sEmailNoPeriod = "There was no domain specified (ex. mydomain.com) in your email address."
sEmailNoAt = "There must be an at symbol (@) in your email address."
sEmailInvalidChars = "There invalid characters in your email address."
sDisplayMethod = "alert"

function BrowserChecker(){

	this.ver=navigator.appVersion; this.dom=document.getElementById?1:0;
	this.mac=(this.ver.indexOf("PPC")!= -1)?1:0;	this.win=(this.ver.indexOf("Win")!= -1)?1:0;
	this.ie5up=(this.ver.indexOf("MSIE") && this.dom && parseInt(this.ver) >= 4) ?1:0;
	this.ie4=(document.all && !this.dom)?1:0; this.ie=(this.ie5up || this.ie4);
	this.ns5up=(this.ver.indexOf("MOZILLA") && this.dom && parseInt(this.ver) >= 5) ?1:0;
	this.ns4=(document.layers && !this.dom)?1:0; this.ns=(this.ns4 || this.ns5up);
	//this.duk=(this.ie || this.ns);
	return this;
	
}


function formvalidator(objForm , aValidationItems){

	this.sDisplayMethod = sDisplayMethod;
	this.oForm = objForm;
	this.arrValidationItems = aValidationItems;

	this.sFormName = objForm.name;
	this.iNoformElements = aValidationItems.length;
	this.oBrowserDom = (document.all)? document.all : document;
	this.currentErrorMessage = "";
	this.bBrowser = new BrowserChecker();
	this.validate = private_validator;
	this.removeLeading = private_removeLeadingspaces;
	this.validateEmail = private_validateEmail
	this.required = private_required
	this.nowhitespace = private_nowhitespace
	this.firstElementFocus = private_firstElementFocus
	this.processCurrentElement = private_processCurrentElement
	this.addTostring = addTostring
	this.namevaluepairs =""
	this.chk_date = private_chkdate
	this.chk_time = private_chktime
	this.chk_minutes = private_chkminutes
	this.chk_number = private_chknumber

}

function private_firstElementFocus(){
	this.oForm.reset();
}

function addTostring(name , value){
	this.namevaluepairs += name + "=" +value +"&"
}

function private_validator()
{
	var bhasNoErrors = true;
	var iCurrentElementIndex = 0
	var arrValidation;
	this.namevaluepairs =""

		while((bhasNoErrors) && (iCurrentElementIndex <= this.iNoformElements-1))
		{

			arrrCurrentItem = this.arrValidationItems[iCurrentElementIndex]
			oCurrentElement = this.oForm[arrrCurrentItem.elementName]
			sCurrentElementValue = oCurrentElement.value
			sCurrentElementType = oCurrentElement.type
			this.currentErrorMessage = arrrCurrentItem.errormessage;
				
			if ((sCurrentElementType.toLowerCase() == "textarea") || (sCurrentElementType.toLowerCase() == "hidden") || (sCurrentElementType.toLowerCase() == "text") || (sCurrentElementType.toLowerCase() == "password") || (sCurrentElementType.indexOf("select")!= -1 ))
			{

				this.addTostring(oCurrentElement.name ,  sCurrentElementValue)

				private_removeLeadingspaces(oCurrentElement)

				sCurrentElementValue = oCurrentElement.value
			
				
				if (this.processCurrentElement(oCurrentElement , arrrCurrentItem.validation))
				{
					bhasNoErrors = false;
					//break from while loop
					break;
				}
				
			}
			//
			iCurrentElementIndex = iCurrentElementIndex + 1
		}


	return bhasNoErrors
}

