/**
 * @author jp
 */

//window.onload = initForms;

var allErrors = "";
var missinFields = 0;

var passLength = 5;



function ErrorsObj (errorName) {

	ErrorsObj.prototype.errorCount ++;
	this.errorArray = new Array();	
	this.addError = new Function ("errorName", "this.addErrorFn(errorName)");	
	this.addErrorFn = function (errorName) {		
		var valMatch = false;
		for (var a=0; a <this.errorArray.length; a++) {			
			if (this.errorArray[a] == errorName) {
				valMatch = true;
			}			
		}				
		if (valMatch == false) {
			this.errorArray.push(errorName);
		}				
	}
		
}

var signFormErrors = new ErrorsObj();


function initForms() {

	var formelement;
	for (var i=0; i< document.forms.length; i++) {
		for (var j=0; j< document.forms[i].elements.length; j++) {
			if ( document.forms[i].elements[j].id == "mobileno" )
			{			
				// document.forms[i].elements[j].onchange = function () { collatePhoneInfo(countrycode, mobileno, credential_0); return validTag(this); };	
				//document.forms[i].elements[j].onchange = "collatePhoneInfo(countrycode, mobileno, credential_0); validTag(this); "	
			}
			else
			{
				document.forms[i].elements[j].onchange = function () {return validTag(this); };				
			}

			//document.forms[i].elements[j].onblur = function () { return validTag(this); };
		}
		document.forms[i].onsubmit = function () { return validForm(); }
	}
}


function initSMSForms() {

	var formelement;
	for (var i=0; i< document.forms.length; i++) {
		for (var j=0; j< document.forms[i].elements.length; j++) {
			if ( document.forms[i].elements[j].id == "mobileno" )
			{			
				// document.forms[i].elements[j].onchange = function () { collatePhoneInfo(countrycode, mobileno, credential_0); return validTag(this); };	
				//document.forms[i].elements[j].onchange = "collatePhoneInfo(countrycode, mobileno, credential_0); validTag(this); "	
			}
			else
			{
				document.forms[i].elements[j].onchange = function () {return validTag(this); };				
			}

			//document.forms[i].elements[j].onblur = function () { return validTag(this); };
		}
		document.forms[i].onsubmit = function () { return validSMSForm(); }
	}
}


function validForm() {
	

	var allGreat = true;	
	var allTags = document.getElementsByTagName("*");
	for (var i=0; i<allTags.length; i++) {
		if (!validTag(allTags[i])) {
			allGreat = false;
		}
	}
	
	
	// Now checking for password, ppasword match

	if (!crossCheck("password", "credential_1")) {
		

		invalidLabel(document.getElementsByName("password")[0].parentNode);
		invalidLabel(document.getElementsByName("credential_1")[0].parentNode);
		signFormErrors.addError("Original and re-entered password do not match");	
		allGreat = false;

	}
	else {
		
		/*
		if ((document.getElementsByName("password")[0].value.length > passLength ) && 
			(document.getElementsByName("credential_1")[0].value.length > passLength)) {
			validLabel(document.getElementsByName("password")[0].parentNode);
			validLabel(document.getElementsByName("credential_1")[0].parentNode);			
		}	
		*/			
	} 
	
	// Next checking for email, remail match
	
	if (!crossCheck("email","nemail")) {

		invalidLabel(document.getElementsByName("email")[0].parentNode);
		invalidLabel(document.getElementsByName("nemail")[0].parentNode);
		signFormErrors.addError("Original and re-entered emails do not match");	
		allGreat = false;
	}
	
	

	if (!(allGreat)) {
		PresentErrors ();
	}
	
	
	return allGreat;
}


function validSMSForm() {
	

	var allGreat = true;	
	var allTags = document.getElementsByTagName("*");
	for (var i=0; i<allTags.length; i++) {
		if (!validTag(allTags[i])) {
			allGreat = false;
		}
	}
	

	if (!(allGreat)) {
		PresentErrors ();
	}
	
	
	return allGreat;
}


