/*
**ver 2.1
Breaks compatibility with 2.0

use addValObj(document.form1.txtDate,"Start Date","date","R") validated even if it isn't changed triggered only on form submit
use addValObjE(document.form1.txtDate,"Start Date","date","R") validated even if it isn't changed triggered both onchange and form submit

The 'R' means a required field, use nothing for not required
or use 'C' to make the script clear that text box on submit
valid types are: date, currency, number, time, text

onSubmit="return valAllObjects()"

TO DO:
-- merge addValObj & addValObjE so same function different parameter
-- probably should tidy up error report to single screen unless onchange
-- add Minimum and maximum?
*/
//array of objects to validate on form submit
var valObjects = new Array();
//object counter
var valObjectCount = 0;
var errorString="";

function setDateFormat(formatString){
	dateFormat=formatString;
}
//strips leading zeros
function stripZeros(inputStr) {
	var result = inputStr
	while (result.substring(0,1) == "0") {
		result = result.substring(1,result.length)
	} return result
}
function stripChars(theFilter,theString){
	var strOut,i,curChar

	strOut = ""
	for (i=0;i < theString.length; i++){		
		curChar = theString.charAt(i)
		if (theFilter.indexOf(curChar) < 0)	// if it's not in the filter, send it thru
			strOut += curChar		
	}	
	return strOut
}

function newValObj(nvoObject, nvoName, nvoType, nvoRequired){

	this.object=nvoObject;
	this.name=nvoName;
	this.type=nvoType;
	this.required=nvoRequired;

}