function private_processCurrentElement(CurrentElement,sValidation)
{

	bError = false;
	if ((typeof(sValidation) != "undefined"))
	{
		arrValidation = sValidation.split(",")
		x = 0
		while ((x < arrValidation.length) && (!bError))
			{
			
				switch (arrValidation[x].toLowerCase())
				{
					case "email":
						bError = this.validateEmail(oCurrentElement, sCurrentElementValue)
					break;
					case "required":
						bError = this.required(oCurrentElement , sCurrentElementValue)
					break;
					case "nowhitespace":
						bError = this.nowhitespace(oCurrentElement , sCurrentElementValue)
					break;
					case "eurodate":
						bError = this.chk_date(oCurrentElement , sCurrentElementValue)
					break;					
					case "time":
						bError = this.chk_time(oCurrentElement , sCurrentElementValue)
					break;					
					case "minutes":
						bError = this.chk_minutes(oCurrentElement , sCurrentElementValue)
					break;					
					case "number":
						bError = this.chk_number(oCurrentElement , sCurrentElementValue)
					break;					
				}
				x = x + 1
			}
		
	}
	return bError;
}
function private_chknumber(currentElement , sCurrentValue){

	bResults = false
	if (sCurrentValue.length < 1){
		return false;
	}

	if (!checknumber(sCurrentValue)){
		bResults = true;
	}
	if (bResults){
		displayMessage ("The data supplied for the field [" + this.currentErrorMessage + "] is not a number.")
		currentElement.focus()
		}

	return bResults 

}
function private_chktime(currentElement , sCurrentValue){
	if (sCurrentValue.length < 1){
		return false;
	}

	bResults = false

	isplit = sCurrentValue.indexOf(':');

	if (isplit == -1 || isplit == sCurrentValue.length){
		bResults = true;
		}

	
	sHour = sCurrentValue.substring(0, isplit);
	iminute = sCurrentValue.indexOf(':', isplit + 1);
	
	if (iminute == -1 || iminute == sCurrentValue.length)
		sMin = sCurrentValue.substring((sHour.length + 1));
	else
		sMin = sCurrentValue.substring((sHour.length + 1), iminute);

	if (!checkinteger(sHour)){
		bResults = true;
	}
	else if (!checkrange(sHour, 8, 22)){
		bResults = true;
	}

	if (!checkinteger(sMin)){
		bResults = true;
		}
	else if (!checkrange(sMin, 0, 59)){
		bResults = true;
	}

	if (iminute != -1)
	{
		sSec = sCurrentValue.substring(iminute + 1);
		if (!checkinteger(sSec))
		bResults = true;
		else if (!checkrange(sSec, 0, 59))
		bResults = true;
	}

	if (bResults){
		displayMessage ("The data supplied for the field [" + this.currentErrorMessage  + "] is invalid.")
		currentElement.focus()
		}
	return bResults;

}
function private_chkminutes(currentElement , sCurrentValue){
	bResultx = false
	if (sCurrentValue.length < 1){
		return false;
	}

	if (!checkrange(sCurrentValue,1,59)){
		bResultx = true
		displayMessage ("The data supplied for the field [" + this.currentErrorMessage  + "] is invalid.")
		currentElement.focus()
	}
	return bResultx
}
function private_chkdate(currentElement , sCurrentValue){
	bResult = false
	if (sCurrentValue.length < 1){
		return false;
	}
	isplit = sCurrentValue.indexOf('/');

	if (isplit == -1)
		isplit = sCurrentValue.indexOf('.');

	if (isplit == -1 || isplit == sCurrentValue.length)
		bResult = true;

	sDay = sCurrentValue.substring(0, isplit);

	monthSplit = isplit + 1;

	isplit = sCurrentValue.indexOf('/', monthSplit);

	if (isplit == -1)
		isplit = sCurrentValue.indexOf('.', monthSplit);

	if (isplit == -1 ||  (isplit + 1 )  == sCurrentValue.length)
		bResult = true;

	sMonth = sCurrentValue.substring((sDay.length + 1), isplit);

	sYear = sCurrentValue.substring(isplit + 1);

	if (!checkinteger(sMonth))
		bResult = true;
	else
	if (!checkrange(sMonth, 1, 12))
		bResult = true;
	else
	if (!checkinteger(sYear))
		bResult = true;
	else
	if (!checkrange(sYear, 0, null))
		bResult = true;
	else
	if (!checkinteger(sDay))
		bResult = true;
	else
	if (!checkday(sYear, sMonth, sDay))
		bResult = true;
	else
		bResult = false;
	
	if (bResult){
		displayMessage ("The data supplied for the field [" + this.currentErrorMessage  + "] is invalid.")
		currentElement.focus()
	}
	
	return bResult;	
}


function private_nowhitespace(currentElement , sCurrentValue)
{
	var i = 0 ;
	var bError = false;
	var sReturnString = "";
	var intNumspace = 0
	
	while ((!bError) && (i < sCurrentValue.length))
		{
			var c = sCurrentValue.charCodeAt(i);
			if (c == 32)
			{
				// there is a space in the string somewhere
				bError = true
				displayMessage ("The data supplied for the field [" + this.currentErrorMessage  + "] has a space in it.")
				currentElement.focus()
			}
			i = i + 1
		}	
		
		
	return bError ;

}
function private_required(currentElement , sCurrentValue)
{
	bError = false
	if (sCurrentValue.length <= 0) {
		displayMessage (this.currentErrorMessage  + " is a required field")
		currentElement.focus()
		bError = true
	}
	return bError
}

function private_validateEmail(currentElement , sEmailValue)
{
	var bValidateEmailResult = false
	var iIndexofAt = sEmailValue.indexOf("@", 0)
	var iIndexofDot = sEmailValue.indexOf(".", parseInt(iIndexofAt) + 1)
	if (iIndexofAt == -1)
	{
		//emailaddress has no @ char
		displayMessage (sEmailNoAt)
		 bValidateEmailResult = true
		 currentElement .focus()
	}
	else if (iIndexofDot == -1)
	{
		//emailaddress has no . char after the @ char
		displayMessage (sEmailNoPeriod)
		 bValidateEmailResult = true
		 currentElement .focus()
	}
	else if(parseInt(sEmailValue.length - iIndexofDot) < 3)
	{
		displayMessage (sEmailNoPeriod)
		currentElement .focus()
	}
	else if (hasInvalidChars(sEmailValue , "/!£$%^&*()'+=") )
	{
		displayMessage(sEmailInvalidChars)
		bValidateEmailResult = true
		currentElement .focus()
	}
	else
	{
	 bValidateEmailResult = false
	}
	
	return bValidateEmailResult;
}

