function Validator(pWin,pDoc,pValArray,pMsgArea)
{
var t=this;
var gDecimalValidationExp = /^[-+]?\d+\.?\d*$/; 
var gIntegerValidationExp = /^[-+]?\d+$/; //All-digit
t.msgArea=pMsgArea;
t.win=pWin;
t.doc=pDoc;
t.valArray=pValArray;
t.dateFormat;
t.timeFormat;
t.dateTimeFormat;
// field,label,datatype:1=string/2=number/3=double/4=datetime/5=date/6=time,mandatory:true/false,field1,field2,field3,enterable,changeable,indexinmessage
// string : maxlength=unlimited,minlength=0,change case
// number : maxvalue=+infinity,minvalue=-infinity,null
// number : maxvalue=+infinity,minvalue=-infinity,decimalplace=unlimited
// datetime : maxvalue=+infinity,minvalue=-infinity,null
// date : maxvalue=+infinity,minvalue=-infinity,null
// time : maxvalue=+infinity,minvalue=-infinity,null
function validate()
{
	for (lPtr=0;lPtr<t.valArray.length;lPtr++)
	{
		var lFld=t.doc.getElementById(t.valArray[lPtr][0]);
		var lFocusFld=lFld;
		if ((t.valArray[lPtr][2]==4)||(t.valArray[lPtr][2]==5)||(t.valArray[lPtr][2]==6)) 
		{
			try
			{
				lFocusFld=t.win.eval("ctrl"+t.valArray[lPtr][0]);
			}
			catch(lException)
			{
				lFocusFld=null;
			}
		}
		if (lFld==null) continue;
		var lErr=t.validateValue(lFld.value,t.valArray[lPtr],true);
		if (lErr!=true)
		{
			if((lFocusFld!=null)&&!lFocusFld.isDisabled)
				lFocusFld.focus();
			return lErr;
		}
	}
	return true;
}
function validateField()
{
	try
	{		
		var lFld=t.win.event.target ||t.win.event.srcElement;
		lFldName=lFld.name;
		lErrFlg=false;
		if (lFld==null) return true;
		lFieldVal=null;
		for (lPtr=0;(lPtr<t.valArray.length)&&(lFieldVal==null);lPtr++)
		{
			if (t.valArray[lPtr][0]==lFldName) lFieldVal=t.valArray[lPtr];
		}
		if (lFieldVal==null) return true;
		var lErr=t.validateValue(lFld.value,lFieldVal,lErrFlg);
		if (lErr!=true)
		{
			return lErr;
		}
	}
	catch (exception)
	{
	}
	return true;
}
function validateValue(pValue,pFieldVal,pErrFlg)
{
	var lMode=pErrFlg;
	if ((pFieldVal[3]==true)&&(pValue==""))
		return showAlert("Please enter value for field : "+pFieldVal[1],lMode);
	if (pValue=="")
	{
	}
	else if (pFieldVal[2]==1)//str
	{
		if ((pFieldVal.length>4)&&(pFieldVal[4]!=null)&&(pValue.length>pFieldVal[4]))
			return showAlert("Please enter value upto "+pFieldVal[4]+" characters for field : "+pFieldVal[1],lMode);
		if ((pFieldVal.length>5)&&(pFieldVal[5]!=null)&&(pValue.length<pFieldVal[5]))
			return showAlert("Please enter value of atleast "+pFieldVal[5]+" characters for field : "+pFieldVal[1],lMode);
		var lStrField=t.doc.getElementById(pFieldVal[0]);
		if (pFieldVal[6]==1) lStrField.value=pValue.toUpperCase();
		else if (pFieldVal[6]==-1) lStrField.value=pValue.toLowerCase();
	}
	else if (pFieldVal[2]==2)//num
	{
		pValue=pValue.replace(new RegExp(",","g"),"");
		if (pValue=="") return true;
		if (!gIntegerValidationExp.test(pValue))
			return showAlert("Please enter a valid integer for field : "+pFieldVal[1],lMode);
		if ((pFieldVal.length>4)&&(pFieldVal[4]!=null)&&(parseFloat(pValue)>pFieldVal[4]))
			return showAlert("Please enter value <= "+pFieldVal[4]+" for field : "+pFieldVal[1],lMode);
		if ((pFieldVal.length>5)&&(pFieldVal[5]!=null)&&(parseFloat(pValue)<pFieldVal[5]))
			return showAlert("Please enter value >= "+pFieldVal[5]+" for field : "+pFieldVal[1],lMode);
	}
	else if (pFieldVal[2]==3)//dec
	{	//new RegExp(",","g")
		pValue=pValue.replace(new RegExp(",","g"),"");
		if (pValue=="") return true;
		if (pValue.charAt(0)==".") pValue="0"+pValue;
		if (!gDecimalValidationExp.test(pValue))
			return showAlert("Please enter a valid decimal for field : "+pFieldVal[1],lMode);
		if ((pFieldVal.length>4)&&(pFieldVal[4]!=null)&&(parseFloat(pValue)>pFieldVal[4]))
			return showAlert("Please enter value <= "+pFieldVal[4]+" for field : "+pFieldVal[1],lMode);
		if ((pFieldVal.length>5)&&(pFieldVal[5]!=null)&&(parseFloat(pValue)<pFieldVal[5]))
			return showAlert("Please enter value >= "+pFieldVal[5]+" for field : "+pFieldVal[1],lMode);
		if ((pFieldVal.length>6)&&(pFieldVal[6]!=null))
		{
			lDecPos=pValue.indexOf(".");
			if (lDecPos>=0)
			{
				lDecCnt=pValue.length-lDecPos-1;
				if (lDecCnt==0) pValue=pValue.substring(0,pValue.length-1);
				if (lDecCnt>pFieldVal[6])
					return showAlert("Please enter value with "+pFieldVal[6]+" decimal places for field : "+pFieldVal[1],lMode);
			}
		}
	}
	else if (pFieldVal[2]==4)//datetime
	{
	}
	else if (pFieldVal[2]==5)//date
	{
	}
	else if (pFieldVal[2]==6)//time
	{
	}
	if (t.msgArea!=null)
	{
		t.msgArea.innerHTML="";
	}
	return true;
}
function showAlert(pMsg,pMode)
{
	if (t.msgArea!=null)
	{
		t.msgArea.innerHTML=pMsg;
	}
	if (t.win!=null)
	{
		if (pMode) t.win.alert(pMsg);
		return false;
	}
	else
		return pMsg;
}

function setHandlers(pVarName)
{
	for (lPtr=0;lPtr<t.valArray.length;lPtr++)
	{
		lFld=t.doc.getElementById(t.valArray[lPtr][0]);
		if (lFld==null) continue;
		lFld.onblur=t.validateField;
	}
}
t.validate=validate;
t.validateValue=validateValue;
t.validateField=validateField;
t.showAlert=showAlert;
t.setHandlers=setHandlers
}
