addLoadEvent(initForms);

window.onerror = function(message, uri, line)
{
  alert("UNEXPECTED ERROR!\n\n" + message + "\n" + uri + ": " + line);
  return false;                  
}

function initForms() 
{
  var forms = document.getElementsByTagName("form");

  for (var i = 0; i < forms.length; i++) {
    initForm(forms[i]);
  }
}

function initForm(pForm)
{
  // Assign events to form elements

  var className = "";
  var tagName = "";
  var el;
  var focusSet = false;

  var elements = pForm.getElementsByTagName("*");

  for (var i = 0; i < elements.length; i++)
  {
    el = elements[i];

	className = el.className;
    tagName = el.tagName;
    
    switch(tagName)
    {
      case "SELECT":
      {
        if(focusSet == false)
        {
          try {el.focus();} catch (e) {}
		  focusSet = true;
		}

		if(className != null)
		{
          switch(className)
		  {
		    case "date":
		    {
			  el.onchange = PopulateDateControl;
			  break;
		    }
		    case "autocomplete":
		    {
			  InitAutoComplete(el);
			  break;
		    }
		  }
        }

        break;
      }
      case "INPUT":
      {
        type = el.type;

        if(focusSet == false)
        {
          if(type != "hidden" && type != "radio" && type != "checkbox")
          {
            try {el.focus();} catch (e) {}
		    focusSet = true;
		  }
		}

		if(className != null)
		{
		  if(className.indexOf("integer") > -1) {
			el.onblur = validateInteger;
		  }
		  else if(className.indexOf("url") > -1) {
			el.onblur = validateURL;
		  }
		  else if(className.indexOf("email") > -1) {
			el.onblur = validateEmail;
		  }
		  else if(className.indexOf("gridref") > -1) {
			el.onblur = validateGridRef;
		  }
		  else if(className.indexOf("time") > -1) {
			el.onblur = validateTime;
		  }
		}

		switch(type)
		{
		  case "text":
		  case "password":
		  {
			el.onfocus = textboxFocus;
		  }
		}

		break;
      }
      case "IMG":
      {
	    if(el.getAttribute("longdesc"))
		{
		  el.onmouseover = ShowTip;
		  el.onmouseout = hidetip;
		}

        break;
	  }
    }
  }

  // Assign a submit form event

  pForm.onsubmit = function () {
    return formSubmit(pForm);
  }
}

// ************************************************** VALIDATION ROUTINES **************************************************

function validateItem(el, pattern, value)
{
  if(value.length == 0)
  {
    el.style.backgroundColor = "white";
    return true;
  }

  if(pattern.test(value) == true)
  {
    el.style.backgroundColor = "white";
    el.style.color = "black";
    return true;
  }
  else
  {
    el.style.backgroundColor = "red";
    el.style.color = "white";
    return false;
  }
}

function validateGridRef(e)
{
  var el = getEventElement(e);

  var pattern = /^\D{2}\d{2,6}$/;

  return validateItem(el, pattern, el.value);
}

function validateEmail(e)
{
  var el = getEventElement(e);

  var pattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;

  return validateItem(el, pattern, el.value);
}

