/*
#########################################################################################

	Validation Script Version - 1.1

	Written By	 			: Gagan Bagga
	Last Updated On 		: 24-Mar-2005
	Purpose					: To validate the form elements
	Functions & Parameters	: 

		Name of the Function		Parameters							Return Type

	1.	validate_form()				Referernce of the form				Boolean
	2.	lr_trim()														String
	3.	chkSplCharacters()			Reference of an text element	
	4.	chkSplFormat()				Reference of an text element

#########################################################################################
*/

var bValid = 1;

function lr_trim()
{
	return this.replace(/^\s+/,'').replace(/\s+$/,'');
}
String.prototype.trim = lr_trim;

function chkSplCharacters(cntrl)
{
	var splChars = "~^{}";
    for (var i = 0; i < cntrl.value.length; i++)
    {
		if (splChars.indexOf(cntrl.value.charAt(i)) != -1)
		{
			alert ("Following special characters are not allowed.\n\n" + splChars);
			cntrl.select();
            bValid = 0;
            break;
        }
		if (cntrl.value.indexOf("@#$") != -1)
		{
			alert ("Invalid combination of special characters (\'@#$\')");
			cntrl.select();
            bValid = 0;
            break;
        }
	}
}

function chkSplFormat(cntrl)
{
	var format = cntrl.getAttribute("format").toLowerCase();
	switch(format)
	{
		case 'email':
			var addr = cntrl.value;
			if (!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/.test(addr))
			{
				alert("This is not a valid email address,\n as it is not in the correct format: xxx@xxx.xxx");
				cntrl.select();
				bValid = 0;
			}
			break;
		case 'url':
			var URLaddr = cntrl.value;
			var RegExp = /^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/;
			if(!RegExp.test(URLaddr))
			{
				alert("This is not a valid URL address");
				cntrl.select();
				bValid = 0;
			}
			break;
		case 'phone/fax':
			var phoneFax = cntrl.value;
			var validChars = ", +-0123456789";
			for(i=0;i < phoneFax.length;i++)
				if(validChars.indexOf(phoneFax.charAt(i)) == -1)
				{
					alert("Please enter a valid " + cntrl.getAttribute("label"));
					cntrl.select();
					bValid = 0;
					break;
				}
			break;
		case 'numeric' :
			val = cntrl.value;
			if(parseFloat(val,10) != (val*1))
			{
				alert("Please enter only numeric value for " + cntrl.getAttribute("label"));
				cntrl.select();
				bValid = 0;
			}
			break;
		case 'currency' :
			val = cntrl.value;
			if(parseFloat(val,10) != (val*1))
			{
				alert("Please enter only numeric value for " + cntrl.getAttribute("label"));
				cntrl.select();
				bValid = 0;
			}			
			if(val <= 0)
			{
				alert("Please enter a " + cntrl.getAttribute("label") + " of at least 1");
				cntrl.select();
				bValid = 0;
			}
			break;
		case 'wholeinteger' :
			val = cntrl.value;
			if(parseFloat(val,10) != (val*1))
			{
				alert("Please enter only numeric value for \"" + cntrl.getAttribute("label") + "\"");
				cntrl.select();
				bValid = 0;
			}			
			if(val <= 0)
			{
				alert("Zero (0) / negative value is not allowed for \"" + cntrl.getAttribute("label") + "\"");
				cntrl.select();
				bValid = 0;
			}
			if(val.indexOf(".") != -1)
			{
				alert("Only whole numbers are allowed for \"" + cntrl.getAttribute("label") + "\"");
				cntrl.select();
				bValid = 0;
			}
			break;
		case 'username/password':
			var splChars = "~!@#$%^&*()-+=[]\\\;,.<>/{}|\":?0123456789";
			for (var i = 0; i < cntrl.value.length; i++)
			{
				if (splChars.indexOf(cntrl.value.charAt(i)) != -1)
				{
					alert ("None of the special characters / blank spaces are allowed for " + cntrl.getAttribute("label"));
					cntrl.select();
			        bValid = 0;
			        break;
			    }
			}
		case 'alphanumeric':
			var splChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
			for (var i = 0; i < cntrl.value.length; i++)
			{
				if (splChars.indexOf(cntrl.value.charAt(i)) != -1)
				{
				}
				else
			    {
			        alert ("These letters are not allowed for " + cntrl.getAttribute("label"));
					cntrl.select();
			        bValid = 0;
			        break;
			    }
			}		
	}
}

