function ValidationField() 
{
	this.FieldName = null ; // form field name
	this.ReqMessage = null ; // Required field message
	this.Type = null; // type of the form field eg. checkbox,text
	this.Expression = null; // regular expression type - acceptable values are defined underneath
	this.ExpMessage = null; // message if regular expression check fails
	this.CompMessage = null; // comparison message
	this.CompDepType = null; // comparison dependency type - 'field' or 'value'
	this.CompOperator = null; // STRINGEQ, RANGE
	this.CompValue1 = null; // minimum value - also field value
	this.CompValue2 = null; // maximum value - empty if STRINGEQ - only for range.
}

function performValidations(f)
{
	if(checkRequiredFields(f))
	{
		if(checkRegularExpressionFields(f))
		{
			if(checkComparisonFields(f))
				return true;
			else
				return false;
		}
		else
			return false;
	}
	else
		return false;
}
function checkRequiredFields(f) 
{
	var sWarning = "" ;
	var i ;
	for (i=0;i<aFields.length;i++) 
	{
		var aField = aFields[i] ;
		if(aField.ReqMessage != null)
		{
			switch (aField.Type)
			{
				case "text": 
					var fieldValue = f[aField.FieldName].value ;
					fieldValue = trimString(fieldValue) ;
					f[aField.FieldName].value = fieldValue;
					if (fieldValue=="") 
						sWarning += "\n - " + aField.ReqMessage ;
					break;
				case "textarea":
					var fieldValue = f[aField.FieldName].value ;
					fieldValue = trimString(fieldValue) ;
					f[aField.FieldName].value = fieldValue;
					if (fieldValue.length == 0)
						sWarning += "\n - " + aField.ReqMessage ;
					break;
				case "password": 
					var fieldValue = f[aField.FieldName].value ;
					fieldValue = trimString(fieldValue);
					f[aField.FieldName].value = fieldValue;
					if (fieldValue=="") 
						sWarning += "\n - " + aField.ReqMessage ;
					break;
				case "checkbox":
					if(!f[aField.FieldName].checked) 
						sWarning += "\n - " + aField.ReqMessage ;
					break;
				case "radio":
					if(GetSelectedRadio(f[aField.FieldName]) == -1) 
						sWarning += "\n - " + aField.ReqMessage ;
					break;
				case "select":
					var theObjName = aField.FieldName;
					if(getValue(eval('f.' + theObjName)) == "NULL") 
						sWarning += "\n - " + aField.ReqMessage ;
					break;
			}
		}
	}
	if (sWarning != "") 
	{
		sWarning = "Following form fields are required:" + sWarning ;
		window.alert(sWarning) ;
		return false;
	}
	else
		return true;
}

function wordcount(string) 
{
	var a = string.split(/\s+/g); 
	return a.length;
}

function GetSelectedRadio(theGroupName)
{
	var i;

	for( i=0; i<theGroupName.length; ++i)
		if( theGroupName[i].checked)
			return theGroupName[i].value;

	// default (non selected)
	return -1;
}

function trimString(sTemp) 
{
	var iStart = 0 ;
	var iEnd = 1 ;

	while(sTemp.charAt(iStart) == " ") iStart++;
	while(sTemp.charAt(sTemp.length - iEnd) == " ") iEnd++;

	return sTemp.substring(iStart, sTemp.length - iEnd + 1);
}

function checkRegularExpressionFields(f) 
{
	var sWarning = "" ;
	var i ;
	for (i=0;i<aFields.length;i++) 
	{
		var aField = aFields[i] ;
		if(aField.ExpMessage != null)
		{
			var fieldValue = f[aField.FieldName].value ;
			fieldValue = trimString(fieldValue);
			f[aField.FieldName].value = fieldValue;
			if(fieldValue.length > 0)
			{
				var regExp = aField.Expression;
				if(!RegularExpressionCheck(fieldValue,regExp))
						sWarning += "\n - " + aField.ExpMessage ;
			}
		}
	}
	if (sWarning != "") 
	{
		sWarning = "Please ensure:" + sWarning ;
		window.alert(sWarning) ;
		return false;
	}
	else
		return true;
}

