// abilita controlli dipendenti in base al valore dell'oggetto abilitatore
function enableDependents(frmname,enablerElem,enablerValue,arjDependsElems,optClassBaseNameEnbled,optClassBaseNameDisabled){

	var f;//form
	var tmpArj;//array di tipi di elementi
	var elemsCount;
	var tmpElem;
	f=document.forms[frmname];
	tmpArj=arjDependsElems;
	elemsCount=tmpArj.length
	//alert(f.elements[baseElem].type)
	for (var i=0;i<elemsCount;i++){
		if(f.elements[enablerElem].value==enablerValue){
			tmpElem=tmpArj[i];
			f.elements[tmpElem].disabled=false;
			if (optClassBaseNameEnbled!="") {f.elements[tmpElem].className = optClassBaseNameEnbled}
		}//if(f.elements[baseElem].value==valBaseElem
		else if (f.elements[enablerElem].value!=enablerValue){
			tmpElem=tmpArj[i];
			f.elements[tmpElem].disabled=true;
			if (optClassBaseNameDisabled!="") {f.elements[tmpElem].className = optClassBaseNameDisabled}			
		}//else if (f.elements[baseElem].value==valBaseElem)
	}//for (var i=0;i<elemsCount;i++)
}//function enableDipendents


// abilita controlli dipendenti in base al valore chekkato o no del checkbox
function chkEnableDependents(frmname,chkenablerElem,arjDependsElems,optClassBaseNameEnbled,optClassBaseNameDisabled){

	var f= document.forms[frmname];//form
	var chkEnablerObj=f.elements.item(chkenablerElem);
	var aCampiSecondari=arjDependsElems;
	var ctrlDipendente;

	if(chkEnablerObj.checked ==true){
		for (var i=0;i<aCampiSecondari.length;i++){
			ctrlDipendente=f.elements.item(aCampiSecondari[i]);
			ctrlDipendente.disabled=false;
			if (optClassBaseNameEnbled!=""){ctrlDipendente.className = optClassBaseNameEnbled}
		}//for (var i=0;i<elemsCount;i++)
	}//if(chkEnablerObj.checked =true)
	else {
		for (var i=0;i<aCampiSecondari.length;i++){
			ctrlDipendente=f.elements.item(aCampiSecondari[i]);
			ctrlDipendente.disabled=true;
			if (optClassBaseNameDisabled!=""){ctrlDipendente.className = optClassBaseNameDisabled}			
		}//for (var i=0;i<elemsCount;i++)
	}// else
}//function enableDipendents


// Imposta 1 al Value di un checkbox se esso  checcato e 0 se no lo 
function chkSetBooleanValue(frmname,arjChkElems){
		var tmpArj;//array di tipi di elementi
		var elemsCount;
		var f;
		tmpArj=arjChkElems;
		elemsCount=tmpArj.length
		f=document.forms[frmname];
		for (var i=0;i<elemsCount;i++){
			//alert(f.elements[(tmpArj[i])].checked)
			if  (f.elements[(tmpArj[i])].checked==true){
					f.elements[(tmpArj[i])].value=1
				}//if  (f.elements[(tmpArj[i])].checked==true)
			else if (f.elements[(tmpArj[i])].checked==false){
					f.elements[(tmpArj[i])].value=0
				}//else if (f.elements[(tmpArj[i])].checked==false)
		}//for (var i=0;i<elemsCount;i++
}

