var iErr = 0;

function rl_verify(val) {
	
	var bReturn = true;
	var oCtrl = document.getElementById(val.controltovalidate);
	var oCtrlValue=ValidatorGetValue(val.controltovalidate);
	
	if ((oCtrl.type == "radio") && (val.getAttribute("mandatory") == "true"))
	{
		var Arr =document.getElementsByName(oCtrl.name);
		var i;
		bReturn = false; 
		for (i=0; i <Arr.length;i++)
		{
			if (Arr[i].checked==true)
			{
				bReturn = true; 
				break;
			}
			if (!bReturn)
			{
				popMessage(val, "MandatoryException");
			}
		}
	}
	
    if (oCtrl.type == null)
    {
		if (((oCtrlValue==null) || (oCtrlValue=="")) && (val.getAttribute("mandatory") == "true"))
		{ 
			popMessage(val, "MandatoryException");
			bReturn = false; 
		}
	}
	
	if ((oCtrl.type == "select-one") & (val.getAttribute("mandatory") == "true")) {
		if (oCtrl.value == "-1") {
			popMessage(val, "MandatoryException");
			bReturn = false; }}
	
	if ((oCtrl.type == "text")||(oCtrl.type == "password"))
	{
		if ((oCtrl.value.length==0) & (val.getAttribute("mandatory")=="true")) {
			popMessage(val, "MandatoryException");
			bReturn = false ; }
		else if ((oCtrl.value.length>0) & (oCtrl.value.length>val.maximumlength || oCtrl.value.length<val.minimumlength)) {
			(val.maximumlength==val.minimumlength)? popMessage(val, "ExactLengthException") : popMessage(val, "LengthException") ;
			bReturn = false; }
		else 
		{
			if (oCtrl.value.length>0)
			{
				if (val.validationtype == "EmailAddress") {
					if (!/^(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)$/i.test(oCtrl.value)) {
						popMessage(val, "EmailException");
						bReturn = false; }}
				else if (val.validationtype == "Number") {
					exp = new RegExp("^(\\d*\\.{0,1}\\d{0," + val.decimalplaces + "})$");
					if (val.decimaplaces-0 == 0) {
						exp = new RegExp("^(\\d*)$");
					}
					if (oCtrl.value.match(exp) == null)
						bReturn = false;
					if (bReturn)
						if (oCtrl.value-0 < val.minimumvalue-0 || oCtrl.value-0 > val.maximumvalue-0)
							bReturn = false;
					if (!bReturn) {
						if (val.decimalplaces-0 > 0) {
							popMessage(val, "NumericException");
						} else {
							popMessage(val, "NumericIntegerException");
						}
					}}
				else if (val.validationtype == "Password") {
					exp = new RegExp("^[A-Za-z0-9 !£\$%\^\*\(\)-=_\+,\.\?#@{}\|/]{8,}$");
					if (oCtrl.value.match(exp) == null)
						bReturn = false;
						popMessage(val, "PasswordFormatException"); }
						
				else if (val.validationtype == "UserName") {
					exp = new RegExp("^(\\d+)$");
					if (oCtrl.value.match(exp) == null)
						bReturn = false;
						popMessage(val, "UserNameFormatException"); }
			   
   				else if (val.validationtype == "PostCode") {
					exp = new RegExp("^[A-Za-z]{1,2}[0-9A-Za-z]{1,2}[ ]?[0-9]{0,1}[A-Za-z]{2}$");
					if (oCtrl.value.match(exp) == null)
						bReturn = false;
						popMessage(val, "PostCodeFormatException"); }
			   
   				else if (val.validationtype == "Text") {
					exp = new RegExp("([<>]+)");
					if (oCtrl.value.match(exp) != null)
						bReturn = false;
						popMessage(val, "TextFormatException"); }
			      
   				else if (val.validationtype == "Alphanumeric") {
					exp = new RegExp("^([\\d\\w]*)$");
					if (oCtrl.value.match(exp) == null)
						bReturn = false;
						popMessage(val, "AlphanumericFormatException"); }
						
   				else if (val.validationtype == "FixedString") {
					if (oCtrl.value != val.fixedstringvalue)
						bReturn = false;
						popMessage(val, "FixedStringFormatException"); }
			}
		}
    }
    
    document.getElementById(val.id).title = (!bReturn) ? val.errormessage : "" ;
	
	val.isvalid = bReturn;
    ValidatorUpdateIsValid();    

	return bReturn; 
}
	