function doComparision(cntrl1, cntrl2)
{
	if(cntrl1.value != cntrl2.value)
	{
		alert("\"" + cntrl2.getAttribute("label") + "\" and \"" + cntrl1.getAttribute("label") + "\" do not match");
		cntrl1.value="";
		cntrl2.value="";
		cntrl2.focus();
		bValid = 0;
	}
}

/* Example to use datecheck

<form ID="Form1">
From date <input type=text name=from onBlur="checkdate(this)" size=11 maxlength=11 ID="Text1">
To date   <input type=text name=to   onBlur="checkdate(this)" size=11 maxlength=11 ID="Text2">
<input type=button name=formatbutton onClick="doDateCheck(this.form.from, this.form.to);" value="Check" ID="Button1">
</form>

*/

function checkdate(objName) {
	var datefield = objName;
	if (chkdate(objName) == false) {
	datefield.select();
	alert("That date is invalid.  Please try again.");
	datefield.focus();
	return false;
	}
	else {
	return true;
	}
}

function chkdate(objName) {
	var strDatestyle = "US"; //United States date style
	//var strDatestyle = "EU";  //European date style
	var strDate;
	var strDateArray;
	var strDay;
	var strMonth;
	var strYear;
	var intday;
	var intMonth;
	var intYear;
	var booFound = false;
	var datefield = objName;
	var strSeparatorArray = new Array("-"," ","/",".");
	var intElementNr;
	var err = 0;
	var strMonthArray = new Array(12);
	strMonthArray[0] = "Jan";
	strMonthArray[1] = "Feb";
	strMonthArray[2] = "Mar";
	strMonthArray[3] = "Apr";
	strMonthArray[4] = "May";
	strMonthArray[5] = "Jun";
	strMonthArray[6] = "Jul";
	strMonthArray[7] = "Aug";
	strMonthArray[8] = "Sep";
	strMonthArray[9] = "Oct";
	strMonthArray[10] = "Nov";
	strMonthArray[11] = "Dec";
	strDate = datefield.value;
	if (strDate.length < 1) {
	return true;
	}
	for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
	if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {
	strDateArray = strDate.split(strSeparatorArray[intElementNr]);
	if (strDateArray.length != 3) {
	err = 1;
	return false;
	}
	else {
	strDay = strDateArray[0];
	strMonth = strDateArray[1];
	strYear = strDateArray[2];
	}
	booFound = true;
	}
	}
	if (booFound == false) {
	if (strDate.length>5) {
	strDay = strDate.substr(0, 2);
	strMonth = strDate.substr(2, 2);
	strYear = strDate.substr(4);
	}
	}
	if (strYear.length == 2) {
	strYear = '20' + strYear;
	}
	// US style
	if (strDatestyle == "US") {
	strTemp = strDay;
	strDay = strMonth;
	strMonth = strTemp;
	}
	intday = parseInt(strDay, 10);
	if (isNaN(intday)) {
	err = 2;
	return false;
	}
	intMonth = parseInt(strMonth, 10);
	if (isNaN(intMonth)) {
	for (i = 0;i<12;i++) {
	if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) {
	intMonth = i+1;
	strMonth = strMonthArray[i];
	i = 12;
	}
	}
	if (isNaN(intMonth)) {
	err = 3;
	return false;
	}
	}
	intYear = parseInt(strYear, 10);
	if (isNaN(intYear)) {
	err = 4;
	return false;
	}
	if (intMonth>12 || intMonth<1) {
	err = 5;
	return false;
	}
	if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
	err = 6;
	return false;
	}
	if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
	err = 7;
	return false;
	}
	if (intMonth == 2) {
	if (intday < 1) {
	err = 8;
	return false;
	}
	if (LeapYear(intYear) == true) {
	if (intday > 29) {
	err = 9;
	return false;
	}
	}
	else {
	if (intday > 28) {
	err = 10;
	return false;
	}
	}
	}
	if (strDatestyle == "US") {
	datefield.value = strMonthArray[intMonth-1] + " " + intday+" " + strYear;
	}
	else {
	datefield.value = intday + " " + strMonthArray[intMonth-1] + " " + strYear;
	}
	return true;
}
function LeapYear(intYear) {
	if (intYear % 100 == 0) {
	if (intYear % 400 == 0) { return true; }
	}
	else {
	if ((intYear % 4) == 0) { return true; }
	}
	return false;
}

function doDateCheck(from, to) {
	if (Date.parse(from.value) <= Date.parse(to.value)) {
		//alert("The dates are valid.");
	}
	else {
	if (from.value == "" || to.value == "") 
		alert("Both dates must be entered.");
	else 
		alert("To date must occur after the from date.");
	}
}


