//Created by Sidhanta Shrestha
//Created on 20080512
//Purpose : To include all validation for form

//Used as: <Control GeneralSettings="settings"
//					IfEqualTo="fieldName:value" (if this field is equal to value then only go on for validation)
//					IsRequired="[yes]/[no]" DataType="number"
//					DataType="[email]/[number]/[phone]/[dropdown]/[text]/[all]"
//					Caption="ControlName to give alert" 
//					CustomValidation="functionName();" >


//Constants
var VALID = 1001;
var REQUIRE_VALIDATION = 1002;
var NOT_VALID = 1003;

//Charecter pool. Add more char that you like;
var NUMBER_POOL = "0123456789";
var DECIMAL_POOL = "0123456789.";
//var TEXT_POOL = NUMBER_POOL + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_!@#$,.<>?/\|+=()&%*~`[]{};:'"" ";

//Validation error message
var mustFill = " must be filled in."	//Date must be filled in.
var notValid = " is not valid."			//Date is not valid.
var phoneFormat = "Should be in format #### #######" //Phone is not valid
                                                     //Should be in format #### #######
var mustSelect = " must be selected."	//Dropdown must be selected                                                     


//Browser checking
var isIE = (document.all) ? true : false;

//Main function to validate
function IsValidate(objForm)
{
	var i, obj, DataType, caption, ifEqualTo;
	var retError, blnContinue, arrIfEqualTo;
	
	for(i=0;i<objForm.elements.length;i++)
	{
		blnContinue = true;	
		obj = objForm.elements[i];		
		
		//Get the value for IfEqualTo
		if(isIE)
		{
			if(obj.IfEqualTo)			
				ifEqualTo = obj.IfEqualTo;
			else
				ifEqualTo = "";
		}		
		else
			ifEqualTo = getAttribute(obj,"ifequalto");
		
		//Get the value for DataType
		if(isIE)
		{
			if(obj.DataType)			
				DataType = obj.DataType.toLowerCase();
			else
				DataType = "";
		}		
		else
			DataType = getAttribute(obj,"datatype");	
	
		//Get the value for Caption
		if(isIE)
		{
			if(obj.Caption)
				caption = obj.Caption.replace("<b>","").replace("</b>","");
			else
				caption = obj.id;
		}
		else
		{
			caption = getAttribute(obj,"caption");
			if(caption == "")
				caption = obj.id;
		}
		caption = caption.replace("<b>","").replace("</b>","");
		
		if(ifEqualTo != "")
		{
			arrIfEqualTo = ifEqualTo.split(":");
			if(arrIfEqualTo.length == 2 || arrIfEqualTo.length == 4)
			{
				if(arrIfEqualTo.length == 2)	
				{
					if(eval("objForm." + arrIfEqualTo[0]).value != arrIfEqualTo[1])
						blnContinue = false;
				}
				else
				{
					if(eval("objForm." + arrIfEqualTo[0]).value != arrIfEqualTo[1] || eval("objForm." + arrIfEqualTo[2]).value != arrIfEqualTo[3])
						blnContinue = false;
				}		
			}			
		}
				
		//Start validation
		if(blnContinue)
		{
			//If DataType present then only validate
			if(DataType != "")
			{
				//Check if required
				retError = CheckRequired(obj, DataType, caption);
				if(retError != VALID && retError != REQUIRE_VALIDATION)
				{
					alert(retError);
					try{
						obj.focus();
						}catch(e){}
					return false;	
				}
											
				if(retError == REQUIRE_VALIDATION)
				{
					//Validate for [email]
					if(DataType == 'email')
						retError = CheckEmail(obj, caption);
					//Validate for [number]
					else if(DataType == 'number')
						retError = CheckNumber(obj,caption);
					//Validate for [phone]
					else if(DataType == 'phone')
						retError = CheckPhone(obj,caption);
					//Validate for [dropdown]
					else if(DataType == 'dropdown')
						retError = CheckDropDown(obj,caption);	
					//Validate for [dollar]
					else if(DataType == 'dollar')
						retError = CheckDollar(obj,caption);	
					//Validate for [text]
					else if(DataType == 'text')
						//retError = CheckText(obj,caption);		
						retError = VALID;
					//Validate for [all]
					else if(DataType == 'all')
						retError = VALID;
					
					//Parse the output from validation function
					if(retError != VALID)
					{
						alert(retError);
						try{
							obj.focus();
							}catch(e){}
						return false;	
					}
				}
				//End of if(retError == REQUIRE_VALIDATION)
			}
			//End of if(DataType != "") 
		}
		//End of if(blnContinue)
	}
	//End of for loop
	
	//If everything ok then return true
	return true;
}

