/////////////////////////////////////////////////////////////////////////
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.CHECKED = 21;
	this.LATIN = 22;
}

var CHK_TYPES = new CheckTypes();

if(typeof(Controls) == "undefined")
	Controls = {};
if(typeof(Controls.DataValidation) == "undefined"){
	Controls.DataValidation = {};

	/////////////////////////////////////////////////////////////////////////
	Controls.DataValidation.ValidateControls = function(sOnSubmit){
		var i, j, k;
		var nCurrLanguage;
		var bUsedALanguage;
		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;
		}
		

		//alert(this.bIsArray);  //towa ne e masiv
		//alert(this.arSwitchBaseNames[0]); //undefined	
		if(typeof(this.arControls) != 'undefined'){		
			for(i = 0; i < this.arControls.length; i++){			
				//alert(sPrefix + this.arControls[i] +"->"+ eval(sPrefix + this.arControls[i]));
				if(!Controls.DataValidation.CheckValue(eval(sPrefix + this.arControls[i]))){
					return false;
				}
			}
		}
		if(typeof(this.arLngControls) != 'undefined'){
			bUsedALanguage = false;
			for(k = 0; k < this.arSwitchBaseNames.length; k++){
				this.sSwitchBaseName = this.arSwitchBaseNames[k];
				//alert(sPrefix + this.sSwitchBaseName);
				for(i = 0; i < this.arLanguages.length; i++){
					if(eval(sPrefix + this.sSwitchBaseName + i).checked){
						bUsedALanguage = true;
						nCurrLanguage = eval(sPrefix + this.sSwitchBaseName + i).value;
						for(j = 0; j < this.arLngControls.length; j++){
							if(this.bIsArray){
								sCntrlPrefix = k +"_";
							}else{
								sCntrlPrefix = "";
							}
							//alert(sPrefix + this.arLngControls[j] + sCntrlPrefix + nCurrLanguage);
							if(!Controls.DataValidation.CheckValue(eval(sPrefix + this.arLngControls[j] + sCntrlPrefix + nCurrLanguage))){
								return false;
							}
						}
					}
				}
			}
		}else{
			bUsedALanguage = true;
		}
		if(!bUsedALanguage){
			alert(this.sNoLanguageSelectedErr);
			return false;
		}
		
		if(typeof(sOnSubmit) == 'undefined' || sOnSubmit == ""){		
			if(this.OnValidationComplete == "-1"){			
				this.submit(); //// TRUE
			}else{
				//alert(this.OnValidationComplete);
				eval(this.OnValidationComplete);
			}		
		}else{
			if(eval(sOnSubmit) == true){			
				if(this.OnValidationComplete == "-1"){
					this.submit(); //// TRUE
				}else{
					eval(this.OnValidationComplete);
				}
			}else{
				return false;
			}
		}	
		return true;
	}

	/////////////////////////////////////////////////////////////////////////
	Controls.DataValidation.CheckValue = function(oControl, bHideError){
		//var nchecktype = eval(oControl.nchecktype);		
		if(oControl.getAttribute("disablevalidation")){
			return true;
		}
		
		for(nIndex = 0; nIndex < 100; nIndex++){
			var sCheckNum = nIndex;
			if(nIndex == 0)
				sCheckNum = "";
			
			//eval("var nchecktype = eval(oControl.getAttribute(\"nchecktype"+ sCheckNum +"\"));");
			var nchecktype = eval(oControl.getAttribute("nchecktype"+ sCheckNum +""));
			//alert(nchecktype);
			//var nchecktype = eval(oControl.getAttribute('nchecktype'+ sCheckNum));
			
			if(typeof(nchecktype) == 'undefined' || nchecktype == null){
				if(nIndex == 0)
					continue;
				else
					break;
			}
			
			//eval("var sErrorMessage = oControl.sErr"+sCheckNum+";");
			var sErrorMessage = oControl.getAttribute('serr'+ sCheckNum);
			var oTwinControl;
			if(nchecktype == CHK_TYPES.EMPTY){		
				if(oControl.value.replace(/\s+/, "") == ""){
					if(!bHideError){
						alert(sErrorMessage);
						Controls.DataValidation.HighlightField(oControl);
					}																	
					return false;				
				}			
			}else if(nchecktype == CHK_TYPES.SELECT){
				if(oControl.selectedIndex == -1){
					if(!bHideError){
						alert(sErrorMessage);
						Controls.DataValidation.HighlightField(oControl);
					}
					return false;
				}
			}else if(nchecktype == CHK_TYPES.CHOOSE_SELECT){
				if(oControl.selectedIndex < 1){
					if(!bHideError){
						alert(sErrorMessage);
						Controls.DataValidation.HighlightField(oControl);
					}
					return false;
				}
			}else if(nchecktype == CHK_TYPES.EMAIL){
				var regExp = new RegExp(/^[0-9a-z-_]+(\.[0-9-a-z_]+)*@[0-9a-z-_]+(\.[0-9a-z_]+)+$/gi);
				sEMail = oControl.value;
				//alert(sEMail);
				if(!sEMail.match(regExp)){
				//if((sEMail == "" || (sEMail.indexOf('@') < 1 || sEMail.indexOf('@') == (sEMail.length - 1)))){
					if(!bHideError){
						alert(sErrorMessage);
						Controls.DataValidation.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);
						Controls.DataValidation.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);
						Controls.DataValidation.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);
						Controls.DataValidation.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);
						Controls.DataValidation.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);
						Controls.DataValidation.HighlightField(oControl);
					}
					return false;
				}
			}else if(nchecktype == CHK_TYPES.PASSWORD){
				sPwd = oControl.value.replace(/\s+/, "");
				oTwinControl = eval("document.all."+ oControl.name + "2");
				sPwd2 = oTwinControl.value.replace(/\s+/, "");
				if(sPwd == ""){
					if(!bHideError){
						alert(sErrorMessage);
						Controls.DataValidation.HighlightField(oControl);
					}
					return false;
				}else{
					if(sPwd != sPwd2){
						if(!bHideError){
							alert(oControl.sErr2);
							Controls.DataValidation.HighlightField(oTwinControl);
						}
						return false;
					}
				}
			}else if(nchecktype == CHK_TYPES.PHONE){
				var reCheck = new RegExp("^\\+?([0-9 ])+$");
				if(oControl.value.toString().match(reCheck) == null){
					if(!bHideError){
						alert(sErrorMessage);
						Controls.DataValidation.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);
						Controls.DataValidation.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);
						Controls.DataValidation.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);
						Controls.DataValidation.HighlightField(oControl);
					}
					return false;
				}
			}else if(nchecktype == CHK_TYPES.DUAL_LISTBOX){
				if(oControl.options.length == 0){
					if(!bHideError){
						alert(sErrorMessage);
						Controls.DataValidation.HighlightField(oControl);
					}
					return false;
				}
			}else if(nchecktype == CHK_TYPES.CALLBACK){			
				if(eval(oControl.sCallbackValidator +"("+ "document.all."+ oControl.name +")") == true){
					//return true;
				}else{
					if(!bHideError){
						alert(sErrorMessage);
						Controls.DataValidation.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);
						Controls.DataValidation.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);
						Controls.DataValidation.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);
						Controls.DataValidation.HighlightField(oControl);
					}
					return false;
				}
			}else if(nchecktype == CHK_TYPES.CHECKED){		
				if(!oControl.checked){
					if(!bHideError){
						alert(sErrorMessage);
						Controls.DataValidation.HighlightField(oControl);
					}
					return false;
				}
			}else if(nchecktype == CHK_TYPES.LATIN){
				var reCheck = new RegExp("^[A-Za-z- ]+$");
				if(oControl.value.toString().match(reCheck) == null){
					if(!bHideError){
						alert(sErrorMessage);
						Controls.DataValidation.HighlightField(oControl);
					}
					return false;
				}
			}else if(nchecktype == CHK_TYPES.NONE){
				
			}else{
				alert('Invalid Check Type!');
				return false;
			}
		}
			
		return true;
	}
	/////////////////////////////////////////////////////////////////////////
	Controls.DataValidation.ValidateInput = function(){
		// ESC, SPACEBAR OR ENTER			
		if(event.keyCode == 27 || event.keyCode == 13) return true;
		if(event.srcElement.disabled || event.srcElement.readOnly) return false;
		if(!event.srcElement.nchecktype) return true;
		
		var arCheckTypes = new Array();
		var nchecktype = null;
		var Field = event.srcElement;
		var nTemp;
		// find the check type
		arCheckTypes.push(eval(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;
			}
			if(arCheckTypes[i] == CHK_TYPES.POSITIVE_INTEGER || arCheckTypes[i] == CHK_TYPES.PERCENT || arCheckTypes[i] == CHK_TYPES.INTEGER){
				nchecktype = arCheckTypes[i];
				break;
			}
		}
		
		if(nchecktype == null) return true;
		
		/*
		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 oRange = document.selection.createRange();
		var sOrigValue = event.srcElement.value;			
		//var sSelection = oRange.text;			
		oRange.text = String.fromCharCode(event.keyCode);
		oRange.select();
		sValue = event.srcElement.value;
		
		oControl = new AbstractControl(event.srcElement.name, sValue, nchecktype, event.srcElement.sCallbackValidator);//event.srcElement.nchecktype
		var nPointPosition = sValue.indexOf(".");
		var nNumDigits = 0;

		if(nPointPosition >= 0){
			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){
				//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;
			}
		}
		//alert(oControl.innerHTML);
		if(!CheckValue(oControl, true)){
			event.srcElement.value = sOrigValue;
		}
		return false;
	}

	/////////////////////////////////////////////////////////////////////////
	Controls.DataValidation.AbstractControl = function(sName, vValue, nchecktype, sCallbackValidator){
		this.nchecktype = nchecktype;
		this.value = vValue;
		this.sCallbackValidator = sCallbackValidator;
		this.name = sName;
	}
	/////////////////////////////////////////////////////////////////////////
	Controls.DataValidation.CheckSubmit = function(frmForm, sOnSubmit){  ///, bDoSubmit	   
		if(frmForm.ValidateControls(sOnSubmit)){		
			frmForm.submit();		
		}
		
		return false;		
	}
	////////////////////////////////////////////////////////////////////////////////////////
	Controls.DataValidation.FindParentForm = function(oObject){
		while(oObject.parentNode.tagName != "FORM"){
			oObject = oObject.parentNode;
		}
		return oObject.parentNode;
	}
	////////////////////////////////////////////////////////////////////////////////////////
	Controls.DataValidation.ChangeState = function(chkSwitch, nLanguageId){
		var bState = chkSwitch.checked;
		var i;
		var frmForm = Controls.DataValidation.FindParentForm(chkSwitch);
		var sPrefix = "document."+ frmForm.name + ".";
		for(i = 0; i < frmForm.arLngControls.length; i++){
			eval(sPrefix + frmForm.arLngControls[i] + nLanguageId).disabled = !bState;
		}
	}
	////////////////////////////////////////////////////////////////////////////////////////
	Controls.DataValidation.DisableForm = function(oForm){
		var i;
		for(i = 0; i < oForm.elements.length; i++){
			oForm.elements[i].disabled = true;
		}
	}
	////////////////////////////////////////////////////////////////////////////////////////
	Controls.DataValidation.DisplayMessageAndGoBack = function(sMessage, sUrl){
		alert(sMessage);
		window.location = sUrl;
	}
	//////////////////////////////////////////////////////////////////////////////////////////
	Controls.DataValidation.HighlightField = function(oControl){
		if(typeof(oControl) != "undefined"){
			oControl.value = "";
			oControl.focus();
		}	
		//
	}
}