function popMessage(val,messageType)
{
	var err = errorMessage[messageType];
	var placeholder;
	var regex;
		
	for( var i=0; i < val.attributes.length; i++ ) {
		
		placeholder="%"+val.attributes[i].nodeName.toLowerCase()+"%";
		//alert("'"+placeholder+"'");
		regex = new RegExp(placeholder,"gi");
		var formattedValue = val.attributes[i].value;
		if (placeholder == "%minimumvalue%" | placeholder == "%maximumvalue%") {
			formattedValue = FormatNumber(formattedValue, val.decimalplaces);
		}
		err = err.replace(regex, formattedValue);
	}
	
	val.errormessage = err;
}
	
	function toggleMandatory(ctlId,on) {
		var ctl = document.getElementById(ctlId);
		var Name ="," + ctlId + ",";
		if (on==true)
		{
			document.getElementById("txtNonMandatoryFields").value=document.getElementById("txtNonMandatoryFields").value.replace(Name,"");
			if (document.getElementById("txtMandatoryFields").value.search(Name)<0)
			{
				document.getElementById("txtMandatoryFields").value +=Name;	
			}
			if (ctl!=null)
			{
			    ctl.mandatory = "true";
			    ctl.enabled = true;
			    ValidatorUpdateDisplay(ctl);
			}
		}	
		else
		{
			if (document.getElementById("txtNonMandatoryFields").value.search(Name)<0)
			{
				document.getElementById("txtNonMandatoryFields").value +=Name;	
			}
			document.getElementById("txtMandatoryFields").value=document.getElementById("txtMandatoryFields").value.replace(Name,"");
			if (ctl!=null)
			{
				ctl.mandatory = "false";
				ctl.enabled = false;
				ValidatorUpdateDisplay(ctl);
			}
		}			
	}
	
	function Disable(ctl){
		ctl.disabled=true;
		//Do not apply formatting to radio buttons
		if (ctl.type!="radio" && ctl.type!="checkbox") {
			if (ctl.className) {
				if (ctl.className != "DisabledBox") {
					ctl.oldEnabledClassName = ctl.className;
				}
			} else {
				ctl.oldEnabledClassName="";
			}
			ctl.className = "DisabledBox";
			}
	}
	function Enable(ctl){
		ctl.disabled=false;
		//Do not apply formatting to radio buttons
		if (ctl.type!="radio" && ctl.type!="checkbox") {
			if (ctl.className) {
				if (ctl.className != "EnabledBox") {
					if (ctl.oldEnabledClassName) {
						ctl.className = ctl.oldEnabledClassName;
					} else {
						ctl.className="EnabledBox";
					}
				}
			} else {
				ctl.className = "EnabledBox";
			}
			ctl.oldEnabledClassName = "";
		}
    }

    function toggleVisible(ctlId, setVisible) {

        var ctl = document.getElementById(ctlId);
        if (ctl != null) 
        {
            if (setVisible)
                ctl.style.visibility = "visible";
            else 
                ctl.style.visibility = "hidden";
        }
    }

	//Set enabled or disabled
	function toggleEnabled(ctlId,setEnabled,clearValues) {	   
		var ctl = document.getElementById(ctlId);
		if (ctl!=null)
		{
			ctl.disabled=setEnabled;
			ToggleEnableDisable(ctlId, clearValues);
		}
    }
    
	//Alternative implementation - true toggle
	function ToggleEnableDisable(ctlId, clearValues) {
		var ctl = document.getElementById(ctlId);
		if (ctl) {
			if (clearValues) ctl.value = "";
			if (ctl.disabled) {
				Enable(ctl);
			} else {
				Disable(ctl);
			}
		}
	}
	
	function resetValidator(ctlId)
	{
		var ctl = document.getElementById(ctlId);
		if (ctl!=null)
		{
			ctl.isvalid=true;
			ValidatorUpdateDisplay(ctl);
		}
	}

	function AddLeadingZero(field){
		var zero = "0"
		var value;

		value = field.value;		
		//Add a leading zero
		if(value.length == 1)
		{
			field.value = zero + value;
		}
	}
	
	//Character suppression functions
	function enterAlphanumeric(field)
	{
		exp = new RegExp("^([\\d\\w]*)$");
		check(field,exp);					
	}
	function enterPostcode(field)
	{
		exp = new RegExp("^([A-Z0-9 ]*)$","i");
		check(field,exp);					
	}
	function enterNumber(field)
	{
	/*
		var id = field.id+" ";
		var valparent;
		var parents = id.split("_");
		if (parents.length>0)
		{
			var item = parents[parents.length-1];

			valparent = id.split(item)[0];	
		}
		
		var thisval = document.getElementById(valparent+field.val);

		if (thisval!=null)
		{
			exp = new RegExp("^(\\d*\\.{0,1}\\d{0," + thisval.decimalplaces + "})$");
		}
		else
		{
	*/
			exp = new RegExp("^([\\d]*[.]{0,1}[\\d]*)$");
	/*
		}
	*/
		check(field,exp);					
	}
	function enterInteger(field)
	{
		exp = new RegExp("^([\\d]*)$");
		check(field,exp);					
	}
	function enterDate(field)
	{
		exp = new RegExp("^([\\d\\\/]*)$");
		//exp = new RegExp("^([\\d]{2}[\\\/]{1}[\\d]{2}[\\\/]{1}[\\d]{4})$");
		check(field,exp);					
	}
	function enterAlphabetic(field) 
	{
	    exp = new RegExp("^([A-Z]*)$", "i");
	    check(field, exp);
	}
	function enterAlphabeticAndSpace(field) 
	{
	    exp = new RegExp("^([A-Z]*\\s*)$", "i");
	    check(field, exp);
	}
	function check(field,regex)
	{
		var temp = field.value.charAt(field.value.length-1)
		var blur;
		if (temp.match(exp) == null) //check last char
		{
			field.value = field.value.substring(0,field.value.length-1);
			blur=true;
			//alert("last Char");
		}
		//alert(	field.value.match(exp) );
		if (field.value.match(exp) == null) //check all chars
		{
			field.value = "";
			blur=true;
			//alert("all Char");
		}
		field.onblur=(blur)?"rl_verify(field.val);":null;
	}
function FormatNumber(num, decimalNum) {
	if (!decimalNum) {
		return num;
	}
	var numberVal = new Number(num);
	return numberVal.toFixed(decimalNum)
}


