/****************** Java Script Validation Scripts Generic ******/
/* ------------- Validation Rules
For Required Filed					 :	onblur="Cordys_validate(this,'Required')" 
For Required Filed with Only Numeric :	onblur="Cordys_validate(this,'RequiredNumeric')"
For Required Filed with Only Email 	 :	onblur="Cordys_validate(this,'Email')"
*****/


//////// Validation library V2
//////////////////////////////
var errored = false;            // Global for cordys_validate function
var exClassName = new Object(); // Global for Changed classnames
var styleAdded = false;         // Global for checking sytle status

// page break object
var pageBreak = new pageBreak();

function cordys_validate(elem,type,option){	// Main function

	if (typeof(pageBreak.formName) == 'undefined'){
		pageBreak.formName = elem;
		pageBreak.setInitialStatus();
	}

	var option = (option)? option : "";
	if(!styleAdded){			// Add style for Error warnings
		var style = document.createElement('style');
		var sprop  = '.error{ border:2px red solid; background:#FCFCFC; }';
		    sprop += '.Errortext{ color:#FF0000;font-family:"Trebuchet MS"; font-size:11px; }';
            sprop += '.DivErrortext{ border:1px solid #ccc;margin:4px; padding:5px; background:lightyellow; color:#FF0000;font-family:"Trebuchet MS"; font-size:11px; }';
		style.setAttribute("type", "text/css");
		if (style.styleSheet){   // for IE
			style.styleSheet.cssText = sprop;
		} else {
			var newStyle = document.createTextNode(sprop);
			style.appendChild(newStyle);
		}
		document.getElementsByTagName('head')[0].appendChild(style);
		styleAdded = true; //don't add again.
	}
	///////////
	//Checking for mail validation
	var checkmail = function(email){
        return /^[A-Za-z0-9_\-]+(\.[_A-Za-z0-9\-]+)*@([_A-Za-z0-9\-]+\.)+([A-Za-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/.test(email);
        /*  Deprecated: for stupid behaviour      
		var splitted = email.match("^(.+)@(.+)$");
        if(splitted == null) return false;
		if(splitted[1] != null )   {
			var regexp_user=/^\"?[\w-_\.]*\"?$/;
			if(splitted[1].match(regexp_user) == null) return false;  
		}
		if(splitted[2] != null)  {
			var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
			if(splitted[2].match(regexp_domain) == null) {
				var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
				if(splitted[2].match(regexp_ip) == null) return false; 
			}
			return true; 
		}
		return false;
		*/
	}
    var warned = false;
	//////////////
	// Function to run onsubmit;
	var onSubmit = function(elem){
		errored = false;
		var form = document.forms[elem];
		for(var node = 0;node < form.length; node++)
			if((""+form[node].onblur).match("cordys_validate"))
				form[node].onblur();
		if(errored){
            if(!warned){
                var inputs = form.getElementsByTagName('input');
                for(var x =0; x< inputs.length; x++){
                    if(inputs[x].type == 'submit'){
                        var errdiv = document.createElement('div');
                        errdiv.className = 'DivErrortext';
                        errdiv.innerHTML = 'There are missing fields on your form please correct them.';
                        inputs[x].parentNode.appendChild(errdiv);
                    }
                }
                warned = true;
            }
			pageBreak.goErrorPage();
            return false;
        }
		else
		  form.submit();
	}
	
	//////////////
	// Function to set error messages
	var getMsg = function(type){
		switch(type){
			case "LessThan":           return "This field's length should be less than (" + option['LessThan'] + ")"
			case "GreaterThan":        return "This field's length should be greater than (" + option['GreaterThan'] + ")"
			case "Alphabetic":         return "Cannot contain non-alphabetic characters."
			case "RequiredAlphabetic": return "This field is required and cannot contain non-alphabetic characters."
			case "Numeric":            return "Cannot contain non-numeric characters."
			case "RequiredNumeric":    return "This field is required and cannot contain non-numeric characters."
			case "Email":              return "Enter a valid email address."
			case "Required":           return "This field is required."
            case "Confirm":            return "Value should match with Password"
			case "Regex":              return "This entry does not match (" + option + ")."
			default:                   return "Undefined Error Message"
		}
	}
	
	/////////////
	// Function to check is error printed?
	var checkForErrorDiv = function(elem){
		for(var node = 0;node < elem.parentNode.childNodes.length; node++)
			if(elem.parentNode.childNodes[node].className == "Errortext")
				return true;
		return false;
	}
	
	/////////////
	// Function to define errors and print messages
	var error = function(elem, type, message){
		correct(elem);
		if(!checkForErrorDiv(elem)){
			div = document.createElement("div");
			div.innerHTML = (message)? message : getMsg(type);
			div.className = "Errortext";
			elem.parentNode.appendChild(div);
			//elem.parentNode.insertBefore(div, elem.nextSibling);
		}
		if(elem.className != "error")
			exClassName[elem.name] = elem.className;
		if(elem.type != "checkbox" && elem.type != "radio"){
			elem.className = "error";
		}
		errored = true;
		return true;
	}
	
	/////////////
	// Function to revert Errored fields
	var correct = function(elem){
		var parent = elem.parentNode;
		for(x = 0; x < parent.childNodes.length; x++){
			var node = parent.childNodes[x];
			if(node){
				if(node.className == "Errortext")
					node.parentNode.removeChild(node);
				if(node.className == "error")
					node.className = exClassName[node.name];
			}
		}
	}
	
	///////////////
	// Check for optional validations
	if(option['LessThan']){
		if(elem.value.length >= option['LessThan']){
			error(elem,"LessThan",option['message']);
			return false;
		}else
			correct(elem);
	}
	if(option['GreaterThan']){
		if(elem.value.length <= option['GreaterThan']){
			error(elem,"GreaterThan", option['message']);
			return false;
		}else
			correct(elem);
	}
    if(option.confirm){
		if(elem.value.toLowerCase() != $jt(option.confirm).value.toLowerCase()){
			error(elem, "confirm", option['message']);
            error($jt(option.confirm), "confirm", option['message']);
			return false;
		}else{
            correct(elem);
            correct($jt(option.confirm));
        }
			
	}
		
	//////////////
	// Make all the validations
	switch(type){
		case "Alphabetic":
			var charpos = elem.value.search(/[^a-zA-Z\s\-\_\']/);
			if(charpos >= 0) error(elem,type,option['message']); else correct(elem);
			break;
		case "RequiredAlphabetic":
			if(elem.value.length <= 0) error(elem,type,option['message']); 
			else{
				var charpos = elem.value.search(/[^a-zA-Z\s\-\_\']/);
				if(charpos >= 0) error(elem,type,option['message']); else correct(elem);
			}
			break;
		case "Numeric":
			var charpos = elem.value.search(/[^0-9\.\,\s\-\_]/);
			if(charpos >= 0) error(elem,type,option['message']); else correct(elem);
			break;
		case "RequiredNumeric":
			if(elem.value.length <= 0) error(elem,type,option['message']); 
			else{
				var charpos = elem.value.search(/[^0-9\.\,\s\-\_]/);
				if(charpos >= 0) error(elem,type,option['message']); else correct(elem);
			}
			break;
		case "Email":
			if(!checkmail(elem.value)) error(elem,type,option['message']); else correct(elem);
			break;
		case "Required":
			if(elem.type == "checkbox" || elem.type == "radio"){
				var parent = elem.parentNode;
				var ok = false;
				for(x = 0; x < parent.childNodes.length; x++)
					if(parent.childNodes[x].checked == true)
						ok = true;
				if(ok) correct(elem,true); else error(elem,type,option['message']);
			}else{
				if(elem.options)	
					// Here can be edited for checking text to "Please Select one" or similar text
					// in this example it looks for blank <option> to give error
					if(elem.options[elem.selectedIndex].value == "select") error(elem,type,option['message']); else correct(elem);
				else
					if(elem.value.length <= 0) error(elem,type,option['message']); else correct(elem);
			}
			break;
		case "Confirm":
		    if(elem.value.length <= 0)
			  error(elem,'Required',option['message']);
			else
			if(elem.value != option) 
			  error(elem,type,option['message']); 	
			else
			  correct(elem);
		    break;
		case "Regex":
			if(elem.value.match(option['expression'])) correct(elem);
			else error(elem,type,option['message']);
			break;
		default:	// Default is for defining the form and setting onsubmit function
			var form = document.forms[elem]
			form.onsubmit = function(){ onSubmit(elem); return false; };
			break;
	}		
}

function pageBreak(){
	// the object properties
	this.form;
	this.pages;
	this.pageIndex;
	this.pageLength;
	
	// The form objects.
	this.setInitialStatus = setInitialStatus;
	this.goErrorPage = goErrorPage;
	this.goPage = goPage;
	this.controlCurrentPage = controlCurrentPage;
	
	// function for getting properties	
	/**
	 * Get the form objects with the
	 * name form name
	 */
	function getForm(formName){
		return document.forms.formName;
	}
	
	/**
	 * Get the divs
	 */
	function getPages(){
		var temp = new Array();
		var mainDiv = document.getElementById("main");
		if (typeof(mainDiv) == null) {
			alert("Cannot find the main div.");
		}
		for (var i = 0; i < mainDiv.childNodes.length; i++) {
			if (mainDiv.childNodes[i].className == "pagebreak") {
				temp.push(mainDiv.childNodes[i]);
			}
		}
		return temp;
	}
	
	// methods..
	/**
	 * Set the initial status of the
	 * divs.
	 */
	function setInitialStatus(){
		this.form = getForm(this.formName);
		this.pages = getPages();
		this.pageIndex = 0;
		this.pageLength = this.pages.length;
		hidePages(this);
		setButtons(this);
	}
	
	function hidePages(pageBreak){
		for (var i = 0; i < pageBreak.pages.length; i++) {
			if (i != 0) {
				pageBreak.pages[i].style.display = "none";
			}
		}
	}
	
	function setButtons(pageBreak){
		for (var i = 0; i < pageBreak.pages.length; i++) {
			for (var j = 0; j < pageBreak.pages[i].childNodes.length; j++) {
				if (pageBreak.pages[i].childNodes[j].nodeName == "TABLE") {
					var table = pageBreak.pages[i].childNodes[j];
					var rows = table.getElementsByTagName('tr');
					if (rows.length<1){
						continue;
					}
					var lastRow = rows[rows.length-1];
					var myCells = lastRow.getElementsByTagName('td');
					var myCell = myCells[0];
					if (!lastRowButton(table) || i != (pageBreak.pageLength - 1)) {
						var myRow = table.insertRow(-1);
						var myCell = myRow.insertCell(-1);
						var myCell2 = myRow.insertCell(-1);
					}
					if (i != 0) {
						var backButton = document.createElement("div");
						backButton.className = "backButton";
						backButton.onclick = function(){
							goBackPage(pageBreak);
						};
						myCell.appendChild(backButton);
					}
					if (i != pageBreak.pageLength - 1) {
						var nextButton = document.createElement("div");
						nextButton.className = "nextButton";
						nextButton.onclick = function(){
							goNextPage(pageBreak);
						};
						myCell2.appendChild(nextButton);
					}
				} // if element is table
			} // look for all elements in page
		} // look for all pages
	} // end of function
	function goNextPage(pageBreak){
		if (pageBreak.controlCurrentPage() == false){
			scrollTo(obtenerPosicionX(document.getElementById('main')), obtenerPosicionY(document.getElementById('main')))
			return;
		}
		scrollTo(obtenerPosicionX(document.getElementById('main')), obtenerPosicionY(document.getElementById('main')))
		pageBreak.pages[pageBreak.pageIndex].style.display = "none";
		pageBreak.pageIndex++;
		pageBreak.pages[pageBreak.pageIndex].style.display = "block";
	}
	
	function goBackPage(pageBreak){
		scrollTo(obtenerPosicionX(document.getElementById('main')), obtenerPosicionY(document.getElementById('main')))
		pageBreak.pages[pageBreak.pageIndex].style.display = "none";
		pageBreak.pageIndex--;
		pageBreak.pages[pageBreak.pageIndex].style.display = "block";
	}
	
	//Get X position
	function obtenerPosicionX(elemento){
		var x = 0;
		while (elemento) {
			x += elemento.offsetLeft;
			elemento = elemento.offsetParent;
		}
		return x;
	}
	
	//Get Y position
	function obtenerPosicionY(elemento){
		var y = 0;
		while (elemento) {
			y += elemento.offsetTop;
			elemento = elemento.offsetParent;
		}
		return y;
	}
	
	function goErrorPage(){
		for (var i = 0; i < this.pageLength; i++) {
			var div = this.pages[i];
			var inputs = div.getElementsByTagName('input');
			for (var j = 0; j < inputs.length; j++) {
				var className = inputs[j].className;
				if (className.search(/error/) != -1) {
					this.goPage(i);
					return;
				}
			}
		}
	}
	
	function goPage(index){
		this.pages[this.pageIndex].style.display = 'none';
		this.pages[index].style.display = 'block';
		this.pageIndex = index;
	}
	
	function lastRowButton(table){
		var inputs = table.getElementsByTagName('input');
		if (inputs.length<1){
			return false;
		}
		var lastRowInput = inputs[inputs.length - 1];
		if (lastRowInput.type == 'submit') {
			return true;
		}
		return false;
	}
	
	function controlCurrentPage(){
		var div = this.pages[this.pageIndex];
		var inputs = div.getElementsByTagName('input');
		// fire all validation events
		for (var i=0; i<inputs.length; i++){
			fireHTMLEvent(inputs[i],"onblur");
			var className = inputs[i].className;
			if (className.search(/error/) != -1) {
				return false;
			}
		}
		return true;
	}
	
    function fireHTMLEvent(obj, eventType){
        if (typeof obj.fireEvent != "undefined") 
            obj.fireEvent(/^on/.test(eventType) ? eventType : "on" + eventType);
        else {
            var evt = document.createEvent("HTMLEvents");
            evt.initEvent(eventType.replace(/^on/, ""), true, true);
            obj.dispatchEvent(evt);
        }
    }
}