//adds the object and doesn't change it's onchange event.
function addValObj(varObj, varObjName, varObjType, varReq){
	var dontAdd=false;
	
	//this test doesn't work
	if(varObj==null){
		alert("Form element \'" + varObjName + "\' doesn't exist.");
		return false;
	}
	
	for(i=0;i<valObjectCount;i++){
		if(valObjects[i].object==varObj){
			dontAdd=true;
			if(varReq){
				valObjects[i].required=varReq;
			}
		}
	}
	if(dontAdd!=true){
		valObjects[valObjectCount]=new newValObj(varObj, varObjName, varObjType, varReq);
		valObjectCount++;
	}
}
function valDate(evt){
	makeDateGood(this);
}
function valCurr(evt){
	makeCurrGood(this);
}
function valNum(evt){
	makeNumGood(this);
}
function valTime(evt){
	makeTimeGood(this);
}
function valLink(evt){
	makeLinkGood(this);
}
//adds the object and changes it's onchange event.
function addValObjE(varObj, varObjName, varObjType, varReq){
	var dontAdd=false;
	for(i=0;i<valObjectCount;i++){
		if(valObjects[i].object==varObj){
			dontAdd=true;
			if(varReq){
				valObjects[i].required=varReq;
			}
		}
	}
	
	if(dontAdd!=true){
		if(varObjType=="date"){
			varObj.onchange=valDate;
		}else if(varObjType=="currency"){
			varObj.onchange=valCurr;
		}else if(varObjType=="number"){
			varObj.onchange=valNum;
		}else if(varObjType=="time"){
			varObj.onchange=valTime;
		}else if(varObjType=="link"){
			varObj.onchange=valLink;
		}
		valObjects[valObjectCount]=new newValObj(varObj, varObjName, varObjType, varReq);
		valObjectCount++;
	}
}
function failedVal(fvString){
	errorString+=(fvString + "\n");
}
//final validation function
function valAllObjects(){
	errorString="";
	for(crntObjCount=0;crntObjCount < valObjectCount;crntObjCount++){
		if(valObjects[crntObjCount]=="C")
			valObjects[crntObjCount].object.value="";
		if(valObjects[crntObjCount].required=="R" && valObjects[crntObjCount].object.value==""){
			failedVal("'" + valObjects[crntObjCount].name + "' is a required field.");
		}
		if(valObjects[crntObjCount].type=="date"){
			if(!makeDateGood(valObjects[crntObjCount].object)){
				failedVal("'" + valObjects[crntObjCount].name + "' must be entered as dd/mm/yy.");
			}
		}else if(valObjects[crntObjCount].type=="currency"){
			if(!makeCurrGood(valObjects[crntObjCount].object)){
				failedVal("'" + valObjects[crntObjCount].name + "' must be a price, and may contain only numbers, dollar signs and commas.");
			}
		}else if(valObjects[crntObjCount].type=="number"){
			if(!makeNumGood(valObjects[crntObjCount].object)){
				failedVal("'" + valObjects[crntObjCount].name + "' must be a number.");
			}
		}else if(valObjects[crntObjCount].type=="time"){
			if(!makeTimeGood(valObjects[crntObjCount].object)){
				failedVal("'" + valObjects[crntObjCount].name + "' must be entered as hh:mm tt, where tt is either am or pm.");
			}
		}else if(valObjects[crntObjCount].type=="link"){
			if(!makeLinkGood(valObjects[crntObjCount].object)){
				failedVal("'" + valObjects[crntObjCount].name + "' is not a valid hyperlink.");
			}
		}else if(valObjects[crntObjCount].type=="text"){

		}else{
			alert("Critical error: Validation Type not supported - \'" + valObjects[crntObjCount].type) +"\'";
			return false;
		}
	}
	
	if(errorString!=""){
		alert("The form could not be submitted because of the following problems:\n\n" + errorString);
		return false;
	}
	return true;
}
function makeLinkGood(crntTextBox,varReq){
	if(crntTextBox.value.indexOf("http://")==0){
		crntTextBox.value = crntTextBox.value.substring(7, crntTextBox.value.length);
	}
	return true;
}
function makeNumGood(crntTextBox, varReq){
	if(isNaN(crntTextBox.value) && crntTextBox.value!=""){
		errString+="Is not number\n";
		return false;
	}else{
		return true;
	}
}
function makeDateGood(mdgTextBox, varReq){
	var crntDateString;
	var errString="";
	if(mdgTextBox.value==""){
		return true;
	}
	crntDateString=mdgTextBox.value;
	crntDateString=crntDateString.replace(/-/g,"/");
	//if there are no / then error
	if(crntDateString.indexOf("/")==-1){
		errString+="Date must be in day/month/year format.  It contained no separators.\n";
	}else{	
		//split the date string into 3 (dd/mm/yy)
		var dateArray = crntDateString.split("/");
		if(dateArray.length!=3){
			errString+="Date must be in day/month/year format.\n";
		}
		//validate d, m & y
		if(dateArray[2]<0||(dateArray[2]>99&&dateArray[2]<999)||isNaN(dateArray[2])){
			errString+="Year is out of acceptable limits.\n";
		}
		if(dateArray[1]>12||dateArray[1]<1||isNaN(dateArray[1])){
			errString+="Month is out of acceptable limits\n";
		}
		//find the days in the month
		crntMonth=stripZeros(dateArray[1])
		switch(crntMonth){
			case "4": case "6": case "9": case "11":
				dayMax=30;
				break;
			case "2":
				dayMax= (dateArray[2] % 4 > 0) ? 28 : 29;
				break;
			default:
				dayMax=31;
		}
		if(dateArray[0]>dayMax||dateArray[0]<1||isNaN(dateArray[0])){
			errString+="Day is out of acceptable limits.\n";
		}
	}
	//output results
	if(errString){
		return false;
	}else{
		newDateString=dateArray[0]+"/"+dateArray[1]+"/"+dateArray[2];
		mdgTextBox.value=newDateString;
		return true;
	}
}
function makeCurrGood(crntTextBox, varReq){
	var crntCurrString="";
	var errString="";
	if(crntTextBox.value==""){
		return true;
	}
	crntCurrString = crntTextBox.value;
	crntCurrString = stripChars(",$", crntCurrString)
	crntCurrString = stripZeros(crntCurrString);
	if(isNaN(crntCurrString)){
		errString+="Currency Fields Must contain only Numbers, Commas or Dollar signs.\n";
	}
	if(errString){
		return false;
	}else{
		if(crntCurrString==""){crntCurrString="0";}
		crntTextBox.value = "" + crntCurrString;
		return true;
	}
}
function makeTimeGood(crntTextBox, varReq){
	var crntTimeString = crntTextBox.value;
	var errString="";
	crntTimeString=crntTimeString.toLowerCase();
	
	var theLen = stripChars(" \n\t\r",crntTimeString).length
	if (theLen == 0){	
		if (varReq=="R"){
			errString+="This time is a required field.\n";
		}else{
			crntTimeString="";
		}
	}else if(theLen==4&&!isNaN(crntTimeString)){
		var crntHr, crntMin;
		crntHr=crntTimeString.substr(0,2);
		crntMin=crntTimeString.substr(2,2);
		if(crntHr>23||crntHr<0){errString+="Hour is beyond acceptable limits";}
		if(crntMin>59||crntMin<0){errString+="Minute is beyond acceptable limits";}
	}else{	
		crntTimeString = crntTimeString.replace(/\./g,":");
		crntTimeString = crntTimeString.replace(/\ /g,":");
		if(crntTimeString.indexOf("pm")!=-1)
			var amPm="pm"
		else
			var amPm="am"
		crntTimeString=crntTimeString.replace(/\pm/g,"");
		crntTimeString=crntTimeString.replace(/\am/g,"");
		var timeArray = crntTimeString.split(":");
		if(timeArray[0]>23||timeArray[0]<0){
			errString+="Hour is beyond acceptable limits\n";
		}
		if(!timeArray[1]){
			timeArray[1]="00";
		}else{
			if(timeArray[1]<0||timeArray[1]>59){
				errString+="Minute is beyond acceptable limits\n";
			}
		}
		if(!timeArray[2]){
			timeArray[2]="00";
		}else{
			if(timeArray[2]<0||timeArray[2]>59){
				errString+="Second is beyond acceptable limits\n";
			}
		}
		crntTimeString=timeArray[0]+":"+timeArray[1]+":"+timeArray[2]+" "+amPm
		var result = Date.parse("1/1/1970 " + crntTimeString);
		if (isNaN(result)){
			errString+="This time is invalid. Times should be formatted as \'hh:mm tt\' am/pm can be ommitted, but if it is the time will be treated as 24hr\n";
		}
	}
	if(errString){
		return false;
	}
	crntTextBox.value=crntTimeString;
	return true;
}