// Restituisce 1 se Chekbox checcato e 0 se no lo 
function chkGetBooleanValue(frmname,chkElem){
	var f;
	f=document.forms[frmname];
	if  (f.elements[chkElem].checked==true){
		return 1;
	}// if (f.elements[elem].checked==true)
	else if (f.elements[chkElem].checked==false){
		return 0;
	}//else if (f.elements[elem].checked==false)
}
/* Valida un form tramite un prefisso nell'ID del tag controllo
Sintassi: o/no_prefisso_NomeOggetto

o: campo Obbligatorio
no: campo non Obbligatorio

Prefissi:
d: Data
n: Numerico (con decimali o non) anche valuta es. 12,5 - 123.45 - 1233 etc...
sn: Solo Numeri
t: testo
m:memo
v: valore specifico
u: url
e: email
sl: select
ck: checkbox (booblean)
bt: pulsante
ob: option button/s
h: hidden
*/
function ValidateFormForPrefix(frmname,cname){	

	var f;//form
	var totCtrl;//totale controlli
	var tmpArj;//array di tipi di elementi
	var tmpNameOfCtrl,tmpIDOfCtrl;// nome del controllo corrente
	var prefixCtrl,valctrl;// valore prefisso controllo corrente
	var AlertMessage;
	//elemento corrente
	f=document.forms[frmname];
	totCtrl=(f.elements.length);

	if (totCtrl!=null){
		
		for (var i=0;i<totCtrl;i++){
			
			var elem=f.elements[i];//Elemento o Controllo in oggetto
			tmpNameOfCtrl=(elem.name);	
			tmpIDOfCtrl=(elem.id);
			tmpArj=tmpIDOfCtrl.split("_");
			
			//....se e obbligatorio
			if (elem.disabled==false){

				elem.className=cname
				if(tmpArj[0]=="o"){
					//...se  da validare
					prefixCtrl=tmpArj[1];
					//Controllo se un oggetto select per recuperarne il valore
					if((elem.type=="select-one") || (elem.type=="select-multiple")){
						if (elem.options.selectedIndex!=-1){
							valctrl=elem.options[(elem.selectedIndex)].value;
						}//if (elem.options.selectedIndex!=-1){
						else{
							valctrl=" "
							}//else //if (elem.options.selectedIndex!=-1){
						}//if((elem.type=="select-one") || (elem.type=="select-multiple")){
					else{
						valctrl=elem.value;
						}//else ((elem.type=="select-one") || (elem.type=="select-multiple")){
					//VALIDAZIONE!
					if (!isValid(prefixCtrl,valctrl)){
						
						elem.className="error";
						alert("Campo: ( " + tmpNameOfCtrl + " )  \n\n" + AlertMessage);//"Il campo: "  + tmpNameOfCtrl + " " +
						focusElement(frmname,tmpIDOfCtrl);					
						return false;
						
						}//if (!isValid(prefixCtrl,valctrl)){
							
				}//if(tmpArj[0]=="o")
				
				//validazione anche se non obbligatoria
				else if (tmpArj[0]=="no"){// se non  obbligatorio controlla comunque che il tipo inseito sia di tipo valido
					prefixCtrl=tmpArj[1];
					//Controllo se un oggetto select per recuperarne il valore
					if((elem.type=="select-one") || (elem.type=="select-multiple")){
						if (elem.options.selectedIndex!=-1){
							valctrl=elem.options[(elem.selectedIndex)].value;
						}//if (elem.options.selectedIndex!=-1){
						else{
							valctrl=" "
							}//else //if (elem.options.selectedIndex!=-1){
						}//if((elem.type=="select-one") || (elem.type=="select-multiple")){
					else{
						valctrl=elem.value;
						}//else ((elem.type=="select-one") || (elem.type=="select-multiple")){
							
					// decidiamo per quali tipi effettuare il controllo comunque
					var validacomunque=false;
					
					switch(prefixCtrl){
						case "t"://TESTO
							break;
						case "e":
							if (!(valctrl=="")){
								validacomunque=true;
								}
							break;
						
						case "eo":
							break;
						case "v"://Valore specifico
							break;
						case "sn"://SOLO NUMERI
							break;
						case "n"://NUMERICO con decimali
							break;
						case "d"://DATA
							break;
						case "fi"://FILE
							break;
						case "img"://IMMAGINI
							break;
						case "u"://URL
							break;
						case "m"://Memo
							break;
						case "sl"://SELECT - VALORE SELECTED
							break;
						case "ck"://CHECKBOX - VALORE CHECKED
							break;
						case "bt":// BUTTON
							break;
						case "ob":// Option Button
							break;
						case "h":// Hidden
							break;
						case "cf":// CODICE FISCALE
							if (!(valctrl=="")){
								validacomunque=true;
								}
							break;
						default://
						//return true;
						
					}//switch
					
					if (validacomunque==true){
					//VALIDAZIONE!
						if (!isValid(prefixCtrl,valctrl)){
							elem.className="error";
							alert("Campo: ( " + tmpNameOfCtrl + " )  \n\n" + AlertMessage);//"Il campo: "  + tmpNameOfCtrl + " " +
							focusElement(frmname,tmpIDOfCtrl);					
							return false;
							}//if (!isValid(prefixCtrl,valctrl)){
					}//if (validacomunque=true){
						
				}//else{// se non  obbligatorio
					
			}//(elem.disabled==false)
			
		}//for (var i=0;i<totCtrl;i++)
		
	}//if (totCtrl!=null)
	
	// VALIDATORE TRAMITE PREFISSO
	function isValid(prefixCtrl,vValue){
			//alert ("prefixCtrl " + prefixCtrl + " vValue " + vValue)		
			switch(prefixCtrl){
				case "t"://TESTO
					AlertMessage="Il campo non può restare vuoto!"
					return (vValue!="");
					break;
				case "e"://E-MAIL
					AlertMessage="Digitare un'indirizzo email valido"
					return validateEmailv2(vValue);
					break;
				case "eo":
					AlertMessage="Digitare un'indirizzo email valido"
					return validateEmailob(vValue);
					break;	
				case "v"://Valore specifico
					//
					AlertMessage="Il valore non corrisponde ai criteri specificati!";
					break;
				case "sn"://SOLO NUMERI
					//
					AlertMessage="Inserire esclusivamente numeri!";
					return isOnlyNumber(vValue);
					break;
				case "n"://NUMERICO con decimali
					AlertMessage="Inserire un valore numerico valido!";
					return isNumber(vValue);
					break;
				case "d"://DATA
					AlertMessage="Inserire una data valida!... nel formato [gg/mm/aaaa] " ;
					return isDate(vValue);
					break;
				case "fi"://FILE
					//AlertMessage="L'estensione del file immagine non  valida";
					//return isGraphicsExt(vValue);
					break;	
				case "img"://IMMAGINI
					AlertMessage="L'estensione del file immagine non è valida";
					return isGraphicsExt(vValue);
					break;	
				case "u"://URL
					//
					AlertMessage="Inserire un'Url valido!";
					break;
				case "m"://Memo
					//
					//return true;
					break;
				case "sl"://SELECT - VALORE SELECTED
					return (vValue!="");
					break;
				case "ck"://CHECKBOX - VALORE CHECKED
					//return true;
					break;
				case "bt":// BUTTON
					//return true;
					break;
				case "ob":// Option Button
					//return true;
					break;
				case "h":// Hidden
					//return true;
					break;
				case "cf":// CODICE FISCALE
					AlertMessage="Inserire un numero di Codice Fiscale valido!";
					return IsCodiceFiscale(vValue);
					break;
				default://				
			}//switch
		return true;
	}//isValid Function

	return true;
}//ValidateFormForPrefix



