// JavaScript per la Gestione Errori nei form
 
/* check-type: 
			0 mandatory
			1 number      [0-9]
			2 string      [a-zA-Z]
			3 email		  ^[a-zA-Z0-9_\\.-]+@{1}[a-zA-Z0-9-]+\\.[a-zA-Z]{0,4}$
			4 url
			5 date		  ^(0[1-9]|[12]\d|3[01])\/(0[1-9]|1[0-2])\/([1-9])\d\d\d$ valide dal 01/01/1900
			6 phone		  ^\\+{0,1}[0-9 ]{1,}$
			7 alphanumeric ^[a-zA-Z0-9]*$
 */
var regexp = new Array( 
			"^(.)*(\\S)+(.)*$",                         									// 0 mandatory
	    	"^[0-9]*$",																		// 1 number
	    	"^[a-zA-Z]*$",																	// 2 string
	    	"^[a-zA-Z0-9_\\.-]+@{1}[a-zA-Z0-9]{1}([a-zA-Z0-9_-]+\\.{1})+[a-zA-Z]{2,4}$",	// 3 email
	    	"",						                            							// 4 url
	    	"^(0[1-9]|[12]\\d|3[01])\\/(0[1-9]|1[0-2])\\/([1-9])\\d\\d\\d$",				// 5 date (sono valide dal 01/01/1900
	    	"^\\+?[0-9]+[0-9 ]{1,}$",														// 6 phone
	    	"^[a-zA-Z0-9' ]*$",																// 7 alphanumeric
	    	"^[1-9]*$"																		// 8 number without 0
	   	);

var errors = 0;

/**
 * Funzione di validazione generica, Se non e' specificata l' exp regolare applica checkMandatory altrimenti
 * verifica che il campo rispetti l'exp regolare.
 * 
 * @param i: indice(relativo a fields) dell'elemento che si sta validando
 * @param fields: e' una matrice formata dai seguenti elementi: field-id, check-type, function da applicare, reqExp da applicare 
 * @return boolean true se il campo e' valido | false altrimenti
 */
function check(i, fields) {
	var exp = ( fields[i][3].blank() ) ? regexp[fields[i][1]] : fields[i][3];
	var pattern = new RegExp(exp);
	var valid = true;
	if( fields[i][1] == "0" ) valid = checkMandatory(i, fields);
	else 
	{
		var inputValue = $(fields[i][0]).value;
		if( !inputValue.blank() )  valid = valid && pattern.test(inputValue);
	}
	if(!valid) manageError(i, fields);
	return valid;
}

/**
 * Verifica se un campo obbligatorio e' settato.
 * 
 * @param i: indice(relativo a fields) dell'elemento che si sta validando
 * @param fields: e' una matrice formata dai seguenti elementi: field-id, check-type, function da applicare, reqExp da applicare 
 * @return boolean true se il campo ha un valore | false altrimenti
 */
function checkMandatory(i, fields) {
	ret = false;
	var el = $(fields[i][0]);

	if(el != null) {
		switch(el.type) {
			case "textarea"     : 
			case "hidden"       : 
			case "text"         : ret = ( !el.value.blank() );	break;
			case "select-one"   : ret = (!el.value.blank() && el.selectedIndex > -1);	break;
			default: ret = false;
		}
	}
	return ret;
}

/**
 * 
 * @param String idPwd: id del campo contenente la pwd da validare
 * @param String idPwd2: id del campo contenente la pwd duplicata da validare
 * @return boolean true se la password e' valida e se le due password coincidono | false altrimenti
 */
function checkPassword(idPwd, idPwd2) {
	var pattern = new RegExp("^[a-zA-Z0-9-_\\.]{4,}");
	var passw1 = $(idPwd);
	var passw2 = $(idPwd2);
	var valid = passw1.value===passw2.value;
	if(valid) {
		valid = pattern.test(passw1.value);
	}
	return valid;

}

/**
 * 
 * @param i: indice(relativo a fields) dell'elemento che si sta validando
 * @param fields: e' una matrice formata dai seguenti elementi: field-id, check-type, function da applicare, reqExp da applicare 
 * @param str: Messaggio di errore da mostrare. Se non viene passato (o valorizzato) viene mostrato il msg di errore di default
 * @return void
 */
function manageError(i, fields, str) {
	try {
		var el = document.getElementById(fields[i][0]);
		//var elerr = document.getElementById(fields[i][0]+"_ERR");
		var msg = str;
		if( Object.isBlank(msg) || msg.blank() ) {
			switch(fields[i][1]) {
			case "0": msg = mandatoryData;      break;
			case "1": msg = noNumericData;      break;
			case "2": msg = noStringData;       break;
			case "3": msg = noEmailData;        break;
			case "4": msg = wrongFormattedData; break;
			case "5": msg = noDateData;         break;
			case "6": msg = wrongData;          break;
			case "7": msg = wrongFormattedData; break;
			case "8": msg = noNumericData; break;
			default : break;
			}
		}
//		if(msg.length >0) msg = msg+fields[i][0];
/*
		el.parentNode.className="erroreForm";
		if(elerr.innerHTML.indexOf(msg) < 0) {
			elerr.innerHTML += (elerr.innerHTML.length > 0) ? "<br />"+msg : msg; 
		}
		elerr.className = "erroreForm displayNone";
		errors++;
*/
		if(msg.length > 0) {
			if(typeof fields[i][4] != "undefined")
				msg += "\n"+fields[i][4];
			alert(msg);
			el.focus();

		}
		errors++;
	}
	catch(e) {
		alert("GENERIC ERROR " + e.message);
		return false;
	}
}

/**
 * 
 * @param fields: e' una matrice formata dai seguenti elementi: field-id, check-type, function da applicare, reqExp da applicare 
 * @return void
 */
function resetErrorMsg(fields) {
	for(i = 0; i < fields.length; i++) {
		var elerr = document.getElementById(fields[i][0]+"_ERR");
//		elerr.innerHTML = "";
	}
}

/**
 * 
 * @param i: indice(relativo a fields) dell'elemento che si sta validando
 * @param fields: e' una matrice formata dai seguenti elementi: field-id, check-type, function da applicare, reqExp da applicare 
 * @return void
 */
function resetError(i, fields) {
	var el = document.getElementById(fields[i][0]);
	var elerr = document.getElementById(fields[i][0]+"_ERR");
	el.parentNode.className="";
	elerr.className="displayNone";
}

function resetAllError(fields)
{
	for(i=0; i<fields.length; i++)
	{
//		document.getElementById(fields[i][0]+"_ERR").innerHTML = "";
		resetError(i, fields);
	}
}

/**
 * Applica le regole di validazione al form
 * 
 * @param fields: e' una matrice formata dai seguenti elementi: field-id, check-type, function da applicare, reqExp da applicare 
 * @return boolean true se le regole di validazione sono valide | false altrimenti
 */
function validateElements(fields) {
	//resetErrorMsg(fields);
    errors = 0;
	var i = 0;
	for(i = 0; i < fields.length; i++) {
		//resetError(i, fields);
		valid = (!fields[i][2].blank()) ? eval(fields[i][2]) : check(i, fields);
        if(!valid) break;
	}
	
	return (errors == 0 && valid);
}

function checkMaxItemsSelected(field, name, max) {
	var res = true;
/*
	var count = 0;
	for (i=0; i<field.options.length; i++) {
		if (field.options[i].selected) {
			count++;
		}
	}

	if(count>max) {
		alert(maxItems1+" "+max+" "+ maxItems2 + " "+name);
		field.focus();
		res=false;
	}
*/
	return res;
}