function validTag(thisTag) {
	

	var allGood = true;
	var outClass = "";
	var allClasses = thisTag.className.split(" ");
	for (var j=0; j<allClasses.length; j++) {
		outClass += validBasedOnClass(allClasses[j]) + " ";
	}

	thisTag.className = outClass;
	if (outClass.indexOf("invalid") > -1) {
		if ((thisTag.nodeName == "INPUT") || (thisTag.nodeName == "SELECT")) {
			invalidLabel(thisTag.parentNode);
			if (thisTag.nodeName == "INPUT") {
			thisTag.focus();
			thisTag.select();				
			}
		}
		
		return false;
	}
	if (outClass.indexOf("invalid") == -1) {
		if ((thisTag.nodeName == "INPUT") || (thisTag.nodeName == "SELECT")) {
			validLabel(thisTag.parentNode);			
		}
		return true;
	}
	

		
	function validBasedOnClass(thisClass) {
		var classBack = "";	
		switch(thisClass) {
			case "":
			case "invalid":
				break;
			case "email":
				if (allGood && !validEmail(thisTag.value)) { 
					classBack = "invalid ";
					signFormErrors.addError("Email address is of an incorrect format");
				}
				classBack += thisClass;
				break;
				
			case "remail":
				if (allGood && !validEmail(thisTag.value)) {
					classBack = "invalid ";
					signFormErrors.addError("Re-entered email address is of an incorrect format");	
				}
				classBack += thisClass;
				break;
			
			case "mobileno":

				if (allGood && !ParseMobilePhone(thisTag.value)) {
					classBack = "invalid ";
					signFormErrors.addError("Mobile number is of an incorrect format");					
				}
				classBack += thisClass;
				break;
				
			case "pwd":
				if (allGood && !(thisTag.value.length > passLength)) {
					classBack = "invalid ";
					signFormErrors.addError("Password is not at least six (6) characters long");		
				}
				classBack += thisClass;
				break;
				
			case "reqd":
				if (allGood && (thisTag.value == "" || thisTag.value == "00" )) {
					classBack = "invalid ";
					signFormErrors.addError("Required fields are missing, please review the red tabbed fields");
				}
				classBack += thisClass;
				break;
				
			default:
				classBack += thisClass;
		}
		return classBack;
	}
		
}


				
function validEmail(email) {
	
	var re = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;	
	var rest = re.test(email);
	return re.test(email);
}

	

function ParseMobilePhone ( phoneNo ) {
	var re = /[\-\.\(\) ]/;
	var newDigits = phoneNo.split(re);
	var onlyDigits = newDigits.join("");
	switch (document.getElementById("countrycode").value)
	{
		case "1":
			if (onlyDigits.length == 10)
			{
				document.getElementById("mobileno").value = "(" + onlyDigits.substring(0,3) + ") " + onlyDigits.substring(3,6) + "-" + onlyDigits.substring(6);
				return true;
			}
			else 
			{
				return false;
			}
			break;
		default:
			document.getElementById("mobileno").value = onlyDigits;	
			return true;			
	}						
}



function crossCheck (oneField,otherField) {

	if (!document.getElementsByName(otherField)[0]) return false;
	return (document.getElementsByName(oneField)[0].value == document.getElementsByName(otherField)[0].value);
}

function PresentErrors (){
		
 	var nodeHere = document.getElementById("errorbox");
	var errorNodeLI;
	
	for (var k = (nodeHere.childNodes.length - 1) ; k > 0; k-- ) {
		if (nodeHere.childNodes[k].nodeName == "LI" ) {
			nodeHere.removeChild(nodeHere.childNodes[k] );	
		}		
	}
	
	
	while (signFormErrors.errorArray.length > 0) { 
				
		errorNodeLI = document.createElement("LI");
		errorNodeLI.appendChild(document.createTextNode(signFormErrors.errorArray.shift()));			
		nodeHere.insertBefore(errorNodeLI,document.getElementById("errorInserts"));
		
		/*
		nodeHere.insertBefore(document.createElement("LI").appendChild(document.createTextNode(signFormErrors.errorArray.shift())),
		document.getElementById("errorInserts")); */
			
	}
		
}



function invalidLabel(parentTag) {

	for (var j=0; j<parentTag.childNodes.length; j++) {
		if ((parentTag.childNodes[j].tagName == "LABEL") || (parentTag.childNodes[j].tagName == "INPUT") || (parentTag.childNodes[j].tagName == "SELECT")) {
			parentTag.childNodes[j].className += (parentTag.childNodes[j].className.indexOf("invalid") == -1) ? " invalid": "" ;
		}
	}

}

function validLabel(parentTag) {

	for (var j=0; j<parentTag.childNodes.length; j++) {
		if ((parentTag.childNodes[j].tagName == "LABEL") || (parentTag.childNodes[j].tagName == "INPUT") || (parentTag.childNodes[j].tagName == "SELECT")) {				
			var rep = /(\s)+invalid/g;
			var oldClasses = parentTag.childNodes[j].className.replace(rep,'');
			parentTag.childNodes[j].className = oldClasses;
		
		}
	}

}


function collatePhoneInfo(countryCode, phoneNumber, destPhoneField)
{
	if (document.getElementById(phoneNumber.id).value) 
	{
		var tempdestPhoneValue = document.getElementById(countryCode.id).value + document.getElementById(phoneNumber.id).value;
	}
	document.getElementById(destPhoneField.id).value = tempdestPhoneValue.replace(/[\(\)\-\s]/g, "","");

}