// RESTITUISCE IL FOCUS SU UN ELEMENTO HTML 
function focusElement(formName, elemName) {
    var elem = document.forms[formName].elements[elemName];
	if (elem.disabled==false){
		if (elem.type=="select-one" || (elem.type=="select-multiple")){
			elem.focus( );
			}
		else {
		elem.focus( );
		elem.select( );
			}// )
		}
}

//________________________________________________________________________________
// Verifica che il dato passato sia di tipo data
function isDate(vValue) 
{
	var _pattern=/^(((((0[1-9])|(1\d)|(2[0-8]))\/((0[1-9])|(1[0-2])))|((31\/((0[13578])|(1[02])))|((29|30)\/((0[1,3-9])|(1[0-2])))))\/(([0-9][0-9][0-9][0-9]))|(29\/02\/[0-9][0-9](([02468][048])|([13579][26]))))$/;
	return _pattern.test(vValue);
}


// CALCOLA UN INTERVALLO DI TEMPO TRA DUE DATE
function isValidDate(dateStr) {
// Date validation function courtesty of 
// Sandeep V. Tamhankar (stamhankar@hotmail.com) -->

// Checks for the following valid date formats:
// MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY

var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/; // requires 4 digit year

var matchArray = dateStr.match(datePat); // is the format ok?
if (matchArray == null) {
alert(dateStr + " Date is not in a valid format.")
return false;
}
month = matchArray[1]; // parse date into variables
day = matchArray[3];
year = matchArray[4];
if (month < 1 || month > 12) { // check month range
alert("Month must be between 1 and 12.");
return false;
}
if (day < 1 || day > 31) {
alert("Day must be between 1 and 31.");
return false;
}
if ((month==4 || month==6 || month==9 || month==11) && day==31) {
alert("Month "+month+" doesn't have 31 days!")
return false;
}
if (month == 2) { // check for february 29th
var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
if (day>29 || (day==29 && !isleap)) {
alert("February " + year + " doesn't have " + day + " days!");
return false;
   }
}
return true;
}

