/* FORM VALIDATION MODULE */
/*  */

var formValidation = new mSDFormValidation();


function mSDFormValidation(){
	this.okClass			= "formTextNormal";
	this.errorClass			= "formTextRequired";
	this.lastClassSelect 	= "";
	this.formvalues			= "";
	this.flagAlert			= 0;
	this.flagError			= 0;
	this.flagSetFocus		= 0;
	this.classNameArray		= new Array();
	this.classArray			= new Array();
	this.errorsArray		= new Array();
	this.debug				= true;
	this.generalError		= 0;
	
	this.fValidator = function(elem,functions){
		try{
			var flagErrorVal = 0;
			var func = functions.split(" ");
			for(var a = 0; a <= func.length-1; a++ ){
				if (func[a].indexOf('isMatchFields')!=-1){
					var vars = func[a].match(/\((.*),(.*),(.*)\)/);
					var data = func[a].replace("this",'document.getElementById("'+elem.id+'")');
					var data = data.replace(vars[2],'document.getElementById("'+vars[2]+'")');
				}else{
					var data = func[a].replace("this",'document.getElementById("'+elem.id+'")');
				}
				var res = eval(data);
				if(!res){
					flagErrorVal = 1;
					break;
				}
				//this.isLen(elem, 10);	
			}
			if(flagErrorVal){
				return false;
			}else{
				return true;
			}
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}			
	}
	this.searchArray = function(array,val){
		try{		
			for(var j=0;j <= array.length-1;j++){
				if(array[j] == val){
					return j;
				}
			}
			return -1;
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}		
	}
	
	this.sdErrorHandler = function(elem,errornum){
		try{
			if(!this.flagSetFocus){
				this.flagSetFocus = elem
			}
			
			var val = this.searchArray(this.classNameArray,elem.id);
			
			if(val != -1){
				
				elem.className = this.classArray[val]+" "+this.errorClass;
			}
			
			var idname = 'errMessage'+elem.id;
			if(document.getElementById(idname)){
				idSpan 				= document.getElementById(idname)
				idSpan.innerHTML	= this.printMessage(errornum)
			}else{
				var newfield 		= document.createElement('span');
				newfield.id 		= idname;
				newfield.className	= "formMessageError";
				newfield.innerHTML	= this.printMessage(errornum)
				elem.parentNode.appendChild(newfield);							
			}
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}			
	}
	this.printMessage = function(num){
		try{		
			if(!this.errorsArray[num]){
				return "";
			}else{
				return this.errorsArray[num];
			}
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}			
	}
	this.sdOkHandler = function(elem){
		try{
			var idname = 'errMessage'+elem.id;
			idSpan = document.getElementById(idname)
			if(idSpan){
				idSpan.innerHTML	= "";
			}
	
			var val = this.searchArray(this.classNameArray,elem.id);
			if(val != -1){
				elem.className = this.classArray[val];
			}else{
				elem.className = this.okClass;
			}
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}			
	}
	this.sdSetFocus = function(){
		try{		
			elem	= this.flagSetFocus;
		    elem.focus();
		    elem.select();
		    this.flagSetFocus = 0;
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}			    
	}
	this.setForm = function(data,errors){
		try{
			this.formvalues = data;
			this.errorsArray = errors;
			for(var j=1;j <= this.formvalues.length/3;j++){
				var event 	= this.formvalues[(j*3)-2];
				var args 	= this.formvalues[(j*3)-1];
				var elem 	= this.formvalues[(j*3)-3];
				var idE 	= document.getElementById(elem)
				this.classNameArray[j] 	= elem;
				this.classArray[j] 		= idE.className;
				
				var gko = navigator.userAgent.toLowerCase();
				if (gko.indexOf('gecko')!=-1){
					idE.setAttribute(event,args); 
				}else{	
					idE[event] = new Function(args);
				}			
			}
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}				
	}

	this.validateForm = function(){
		try{
			this.flagSetFocus	= 0;
			this.flagError		= 0;
			
			this.flagAlert 		= 1;
			for(var j=1;j <= this.formvalues.length/3;j++){
				var funcs	= this.formvalues[(j*3)-1];
				var elem	= this.formvalues[(j*3)-3];
				//funcs 		= funcs.replace("this",this.formvalues[(j*3)-3]);
	
				if(funcs.indexOf('fValidator')!=-1){
					var argsf = funcs.match(/.*fValidator\(this,(.*)\)$/);
					var data = "this.fValidator(document.getElementById('"+elem+"'),"+argsf[1]+")";
					
					var func 	= "var res = "+data;
					eval(func);
					if(!res){
						this.flagError = 1;
					}
				
				}else if(funcs.indexOf('isMatchFields')!=-1){
					var vars = funcs.match(/\((.*),(.*)\)/);
					var data = funcs.replace("this",'document.getElementById("'+elem+'")');
					var data = data.replace(vars[2],'document.getElementById("'+vars[2]+'")');
					var func 	= "var res = "+data;
					eval(func);
					if(!res){
						this.flagError = 1;
					}				
				}else{
					var vars = funcs.match(/\((.*)\)/);
					var data = funcs.replace("this",'document.getElementById("'+elem+'")');
					var func 	= "var res = "+data;
					eval(func);
					if(!res){
						this.flagError = 1;
					}				
				}			
				
				
			}
			if(this.flagError){
	
				this.sdSetFocus();
				this.flagAlert 	= 0;
				return false;
	
			}else{
	 			
				return true;
			}
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}			
	}

	this.isValidElement = function(elem){
		if(elem.value){
			return true;
		}else{
			return false;
		}
	}
	function getHtmlObject(elem){
		if(document.getElementById(elem)){
			var obj = document.getElementById(elem);
			alert(obj);
			return obj;
		}
	}	
	this.isLen = function(elem,charlength,errornum){
		try{
			var str = elem.value;
			if (str.length < charlength) {
				elem.className = this.errorClass
				this.sdErrorHandler(elem,errornum)
	
				return false;
			} else {
				this.sdOkHandler(elem)
				return true;
			}
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}			
	}
	this.isNotEmpty = function(elem,errornum){
		try{
			if(!this.isValidElement(elem)){
				this.sdErrorHandler(elem,errornum);

				return false;
			}
			this.sdOkHandler(elem)
			return true;
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}

	}
	this.errorFramework = function(elem,err){
		if(this.debug && this.generalError == 0){
			this.generalError = 1;
			alert("Form Validation Error\nWe can't validate the form, an error stop the execution of framework, please check your code\nError : "+err)

		}
		this.sdOkHandler(elem)
		return true;
	}
	this.isNumber = function(elem,minchars,errornum){
		try{
			var str = elem.value;
		    var re = /^[-]?\d*\.?\d*$/;
		    str = str.toString();
		    if (!str.match(re)) {
		    	this.sdErrorHandler(elem,errornum)
		        return false;
		    }
		    if(this.isLen(elem, minchars)){
		    	this.sdOkHandler(elem)
		    	return true;
		    }
		    
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}		    
	}
	

	this.isEMailAddr = function (elem,errornum) {
		try{
			var str = elem.value;
		    var re = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
		    if (!str.match(re)) {
				this.sdErrorHandler(elem,errornum)
		        return false;
		    } else {
		    	this.sdOkHandler(elem)
		        return true;
		    }
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}		    
	}
	this.isMatchFields = function(elem,otherelem,errornum){
		try{
			if(elem.value != otherelem.value){
				elem.className 		= this.errorClass;
				otherelem.className = this.errorClass;
				this.sdErrorHandler(elem,errornum);
				this.sdErrorHandler(otherelem,errornum);
				return false;
			}else{

				this.sdOkHandler(elem);
				this.sdOkHandler(otherelem);
				return true;

			}
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}				

	}
	this.validateFieldExp = function(elem,expression,minchars,errornum){
		try{
			var str = elem.value;
			switch(expression){
				case "alphanumeric":
					var re = /^\w+$/;
				break;
				case "alphanumericunderlinedash":
					var re = /^[\w-]+$/;
				break;
				case "telephone":
					var re = /^[\d- ]+$/;
				break;
			}
	
		    if (!str.match(re)) {
				elem.className = this.errorClass
				this.sdErrorHandler(elem,errornum)
		        	
		        return false;
		    } else {
		    	if(this.isLen(elem, minchars))
		    		this.sdOkHandler(elem)
		    		return true;
		    }
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}			    

	}
	this.isChecked = function(elem,def,errornum) {
		
		try{
		    if (elem.checked != def) {
		    	elem.className = this.errorClass
				this.sdErrorHandler(elem,errornum)
		        return false;
		    } else {
		    	this.sdOkHandler(elem)
		        return true;
		    }
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}			    
	    
	}	
	this.isChosen = function(elem,errornum) {
		try{
		    if (elem.selectedIndex == 0) {
				elem.className = this.errorClass
				this.sdErrorHandler(elem,errornum)
		        return false;
		    } else {
		    	this.sdOkHandler(elem)
		        return true;
		    }
		}catch(err){
			this.errorFramework(elem,err);
			return true;
		}		    
	    
	}

}
