//-------------------------------------------------
//Uses functions from LIBPATH/js/functions.js
//-------------------------------------------------

//-------------------------------------------------
//FormValidator class
//-------------------------------------------------

function FormValidator(formObj){
    this.formObj = formObj;
    
    this.on_VALID_NOTEMPTY = 
    function(fieldName){
        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];
    	
    	if(field.type.indexOf('select') >= 0)
    		return true;
    		
    	var valmax = field.getAttribute("valmax");
    	var valmin = field.getAttribute("valmin");
    	var val = field.value;
    	
		if(!isInteger(val))			
			return false;
		
		if(valmax){
			if(!isInteger(valmax)){
				alert("Developer: valmax and valmin and values for in dropdown for on_VALID_INTERVALVALS must be integers");
				return false;
			}else if(parseInt(val) > parseInt(valmax)){
				return false;
			}    			
		}
		
		if(valmin){
			if(!isInteger(valmin)){
				alert("Developer: valmax and valmin and values for in dropdown for on_VALID_INTERVALVALS must be integers");
				return false;
			}else if(parseInt(val) < parseInt(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_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);

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);

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;
});