function isValidTime(timeStr) {
// Time validation function courtesty of 
// Sandeep V. Tamhankar (stamhankar@hotmail.com) -->

// Checks if time is in HH:MM:SS AM/PM format.
// The seconds and AM/PM are optional.

var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;

var matchArray = timeStr.match(timePat);
if (matchArray == null) {
alert("Time is not in a valid format.");
return false;
}
hour = matchArray[1];
minute = matchArray[2];
second = matchArray[4];
ampm = matchArray[6];

if (second=="") { second = null; }
if (ampm=="") { ampm = null }

if (hour < 0  || hour > 23) {
alert("Hour must be between 1 and 12. (or 0 and 23 for military time)");
return false;
}
if (hour <= 12 && ampm == null) {
if (confirm("Please indicate which time format you are using.  OK = Standard Time, CANCEL = Military Time")) {
alert("You must specify AM or PM.");
return false;
   }
}
if  (hour > 12 && ampm != null) {
alert("You can't specify AM or PM for military time.");
return false;
}
if (minute < 0 || minute > 59) {
alert ("Minute must be between 0 and 59.");
return false;
}
if (second != null && (second < 0 || second > 59)) {
alert ("Second must be between 0 and 59.");
return false;
}
return true;
}

function dateDiff(data1,data2,typeDifference,bolAbs) {
	var time1="00:00:00AM";
	var time2="00:00:00AM";
	
	var aDt1=new Array();//array data1
	var aDt2=new Array();//array data2
	
	date1 = new Date();
	date2 = new Date();
	diff  = new Date();

	if (isDate(data1) && isValidTime(time1)) { // Validates first date 
		aDt1=data1.split('/');//array data1	
		date1temp = new Date((aDt1[1] + '/' + aDt1[0] + '/' + aDt1[2]) + " " + time1);		
		date1.setTime(date1temp.getTime());
	}
	else return false; // otherwise exits
	
	if (isDate(data2) && isValidTime(time2)) { // Validates second date
		aDt2=data2.split('/');//array data2		
		date2temp = new Date((aDt2[1] + '/' + aDt2[0] + '/' + aDt2[2]) + " " + time2);
		date2.setTime(date2temp.getTime());
	}
	else return false; // otherwise exits
	
	// sets difference date to difference of first date and second date
	if (bolAbs){
		diff.setTime(Math.abs(date1.getTime() - date2.getTime()));
	}
	else{
		diff.setTime(date1.getTime() - date2.getTime());		
		}
	
	timediff = diff.getTime();
	
	weeks = Math.floor(timediff / (1000 * 60 * 60 * 24 * 7));
	timediff -= weeks * (1000 * 60 * 60 * 24 * 7);
	
	days = Math.floor(timediff / (1000 * 60 * 60 * 24)); 
	timediff -= days * (1000 * 60 * 60 * 24);
	
	hours = Math.floor(timediff / (1000 * 60 * 60)); 
	timediff -= hours * (1000 * 60 * 60);
	
	mins = Math.floor(timediff / (1000 * 60)); 
	timediff -= mins * (1000 * 60);
	
	secs = Math.floor(timediff / 1000); 
	timediff -= secs * 1000;
	
	// restituisco la differenza nel formato specificato nel parametro typeDifference
	//alert( weeks + " weeks, " + days + " days, " + hours + " hours, " + mins + " minutes, and " + secs + " seconds");
	switch (typeDifference){
		case 'hours':
			return hours;
			break;
		case 'mins':
			return mins;
			break;	
		case 'secs':
			return secs;
			break;
		case 'days':
			return (weeks*7) + days;
			break;
		case 'weeks':
			return weeks;
			break;
		default: 
			return false
			break;
	}

	return false; // form should never submit, returns false

}



