// el(id) is a shortcut to using the getElementById function safely
// elvalue(id) is to get the .value of an element safely

function el(id) { if (document.getElementById) { return document.getElementById(id) } else if (window[id]) { return window[id] } return null }
function elvalue(id) { var i = el(id); if (i) { if (i.value) { return i.value } else return null } }

function ifIE() {
	var ua = navigator.userAgent.toLowerCase();
	if ( ua.indexOf( "msie" ) != -1 ) {
	  return true;
	} 
	return false;
}

var debugging = false
var numberofformerrors = 0
var formerrors = ""

function debug(sometext) { if (debugging==true) { alert (sometext) } }


/* Form validation Javascript */

function ValidateForm(formobject) {
	var fieldnames = ""
	
	var forminputs = formobject.getElementsByTagName("*")
	numberofformerrors = 0
	formerrors = ""

	if (forminputs.length > 0) {
		for (count=0; count<forminputs.length; count++) {
			switch (forminputs[count].tagName) {
				case "INPUT":
					var inputtype = (forminputs[count].getAttribute("type") ? forminputs[count].getAttribute("type") : "text") ;
					inputtype = inputtype.toUpperCase()
					switch (inputtype) {
						case "HIDDEN":
							break
						case "CHECKBOX":
						case "TEXT":
							var error = ValidateField( forminputs[count].name )
							if (error) { numberofformerrors++; formerrors += error; }
							break
					}
					break
				case "SELECT":
				case "TEXTAREA":
					var error = ValidateField( forminputs[count].name )
					if (error) { numberofformerrors++; formerrors += error; }
					break
			}
		}
	}
	
	ValidateRadioButtons(forminputs);
	
	if (numberofformerrors == 0) {
		debug("THE FORM WAS OK (APPARENTLY)!!!")
		
		//disable the submit button for
		submitButton = document.getElementById("NRForm_BtnSubmit");
		if (submitButton != null)
		{
			submitButton.disabled = true;
		}
		
		return true
	}
	else {
		// errors in validating the form
//debug (numberofformerrors + " ERROR(S) IN VALIDATING THE FORM")
		alert (numberofformerrors + " " + (numberofformerrors==1 ? "error was" : "errors were" ) + " found in your form submission -\n\n" + formerrors)
		
		return false
	}
}


function ValidateField (fieldname) {
	var element = el(fieldname)
	var elementdescription = elvalue(fieldname + "_Description")

	// read the validation rules
    
	if (element.getAttribute("validation")) {
		 
		var validationrules = new Array()
		validationrules = element.getAttribute("validation").toString().split('|')
		for (var rulenumber=0; rulenumber<validationrules.length; rulenumber++) {
			var rule = validationrules[rulenumber].toString()
			var i = rule.indexOf(':')
			var ruletype = ""
			if (i > -1) {
				ruletype = rule.substring(0, i)
				rule = rule.substring(i+1, rule.length)
			}
			else {
				ruletype = rule
			}
			
			// different validation rules

			switch (ruletype) {
				case "notnull":
					if(element.type == 'checkbox') {
					   if(!element.checked) {
						return ("\"" + elementdescription + "\" is a required field\n");
					   }
				    } else if(!element.value) {
						return ("\"" + elementdescription + "\" is a required field\n")
					}
					break
				case "minlength":
					if (element.value.length < rule) {
						return ("\"" + elementdescription + "\" is too short\n")
					}
					break
				case "maxlength":
					if (element.value.length > rule) {
						return ("\"" + elementdescription + "\" is too long\n")
					}
					break
				case "minvalue":
					if (eval(element.value) < rule) {
						return ("\"" + elementdescription + "\" is too small\n")
					}
					break
				case "maxvalue":
					if (eval(element.value) > rule) {
						return ("\"" + elementdescription + "\" it too big\n")
					}
					break
				case "choice":
					var choicefound = false
					var choices = new Array()
					choices = rule.split(',')
					for (var c = 0; c < choices.length; c++) {
						if (element.value == choices[c]) {
							choicefound = true
							break
						}
					}
					if (!choicefound) {
						return ("\"" + elementdescription + "\" is not a valid choice\n")
					}
					break
				case "email":
					var exp = new RegExp( /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/ )
					if (element.value.length > 0) {
						if (element.value.match(exp) == null) {
							return ("\"" + elementdescription + "\" is not a valid email address\n")
						}
					}
					break
				case "regexp":
				case "regex":
					debug("regex")
					var exp = new RegExp(rule)
					if (element.value.match(exp) != null) {
						return ("\"" + elementdescription + "\" is not a valid value\n")
					}
					break
				case "mindate":
				case "maxdate":
				case "date":
					debug("date not yet implemented")
					break
				default:
					debug("UNKNOWN VALIDATION RULE: (" + element.id + ")" + ruletype + ", V: " + rule)
					break
			}
		}
	}
	else { debug ("NO VALIDATION RULES FOR id=" + element.id ) }

}

function ValidateRadioButtons(forminputs)
{
	var isSelected = false;
	var hasRadioButtons  = false;
	
	if (forminputs.length > 0) 
	{
		for (count=0; count<forminputs.length; count++) 
		{
			if (forminputs[count].tagName == "INPUT")
			{ 
					var inputtype = (forminputs[count].getAttribute("type") ? forminputs[count].getAttribute("type") : "text") ;
					inputtype = inputtype.toUpperCase()
					if (inputtype == "RADIO")
					{	hasRadioButtons = true;
						var selected = forminputs[count].checked;
						if (selected) 
							isSelected = true;
					}
			}
			if (selected) 
				break;
		}
	}
	if (!isSelected && hasRadioButtons)
	{ 
		numberofformerrors++; 
		formerrors +=  "You must check one radio button"; 
	}
}

function setFormId(formId)
{
	var nrFormId = el("NRForm_ID");
	nrFormId.value = formId;
}


/*

<form name="NRForm">
<input type="hidden" required="true" validation="..." />
<input type="text" required="true" validation="..." />

Where validation =

notnull:

minlength:
maxlength:

minvalue:
maxvalue:

date:
mindate:
maxdate:

choice:yes,no

regex:

email:  is a regex with \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

*/
