/////////////////////////////////////////////////////////////////////////
function CheckTypes(){
	this.NONE = -1;
	this.EMPTY = 0;
	this.INTEGER = 1;
	this.EMAIL = 2;
	this.PASSWORD = 3;
	this.SELECT = 4;
	this.POSITIVE_NUMBER = 5;
	this.NON_NEGATIVE_NUMBER = 6;
	this.NUMBER = 7;
	this.PHONE = 8;
	this.EGN = 9;
	this.DUAL_LISTBOX = 10;
	this.ALL_CAPS = 11;
	this.CALLBACK = 12;
	this.POSITIVE_INTEGER = 13;
	this.PERCENT = 14;
	this.CHOOSE_SELECT = 15;
	this.POSITIVE_NUMBER_TWO_DIGITS = 16;
	this.POSITIVE_NUMBER_FOUR_DIGITS = 17;
	this.FILENAME = 18;
	this.CUSTOM_REGEXP = 19;
	this.CODE = 20;
	this.TIME = 21;
	this.LIST = 22;
}
var CHK_TYPES = new CheckTypes();

////////////////////////////////////////////////////////////////////////
function DvlValidate(ControlCollection, bSuppressNotifications){
	if(typeof(bSuppressNotifications) == "undefined")
		bSuppressNotifications = false;
		
	for(i = 0; i < ControlCollection.length; i++){
		var CurrentControl = ControlCollection[i];
		/*
		if(typeof(CurrentControl.FieldType) == "undefined")
			continue;
		if(typeof(CurrentControl.Required) != "undefined" && CurrentControl.Required != "1")
			continue;
		if(typeof(CurrentControl.DisableValidation) != "undefined"){
			if(CurrentControl.DisableValidation == true || CurrentControl.DisableValidation == "1")
				continue;
		}
		if(!CheckValue(CurrentControl, bSuppressNotifications)){
			return false;
		}
		*/
		if(!DvlValidateControl(CurrentControl, bSuppressNotifications))
			return false;
	}
	
	return true;
}

/////////////////////////////////////////////////////////////////////////
function DvlValidateControl(CurrentControl, bSuppressNotifications){
	if(typeof(bSuppressNotifications) == "undefined")
		bSuppressNotifications = false;
	if(typeof(CurrentControl.FieldType) == "undefined")
		return true;
	if(typeof(CurrentControl.Required) != "undefined"){
		if(CurrentControl.Required != "1" && CurrentControl.value.length == 0)
			return true;
	}
	if(typeof(CurrentControl.DisableValidation) != "undefined"){
		if(CurrentControl.DisableValidation == true || CurrentControl.DisableValidation == "1")
			return true;
	}

	if(!CheckValue(CurrentControl, bSuppressNotifications, !bSuppressNotifications)){
		return false;
	}
	return true;
}

/////////////////////////////////////////////////////////////////////////
function DvlValidateControls(sOnSubmit, CheckOnly){
	if(typeof(CheckOnly) == "undefined")
		CheckOnly = false;

	var i, j, k;
	var sPrefix = "document."+ this.name + ".";
	var sCntrlPrefix;
	
	//if(typeof(bDoSubmit) == 'undefined' || bDoSubmit == '') bDoSubmit = true;
	
	if(typeof(this.arSwitchBaseNames) != "undefined"){
		// if it's an array or this is a second pass
		this.sSwitchBaseName = "";
		if(typeof(this.bIsArray) == "undefined"){
			this.bIsArray = true;
		}
	}else{
		// if it's not an array (only first pass)
		this.arSwitchBaseNames = Array();
		this.arSwitchBaseNames.push(this.sSwitchBaseName);
		this.bIsArray = false;
	}
	
	

	var arControls = new Array();

	if(typeof(this.elements) != 'undefined'){
		for(i = 0; i < this.elements.length; i++)
			arControls.push(this.elements[i]);
	}
	
	arObjectPickers = this.all.urns("ScrollContainer");
	for(i = 0; i < arObjectPickers.length; i++)
		arControls.push(arObjectPickers[i]);
	
	for(i = 0; i < arControls.length; i++){
		var CurrentControl = arControls[i];

		if(typeof(CurrentControl.FieldType) == "undefined"){
			continue;
		}
		if(typeof(CurrentControl.Required) != "undefined" && CurrentControl.Required != "1"){
			continue;
		}
		if(typeof(CurrentControl.DisableValidation) != "undefined"){
			if(CurrentControl.DisableValidation == true || CurrentControl.DisableValidation == "1")
				continue;
		}
		if(!CheckValue(CurrentControl, CheckOnly, true)){
			return false;
		}
	}
//	if(typeof(this.arControls) != 'undefined'){
//		for(i = 0; i < this.arControls.length; i++){
//			//alert(sPrefix + this.arControls[i] +"->"+ document.all(this.arControls[i]));
//			var CurrentControl = document.all(this.arControls[i]);
//			if(typeof(CurrentControl.DisableValidation) != "undefined"){
//				if(CurrentControl.DisableValidation == true || CurrentControl.DisableValidation == "1" || CurrentControl.DisableValidation == 1)
//					continue;
//			}
//			if(!CheckValue(CurrentControl, CheckOnly)){
//				return false;
//			}
//		}
//	}

	if(CheckOnly == true)
		return true;

	if(typeof(sOnSubmit) == 'undefined' || sOnSubmit == ""){
		if(this.OnValidationComplete == "-1" || this.OnValidationComplete == ""){
			this.DoSubmit(); //// TRUE
		}else{
			eval(this.OnValidationComplete);
		}
	}else{
		if(eval(sOnSubmit) == true){			
			if(this.OnValidationComplete == "-1" || this.OnValidationComplete == ""){
				this.DoSubmit(); //// TRUE
			}else{
				eval(this.OnValidationComplete);
			}
		}else{
			return false;
		}
	}

}