function validate_form(oFrm)
{
	var aElements = oFrm.elements;
	bValid = 1;
	for(var i=0;i < aElements.length;i++)
	{
		//if(!(aElements[i].disabled || aElements[i].getAttribute("readonly") || aElements[i].getAttribute("with-no-check") != null))
		if(!(aElements[i].disabled || aElements[i].getAttribute("with-no-check") != null))
		{
			if(aElements[i].type=="text" || aElements[i].type=="textarea" || aElements[i].type=="password")
			{
				if(aElements[i].type != "password")
					aElements[i].value = aElements[i].value.trim();
				if(aElements[i].value.length > 0)
				{
					if(aElements[i].getAttribute("format") == null)
						chkSplCharacters(aElements[i]);
					else if(aElements[i].getAttribute("format").toLowerCase() != "none")
						chkSplFormat(aElements[i]);
					if(aElements[i].getAttribute("compareWith") != null && bValid==1)
						doComparision(aElements[i], eval(aElements[i].getAttribute("compareWith")));
				
				}
				else if(aElements[i].getAttribute("required") != null)
				{
					alert("Please enter " + aElements[i].getAttribute("label"));
					aElements[i].focus();
					bValid = 0;
				}
				if(aElements[i].type=="textarea" && aElements[i].getAttribute("maxlength") != null && bValid==1)
					if(aElements[i].value.length > aElements[i].getAttribute("maxlength"))
					{
						alert(aElements[i].getAttribute("label") + " should not exceed the maximum length of " + aElements[i].getAttribute("maxlength") + " characters");
						aElements[i].focus();
						bValid = 0;
					}
				if(aElements[i].getAttribute("minlength") != null && bValid==1)
					if(aElements[i].value.length < aElements[i].getAttribute("minlength"))
					{
						alert(aElements[i].getAttribute("label") + " should be at least of " + aElements[i].getAttribute("minlength") + " characters");
						aElements[i].focus();
						bValid = 0;
					}
			}
			else if(aElements[i].type=="file")
			{
				if(aElements[i].value.trim() == "")
				{
					if(aElements[i].getAttribute("required") != null)
					{
						alert("Please enter " + aElements[i].getAttribute("label"));
						aElements[i].select();
						bValid = 0;
						
					}
				}
				else
				{
					var vFileName = aElements[i].value.trim();
					iDotPos = vFileName.lastIndexOf(".")
					if(iDotPos <= 0)
					{
						alert("You must specified the valid value for the field \"" + aElements[i].getAttribute("label") + "\"");
						aElements[i].select();
						bValid = 0;
					}
					else
					{
						if(aElements[i].getAttribute("filter") != null)
						{
							var aValidFileTypes = aElements[i].getAttribute("filter").split("/");
							var bValidFile = false;
							for(var ctr = 0; ctr < aValidFileTypes.length; ctr++)
							{
								var vFileExt = vFileName.substring(iDotPos);
								if(vFileExt.toLowerCase() == aValidFileTypes[ctr])
								{
									bValidFile = true; break;
								}
							}
							if(!bValidFile)
							{
								alert("System allows only the following file types\n\n{" + aElements[i].getAttribute("filter") + "}");
								aElements[i].select();
								bValid = 0;
							}
						}
					}					
				}
				
			}
			else if(aElements[i].type == "select" || aElements[i].type == "select-one") // If it is a combox box
			{
				if(aElements[i][aElements[i].selectedIndex].value=="" && aElements[i].getAttribute("required") != null)
				{
					alert("Please select " + aElements[i].getAttribute("label"));
					aElements[i].focus();
					bValid = 0;
				}
			}
			else if(aElements[i].type == "select-multiple") // If it is a list box
			{
				if(aElements[i].length==0 && aElements[i].getAttribute("required") != null)
				{
					alert("Please enter \"" + aElements[i].getAttribute("label") + "\"");
					aElements[i].focus();
					bValid = 0;
				}
			}
			else if(aElements[i].type == "radio") // If it is a list box
			{
				var objRadioGroup = oFrm.elements[aElements[i].name];
				var bChecked = false;
				if (objRadioGroup.length == null)
				{
					if (objRadioGroup.checked)
						bChecked = true;
				}
				else
				{
					for(var j=0; j< objRadioGroup.length; j++)
					{
						if(objRadioGroup[j].checked)
						{
							bChecked = true;
							break;
						}
					}
				}
				if(!bChecked && aElements[i].getAttribute("required") != null)
				{
					alert("Please select " + aElements[i].getAttribute("label"));
					aElements[i].focus();
					bValid = 0;
				}
			}			
		}
		if(!bValid) 
			return false;
	}
	return true;
}