/*
'==========================================
' 2mlib -> javascript -> quick_check.js
'
' Funzioni di controllo client-side per i form html
'
' 2004 Copyright - Dueemmelab
'==========================================
*/

//VARIABILE DI STATO: disabilita il form dopo al primo invio
var Locked_Form=false;

/*QUICK_CHECK(): VERIFICA CHE GLI ELEMENTI DI UN FORM NON
	ABBIANO VALORI NULLI E CHE CERTI TIPI DI DATI SIANO VALIDI.

	Note sull'utilizzo:
		"frm"			:e' il nome/id del form da controllare nel documento
	  "strDir"	:e' una stringa di direttive alla funzione

	La stringa di direttive contiene delle tuple separate dal carattere "/".
	Le tuple sono quadruple del tipo:

		"nome_campo,obbligatorio,tipo_controllo,nome_nel_form"

	con:

		nome_campo	:e' il nome di uno specifico campo del form (proprieta' NAME del tag INPUT)
		obbligatorio	:specifica se il campo e' obbligatorio o no
		tipo_controllo	:e' il tipo di controllo da effettuare sul campo
		nome_nel_form	:e' in nome del campo stampato nei messaggi di errore (se nullo si assume uguale a nomecampo)

	"obbligatorio" puo' contenere qualsiasi stringa non nulla (in genere
	useremo il carattere "M" - mandatory) per indicare un campo obbligatorio
	(per cui l'utente deve necessariamente fornire un valore).

	"tipo_controllo" specifica che tipo di controllo deve subire il contenuto
	del campo preso in esame.I controlli utilizzano le RegularExpression ed
	i tipi validi sono:

		NORMAL		:testo semplice (nessun controllo-default)
		EMAIL			:il testo deve essere un indirizzo email
		URL				:il testo deve essere un URL (http://)
		DATE			:il testo e' una data nel formato dd/mm/yyyy
		TIME			:il testo e' un'orario nel formato hh:mm
		NUMERIC		:il testo deve contenere solo numeri

	Nel caso strDir="" (nessuna direttiva) la funzione controlla solo
	la presenza di eventuali campi lasciati vuoti dall'utente.

	ESEMPIO DI UTILIZZO (all'interno di un tag <form>):
	onSubmit="return quick_check(form_name,'tipo,M,,/nome,M,,/id,M,NUMERIC,/data_ins,M,DATE,data inserimento/ora_inizio,,TIME,ora inizio/link,,URL,',backgroundStd,textStd);"
*/

function prova(){
	alert ('ciao');
}