/////////////////////////////////////////////////////////////////////////
function CheckValue(oControl, bHideError, bSubmit){
//if(oControl.name == "pick_Order_ClientID")
//		    alert(oControl.outerHTML);
	//var nCheckType = eval(oControl.nCheckType);
	var nIndex;
	if(typeof(bSubmit) == 'undefined')
	   bSubmit = false;
	for(nIndex = 0; nIndex < 100; nIndex++){
		var sCheckNum = nIndex;
		if(nIndex == 0)
			sCheckNum = "";
		eval("var nCheckType = eval(oControl.nCheckType"+ sCheckNum +");");
		//var nCheckType = eval("oControl.nCheckType"+ sCheckNum);
		//var nCheckType = oControl.getAttribute('nCheckType'+ sCheckNum);
		if(typeof(nCheckType) == 'undefined' || nCheckType == null){
			if(nIndex == 0)
				continue;
			else
				break;
		}

		if(nCheckType == CHK_TYPES.EMAIL)
			continue;

		eval("var sErrorMessage = oControl.sErr"+sCheckNum+";");
		//var sErrorMessage = eval("oControl.sErr"+ sCheckNum);
		//var sErrorMessage = oControl.getAttribute('sErr'+ sCheckNum);
		var oTwinControl;

		if(nCheckType == CHK_TYPES.EMPTY){
			// custom check
			if(oControl.SelectionMode == 1){
				if(oControl.GetSelectedValuesCount() == 0){
					if(!bHideError){
						alert(sErrorMessage);
						HighlightField(oControl);
					}
					return false;
				}
			}else if(oControl.tagName == "HtmlEditor"){
				if(oControl.IsEmpty){
					if(!bHideError){
						alert(sErrorMessage);
						HighlightField(oControl);
					}
					return false;
				}
			}else if(oControl.value.replace(/\s+/, "") == ""){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.LIST){			
			//alert(oControl.value + "\n\n"+ oControl.DeniedRecords);
			var reCheck = new RegExp(","+ oControl.value +",");
			//alert(reCheck.toString());
			//if(oControl.value.toString().match(reCheck) == null			
			if(oControl.DeniedRecords != ""){
				var sDeniedList = ","+ oControl.DeniedRecords +",";				
				if(sDeniedList.match(reCheck) != null){
					if(!bHideError){
						alert(sErrorMessage);
						HighlightField(oControl);
						return false;
					}
				}
			}
			if(oControl.AllowedRecords != ""){
				var sAllowedList = ","+ oControl.AllowedRecords +",";
				if(sAllowedList.match(reCheck) != null){
					if(!bHideError){
						alert(sErrorMessage);
						HighlightField(oControl);
						return false;
					}
				}
			}
			//if(oControl.value == "0") return true;
			
			return true;
		}else if(nCheckType == CHK_TYPES.SELECT){
			if(oControl.selectedIndex == -1){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.CHOOSE_SELECT){
			if(oControl.selectedIndex < 1){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.EMAIL){
			sEMail = oControl.value.replace(/\s+/, "");
			if((sEMail == "" || (sEMail.indexOf('@') < 1 || sEMail.indexOf('@') == (sEMail.length - 1)))){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.POSITIVE_NUMBER){
			var reCheck = new RegExp("^[ 0-9]+\\.?[0-9]*$");
			if(oControl.value.toString().match(reCheck) == null || oControl.value <= 0){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.INTEGER){
			var reCheck = new RegExp("^[+-]?([0-9]+)$");
			if(oControl.value.toString().match(reCheck) == null){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.POSITIVE_INTEGER){
			var reCheck = new RegExp("^[0-9]+$");
			
			if(oControl.value.toString().match(reCheck) == null){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.NON_NEGATIVE_NUMBER){
			var reCheck = new RegExp("^[0-9]+\\.?[0-9]*$");
			if(oControl.value.toString().match(reCheck) == null || oControl.value < 0){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.NUMBER){
			var reCheck = new RegExp("^[+-]?([0-9]+\\.?[0-9]*)?$");
			if(oControl.value.toString().match(reCheck) == null){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.PASSWORD){
			sPwd = oControl.value.replace(/\s+/, "");
			oTwinControl = document.all(oControl.name + "2");
			sPwd2 = oTwinControl.value.replace(/\s+/, "");
			if(sPwd == ""){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}else{
				if(sPwd != sPwd2){
					if(!bHideError){
						alert(oControl.sErr2);
						HighlightField(oTwinControl);
					}
					return false;
				}
			}
		}else if(nCheckType == CHK_TYPES.PHONE){
			var reCheck = new RegExp("^\\+?([0-9a-zA-Z \/\(\)\+])+$");
			if(oControl.value.toString().match(reCheck) == null){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.EGN){
			var reCheck = new RegExp("^[0-9][0-9][0-1][0-9][0-3][0-9][0-9][0-9][0-9][0-9]$");
			if(oControl.value.toString().match(reCheck) == null){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.ALL_CAPS){
			var reCheck = new RegExp("^[A-Z_]+$");
			
			if(oControl.value.toString().match(reCheck) == null){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.CODE){
			var reCheck = new RegExp("^[\@A-Za-z0-9_/\.\-]+$");
			
			if(oControl.value.toString().match(reCheck) == null){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.DUAL_LISTBOX){
			if(oControl.options.length == 0){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.CALLBACK){
		   //alert(oControl.sCallbackValidator +"(document.all('"+ oControl.name +"'), "+ bSubmit +")");
			if(eval(oControl.sCallbackValidator +"(document.all('"+ oControl.name +"'), "+ bSubmit +")") == true){
				//return true;
			}else{
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.PERCENT){
			var reCheck = new RegExp("^[0-9]?[0-9]?\\.?[0-9]*$");
			if(oControl.value.toString().match(reCheck) == null){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.FILENAME){
			var reCheck = new RegExp("^[0-9A-Za-z_]+$");
			if(oControl.value.toString().match(reCheck) == null){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.CUSTOM_REGEXP){		
			var reCheck = new RegExp(oControl.sCustomRexExp);			
			//alert(oControl.value.match(reCheck))
			if(oControl.value.toString().match(reCheck) == null){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else if(nCheckType == CHK_TYPES.NONE){
			
		}else if(nCheckType == CHK_TYPES.TIME){
			//alert(1);
			var reCheck = new RegExp("^[0-9]{0,2}(:[0-9]{0,2})?(:[0-9]{0,2})?$");
			if(oControl.value.toString().match(reCheck) == null){
				if(!bHideError){
					alert(sErrorMessage);
					HighlightField(oControl);
				}
				return false;
			}
		}else{
			alert('Invalid Check Type!');
			return false;
		}
	}
	return true;
}

/////////////////////////////////////////////////////////////////////////
function ValidateInput(){
	// ESC, SPACEBAR OR ENTER
	if(event.keyCode == 27 || event.keyCode == 13) return true;
//	if(event.keyCode == 8 || event.keyCode == 46) return true; // backspace, del
//	if(event.keyCode == 35 || event.keyCode == 36) return true; // home, end
//	if(event.keyCode == 37 || event.keyCode == 38 || event.keyCode == 39 || event.keyCode == 40) return true; // arrows
	if(event.ctrlKey == true || event.altKey == true) return true;
	if(!event.srcElement.nCheckType) return true;
	event.returnValue = false;
	if(event.srcElement.disabled || event.srcElement.readOnly) return false;

	var arCheckTypes = new Array();
	var nCheckType = null;
	var Field = event.srcElement;
	var nTemp;
	if(event.srcElement.type == 'text'){
		var oRange = document.selection.createRange();
		var sOrigValue = event.srcElement.value;
		oRange.text = String.fromCharCode(event.keyCode);
		oRange.select();
		//alert(event.srcElement.value);
	}else{
		sOrigValue = "";
	}
	var sValue = event.srcElement.value;
	var oControl = new AbstractControl(event.srcElement.name, sValue, nCheckType, event.srcElement.sCallbackValidator);//event.srcElement.nCheckType
	
	// find the check type
	arCheckTypes.push(eval(event.srcElement.nCheckType));
	//oControl.nCheckType = event.srcElement.nCheckType;
	
	var i = 1;
	while(Field.getAttribute('nCheckType'+ i) != null){
		arCheckTypes.push(eval(Field.getAttribute('nCheckType'+ i++)));
	}
	for(i = 0; i < arCheckTypes.length; i++){
		if(arCheckTypes[i] == CHK_TYPES.POSITIVE_NUMBER || arCheckTypes[i] == CHK_TYPES.NON_NEGATIVE_NUMBER || arCheckTypes[i] == CHK_TYPES.NUMBER){
			nCheckType = CHK_TYPES.NUMBER;
			//break;
		}else if(arCheckTypes[i] == CHK_TYPES.POSITIVE_INTEGER || arCheckTypes[i] == CHK_TYPES.PERCENT || arCheckTypes[i] == CHK_TYPES.INTEGER || arCheckTypes[i] == CHK_TYPES.TIME){
			nCheckType = (arCheckTypes[i] == CHK_TYPES.POSITIVE_INTEGER) ?  CHK_TYPES.INTEGER : arCheckTypes[i];
			//break;
		}
		if(i != 0)
			eval('oControl.nCheckType'+ i +' = nCheckType;');
		else
			eval('oControl.nCheckType = nCheckType;');
	}
	if(nCheckType == null){
		//event.srcElement.value = sOrigValue;
		return false;
	}
	
	/*
	if(nCheckType != CHK_TYPES.NUMBER && nCheckType != CHK_TYPES.NON_NEGATIVE_NUMBER && nCheckType != CHK_TYPES.POSITIVE_NUMBER && nCheckType != CHK_TYPES.POSITIVE_INTEGER && nCheckType != CHK_TYPES.PERCENT && nCheckType != CHK_TYPES.INTEGER) 
		return true;	
	*/

	var nPointPosition = sValue.indexOf(".");
	var nNumDigits = 0;

	if(nPointPosition >= 0){
		//alert(event.srcElement.nNumDigitsAfterDecimal);
		if(typeof(event.srcElement.nNumDigitsAfterDecimal) == 'undefined' || event.srcElement.nNumDigitsAfterDecimal == ''){
			nNumDigits = 4;
		}else{		   
			nNumDigits = new Number(eval(event.srcElement.nNumDigitsAfterDecimal));
		}
		if(nCheckType == CHK_TYPES.NUMBER || nCheckType == CHK_TYPES.NON_NEGATIVE_NUMBER || nCheckType == CHK_TYPES.POSITIVE_NUMBER || nCheckType == CHK_TYPES.TIME){
			//alert(event.srcElement.outerHTML);
			
		}else if(nCheckType == CHK_TYPES.PERCENT){
			if(nPointPosition > 2){
				event.srcElement.value = sOrigValue;
				return false;
			}
		}else if(nCheckType == CHK_TYPES.POSITIVE_INTEGER){
			nNumDigits = 0;
		}
		
		if((sValue.length - nPointPosition - 1) > nNumDigits){
			event.srcElement.value = sOrigValue;
			return false;
		}
	}
	if(!CheckValue(oControl, true)){
		event.srcElement.value = sOrigValue;
	}
	return false;
}

/////////////////////////////////////////////////////////////////////////
function AbstractControl(sName, vValue, nCheckType, sCallbackValidator){
	this.nCheckType = nCheckType;
	this.value = vValue;
	this.sCallbackValidator = sCallbackValidator;
	this.name = sName;
}
/////////////////////////////////////////////////////////////////////////
function CheckSubmit(frmForm, sOnSubmit){  ///, bDoSubmit
	if(frmForm.ValidateControls(sOnSubmit))
		frmForm.submit();
}
////////////////////////////////////////////////////////////////////////////////////////
function FindParentForm(oObject){
	while(oObject.parentNode.tagName != "FORM"){
		oObject = oObject.parentNode;
	}
	return oObject.parentNode;
}
////////////////////////////////////////////////////////////////////////////////////////
function DisableForm(oForm){
	var i;
	for(i = 0; i < oForm.elements.length; i++){
		oForm.elements[i].disabled = true;
	}
}
////////////////////////////////////////////////////////////////////////////////////////
function DisplayMessageAndGoBack(sMessage, sUrl){
	alert(sMessage);
	window.location = sUrl;
}