function RegularExpressionCheck(theValue,theExpType) 
{
	var theExp;
	switch (theExpType)
	{
		case "EM": 
			theExp = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; // asareen@dvci.com
			break;
		case "ZIP": 
			theExp = /(^\d{5}$)|(^\d{5}-\d{4}$)/; // 99999 five digit or 9999-9999 five plus four
			break;
		case "AD": 
			theExp = /\d+/; // any number of digits
			break;
		case "AD3": 
			theExp = /\d{3}/; // 999
			break;
		case "AD4": 
			theExp = /\d{4}/; // 9999
			break;
		case "AD15": 
			theExp = /\d{15}/; // 999999999999999 - for credit cards
			break;
		case "AD16": 
			theExp = /\d{16}/; // 9999999999999999 - for credit cards
			break;
		case "USP": 
			theExp = /^[2-9]\d{2}-\d{3}-\d{4}$/; //973-775-6456
			break;
		case "BAD": 
			theExp = /^([1-zA-Z0-1@.\s]{1,255})$/; //checks for existence of things like ‘,\,*,&,$,<,>
			break;
		case "MM/dd/yyyy":
			theExp = /(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d/;
			break;
		default : 
			alert("None chosen");
	}
	var rx = new RegExp(theExp);
	if(theExp.test(theValue))
		return true;
	else
		return false;
}
function checkComparisonFields(f)
{
	var sWarning = "" ;
	var i ;
	for (i=0;i<aFields.length;i++) 
	{
		var aField = aFields[i] ;
		if(aField.CompMessage != null)
		{
			switch (aField.CompDepType)
			{
				case "field": 
					var fieldValue = f[aField.FieldName].value ;
					var compFieldValue = f[aField.CompValue1].value;
					fieldValue = trimString(fieldValue) ;
					compFieldValue = trimString(compFieldValue) ;
					f[aField.FieldName].value = fieldValue;
					f[aField.CompValue1].value = compFieldValue;
					if(aField.CompOperator == "STRING=")
					{
						if (fieldValue != compFieldValue) 
							sWarning += "\n - " + aField.CompMessage ;
						break;
					}
				case "requiredOr": 
					var fieldValue = f[aField.FieldName].value ;
					var compFieldValue = f[aField.CompValue1].value;
					fieldValue = trimString(fieldValue) ;
					compFieldValue = trimString(compFieldValue) ;
					if ((fieldValue=="") && (compFieldValue==""))
						sWarning += "\n - " + aField.CompMessage ;
					break;
				case "wordcount": 
					var fieldValue = f[aField.FieldName].value ;
					var maxNumber = f[aField.CompValue1].value;
					fieldValue = trimString(fieldValue) ;
					if (wordcount(fieldValue) > maxNumber)
						sWarning += "\n - " + aField.CompMessage ;
					break;
				case "charcount": 
					var fieldValue = f[aField.FieldName].value ;
					var maxNumber = aField.CompValue1;
					fieldValue = trimString(fieldValue) ;
					if (fieldValue.length > maxNumber)
						sWarning += "\n - " + aField.CompMessage ;
					break;
				case "value": 
					var fieldValue = f[aField.FieldName].value ;
					fieldValue = trimString(fieldValue);
					f[aField.FieldName].value = fieldValue;
					if(aField.CompOperator == "<>")
					{
						var minVal = parseInt(aField.CompValue1);
						var maxVal = parseInt(aField.CompValue2);
						var theVal = parseInt(fieldValue);
						if ((theVal > maxVal) || (theVal < minVal)) 
							sWarning += "\n - " + aField.CompMessage ;
						break;
					}
					if(aField.CompOperator == ">")
					{
						var compVal = parseInt(aField.CompValue1);
						var theVal = parseInt(fieldValue);
						if (theVal < compVal)
							sWarning += "\n - " + aField.CompMessage ;
						break;
					}
					if(aField.CompOperator == "<")
					{
						var compVal = parseInt(aField.CompValue1);
						var theVal = parseInt(fieldValue);
						if (theVal > compVal)
							sWarning += "\n - " + aField.CompMessage ;
						break;
					}
					if(aField.CompOperator == "=")
					{
						var compVal = parseInt(aField.CompValue1);
						var theVal = parseInt(fieldValue);
						if (theVal != compVal)
							sWarning += "\n - " + aField.CompMessage ;
						break;
					}
			}
		}
	}
	if (sWarning != "") 
	{
		sWarning = "Please note:" + sWarning ;
		window.alert(sWarning) ;
		return false;
	}
	else
		return true;
}

function getValue(sObj)
{
	return sObj.options[sObj.selectedIndex].value;
}

function replaceSingleQuotes(f)
{
	for (i=0; i < f.elements.length; i++)
	{
		if((f.elements[i].type == "text")||(f.elements[i].type == "password")||(f.elements[i].type == "textarea"))
		{
			var theVal = f.elements[i].value;
			theVal = replace(theVal,"'","''");
			f.elements[i].value = theVal;
		}
	}
}
function replace(string,text,by)
{
    var strLength = string.length
    var txtLength = text.length;
    if ((strLength == 0) || (txtLength == 0))
    return string;
    var i = string.indexOf(text);
    if ((!i) && (text != string.substring(0,txtLength)))
    return string;
    if (i == -1)
    return string;
    var newstr = string.substring(0,i) + by;
    if (i+txtLength < strLength)
    newstr += replace(string.substring(i+txtLength,strLength),text,by);
    return newstr;
}

function daysInFebruary (year)
{
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

function DaysArray(n) 
{
	aDaysArray = Array(n);
	for (var i = 1; i <= n; i++) 
	{
		aDaysArray[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {aDaysArray[i] = 30}
		if (i==2) {aDaysArray[i] = 29}
	} 
	return aDaysArray
}

function isDate(dtStr)
{
	var dtCh = "/";
	var daysInMonth = DaysArray(12);
	var pos1=dtStr.indexOf(dtCh);
	var pos2=dtStr.indexOf(dtCh,pos1+1);
	var strMonth=dtStr.substring(0,pos1);
	var strDay=dtStr.substring(pos1+1,pos2);
	var strYear=dtStr.substring(pos2+1);
	strYr=strYear;
	if (strDay.charAt(0)=="0" && strDay.length>1) 
		strDay=strDay.substring(1);
	if (strMonth.charAt(0)=="0" && strMonth.length>1) 
		strMonth=strMonth.substring(1);
	for (var i = 1; i <= 3; i++) 
	{
		if (strYr.charAt(0)=="0" && strYr.length>1) 
			strYr=strYr.substring(1);
	}
	month=parseInt(strMonth);
	day=parseInt(strDay);
	year=parseInt(strYr);
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month])
	{
		alert("The date is not valid.");
		return false;
	}
	return true;
}

function validateDates(yearsBefore)
{
	var f = document.forms[0];
	var currentDate = new Date();
	var birthDate = new Date();
	birthDate.setMonth(getValue(f.theMonth) - 1);
	birthDate.setDate(getValue(f.theDay));
	birthDate.setYear(getValue(f.theYear));
	var theYear = currentDate.getYear() - yearsBefore;
	var theDate = new Date();
	theDate.setMonth(currentDate.getMonth());
	theDate.setDate(currentDate.getDate());
	theDate.setYear(theYear);
	if (birthDate > theDate)
	{
		alert("You have to be " + yearsBefore + " years of age to register.");
		return false;
	}
	return true;
}

function validateBirthDateInRange(minYears,maxYears,theDate)
{
	var f = document.forms[0];
	var compDate = new Date(theDate);

	var birthDate = new Date();
	birthDate.setMonth(getValue(f.theMonth) - 1);
	birthDate.setDate(getValue(f.theDay));
	birthDate.setYear(getValue(f.theYear));

	var minYear = compDate.getYear() - minYears;
	var minDate = new Date();
	minDate.setMonth(compDate.getMonth());
	minDate.setDate(compDate.getDate());
	minDate.setYear(minYear);
	
	var maxYear = compDate.getYear() - maxYears;
	var maxDate = new Date();
	maxDate.setMonth(compDate.getMonth());
	maxDate.setDate(compDate.getDate());
	maxDate.setYear(maxYear);

	if(birthDate > minDate)
		return "less";
	else if(birthDate < maxDate)
		return "over";
	else
		return "ok";
}

