// Form checking ---------------------------------------------------------------
function formCheck(inFormId, inErrorField, inErrorMessage) {

  // Get form
  var formObj = document.getElementById(inFormId);
  
  // Init state
  var emailpattern  = /^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/;
  var allowSubmit   = true;
  var radioCheckbox = [];
  
  // Loop over all fields
  for (var i=0; i<formObj.elements.length; i++) {
  
    // Check if that field is required
    if (formObj.elements[i].getAttribute("required") == 1) {
  
      // Get label field & possible format
      var labelField = document.getElementById(formObj.elements[i].getAttribute("label"));  
      var format     = formObj.elements[i].getAttribute("format");  
        
      // Switch by tag type
      switch (formObj.elements[i].tagName) {
      
        case "select": // Multiple select is not implemented
        case "SELECT":
          var selectedIndex = formObj.elements[i].options.selectedIndex;
          var selectedValue = formObj.elements[i].options[selectedIndex].value;
          
          if (selectedValue.length > 0) {
            allowSubmit &= true;
            if (labelField) labelField.className = "";
          } else {
            allowSubmit &= false;
            if (labelField) labelField.className = "errormessage";
          }
          break;
          
        case "input":
        case "INPUT":
          switch (formObj.elements[i].type) {
              
            case "checkbox":
            case "radio":
              // Create entry for radio / checkbox
              radioCheckbox[formObj.elements[i].name] = (radioCheckbox[formObj.elements[i].name])?(radioCheckbox[formObj.elements[i].name]):(false);
              
              // If checked, override value with true
              if (formObj.elements[i].checked) {
                radioCheckbox[formObj.elements[i].name] |= true;
              }
              break;
              
            case "file":
              break;
              
            case "text":
            case "hidden":
            case "submit":
            default:
              if ((formObj.elements[i].value.length > 0) && ((format=="email")?(emailpattern.test(formObj.elements[i].value)):(true))) {
                allowSubmit &= true;
                if (labelField) labelField.className = "";
              } else {
                allowSubmit &= false;
                if (labelField) labelField.className = "errormessage";
              }
              break;
          }
          break;
          
        case "textarea":
        case "TEXTAREA":
        default:
          if (formObj.elements[i].value.length > 0) {
            allowSubmit &= true;
            if (labelField) labelField.className = "";
          } else {
            allowSubmit &= false;
            if (labelField) labelField.className = "errormessage";
          }
          break;
      }
    }
  }
  
  // Post-process radio / checkbox (error hilighting for radios & checkboxes is not implemented)
  for (fieldName in radioCheckbox) {
    allowSubmit &= radioCheckbox[fieldName];
  }
  
  // Set error message
  if (!allowSubmit) {
    document.getElementById(inErrorField).innerHTML     = inErrorMessage;
    document.getElementById(inErrorField).style.display = "inline";
  } else {
    document.getElementById(inErrorField).innerHTML     = "";
    document.getElementById(inErrorField).style.display = "none";
  }
  
  // Return result anyway
  return allowSubmit;
}

// Userguide handling ----------------------------------------
function userguide(inUrl) {
  window.open(inUrl, "", "location=0,menubar=0,scrollbars=1,status=0,toolbar=0,width=800,height=540,resizable=1");
}

// Print handling --------------------------------------------
function printVersion() {
  window.open("/print" + location.pathname + location.search, "", "location=0,menubar=0,scrollbars=1,status=0,toolbar=0,width=800,height=600,resizable=1");
}

// Popup -----------------------------------------------------------------------
function popup(inPage, inSubpage, inArgs) {
  window.open("/popup/" + inPage + "/" + inSubpage + "/?" + inArgs, "", "location=0,menubar=0,scrollbars=1,status=0,toolbar=0,width=800,height=600,resizable=1,dependent=1,centerscreen=1");
}

// Image swapping --------------------------------------------
function imageSwap(inObj, toSrc) {
  inObj.src = toSrc;
}


// Navigation handling ---------------------------------------
function navRollOver(inObj) {
  inObj.className = "navigationItemOver";
}

function navRollOut(inObj) {
  inObj.className = "navigationItem";
}

function navLink(inUrl) {
  location.href = inUrl;
}


// Tooltips -------------------------------------------------
var tooltip_obj     = null;
var tooltip_content = null;

function tooltip_init(tooltipId, contentId) {
  tooltip_obj     = document.getElementById(tooltipId);
  tooltip_content = document.getElementById(contentId);
}

function tooltip_show(event, message) {

  if (tooltip_obj && message) {
    if (self.event) {
      x  = self.event.clientX;
      y  = self.event.clientY;
	
      self.event.cancelBubble = true;
    } else {
	  x  = event.clientX;
	  y  = event.clientY;
	  	
	  event.stopPropagation();
    }
    
    tooltip_content.innerHTML = message;
    tooltip_obj.style.display = "block";
    
    tooltip_obj.style.top =  y - tooltip_content.offsetHeight - 15 + document.body.scrollTop;
    tooltip_obj.style.left = x - 163 + document.body.scrollLeft;
    
  }
  return false;
}

function tooltip_hide() {
  if (tooltip_obj) {
    tooltip_content.innerHTML = "";
    tooltip_obj.style.top = 0;
    tooltip_obj.style.left = 0;
    tooltip_obj.style.display = "none";
  }
  return false;
}


// Emails --------------------------------------------------
function mailto(inEmail) {
  location.href="mailto:" + reverse(inEmail);
}

function reverse(inText) {
  var outText = "";
  for (var i=inText.length-1; i>=0; i--) {
    outText+= inText.substr(i,1);;
  }
  return outText;
}


// Form checking ------------------------------------------
function checkForm(inForm, inFields, inMessage) {

  var complete = true;
  for (var i=0; i<inFields.length; i++) {
    complete &= (inForm.elements[inFields[i]].value.length > 0);
  }
  
  if (!complete) {
    document.getElementById("formMessage").innerHTML = inMessage;
    return false;
  } else {
    return true;
  }
}


// Dynamic data loading -----------------------------------
var serverPresent   = location.hostname;
var requestQueue    = [];
var request         = null;
var requestTarget   = 0;
var requestCallback = "";
var requestRunning  = false;
function distributeContent() {
  if (request.readyState == 4) {
    if (request.status == 200 || !serverPresent) {
      
      // Javascript transfer hack
      if (request.responseText.indexOf("javascript:") === 0) {
        eval(request.responseText.substr(11));
      } else {
        var targetObj = document.getElementById(requestTarget);
        targetObj.innerHTML = request.responseText;
      }
      
      // Invoke callback
      if (requestCallback) {
        eval(requestCallback);
      }
      
      // Reset request state
      requestRunning = false;
      loadContent();
    }
  }
}

function loadContent() {

  // Check wheter a request is running
  if (!requestRunning && requestQueue.length) {

    // Lock requesting
    requestRunning = true;
  
    // Get last queued request
    var thisRequest = requestQueue.shift();
    var inUrl       = thisRequest[1];
    var inTargetId  = thisRequest[0];
    var inCallback  = thisRequest[2];

    // Load last queue
    requestTarget   = inTargetId;
    requestCallback = inCallback;
    if (window.XMLHttpRequest) {
      request = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
      request = new ActiveXObject("Microsoft.XMLHTTP");
    }
    request.open("GET", inUrl, true);
    request.onreadystatechange = distributeContent;
    request.send(null);
  }
}

function queueContent(inTargetId, inUrl, inCallback) {
  // Queue the request
  requestQueue.push([inTargetId, inUrl, inCallback]);
  
  // Load last queue
  loadContent();
}