function quick_check(frm,strDir,client){
	if (arguments.length==3 || client=='yes'){
		var backgroundStd='#181818';									//Colore originale dello sfondo dell'elemento
		var textStd='#ffffff';												//Colore originale del testo dell'elemento
		var backgroundError='#4E4E4E';								//Colore che assumerà l'elemento del form in caso di errore
		var textError='#ffffff';											//Colore del testo per l'elemento del form in caso di errore
	}else{
		var backgroundStd='#ffffff';									//Colore originale dello sfondo dell'elemento
		var textStd='#000000';												//Colore originale del testo dell'elemento
		var backgroundError='#ff5c00';								//Colore che assumerà l'elemento del form in caso di errore
		var textError='#000000';											//Colore del testo per l'elemento del form in caso di errore

	}

	var dirSet;										//Array contenitore delle direttive
	var i;
	var fieldName,fieldForm,fieldType,mandatory;	//Contengono le info di ogni direttiva
	var emptyError=false;													//Flag di errore "campo obbligario vuoto"
	var check_ok=true;														//Flag "validazione eseguita con successo"
	var no_error=true;														//Flag "nessun errore"

	//Se si utilizza la proprietà 'id' (e non 'name') nel tag form
	if (typeof (frm)!='object' && typeof (frm)=='string') {
		var frm=document.getElementById(frm);
	}


	//DEBUG
	/*var out="";
	for (i=1;i<frm.length;i++)
	{	out=out+"\n"+i+"Campo :"+frm[i].name;
		out=out+" Valore:"+frm[i].value;
		out=out+" Tipo:"+frm[i].type;
		if (frm[i].type=="radio" && frm[i].checked==true )
		{
			out=out+" (checked) ";
		}
	}
	alert(out);
	*/

	//Se il form non e' lockato..
	if (Locked_Form==false)
	{
		if (strDir!="")			//se ci sono direttive..
		{
			dirSet=strDir.split("/");	//separale ed inseriscile in un array
			//per ogni direttiva trovata.. (ne esiste una per ogni campo)
			for (d=0; d < (dirSet.length); d++)
			{	//separa nome_campo,obbligatorio,tipo_controllo,nome_nel_form
				dir=dirSet[d].split(",");

				//salva i dati della direttiva..
				fieldName=dir[0];	//proprieta' NAME del campo
				if (dir[1]!="")
					mandatory=true;
				else	mandatory=false;
				if (dir[2]!="")
					fieldType=dir[2].toUpperCase();
				else	fieldType="NORMAL";
				if (dir[3]!="") {
					//concatena i campi seguenti (frasi con virgole)
					fieldForm="";
					for (i=3;i<dir.length;i++) {
						fieldForm+=dir[i]
						if (dir.length>(i+1)) fieldForm+=",";
					}
				}
				else	fieldForm=fieldName;

				frm[fieldName].style.backgroundColor=backgroundStd;
				frm[fieldName].style.color=textStd;

				//se e' una serie di campi radio..
				if ( (typeof frm[fieldName].length!="undefined") && (typeof frm[fieldName][0].name=="string"))
				{	//alert("radio button ("+ frm[fieldName].length +" choices)");
					i=0;
					while ( i<frm[fieldName].length && frm[fieldName][i].checked==false)
					{	//alert("radio choice "+i+" checked:\n"+frm[fieldName][i].checked)
						++i;
					}
					if ( (i<frm[fieldName].length) )	//se ci sono radio button checked..
						fieldValue=frm[fieldName][i].value;
					else	{
						//alert("radio not found");
						fieldValue='';
					}
				}
				else
				{
					fieldValue=frm[fieldName].value;
				}

				//DEBUG
				//alert("Check Form Debug\n\nDir='"+dirSet[d]+"'\n\nfieldName="+fieldName+"\nfieldForm="+fieldForm+"\nfieldType="+fieldType+"\nmandatory="+mandatory+"\nfieldValue="+fieldValue);

				//controlla se il valore e' vuoto..
				if (fieldValue=='')
				{
					if (mandatory==true)	//se e' vuoto ma obbligatorio..
					{	emptyError=true;
						frm[fieldName].style.backgroundColor=backgroundError;
						frm[fieldName].style.color=textError;
						alert("Campo obbligatorio ("+fieldName+")");
					}
				}
				else 	//controlli in base al tipo di campo (se il campo non e' vuoto)
				{
					switch (fieldType)
					{
						case 'TEMAIL':
							check_ok=isEmail(fieldValue,fieldForm);
							break;
						case 'TURL':
							check_ok=isURL(fieldValue,fieldForm);
							break;
						case 'TDATE':
							check_ok=isDate(fieldValue,fieldForm);
							break;
						case 'TTIME':
							check_ok=isTime(fieldValue,fieldForm);
							break;
						case 'TNUMERIC':
							check_ok=isNum(fieldValue,fieldForm);
							break;
						case 'TID':
							check_ok=isID(fieldValue,fieldForm);
							break;
						case 'TEURO':
							check_ok=isEuro(fieldValue,fieldForm);
							break;
						case 'TPHONE':
							check_ok=isPhone(fieldValue,fieldForm);
							break;
						case 'TFILENAME':
							check_ok=isFileName(fieldValue,fieldForm);
							break;
						case 'TFILESIZE':
							check_ok=isFileSize(fieldValue,fieldForm);
							break;
						case 'TCODICE1':
							check_ok=isCodeType1(fieldValue,fieldForm);
							break;
						case 'TCF':
							check_ok=isCf(fieldValue,fieldForm);
							break;
						case 'TIVA':
							check_ok=isIva(fieldValue,fieldForm);
							break;
						//inserire qui nuovo tipo di controllo
						/*case 'NUOVO_TIPO':
							check_ok=isNuovo_tipo(fieldValue,fieldForm);
							break;
						*/
					}
					if (check_ok==false) {
						//Errore di validazione!
						frm[fieldName].style.backgroundColor=backgroundError;
						frm[fieldName].style.color=textError;
						no_error=false;	//flag generale
						check_ok=true;	//ripristina per il prossimo ciclo
					}
				}
				dir="";
			}
		}
		else			//CONTROLLA SOLO CAMPI VUOTI..
		{
			for (i=0;i<frm.elements.length;i++)
			{
				if ( frm.elements[i].value=='' )
					emptyError=true;
			}
		}
	}

	//SE I CAMPI OBBLIGATORI NON SONO STATI TUTTI INSERITI..
	if (emptyError==true)
	{
		alert('ATTENZIONE: i campi obbligatori evidenziati sono vuoti!');
		return false;
	}
	else
	{
		//Se non ci sono errori ->lock del form
		if (no_error) {
			if (Locked_Form==false)
			{	Locked_Form=true;
				return true;
			}
			else
			{	alert('FORM BLOCCATO: i dati sono stati gia\' inviati.\nAspettare il reload della pagina.');
				return false;
			}
		}
		else return false;
	}
}

