function Validation()
{
	var blnMultipleAlert =true;	// True specify that message will show one by one & False specify show All Messages Together.
	var blnErrorFlag=false;
	var strErrorMessage="";
	var blnFocusFlag=true;
	var strFocusFlag="";
	
	this.getErrorFlag=getErrorFlag;
	this.getErrorMessage=getErrorMessage;

	this.setErrorFlag=setErrorFlag;
	this.appendErrorMessage=appendErrorMessage;
	this.getFocus=getFocus;
	this.setFocus=setFocus;

	this.main=main;
	this.reset=reset;
	this.focus=focus;
	
	function getErrorFlag()
	{
		return blnErrorFlag;
	}
	function getErrorMessage()
	{
		return strErrorMessage;
	}
	function getFocus()
	{
		return strFocusFlag;
	}
	function setErrorFlag(blnFlag)
	{
		 blnErrorFlag=blnFlag;
	}
	function appendErrorMessage(strMsg)
	{
		strErrorMessage+=strMsg;
	}
	function setFocus(strFlag)
	{
		if(strFocusFlag=="")
		{
			strFocusFlag=strFlag;
			blnFocusFlag=false;
		}
	}
	function reset()
	{
		blnErrorFlag=false;
		strErrorMessage="";
		blnFocusFlag=true;
		strFocusFlag="";
		
	}
	function focus(form)
	{
		var strControl=form[strFocusFlag];
		if(strFocusFlag==0)
			strControl=form;
		if(strControl && getObjectType(strControl)!='hidden')
			strControl.focus();
	}
	
	function main(form, array, objGlobal)  // Entry Point
	{	
		blnMultipleAlert=objGlobal.getMultipleAlert();
		
		var blnReturn;
		
		var index=0;
		
		var iLen = array.length;
		
		for (var intIndex=0; intIndex<iLen;intIndex++)
		{
			blnReturn = validate(); // blnReturn stores true if any error occurs in validate function.
			
			if(blnMultipleAlert==false && blnReturn)
				return false;
		}
		
		return;
		//End
		
		function validate()
		{
			var id=array[intIndex][0];	// id stores name of component in form.
			var strPattern=array[intIndex][1];	// stores pattern.
			if(strPattern=="FUN")
			{
				var mmsg = eval(id);
				if(mmsg!="")
				{
					display(mmsg);
					return true;
				}
				else
				{
					return false;
				}//return blnErrorFlag;
			}
			
			var strLabel=array[intIndex][2];	// stores label which is displayed in error message.
			var iIndexOfPattern=0;	//	index of pattern.
			var strDefaultValue="";
			var blnDefaultValue=false;
			var strFormId=form[id];
			
			if(!strFormId)
			{
				alert("Javascript Error: Object " + id + " does not exist.");
				return false;
			}
			
			if(strFormId.disabled)
				return;
			var iMndtyIndex = 0;
			while(strPattern.charAt(iIndexOfPattern))
			{
				var strCharacter=strPattern.charAt(iIndexOfPattern);
				if(strCharacter=="F")	// For Default Value.
				{
					strDefaultValue=getPattern(iIndexOfPattern+2,')')
					blnDefaultValue=true;
					iMndtyIndex = iIndexOfPattern + 1;
				}
				else if(strPattern.charAt(iMndtyIndex)=="M")
				{
					if(mandatory())
						return true;
				}
				if(strFormId.value!="")
				{
					if(strCharacter=="E")
					{
						if(email())
							return true;
					}
					else if(strCharacter=="D")
					{
						if(date())
							return true;
					}
					else if(strCharacter=="S")
					{
						if(string())
							return true;
					}
					else if(strCharacter=="N")
					{
						if(numeric())
							return true;
					}
					else if(strCharacter=="R")
					{
						if(rule())  //  Rule defines the relation between two components.
							return true;
					}
					else if(strCharacter=="I")
					{
						if(min())
							return true; // for minimum Length.
					}
					else if(strCharacter=="X")
					{
						if(max())
							return true; // for maximum Length.
					}
					else if(strCharacter=="U")
					{
						if(url())
							return true; // for maximum Length.
					}
				}
				iIndexOfPattern++;
			}
	
			function mandatory()
			{
				var type=getObjectType(strFormId);
				
				if(type=='text' || type=='textarea' || type=='password' || type=='hidden')
				{
					if(!checkEmpty(strFormId))
					{
						display(MANDATORY,new Array(strLabel));
						clear();
						return true;
					}
				}
				else if(type=='select-one')
				{
					if(!checkEmptyCombo(strFormId))
					{
						display(MANDATORY_SELECT,new Array(strLabel));
						return true;
					}
				}
				else if(type=='select-multiple')
				{
					if(!checkEmptyMultiCombo(strFormId))
					{
						display(MANDATORY_SELECT,new Array(strLabel));
						return true;
					}
				}
				else if(type=='radio' || type=='checkbox')
				{
					if(!strFormId.checked)
					{
						display(MANDATORY_SELECT,new Array(strLabel));
						return true;
					}
				}
				else if(!type)
				{
					if(!checkOptions(strFormId))
					{
						id=0;
						display(MANDATORY_SELECT,new Array(strLabel));
						return true;
					}
				}
				return false;
			}
	
			function email()
			{
				if(!checkEmail(strFormId.value))
				{
					display(EMAIL);
					return true;
				}
				return false;
			}

			function url()
			{
				if(!checkURL(strFormId.value))
				{
					display(URL);
					return true;
				}
				return false;
			}
			
			function date()
			{
				if(!isValidStringDate(strFormId.value))
				{
					display(DATE,strLabel);
					clear();
					//strFormId.value="";
					return true;
				}
				return false;
			}
			
			function string()
			{
				var k=iIndexOfPattern+2;  // Leave 'S"'
				var rule=getPattern(k,'"'); 
				if(!checkPattern(strFormId.value,rule))
				{
					display(VALID,strLabel);
					clear();
					//strFormId.value="";
					return true;
				}
				return false;
			}
			
			function numeric()
			{
				if(strPattern.charAt(iIndexOfPattern+1)=='"')
				{
					var k=iIndexOfPattern+2;  // Leave 'N"'
					var rule=getPattern(k,'"');
					//var defaultValue=getPattern(iIndexOfPattern+2,')');
					if(!checkPattern(strFormId.value,rule))
					{
						if(rule==PATTERN_DECIMAL)
						{
							display(DECIMAL,new Array(strLabel));
						}
						else
						{
							display(NUMERIC,new Array(strLabel));
						}
						clear();
						//strFormId.value=defaultValue;
						return true;
					}
				}
				else if(isNaN(strFormId.value))
				{
					display(NUMERIC,new Array(strLabel));
					clear();
					return true;
				}
				return false;
			}
			
			function rule()
			{
				var strOperativeField="";
				var strValue="";
				var k=iIndexOfPattern+4;  // Leave 'R(O"'
				var strType=strPattern.charAt(k-2);
				var rule="";
				var strField=getPattern(k,'"');
				k=iIndexOfPattern+2;
				rule=getPattern(k,']');
				if(strType=="O")
				{
					strOperativeField=form[strField];
					if(!strOperativeField)
					{
						alert("Object " + strField + " not exists.");
						return false;
					}
					if(strOperativeField.disabled)
					{
						return;
					}
					strValue=strOperativeField.value;
					if(strFormId.value=="" || strValue=="")
					{
						return;
					}
				}
				if(strType=="V")
				{
					strValue=strField;
				}
				var strRuleMsg="";
					
				if(array[intIndex][1].indexOf("D")>=0)
				{
					if(rule==">")
						strRuleMsg="be later than";
					if(rule==">=")
						strRuleMsg="be later than or same as";
					if(rule=="<")
						strRuleMsg="be earlier than";
					if(rule=="<=")
						strRuleMsg="be earlier than or same as";
					if(rule=="!=")
						strRuleMsg="not be same as";
					if(rule=="==")
						strRuleMsg="be same as";				
					//cheking for components type is date or not.
					if(!checkRule(Date.parse(strFormId.value),Date.parse(strValue),rule))
					{
						display(RULE,new Array(strLabel,strRuleMsg,array[intIndex][3]));
						clear();
						//strFormId.value="";
						return true;
					}
				}
				else 
				{
					if(rule==">")
						strRuleMsg="be greater than";
					if(rule==">=")
						strRuleMsg="be greater than or equal to";
					if(rule=="<")
						strRuleMsg="be less than";
					if(rule=="<=")
						strRuleMsg="be less than or equal to";
					if(rule=="!=")
						strRuleMsg="not be equal to";
					if(rule=="==")
						strRuleMsg="be equal to";								
					if(array[intIndex][1].indexOf("N")>=0)
					{
						if(!checkRule(parseFloat(strFormId.value),parseFloat(strValue),rule))
						{
							display(RULE,new Array(strLabel,strRuleMsg,array[intIndex][3]));
							clear();
							//strFormId.value=0;
							return true;
						}
					}
					else
					{
						if(!checkRule(strFormId.value,strValue,rule))
						{
							display(RULE,new Array(strLabel,strRuleMsg,array[intIndex][3]));
							clear();
							//strFormId.value=0;
							return true;
						}
					}
				}
				return false;
			}
			
			function min()
			{
				var k=iIndexOfPattern+2;  // Leave 'I('
				var iminLength=getPattern(k,')');
				if(checkMinLength(strFormId.value,iminLength))
				{
					display(MINIMUM,new Array(strLabel,iminLength));
					clear();
					return true;
				}
				return false;
			}

			function max()
			{
				var k=iIndexOfPattern+2;  // Leave 'X('
				var imaxLength=getPattern(k,')');
				if(checkMaxLength(strFormId.value,imaxLength))
				{
					display(MAXIMUM,new Array(strLabel,imaxLength));
					clear();
					return true;
				}
				return false;
			}
			
			function getPattern(key,character)  // This function retrieve pattern from 2nd element. 
			{
				var rule="";
				while(strPattern.charAt(key)!=character)
				{
					rule+=strPattern.charAt(key);
					key++;
				}
				iIndexOfPattern=key;
				return rule;
			}
			
			function clear()
			{
				if(blnDefaultValue==true)
					strFormId.value=strDefaultValue;
			}
			
			function display(msg,arg)  //  Set the customize error message in strErrorMessage.
			{
				msg = getMessage(msg,arg);
				if(blnMultipleAlert==false)
				{
					strErrorMessage=msg;
					blnErrorFlag=true;
				}
				else
				{
					blnErrorFlag=true;
					strErrorMessage+=msg+"\n";
				}
				if(blnFocusFlag)
				{
					strFocusFlag=id;
					blnFocusFlag=false;
				}
			}
			return false;
		}
	}
}