//function to return node value; used for non IE browsers only
function getAttribute(item, aName)
{
	var i;
	for(i=0;i<item.attributes.length;i++)
	{
		if(item.attributes[i].nodeName == aName.toLowerCase())
			return(item.attributes[i].nodeValue.replace("<b>","").replace("</b>",""));
	}
	
	return "";
}

///==================================================================================
/// individual validation starts from here
///==================================================================================

//Function to check valid number
function CheckDropDown(obj, caption)
{
	if(obj.value == "0" || obj.value == " ")
		return caption + mustSelect;
	else
		return VALID;
}


//Function to check text (a-z A-Z 0-9 _-@#$!| etc)
function CheckText(obj, caption)
{
	if(!CheckPool(obj.value,TEXT_POOL))
			return caption + notValid;		
			
	return VALID;		
			
}


//Function to check valid number
function CheckNumber(obj, caption)
{
	if(!CheckPool(obj.value,NUMBER_POOL))
			return caption + notValid;
			
	return VALID;
}

//Function to check valid amount (dollar)
function CheckDollar(obj, caption)
{
	var realValue = Trim(obj.value);
	
	if(realValue.indexOf("$") != -1 && realValue.charAt("0") != "$")
		return caption + notValid;
		
	realValue = Trim(obj.value.replace("$",""));	
	
	if(!CheckPool(realValue,DECIMAL_POOL))
		return caption + notValid;
	
	obj.value = Trim(obj.value);		
	return VALID;
}


//Function to check valid number/char of given pool
function CheckPool(val, strPool)
{
	var i;
	
	for(i=0;i<val.length;i++)
	{
		if(strPool.indexOf(val.charAt(i)) == -1)
			return false;
	}
	
	return true;
}


//Function to check valid phone
function CheckPhone(obj, caption)
{
	var arr, sep;
	
	if(obj.value.indexOf(" ") != -1)
		sep = " ";
	else if(obj.value.indexOf("-") != -1)
		sep = "-";
	else
		sep = "";
	
	if(sep == "")
		return (caption + notValid + '\n' + phoneFormat);
	
	arr = obj.value.split(sep);
		
	if(arr[0].length != 4 || arr[1].length != 7)
		return (caption + notValid + '\n' + phoneFormat);
			
	if(!CheckPool(arr[0],NUMBER_POOL) || !CheckPool(arr[1],NUMBER_POOL))
		return (caption + notValid + '\n' + phoneFormat);
	
	return VALID;
}


//Function to check valid email
function CheckEmail(obj, caption) 
{ 
	var emailpat = /^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)+$/;
	
	if(!emailpat.test(obj.value))
		 return caption + notValid;
	else
		 return VALID;
}


//Function to find if control value must be selected
function CheckRequired(obj, datatype, caption)
{
	var IsRequired, valu;
	
	//Get the value for IsRequired
	if(isIE)
	{
		if(obj.IsRequired)			
			IsRequired = obj.IsRequired.toLowerCase();
		else
			IsRequired = "no0";
	}		
	else
		IsRequired = getAttribute(obj,"isrequired");

	
	if(datatype == "dropdown")
	{
		if(IsRequired == "yes" && (obj.value == "" || obj.value == " " || obj.value == "0"))
			return caption + mustFill;
		
		return VALID;	
	}
	
	if(datatype == "dollar")
		valu = Trim(obj.value.replace("$",""));
	else
		valu = Trim(obj.value);
	
	if(IsRequired == "yes" && valu == "")
		return caption + mustFill;
	else if(IsRequired == "no" && valu == "")	
		return VALID;	
	else	
		return REQUIRE_VALIDATION;
}


function Trim(strVal)
{
	while(strVal.charAt(0) == ' ')
		strVal = strVal.substr(1); 
		
	while(strVal.charAt(strVal.length-1) == ' ')
		strVal = strVal.substr(0,strVal.length-1);
		
	return strVal;
}