function hasInvalidChars(sValue , sInvalidChars)
{
	var blnError = false;
	var i = 0;
	while ((!blnError) && ( i < sInvalidChars.length))
	{
		if (sValue.indexOf(sInvalidChars.charAt(i) , 0) > -1)
		{
			blnError = true;
		}
	 	i = i + 1
	}
	return blnError;
}

function private_removeLeadingspaces(oCurrentElement)
{
	var i = 0 ;
	var blnDone = false;
	var sReturnString = "";
	var intNumspace = 0
	value = oCurrentElement.value
	sReturnString = value
	x = 0
	while ((!blnDone) && (i < value.length))
		{
		
			var c = value.charCodeAt(i);
			
			if ((c == 32) && (x==0))
			{
				sReturnString  = sReturnString.substring(1 , sReturnString.length);
			}
			else
			{
				blnDone = true
			}
			i = i + 1
		}	
	//sReturnString  = value.substring(intNumspace , value.length);
	if (oCurrentElement.type.toLowerCase() == "textarea") {
		//oCurrentElement.innerHTML = sReturnString
	}else{
	oCurrentElement.value = sReturnString
	}
	return sReturnString ;
}

function displayMessage (strErrorMsg){

	strErrorMsgd = strErrorMsg.split ("_" );
	strErrorMsg= strErrorMsgd.join(" ");
	
	if (sDisplayMethod.toLowerCase() != "alert")
	{
		if(document.all)
		{
			document.all.errMessage.innerHTML = strErrorMsg;
		}
		else
		{
			document.layers.errMessage.document.open()
			document.layers.errMessage.document.write(strErrorMsg);
			document.layers.errMessage.document.close()
		}
	}
	else
	{
		alert (strErrorMsg)
	}
}

function checkday(checkYear, checkMonth, checkDay)
{
	//true if passes 
	//false if it doesnot pass
	bResult = true
	maxDay = 31;
	if (checkMonth == 4 || checkMonth == 6 ||checkMonth == 9 || checkMonth == 11)
		maxDay = 30;
	else if (checkMonth == 2)
	{
		if (checkYear % 4 > 0)
			maxDay =28;
		else if (checkYear % 100 == 0 && checkYear % 400 > 0)
			maxDay = 28;
		else
			maxDay = 29;
	}
	bResult = checkrange(checkDay, 1, maxDay);
	return bResult
}

function checkrange(object_value, min_value, max_value)
{
	bResult = true

	if (object_value.length == 0)
		bResult = false;

	if (!checknumber(object_value)){
		bResult = false;
	}		
	else{
		bResult = numberrange(eval(object_value), min_value, max_value);
	}
	return bResult
}

function checkinteger(object_value)
{
	bResult = true

	if (object_value.length == 0)
		bResult = false;

	var decimal_format = ".";
	var check_char = object_value.indexOf(decimal_format);

	if (check_char == -1){
		bResult = checknumber(object_value);
	}else{
		bResult	= false
	}
	return bResult	
}


function numberrange(object_value, min_value, max_value)
{
	bResult = true

	if (min_value != null)
	{
		if (object_value < min_value)
			bResult = false;
	}

	if (max_value != null)
	{
		if (object_value > max_value)
			bResult = false;
	}

	return bResult;
}


function checknumber(object_value)
{
	bResult = true
	if (object_value.length == 0)
		bResult = false


	var start_format = " .+-0123456789";
	var number_format = " .0123456789";
	var check_char;
	var decimal = false;
	var trailing_blank = false;
	var digits = false;

	check_char = start_format.indexOf(object_value.charAt(0));

	if (check_char == 1)
		decimal = true;
	else if (check_char < 1)
		bResult = false;

	for (var i = 1; i < object_value.length; i++)
	{
		check_char = number_format.indexOf(object_value.charAt(i));
		if (check_char < 0)
			bResult = false;
		else if (check_char == 1)
		{
			if (decimal)
				bResult = false;
			else
				decimal = true;
		}
		else if (check_char == 0)
		{
			if (decimal || digits)	
				trailing_blank = true;
		}
		else if (trailing_blank)
			bResult = false;
		else
			digits = true;
	}	

	return bResult;
}

var  formval = null;

function validate_form(obj , validationItems){
	formval = new formvalidator(obj, validationItems.items);
	bResult = formval.validate();
	if (((obj.name.toLowerCase() == "frmregister") || (obj.name.toLowerCase() == "frmpersonaldetails")) && (bResult)){
		bResult=(obj.password.value == obj.confirmpassword.value)
		if(!bResult){
			displayMessage("password and confirm password field dont not match, please check")
		}
	}
	return bResult
}


function setPaging(oFrm , iPageNo){
	oFrm.page.value = iPageNo
	oFrm.submit()
}

function validationItems(){
	this.items = new Array()
	this.addItem = addItem	;
	
	function addItem(eName, validation, message){
		valItem = new Object();
		valItem.elementName =eName;
		valItem.validation =validation;
		valItem.errormessage =message;
		this.items[this.items.length] = valItem;
	}
	
}