//-------------------------------------------------
//Uses functions from LIBPATH/js/functions.js
//-------------------------------------------------

//-------------------------------------------------
//FormValidator class
//-------------------------------------------------

function FormValidator_new(formObj){
    this.formObj = formObj;
    
    this.on_VALID_NOTEMPTY = 
    function(fieldName){
    	if(startsWith(this.formObj.elements[fieldName].type, "select")){
    		return (this.formObj.elements[fieldName].options.length != 0);
    	}
    		
        return isEmpty(this.formObj.elements[fieldName].value) ? false : true;
    }
    
    this.on_VALID_PASSWORD = 
    function(fieldName){
        return (this.formObj.elements[fieldName].value != this.formObj.elements["C"+fieldName].value) ? false : true;
    }
    
    this.on_VALID_EMAIL = 
    function(fieldName){
       return (isEmpty(this.formObj.elements[fieldName].value) || isEmail(this.formObj.elements[fieldName].value)) ? true : false;
    }
    
    this.on_VALID_NUMERIC = 
    function(fieldName){
       return (isEmpty(this.formObj.elements[fieldName].value) || isNumeric(this.formObj.elements[fieldName].value)) ? true : false;
    }
    
    this.on_VALID_INTEGER = 
    function(fieldName){
       return (isEmpty(this.formObj.elements[fieldName].value) || isInteger(this.formObj.elements[fieldName].value)) ? true : false;
    }
    
    this.on_VALID_DATE =
    function(fieldName){
       return (isEmpty(this.formObj.elements[fieldName].value) || isDate(this.formObj.elements[fieldName].value)) ? true : false;
    }
    
    this.on_VALID_NOTSELECTVALS = 
    function(fieldName){
    	var field = this.formObj.elements[fieldName];
    	
    	if(field.type.indexOf('select') < 0)
    		return true;

    	var badVals = field.getAttribute("badvals");
    	
    	if(!badVals)
    		return true;
    		
    	badVals = badVals.split(",");
    	for(var i=0 ; i<badVals.length ; i++){
    		if(field.options[field.selectedIndex].value == badVals[i])
    			return false;
    	}
    		
    	return true;
    } 
    
    this.on_VALID_VALINTERVAL =
    function(fieldName){
    	var field = this.formObj.elements[fieldName];
    		
    	var valmax = field.getAttribute("valmax");
    	var valmin = field.getAttribute("valmin");
    	var val = field.value;
    	
		if(!isNumeric(val))			
			return false;
		
		if(valmax){
			if(!isNumeric(valmax)){
				alert("Developer: valmax and valmin and values of dropdown options must be numeric");
				return false;
			}else if(parseFloat(val) > parseFloat(valmax)){
				return false;
			}    			
		}
		
		if(valmin){
			if(!isNumeric(valmin)){
				alert("Developer: valmax and valmin and values of dropdown options must be numeric");
				return false;
			}else if(parseFloat(val) < parseFloat(valmin)){
				return false;
			}    			
		} 	
		
		return true;
    }
    
    this.on_VALID_FILEUPLOAD = 
    function(fieldName){
    	var field = this.formObj.elements[fieldName];
    	
    	if(field.type.indexOf('file') < 0)
    		return true;
    	
    	var filePath = field.value;
    	var acceptedExts = field.getAttribute("exts");
    	
    	if(isEmpty(filePath) || !acceptedExts)
    		return true;   
    		
    	acceptedExts = acceptedExts.split(",");
    	for(var i=0 ; i<acceptedExts.length ; i++){
    		if(endsWith(filePath.toLowerCase(), "." + trim(acceptedExts[i]).toLowerCase()))
    			return true;
    	}
	
    	return false;
    }
    
    this.on_VALID_NOSCRIPT = 
    function(fieldName){  
    	var has = (!isEmpty(this.formObj.elements[fieldName].value) && hasScript(this.formObj.elements[fieldName].value)) ? true : false;
    	
    	if(has && funcExists("getResString") && varExists('STRING') && varExists('FORM_DO_NOT_USESCRIPTS'))
    		alert(STRING[FORM_DO_NOT_USESCRIPTS]);
    		
    	return !has; 	
    } 
    
    this.on_VALID_STRLEN =
    function(fieldName){  
    	var field = this.formObj.elements[fieldName];
    	
    	var allowEmpty = field.getAttribute("allowempty");	
    	
    	if(allowEmpty && isEmpty(field.value))
    		return true;
    	
		var eq = field.getAttribute("leneq");		
		if(eq){
			if(!isInteger(eq)){
				alert("Developer: leneq must be integer");
				return false;
			}else if(field.value.length != parseInt(eq)){
				return false;
			}   
			
			return true;
		}
		
		var lt = field.getAttribute("lenlt");		
		if(lt && field.value.length >= parseInt(lt)){
			return false;
		}
			
		var lteq = field.getAttribute("lenlteq");		
		if(lteq && field.value.length > parseInt(lteq)){
			return false;
		}
		
		var gt = field.getAttribute("lengt");		
		if(gt && field.value.length <= parseInt(gt)){
			return false;
		}
		
		var gteq = field.getAttribute("lengteq");		
		if(gteq && field.value.length < parseInt(gteq)){
			return false;
		}
		
		return true;
    } 
    
    this.on_VALID_PHONE =
    function(fieldName){  
    	var field = this.formObj.elements[fieldName];
    	var otherFieldName = field.getAttribute("otherctrl");	
    	
    	if(!otherFieldName){
    		alert("Developer: otherctrl must be set");
			return false;
    	}
    	
    	var fieldVal = field.value;
    	var otherFieldVal = this.formObj.elements[otherFieldName].value;
    	
    	if(isEmpty(fieldVal) && isEmpty(otherFieldVal)){   
    		if(field.getAttribute("allowempty")){
    			return true;
    		}
    		return false
    	}
    	
    	if(isEmpty(fieldVal) || isEmpty(otherFieldVal)){
    		return false;
    	} 
    	
		return true;
    }
    
    this.on_VALID_ATLEASTONESELECTED =
    function(fieldName){  
    	var field = this.formObj.elements[fieldName];
    	
    	if(field.type.indexOf('select') < 0 || !field.multiple){
    		alert("VALID_ATLEASTONESELECTED is only allowed for multiple select controls.");
    		return false;
    	}    	

    	for(var i=0 ; i<field.options.length ; i++){
    		if(field.options[i].selected){
    			return true;
    		}
    	}
    		
    	return false;    	
    }
    
    //---------------------
    
    this.on_Begin = 
    function(){
        return new Array();
    }
    
    this.on_End = 
    function(valids){  
	   	for(ctrlName in valids){
			if(!valids[ctrlName])
				return false;
	   	}    
        return true;
    }
}

