/* 
Webcenter Universal Form Validation
Version: 0.8
Author: Patrick Woods and David Moody


Initialize by running this in an onload event. In tthe templates we use addEvent.

formInit(requiredClass);


A couple extra text input validation functions are avaialble, to use them just add the function name as a second class:

validate_email: will check for @ in your field.
validate_number: will only allow numbers and a Decimal point

*/

addEvent(window, 'load', function() {
	formInit("wdc-required")
	}
);


/* Initialization functions */
function formInit(requiredClass) {
	if (document.getElementsByTagName) {
			var aforms=document.getElementsByTagName("form");
			for(i=0;i<aforms.length;i++){
				aforms[i].onsubmit = function() {
					return wdcValidate(this, requiredClass);
				}
			}
	}
}

/* main validation function */
function wdcValidate(form, requiredClass) {
	var missing = "";
	var focus = 0;
	var checked = new Array();
	var aReqTags = document.getElementsBySelector('#' + form.id + " ." + requiredClass);
	for (var i=0; i<aReqTags.length; i++) {
		if (beenChecked(aReqTags[i].name,checked)) {
			var retval = "";
			if (window['validate_' + aReqTags[i].tagName.toLowerCase()]) {
				var retval = window['validate_' + aReqTags[i].tagName.toLowerCase()](aReqTags[i],form);
				checked[checked.length] = aReqTags[i].name;
			}
			if (retval !="") {
				missing += "- " + retval+ "\n";
				if (!focus) {focus = aReqTags[i];}
			}
		}
	}
	if (missing != "") {
		alert("The following required fields were not completed:\n\n" + missing);
		focus.focus();
		return false;
	}
	return true;
}
/* main validation function */

/* Input Specific validation function */
function validate_select(obj,form) {
	var errorMessage = "";
	if(obj.options[obj.selectedIndex].value == "") {
		errorMessage = 	inputMessage(obj.name,form);
	}
	return errorMessage;
}

function validate_textarea(obj,form) {
	var errorMessage = "";
	if (trim(obj.value) == "") {
		errorMessage = inputMessage(obj.name,form);
	}
	return errorMessage;
}

function validate_input(obj,form) {
	var errorMessage = "";
	errorMessage = window["validate_" + obj.type](obj, form);
	return errorMessage;
}

function validate_radio(obj,form) {
	var errorMessage = "";
	var aRadios = eval("document." + form.name + "." + obj.name);
	for (var i = 0; i < aRadios.length; i++) {
		if (aRadios[i].checked == true) {
				return errorMessage;
			}
	}
	// if we get here there were no checked radio boxes
	errorMessage = inputMessage(obj.name,form);
	return errorMessage;
}

function validate_text(obj,form) {
	var errorMessage = "";
	/* check if a specific type of validation was specified*/
	var validation = getClassBySub(obj,"validate");
	if (validation && window[validation]) {
		errorMessage = window[validation](obj, form);
	} else {
		if (trim(obj.value) == "") {
		errorMessage = inputMessage(obj.name,form);
		}
	}
	return errorMessage;
}

function validate_checkbox(obj,form) {
	var errorMessage = "";
	var aRadios = eval("document." + form.name + "." + obj.name);
	for (var i = 0; i < aRadios.length; i++) {
		if (aRadios[i].checked == true) {
				return errorMessage;
			}
	}
	// if we get here there were no checked check boxes
	errorMessage = inputMessage(obj.name,form);
	return errorMessage;
}


/* Specific Format validation */
function validate_email(obj,form) {
	var errorMessage = "";
	if (obj.value.indexOf("@") == -1) {
		errorMessage = inputMessage(obj.name,form);
		errorMessage += " is not a valid email address.";
	}
	return errorMessage;
}

function validate_number(obj,form) {
	var errorMessage = "";
	if (!isNumeric(obj.value)) {
		errorMessage = inputMessage(obj.name,form);
		errorMessage += " must be a number.";
	}
	return errorMessage;
}
/* Specific Format validation */


/* Errormessage Functions */

function getLabelText(name,form){
	// first check if a customized error message has been set.
		var labelText ="";
		var alabel = form.getElementsByTagName("label");
		for(x = 0;x < alabel.length;x++) {
			var forAtrrib = alabel[x].htmlFor;
				if(forAtrrib.toLowerCase() == name.toLowerCase()) {
				/* Browser are insconsistent on using textContent vs innerText so we check for a defined property and spit that back */
					if (alabel[x].textContent) { 
						var labelText = alabel[x].textContent; 
					} else if (alabel[x].innerText) {
						var labelText = alabel[x].innerText;
					}
				}
		}
		// we now check for a label to see if the label had any value and that it's not all spaces if so we send back the input name
		if (trim(labelText) == "") {
			var legendDiv = document.getElementById(name);
			if (legendDiv) {
				if (legendDiv.textContent) { 
					var labelText = legendDiv.textContent; 
				} else if (legendDiv.innerText) {
					var labelText = legendDiv.innerText;
				}
			} else {
			var labelText = name;
			}
		}
	return labelText;
}

function inputMessage(name, form) {
	if (window.wdcMessage) {
		if(wdcMessage[name]) {
			var inputMessage = wdcMessage[name];
		}
	} else {
		var inputMessage = getLabelText(name,form);
		inputMessage = inputMessage.replace(/:/,"");
	}
	return inputMessage;
}

function setInputClasses(form) {
	var aInputs = form.getElementsByTagName("input");
	for(var i = 0; i < aInputs.length; i++) {
		var inputClass = aInputs[i].className + " " + aInputs[i].type;
		aInputs[i].className = inputClass;
	}
	return true;
}

/* trim function */
function trim(s) {
  while (s.substring(0,1) == ' ') {
    s = s.substring(1,s.length);
  }
  while (s.substring(s.length-1,s.length) == ' ') {
    s = s.substring(0,s.length-1);
  }
  return s;
}
/* trim function */

/* beenChecked function */
function beenChecked(name,checked) {
	for (var i =0; i < checked.length; i++) {
		if (checked[i] == name) {
			return false;	
		}
	}
	return true;
}


/* beenChecked function */

/* get class by substring function */
 function getClassBySub(obj, keyword) {
 	var classExists = obj.className.search(keyword);
	if (classExists != -1) {
 		var theClass = obj.className.slice(classExists);
		theClass = theClass.split(" ",1);
	}
	if (!theClass) {
		return false;
	} else {
		return theClass;
	}
 }
/* get class by substring function */

/* isNumeric function checks if input is a number */
function isNumeric(sText) {
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;

 	if (sText !="") {
	   for (i = 0; i < sText.length && IsNumber == true; i++) { 
	      Char = sText.charAt(i); 
	      if (ValidChars.indexOf(Char) == -1) {
	         IsNumber = false;
	      }
	   }
	   
	 } else {
	 	IsNumber = false;
	 	}
   return IsNumber;
   
}
/* isNumeric function checks if input is a number */