//BLOCCA IL FORM SENZA EFFETTUARE CONTROLLI
function quick_lock()
{	if (Locked_Form==false) {
		Locked_Form=true;return true;
	}
	else	alert('FORM BLOCCATO: i dati sono stati gia\' inviati.\nAspettare il reload della pagina.');
	return false;
}

//CANCELLA TUTTI I VALORI DEL FORM (tranne per i campi reset,submit,hidden,button)
function quick_reset(frm)
{
	var i;
	//Se si utilizza la proprietà 'id' (e non 'name') nel tag form
	if (typeof (frm)!='object' && typeof (frm)=='string') { var frm=document.getElementById(frm);}
	for (i=0;i<frm.elements.length;i++) {
		//alert(frm.elements[i].type);
		switch (frm.elements[i].type) {
			case 'select-one':
				frm.elements[i].selectedIndex=0;
				break
			case 'select-multiple':
				frm.elements[i].selectedIndex=-1;
				break
			case 'checkbox':
			case 'radio':
				frm.elements[i].checked=false;
				break
			case 'text':
			case 'password':
			case 'file':
			case 'textarea':
				frm.elements[i].value="";
				break
		}
	}
	return true;
}

// CONTROLLA I VALUE DI DUE CAMPI PASSWORD E RITORNA TRUE SE SONO UGUALI
function password_match(p1,p2) {
	//Se si utilizza la proprietà 'id' (e non 'name') nel tag form
	if (typeof (p1)!='object' && typeof (p1)=='string') { var p1=document.getElementById(p1);}
	if (typeof (p2)!='object' && typeof (p2)=='string') { var p2=document.getElementById(p2);}
	if (p1 && p2 && p1.value!='') {
		if (p1.value==p2.value) {
			p1.style.backgroundColor='#ffffff';
			p1.style.color='#000000';
			p2.style.backgroundColor='#ffffff';
			p2.style.color='#000000';
			return true;
		}
		else {
			alert('Password non corrispondenti!');
			p1.style.backgroundColor='#ff0000';
			p1.style.color='#ffffff';
			p2.style.backgroundColor='#ff0000';
			p2.style.color='#ffffff';
			Locked_Form=false;	//disabilita lock del form
			return false;
		}
	}
	else return true;
}


// VERIFICA DATA NEL FORMATO dd/mm/yyyy (CONTROLLO SEMPLICE, NO BISESTILE!)
function isDate(what,fname)
{
	var errMsg="Il campo "+fname+" non contiene una data valida.\nFormato corretto: gg/mm/aaaa";
	var i=new RegExp("^(\\d{1,2})\/(\\d{1,2})\/(\\d{4})$");
	if(i.test(what)) {
		datePart=what.split("/");
		giorno=( datePart[0]>=1 && datePart[0]<=31 );
		mese=( datePart[1]>=1 && datePart[1]<=12 );
		anno=( datePart[2]>=1900 && datePart[2]<=9999 );
		if(!giorno || !mese || !anno) {alert(errMsg); return false;}
	}
	else {
		alert(errMsg); return false;
	}
	return true;
}

