// capture existing onload events.
var prevOnload = window.onload;

// required to add the validate function to the forms
window.onload = updateForms;

formOnSubmitFuncs = new Array();


function updateForms() {
	 // trigger existing onload events.
	 if (prevOnload != null) {
		  prevOnload();
	 }
	 len = document.forms.length;

	 for (i = 0; i < len; i++) {
		  formOnSubmitFuncs[document.forms[i].name] = document.forms[i].onsubmit;
		  document.forms[i].onsubmit = valReq;
	 }

	 return true;
}
// }}}

// Method: sortInputIntoGroups() {{{
/** Method: sortInputIntoGroups()
 *
 * Given a form object, it's elements are sorted into
 * groups based on their names.
 */
function sortInputIntoGroups(form) {
	 groups = new Array();

	 cnt = form.elements.length;

	 for (i = 0; i < cnt; i++)
	 {
		  if (groups[form.elements[i].name] == undefined)
	{
				groups[form.elements[i].name] = new Array();
				groups[form.elements[i].name][0] = form.elements[i];
				groups[form.elements[i].name][0]['required'] = form.elements[i].getAttribute('required');
		  }
	else
	{
				len = groups[form.elements[i].name].length;
				groups[form.elements[i].name][len] = form.elements[i];
				groups[form.elements[i].name][len]['required'] = form.elements[i].getAttribute('required');
		  }
	 }

	 return groups;
}
// }}}

// Method: validateSingleInputElement() {{{
/** Method: validateSingleInputElement()
 *
 * Determines if a value has been set for a single element.
 * Only considers the following input types:
 *  input type=file
 *  input type=text
 *  textarea
 *  select box
 */
function validateSingleInputElement(elem) {
	 set = false;

	 switch (elem.tagName) {
		  case 'INPUT':
				if (elem.type == 'text' || elem.type == 'file' || elem.type == 'password')
		 {
					//var sval = elem.value;
					 if (elem.value != null && elem.value.replace(/\s+/gi, '') != "")
		{
						  set = true;
					 }

				}
		 if(elem.type == 'checkbox')
		 {
			if(elem.value != null)
		{
			if(elem.checked)
			{
				set = true;
			}
		}
		 }
				break;
		  case 'SELECT':
				if (-1 != elem.selectedIndex && 0 != elem.options[elem.selectedIndex].value)
				{
					 set = true;
				}
				break;
		  case 'TEXTAREA':
				if (elem.value != null && elem.value.trim() != "") {
					 set = true;
				}
				break;
		  // no default
	 }

	 return set;
}
// }}}

// Method: validateInputGroup() {{{
/** Method: validateInputGroup()
 *
 * Determines if a value has been set within a group of elements.
 * Only considers the following input types for a group:
 *  input type=file
 *  input type=text
 *  input type=radio
 *  input type=checkbox
 */
function validateInputGroup(group) {
	 set = false;
	 len = group.length;

	 for (i = 0; i < len; i++)
	 {
		  if (group[i].tagName == 'INPUT')
	{
				switch (group[i].type)
		 {
					 case 'radio':
						  // fall through
					 case 'checkbox':
						  if (group[i].checked == true)
			 {
								set = true;
						  }
						  break;
					 case 'file':
						  // fall through
					 case 'text':
						  if (group[i].value != null && group[i].value.trim() != "")
			 {
								set = true;
						  }
						  break;
					 // no default
				}
		  }
	 }

	 return set;
}
// }}}

// Method: valReq() {{{
/** Method: valReq()
 *
 * Validates that all required input elements of the form
 * have been given a value.  If this is not true, then
 * the form is not submitted and an error message is
 * delivered to the user via an alert box.
 */
function valReq() {
	 form = this;
	 rc = false;

	 groups = sortInputIntoGroups(form);

	 missingReq  = false;
	 reqMsg      = '';

	 for (name in groups)
	 {
		  if (groups[name][0]['required'] != undefined || (groups[name][0]['hasAttribute'] != undefined && groups[name][0].hasAttribute('required')))
		  {
				set = false;

				if (groups[name].length == 1)
		 {
					set = validateSingleInputElement(groups[name][0]);
				}
		 else
		 {
					set = validateInputGroup(groups[name]);
				}

				if (false == set)
		 {
					 missingReq  = true;
					 if (groups[name][0]['hasAttribute'] != undefined && groups[name][0].hasAttribute('required'))
		{
						  reqMsg += "\t" + groups[name][0].getAttribute('required') + "\n";
					 }
		else
		{
						  reqMsg += "\t" + groups[name][0]['required'] + "\n";
					 }
				}
		  }
	 }

	 if (true == missingReq) {
		  msg = "Some of the required fields in this form are not filled in.\n"
				+ reqMsg;
		  alert(msg);

		  rc = false;
	 } else {
		  rc = true;
	 }

	 if (formOnSubmitFuncs[form.name]) {
		  func = formOnSubmitFuncs[form.name];
		  rc2 = func.call();

		  if (rc == true && rc2 == true) {
				rc = true;
		  }
	 }

	 return rc;
}
// }}}