// CONTROLLA SE UNA DATA RIENTRA NELL'INTERVALLO SPECIFICATO
function isDateBetween(sData,sDataStart,sDataEnd){
	
	// controllo la data oggetto di verifica
	if (!isDate(sData)) {
		return false;
		}
	// controllo le alre due date passate start-end
	if (!(isDate(sDataStart) && isDate(sDataEnd))) {
		return false;
		}
	
	var DiffDay=dateDiff(sDataStart,sDataEnd,'days',false);
	var DiffToStart=dateDiff(sData,sDataStart,'days',false);
	var DiffToEnd=dateDiff(sData,sDataEnd,'days',false);
	
	//alert ("DiffDay:DiffToStart:DiffToEnd " + DiffDay + ':' + DiffToStart + ':' + DiffToEnd)
	// se data  > di startDate e <	  di end Date allora OK
	if((DiffToStart >= 0) && (DiffToEnd<=0)){
		return true;		
		}
	
	else{
		return false;	
		}
}

// VALIDAZIONE EMAIL
function validateEmailob(email)
{
// a very simple email validation checking. 
// you can add more complex email checking if it helps 
    if(email.length <= 0)
	{
	  return false;
	}
    var splitted = email.match("^(.+)@(.+)$");
    if(splitted == null) return false;
    if(splitted[1] != null )
    {
      var regexp_user=/^\"?[\w-_\.]*\"?$/;
      if(splitted[1].match(regexp_user) == null) return false;
    }
    if(splitted[2] != null)
    {
      var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
      if(splitted[2].match(regexp_domain) == null) 
      {
	    var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
	    if(splitted[2].match(regexp_ip) == null) return false;
      }// if
      return true;
    }
return false;
}


// VALIDAZIONE EMAIL
function validateEmailv2(email)
{
// a very simple email validation checking. 
// you can add more complex email checking if it helps 
    if(email.length <= 0)
	{
	  return true;
	}
    var splitted = email.match("^(.+)@(.+)$");
    if(splitted == null) return false;
    if(splitted[1] != null )
    {
      var regexp_user=/^\"?[\w-_\.]*\"?$/;
      if(splitted[1].match(regexp_user) == null) return false;
    }
    if(splitted[2] != null)
    {
      var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
      if(splitted[2].match(regexp_domain) == null) 
      {
	    var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
	    if(splitted[2].match(regexp_ip) == null) return false;
      }// if
      return true;
    }
return false;
}