//-------------------------------------------------
//Needed for inheritance
//-------------------------------------------------

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

Function.method('inherits', function (parent) {
    var d = {}, p = (this.prototype = new parent());
    this.method('uber', function uber(name) {
        if (!(name in d)) {
            d[name] = 0;
        }        
        var f, r, t = d[name], v = parent.prototype;
        if (t) {
            while (t) {
                v = v.constructor.prototype;
                t -= 1;
            }
            f = v[name];
        } else {
            f = p[name];
            if (f == this[name]) {
                f = v[name];
            }
        }
        d[name] += 1;
        r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));
        d[name] -= 1;
        return r;
    });
    return this;
});

Function.method('swiss', function (parent) {
    for (var i = 1; i < arguments.length; i += 1) {
        var name = arguments[i];
        this.prototype[name] = parent.prototype[name];
    }
    return this;
});

//-------------------------------------------------
//These are usable extension examples.To create a custom validator class,
//do this in an included js file and also extend the php class 'FormValidator' 
//as indicated in that file. You may add or override methods.
//-------------------------------------------------

//-------------------------------------------------
//FormValidator_CtrlRedBorder class
//-------------------------------------------------

function FormValidator_CtrlRedBorder(formObj){
    this.formObj = formObj;
}

FormValidator_CtrlRedBorder.inherits(FormValidator_new);

FormValidator_CtrlRedBorder.method('on_End', function (valids){
   	var valid = true;
   	var borderWidth = this.formObj.getAttribute("borderwidth");
   	borderWidth = borderWidth ? borderWidth : "1";
   	
   	for(ctrlName in valids){
   		var isCtrl = false;
   		for(var i=0 ; i<this.formObj.elements.length ; i++){
   			if(ctrlName == this.formObj.elements[i].name){
   				isCtrl = true;
   				break;   				
   			}
   		}
   		
   		if(isCtrl){
	   		ctrl = this.formObj.elements[ctrlName]; 
	   		
			if(!valids[ctrlName]){
				ctrl.style.borderColor = "red";
				ctrl.style.borderWidth = borderWidth + "px";
				
				if(ctrl.type == "password" && (confCtrl = this.formObj.elements["C" + ctrlName])){
					confCtrl.style.borderColor = "red";
					confCtrl.style.borderWidth = borderWidth + "px";
				}
				
				valid = false;
			}else{
				ctrl.style.borderColor = "";
				ctrl.style.borderWidth = "";
				
				if(ctrl.type == "password" && (confCtrl = this.formObj.elements["C" + ctrlName])){
					confCtrl.style.borderColor = "";
					confCtrl.style.borderWidth = "";
				}
			}
   		}
   	}
   	
	return valid;
});

//-------------------------------------------------
//FormValidator_LbRedBkg class
//-------------------------------------------------

function FormValidator_LbRedBkg(formObj){
    this.formObj = formObj;
}

FormValidator_LbRedBkg.inherits(FormValidator_new);

FormValidator_LbRedBkg.method('on_End', function (valids) {
   	var valid = true;
   	var ctrl, lbDiv, passwConfDiv;
        	
	for(ctrlName in valids){		
		lbDiv = document.getElementById(ctrlName);
		ctrl = this.formObj.elements[ctrlName]; 
		
		if(!valids[ctrlName]){
			valid = false;	
			if(lbDiv){
				if(!lbDiv.getAttribute("bgColorSet")){
					lbDiv.setAttribute("bgColor", lbDiv.style.backgroundColor);
					lbDiv.setAttribute("bgColorSet", "1");
				}			
				lbDiv.style.backgroundColor = "#FFCACA";			
			
				if(ctrl.type == "password" && (passwConfDiv = document.getElementById("C" + ctrlName))){
					if(!passwConfDiv.getAttribute("bgColorSet")){
						passwConfDiv.setAttribute("bgColor", passwConfDiv.style.backgroundColor);
						passwConfDiv.setAttribute("bgColorSet", "1");
					}
					passwConfDiv.style.backgroundColor = "#FFCACA";	
				}
			}			
		}else{
			if(lbDiv){
				lbDiv.style.backgroundColor = lbDiv.getAttribute("bgColor");  	
	
				if(ctrl.type == "password" && (passwConfDiv = document.getElementById("C" + ctrlName)))
					passwConfDiv.style.backgroundColor = passwConfDiv.getAttribute("bgColor");  
			}
		}
	}
	
	return valid;
});