var validators = new Array(5);
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 cancellare il valore di tutti i campi della form
**/
function deleteAll(pForm){
	for (var i=0; i < pForm.length; i++) {
		if(pForm[i].type == "select-one"){
			pForm[i].selectedIndex=0;
		} else if (pForm[i].type == "checkbox") {
			pForm[i].checked=false;
		} else if (pForm[i].type == "radio") {
			pForm[i].checked=false;
		} else if (pForm[i].type == "select-multiple") {
			pForm[i].selectedIndex=-1;
		} else{
			pForm[i].value="";
		}
	}
}


/**
* 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_otherValidation){
	var p_form = this;
	// 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) {
	if (pElement.disabled)
	{
		return true;
	}
	// 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"){
		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";
}

/*** codice fiscale ********************************************/
validators[5] = new Array("f", validator = new Object);
validator.validate = function(elm) {
	if (elm.value=="") return true;
	var re = /^[a-zA-Z]{6}\d{2}[a-zA-Z]\d{2}[a-zA-Z]\d{3}[a-zA-Z]$/;
	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}\" non contiene un codice fiscale valido";
}
/*** partita iva ***************************************************************/
validators[6] = new Array("p", validator = new Object);
validator.validate = function(elm) {
	if (elm.value=="") return true;
    var sz_Codice = elm.value;
	var n_Val,n_Som1=0,n_Som2=0,lcv;
   if (sz_Codice.length!=11 || isNaN(parseFloat(sz_Codice)) || parseFloat(sz_Codice)<parseFloat(0))
      return false;
   
   for (lcv=0;lcv<9;lcv+=2)
   {
      n_Val=parseInt(sz_Codice.charAt(lcv));
      n_Som1+=n_Val;
      n_Val=parseInt(sz_Codice.charAt(lcv+1));
      n_Som1+=Math.floor(n_Val/5) + (n_Val<<1) % 10;
   }
   n_Som2 = 10 - (n_Som1 % 10);
   n_Val=parseInt(sz_Codice.charAt(10));
   if (n_Som2==n_Val) {
      return true;
      }
   return false;
}
validator.getMessage = function(pElement) {
	return "il campo \"{1}\" non contiene una partita iva valida";
}




function partitaIVA(sz_Codice)
   {
   var n_Val,n_Som1=0,n_Som2=0,lcv;
   if (sz_Codice.length!=11 || isNaN(parseFloat(sz_Codice)) || parseFloat(sz_Codice)<parseFloat(0))
      return false;
   
   for (lcv=0;lcv<9;lcv+=2)
   {
      n_Val=parseInt(sz_Codice.charAt(lcv));
      n_Som1+=n_Val;
      n_Val=parseInt(sz_Codice.charAt(lcv+1));
      n_Som1+=Math.floor(n_Val/5) + (n_Val<<1) % 10;
   }
   n_Som2 = 10 - (n_Som1 % 10);
   n_Val=parseInt(sz_Codice.charAt(10));
   if (n_Som2==n_Val)
      return true;
   return false;
   }