//Numerals Only Va gestito dall'evento KeyPress
/*function numeralsOnly(evt) {
    evt = (evt) ? evt : event;
    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode : 
        ((evt.which) ? evt.which : 0));
    if (charCode > 31 && (charCode < 48 || charCode > 57)) {
        alert("Enter numerals only in this field.");
        return false;
    }
    return true;
}*/


// validates that the entry is a positive or negative number
function isNumber(vValue) {
	
    var str = vValue;
    var oneDecimal = false;
	var startingDecimal;
    var oneChar = 0;
	
	if (str==""){return false;}
	
    // make sure value hasn't cast to a number data type
    str = str.toString( );
    for (var i = 0; i < str.length; i++) {
        oneChar = str.charAt(i).charCodeAt(0);
		
		// OK se il primo carattere    un numero
		 if (i == 0) {
               if (oneChar < 48 || oneChar > 57) {
            	//alert("Inserire un valore numerico!");
           		 return false;
        		}
         }
		
        // OK for minus sign as first character
        /*if (oneChar == 45) {
            if (i == 0) {
                continue;
            } else {
                alert("Only the first character may be a minus sign.");
                return false;
            }
        }*/
        // OK for one decimal point caratteri accettati per separatore decimali: "." oppure ","
        if (oneChar == 46 || oneChar == 44) {
            if (!oneDecimal) {
                oneDecimal = true;
				startingDecimal=i;
                continue;
            } else {
                //alert("Only one decimal is allowed in a number.");
                return false;
            }
        }
		
		//massimo tre decimali!
		/*if ((i-startingDecimal)> 3){
			alert("A abbasta co l decimali!\n" + "me n'hai mannati " + ((str.length-startingDecimal)-1));
			return true;
		}*/
		
        // characters outside of 0 through 9 not OK
        if (oneChar < 48 || oneChar > 57) {
            //alert("Inserire un valore numerico!");
            return false;
        }
    }//for
    return true;
}

// Accetta soltanto valori numerici
function isOnlyNumber(vValue) {
    var str = vValue;
    var oneChar = 0;
	str = str.toString( );
	if (str==""){return false;}
    for (var i = 0; i < str.length; i++) {
        oneChar = str.charAt(i).charCodeAt(0);

         if (oneChar < 48 || oneChar > 57) {
            //alert("Inserire un valore numerico!");
           	return false;
        }
		
     }//for
	return true;
}

// ELIMINA GLI SPAZI AI LATI DI UNA STRINGA
function Trim(stringa)
   {
   reTrim=/\s+$|^\s+/g;
   return stringa.replace(reTrim,"");
   }

function IsCodiceFiscale(cfins) { 

   var cf = cfins.toUpperCase(); 
   var cfReg = /^[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]$/; 
   if (!cfReg.test(cf)) {
      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) ) {
      return false; }
	  
   return true; 
   } 
   
 
 
// CONTROLLA SE UN VALORE E NUMERICO
function IsNumeric(sText)
{
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;

 
   for (i = 0; i < sText.length && IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;
   
   }

// CONTROLLA SE UN FILE E DI TIPO GRAFICO VALIDO
function isGraphicsExt(stringa){
	var s=stringa;
	var l=s.length;
	var ext3,ext4;
	
	ext3= s.slice((l-4),l)
	ext3=ext3.toLowerCase();
	
	ext4= s.slice((l-5),l)
	ext4=ext4.toLowerCase();
	
		switch(ext3){
			case ".gif" ://GIF
				return true;
				break;
			case ".jpg" ://JPG
				return true;
				break;
			case ".jpeg" ://JPEG
				return true;
				break;
			case ".png" ://PNG
				return true;
				break;
			default ://NO FILE GRAFICO
				switch(ext4){
					case ".jpeg" ://JPEG
						return true;
						break;
					default ://NO FILE GRAFICO
						return false;

				}//switch(ext4)

		}//switch(ext3
		
}//function isGraphicsExt(stringa)