// VERIFICA ORA NEL FORMATO hh:mm
function isTime (what,fname)
{
	var errMsg="Il campo "+fname+" non 	contiene un ora valida.\nFormato corretto: hh.mm";
	var i=new RegExp("^(\\d{2})\\.(\\d{2})$");
	if(i.test(what)) {
		timePart=what.split(".");
		hh=(timePart[0]>=0 && timePart[0]<=23);
		mm=(timePart[1]>=0 && timePart[1]<=59);
		if(!hh || !mm ) {alert(errMsg); return false;}
	}
	else {
		alert(errMsg); return false;
	}
	return true;
}

// VERIFICA EMAIL
function isEmail(what,fname)
{
	var errMsg="Il campo "+fname+" non contiene un indirizzo email valido.\nFormato corretto: mionome@miosito.it";
  var i=new RegExp("^[\\w\\-\\'\\#\\%\\.\\,\\$\\!\\+\\*]+@([\\w\\-\\'\\#\\%\\~\\,\\$\\!\\+\\*]+\\.)+[\\w]{2,4}$");
  if(!i.test(what)) {alert(errMsg); return false;}
  return true;
}

// VERIFICA URL HTTP
function isURL(what,fname)
{
	var errMsg="Il campo "+fname+" non contiene un URL valido.\nFormato corretto: http:\/\/www.miosito.it";
  var i=new RegExp("^http\\:\\/\\/[\\w+\\.]+[\\w+\\.\\:\\/\\_\\?\\=\\&\\-\\'\\#\\%\\~\\;\\,\\$\\!\\+\\*]+$");
  if(!i.test(what)) {alert(errMsg); return false;}
  return true;
}

// VERIFICA VALORE NUMERICO
function isNum (what,fname)
{
	var errMsg="Il campo "+fname+" non contiene un valore numerico.\nNon inserire valori decimali.";
	//var zero=new RegExp("^0");
	var i=new RegExp("^(\\d{1,})$");
	if (!(i.test(what))) // || zero.test(what))
	{alert(errMsg); return false;}
	return true;
}

// VERIFICA VALORE NUMERICO MAGGIORE DI ZERO
function isID (what,fname)
{
	var errMsg="Il campo "+fname+" non contiene un ID numerico valido.\nNon inserire valori decimali o uguali a zero.";
	var zero=new RegExp("^0");
	var i=new RegExp("^(\\d+)$");
	if ( what.type=='undefined' || what=='' || !(i.test(what)) || zero.test(what)) {
		alert(errMsg); return false;
	}
	else {
	 if (parseInt(what,10)!=NaN && parseInt(what,10)>0) {
	 		return true;
	 }
	 else {
	 		alert(errMsg);
		return false;
	 }
	}
}

// VERIFICA VALORE NUMERICO SIA NELLA FORMA 0.00
function isEuro (what,fname)
{
	var errMsg="Il campo "+fname+" non contiene una cifra in Euro.\nFormato corretto: 5.20";
	var i=new RegExp("^(\\d+)(,\\d{2})?$");
	if (!(i.test(what))) {alert(errMsg); return false;}
	return true;
}

// VERIFICA NUMERO DI TELEFONO/FAX
function isPhone (what,fname)
{
	var errMsg="Il campo "+fname+" non contiene un numero di Telefono o Fax.\nFormati corretti: 0547123456, +393471234567";
	var i=new RegExp("^(\\+?\\d{4,})$");
	if (!(i.test(what))) {alert(errMsg); return false;}
	return true;
}

// VERIFICA LA PRESENZA DI UN PUNTO SEGUITO DA UN SUFFISSO/ESTENSIONE ALLA FINE DI UN PERCORSO
function isFileName (what,fname)
{
	var errMsg="Il campo "+fname+" non contiene un nome di file corretto.\nFormato corretto: c:\\cartella\\file.ext";
	var filename;
	var i=new RegExp("^(\\w+\\.\\w{1,5})$");
	//Sostituisci back-slash con slash
	what=what.replace(/\\/g,'\/');
	//Recupera solo il nome del file
	filename=what.substr(what.lastIndexOf('\/')+1);
	if (!(i.test(filename))) {alert(errMsg); return false;}
	return true;
}

