var validators = new Array(6);
var validator;

/**
 * debug: disable in production mode
 **/
function debug(pString) {
	//alert(pString)
}

/**
 * funzione da richiamare all'onload del documento per aggiungere automaticamente la validazione a tutte le form
 **/
function addFormValidation(){
	formList = document.getElementsByTagName("form");
	for (var i=0; i < formList.length; i++) {
		if (formList[i].getAttribute("onsubmit") == null) {
			if (typeof(Object.prototype.addEventListener) == "undefined") {
				formList[i].onsubmit = validateForm;
			} else {
				formList[i].addEventListener("onsubmit", "validateForm")
			}
		}
	}
}

/**
 * funzione per sostituire i parametri nei messaggi di errore
 **/
String.prototype.setParameter = function(pNum, pVal) {
	var lStr,lInd;
	if ((lInd = this.indexOf(lStr = "{"+pNum+"}")) == -1) return this;
	return this.substring(0, lInd) + pVal + this.substring(lInd + lStr.length);
}

/**
 * ritorna il validatore
 **/
function getValidator(pValidationType) {
	for (var i=0;i< validators.length;i++) {
		if (validators[i][0] == pValidationType) return validators[i][1];
	}
	debug("Invalid validation requested: " + pValidationType +"\nNo validator available")
}

/**
 * recupera i tipi di validazione dall'attributo class e li trasforma in un array
 **/
function getValidationArray(pFullClass) {
	var lList = pFullClass.split(" ");
	for (var x=0; x<lList.length; x++) {
		if (lList[x].indexOf("val-") == 0) return lList[x].substring(4).split(":");
	}
	return [];
}

/**
 * funzione principale per la validazione
 **/
function validateForm(p_form, p_otherValidation){
	if(p_form == null){
		p_form = this;
	} else {
		p_form = document.getElementById(p_form);
	}
	// validazione client solo su browser che supportano il dom standard
	if(!document.getElementById) return true;
	// loop su tutti gli elementi della form
	for(var k = 0; k < p_form.length; k++){
		var elm = p_form[k];
		// array di validazioni
		valList = getValidationArray(elm.className);
		// loop per tutte le validazioni richieste
		for (var v=0; v<valList.length;v++) {
			if(!validate(elm, valList[v])) return false;
		}
	}
	// sono necessarie ulteriori validazioni custom?
	if((typeof(p_otherValidation) != "undefined")){
		if(!eval(p_otherValidation)) return false;
	}
	// disabilito i pulsanti
	disableButtons();
	return true;
}

/**
 *	valida un campo
 **/
function validate(pElement, pValidationType) {
	// recupero il validatore
	lValidator = getValidator(pValidationType);
	// validazione
	if(!lValidator.validate(pElement)) {
		// messaggio di errore
		errorMsg = lValidator.getMessage(pElement);
		var lTit =  pElement.getAttribute("title");
		if (lTit == "") lTit = pElement.getAttribute("name");
		errorMsg = errorMsg.setParameter(1, lTit);
		return displayErrorMsg(pElement, errorMsg);
	} else {
		return true;
	}
}

/**
 * disabilita i pulsanti di submit
 **/
function disableButtons(){
	var buttons = document.getElementsByTagName("input");
	for(var k = 0; k < buttons.length; k++){
		lType = buttons[k].type;
		if((lType == "button") || (lType == "submit") || (lType == "reset")){
			buttons[k].disabled = true;
		}
	}
}

/**
 *	mostra il messaggio di errore
 **/
function displayErrorMsg(elm, msg){
	window.alert(msg);
	elm.focus();
	return false;
}

/*** required ************************************************************/
validators[0] = new Array("r", validator = new Object);
validator.validate = function(elm) {
	var lType = elm.type;
	var regEx_space = new RegExp(" ", "g");

	if((lType == "text") || (lType == "textarea") || (lType == "password") || (lType == "file")){
		return !(elm.value.replace(regEx_space, "") == "");
	} else if(lType == "select-one" || lType == "select-multiple"){
		return !(elm.options[elm.selectedIndex].value == "");
	} else if(lType == "radio"){
		var objRadioGroup = elm.form.elements[elm.getAttribute("name")];
		var ck = false;
		for(var i = 0; i<objRadioGroup.length; i++){
			if(objRadioGroup[i].checked == true){
				ck = true;
			}
		}
		return ck;
	}
}
validator.getMessage = function(pElement) {
	return "il campo \"{1}\" deve essere compilato";
}

/*** selected **********************************************************/
validators[1] = new Array("s", validator = new Object);
validator.validate = function(elm) {
	var lType = elm.type;
	if(lType == "select-one"){
		return (elm.selectedIndex != 0);
	} else if(elm.type == "select-multiple"){
		for(var i = 0; i < elm.length; i++){
			if(elm.options[i].selected == true) return true;
		}
		return false;
	} else if(lType == "radio"){
		objRadioGroup = elm.form.elements[elm.getAttribute("name")];
		for(var i = 0; i < objRadioGroup.length; i++){
			if(objRadioGroup[i].checked == true) return true;
		}
		return false;
	} else if(lType == "checkbox"){
		return elm.checked;
	}
}
validator.getMessage = function(pElement) {
	return "nessun valore selezionato per il campo \"{1}\"";
}

/*** email ***************************************************************/
validators[2] = new Array("e", validator = new Object);
validator.validate = function(elm) {
    var regex = new RegExp("^[\\w-_\.]*[\\w-_\.]\@[\\w]\.+[\\w]+[\\w]$");
	return regex.test(elm.value);
}
validator.getMessage = function(pElement) {
	return "il campo \"{1}\" deve contenere un indirizzo di email valido";
}

/*** numero ***************************************************************/
validators[3] = new Array("n", validator = new Object);
validator.validate = function(elm) {
	var regEx_comma = new RegExp(",", "g");
	return (!isNaN(elm.value.replace(regEx_comma, ".")));
}
validator.getMessage = function(pElement) {
	return "il campo \"{1}\" deve essere in formato numerico";
}

/*** ip ***************************************************************/
validators[4] = new Array("i", validator = new Object);
validator.validate = function(elm) {
	if (elm.value=="") return true;
	var re = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
	if (!re.test(elm.value)) return false;
   
	var parts = elm.value.split(".");
	if (parseInt(parseFloat(parts[0])) == 0) return false;
	for (var i=0; i<parts.length; i++) {
		if (parseInt(parseFloat(parts[i])) > 255) return false;
	}
	return true;
}
validator.getMessage = function(pElement) {
	return "il campo \"{1}\" deve contenere un indirizzo ip valido nella forma 12.345.67.89";
}

/*** caratteri ***************************************************************/
validators[5] = new Array("f", validator = new Object);
validator.validate = function(elm) {
	var validChars = "abcdefgihjklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.";
	var found = 0;
	for(var k = 0; k < elm.value.length; k++){
		for(var i = 0; i< validChars.length; i++){
			if(elm.value.charAt(k) == validChars.charAt(i)){
				found++;
			}
		}
	}
	if(found == elm.value.length){
		return true;
	}
	return false;
}
validator.getMessage = function(pElement) {
	return "il campo \"{1}\" contiene caratteri non validi";
}