function validateURL(e)
{
  var el = getEventElement(e);

  //var pattern = /^(http:\/\/www.|https:\/\/www.|ftp:\/\/www.|www.){1}([\w]+)(.[\w]+){1,2}$/;
  var pattern = /^(http\:\/\/[a-zA-Z0-9_\-]+(?:\.[a-zA-Z0-9_\-]+)*\.[a-zA-Z]{2,4}(?:\/[a-zA-Z0-9_]+)*(?:\/[a-zA-Z0-9_]+\.[a-zA-Z]{2,4}(?:\?[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)?)?(?:\&[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)*)$/;

  return validateItem(el, pattern, el.value);
}

function validateTime(e)
{
  var el = getEventElement(e);

  var pattern = /^([0-1][0-9]|[2][0-3]):([0-5][0-9])$/;

  return validateItem(el, pattern, el.value);
}

function validateInteger(e)
{
  var el = getEventElement(e);

  var pattern = /^\d+$/;

  return validateItem(el, pattern, el.value);
}

// *************************************************************************************************************************

function textboxFocus(e)
{
  var el = getEventElement(e);

  if(el)
  {
    if(el.createTextRange)
    {
      var textRange = el.createTextRange();

      if(textRange)
      {
        if(textRange.text.length > 0)
        {
          textRange.findText();
          textRange.select();
        }
      }
    }
    else
    {
      if(el.value) {
        el.setSelectionRange(0, el.value.length); 
      }
    }
  }
}

function formSubmit(form)
{
  var errors = false;

  var elements = form.getElementsByTagName("*");

  for(var i = 0; i < elements.length; i++)
  {
    if(elements[i].style.backgroundColor == "red") {
      errors = true;
    }

    switch(elements[i].tagName)
    {
      case "SELECT":
      case "INPUT":
      case "TEXTAREA":
      {
        if(elements[i].className.indexOf("required") > -1)
        {
          if(elements[i].value.length == 0)
          {
		    var name = GetLabelName(elements[i].id);
            alert(name + " is a required field.");
            elements[i].focus();
            return false;
          }
        }
        break;
      }
	}
  }

  if(errors == true)
  {
    alert("Fields highlighted in red contain invalid data. Please correct them.");
    return false;
  }
}

function DisableFormElements(form)
{
  var elements = form.getElementsByTagName("*");

  for(var i = 0; i < elements.length; i++)
  {
    switch(elements[i].tagName)
    {
      case "INPUT":
      case "TEXTAREA":
      case "SELECT":
      {
         elements[i].disabled = true;
         break;
      }
    }
  }
}

function PopulateDateControl(e)
{
  var el = getEventElement(e);

  var elementName = el.name;
  var i = elementName.lastIndexOf("_", elementName.length - 1);
  var name = elementName.substr(0, i);

  var iMaxDay = 0;
  var iMaxMonth = 0;

  var oToday = new Date();
  var iDay = oToday.getDate();
  var iMonth = oToday.getMonth()+1;
  var iYear = oToday.getFullYear();

  var oDay = document.getElementById(name + "_day");
  var oMonth = document.getElementById(name + "_month");
  var oYear = document.getElementById(name + "_year");

  var selectedDayIndex = oDay.selectedIndex;
  var selectedMonthIndex = oMonth.selectedIndex;
  var selectedYearIndex = oYear.selectedIndex;

  if(oDay.className == "future") {
    bFuture = true;
  }
  else {
    bFuture = false;
  }
  
  //Calculate the number of days in the month
  timeA = new Date(oYear.options[selectedYearIndex].text, oMonth.options[selectedMonthIndex].value, 1);
  timeDifference = timeA - 86400000;
  timeB = new Date(timeDifference);
  
  var daysInMonth = timeB.getDate();

  //Calculate the last day
  if(bFuture == true) {
    iMaxDay = daysInMonth;
  }
  else
  {
    if(oYear.value < iYear || (oYear.value == iYear && oMonth.value < iMonth)) {
      iMaxDay = daysInMonth
    }
    else {
      iMaxDay = iDay;
    }
  }

  //Calculate the last month
  if(bFuture == true) {
    iMaxMonth = 12;
  }
  else
  {
    if(oYear.value < iYear) {
      iMaxMonth = 12
    }
    else {
      iMaxMonth = iMonth;
    }
  }

  //Populate days
  oDay.length = 0;

  for (var i = 0; i < iMaxDay; i++)
  {
    oDay.options[i] = new Option(i+1, i+1);
  }

  //Populate months
  oMonth.length = 0;

  for (var i = 0; i < iMaxMonth; i++)
  {
    switch(i)
    {
      case 0:
        oMonth.options[i] = new Option("January", 1);
        break;
      case 1:
        oMonth.options[i] = new Option("February", 2);
        break;
      case 2:
        oMonth.options[i] = new Option("March", 3);
        break;
      case 3:
        oMonth.options[i] = new Option("April", 4);
        break;
      case 4:
        oMonth.options[i] = new Option("May", 5);
        break;
      case 5:
        oMonth.options[i] = new Option("June", 6);
        break;
      case 6:
        oMonth.options[i] = new Option("July", 7);
        break;
      case 7:
        oMonth.options[i] = new Option("August", 8);
        break;
      case 8:
        oMonth.options[i] = new Option("September", 9);
        break;
      case 9:
        oMonth.options[i] = new Option("October", 10);
        break;
      case 10:
        oMonth.options[i] = new Option("November", 11);
        break;
      case 11:
        oMonth.options[i] = new Option("December", 12);
        break;
    }
  }

  SelectComboboxItem(oDay, selectedDayIndex);
  SelectComboboxItem(oMonth, selectedMonthIndex);
}

function SelectComboboxItem(o, item)
{
  try {
    o.selectedIndex = item;
  }
  catch (e) {
    o.selectedIndex = o.length - 1;
  }

  //Deal with an IE bug
  if(o.selectedIndex == -1) {
    o.selectedIndex = o.length - 1;
  }
}

function HideOptionalFields(e)
{
  var el = getEventElement(e);

  if(el.getAttribute("for")) {
    var o = document.getElementById(el.getAttribute("for"));
  }
  else {
    var o = el;
  }

  if(o.checked == false) {
    var sDisplay = "block";
  }
  else {
    var sDisplay = "none";
  }

  var divs = document.getElementsByTagName("div");

  for (var i = 0; i < divs.length; i++)
  {
    if(divs[i].className == "formitem optional") {
      divs[i].style.display = sDisplay;
    }
  }
}

function ShowTip(e)
{
  var el = getEventElement(e);

  var sTip = el.getAttribute("longdesc");

  showtip("ToolTip", sTip);
}

function GetLabelName(pControlID)
{
  var labels = document.getElementsByTagName("label");

  for (var i = 0; i < labels.length; i++)
  {
    if(labels[i].htmlFor == pControlID)
    {
      if(labels[i].innerText != undefined) {
        return labels[i].innerText;
	  }
	  else {
        return labels[i].innerHTML;
      }
    }
  }
  
  return "";
}

// ************************************************* CROSS BROWSER ROUTINES ************************************************

function getEvent(e)
{
  if (!e) {
    var e = window.event;
  }
	
  return e;
}

function getEventElement(e)
{
  var el;

  e = getEvent(e);

  if (e.target) {
    el = e.target;
  }
  else if (e.srcElement) {
    el = e.srcElement;
  }

  if (el.nodeType == 3) { // defeat Safari bug
    el = el.parentNode;
  }

  return el;
}

function addLoadEvent(func)
{
  var oldonload = window.onload;

  if (typeof window.onload != 'function') {
    window.onload = func;
  } 
  else
  {
    window.onload = function()
    {
      oldonload();
      func();
    }
  }
}