// VERIFICA LA PRESENZA DI UN NUMERO SEGUITO DA UNA UNITA' DI MISURA IN BYTE O MULTIPLI DI BYTE
function isFileSize (what,fname)
{
	var errMsg="Il campo "+fname+" non contiene una dimensione corretta.\nFormati corretti: 1 MB, 1024 KB, 4 byte, 1.567 Kb, etc";
	var i=new RegExp("^(\\d+(\\.\\d+)*\\s+(MB|Mb|mb|KB|byte|kb|Kb)\\s*)$");
	if (!(i.test(what))) {alert(errMsg); return false;}
	return true;
}

// VERIFICA LA PRESENZA DI UN PUNTO SEGUITO DA UN SUFFISSO (FILE DI IMMAGINE) ALLA FINE DI UN PERCORSO
function isFileImage (what,fname)
{
	var errMsg="Il campo "+fname+" non contiene un file immagine corretto.\nFormati corretti: image.jpg, image.gif, image.png, etc";
	var filename;
	var i=new RegExp("^(\\w+\\.(jpg|jpeg|gif|png|svg|JPG|JPEG|GIF|PNG|SVG))$");
	//Sostituisci back-slash con slash
	what=what.replace(/\\/g,'\/');
	//Recupera solo il nome del file
	filename=what.substr(what.lastIndexOf('\/')+1);
	if (!(i.test(filename))) {alert(errMsg); return false;}
	return true;
}

// VERIFICA LA PRESENZA DI UN PUNTO SEGUITO DA UN SUFFISSO (FILE MOVIE) ALLA FINE DI UN PERCORSO
function isFileMovie (what,fname)
{
	var errMsg="Il campo "+fname+" non contiene un filmato corretto.\nFormati corretti: movie.swf, MOVIE.SWF";
	var filename;
	var i=new RegExp("^(\\w+\\.(swf|SWF))$");
	//Sostituisci back-slash con slash
	what=what.replace(/\\/g,'\/');
	//Recupera solo il nome del file
	filename=what.substr(what.lastIndexOf('\/')+1);
	if (!(i.test(filename))) {alert(errMsg); return false;}
	return true;
}

// VERIFICA UN CODICE DI TIPO 1 (DA IMPOSTARE!)
function isCodeType1(what,fname)
{
	var errMsg="Il campo "+fname+" non contiene un codice corretto.\nFormati corretti: 411.xx, 411.xxx, 411.xxxx";
	var i=new RegExp("^(411\\.\\d{2,4})$");
	if (!(i.test(what))) {alert(errMsg); return false;}
	return true;
}

// VERIFICA IL CARATTERE DI CONTROLLO DI UN CODICE FISCALE
function isCf(cfx,fname)
{
	var errMsg="Il campo "+fname+" non contiene un codice fiscale valido.";
	var cf = cfx.toUpperCase();
	var cfReg = /^[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]$/;
	if (!cfReg.test(cf))
	{	alert(errMsg);
	  return false;
	}
	var set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX";
	var s = 0;
	for( i = 1; i <= 13; i += 2 )
	  s += setpari.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
	for( i = 0; i <= 14; i += 2 )
	  s += setdisp.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
	if ( s%26 != cf.charCodeAt(15)-'A'.charCodeAt(0) )
	{	alert(errMsg);
	  return false;
	}
	return true;
}

//VERIFICA LA CORRETTEZZA FORMALE DI UNA PARTITA IVA
function isIva(ivax,fname)
{
	var errMsg="Il campo "+fname+" non contiene una partita iva corretta.";
	var n_Val,n_Som1=0,n_Som2=0,lcv;
	if (ivax.length!=11 || isNaN(parseFloat(ivax)) || parseFloat(ivax)<parseFloat(0))
	{	alert(errMsg);
	  return false;
	}
	for (lcv=0;lcv<9;lcv+=2)
	{
	  n_Val=parseInt(ivax.charAt(lcv));
	  n_Som1+=n_Val;
	  n_Val=parseInt(ivax.charAt(lcv+1));
	  n_Som1+=Math.floor(n_Val/5) + (n_Val<<1) % 10;
	}
	n_Som2 = 10 - (n_Som1 % 10);
	n_Val=parseInt(ivax.charAt(10));
	if (n_Som2==n_Val)
	  return true;
	alert(errMsg);
	return false;
}

