function checkEnter(e) {
	var charCode = (navigator.appName == "Netscape") ? e.which : e.keyCode
	// status = charCode // see ASCII character value!
	if (charCode != 13) return false
	else return true
}


/**
 * Restituisce true se il campo ? un'email
 */
function Is_Email(sDato) {
 	if (sDato != "") {
	  var s = sDato;
	  var localPartfilter1 = /^[^<>()\[\]\x5C.,;:@" ]+(\.[^<>()\[\]\x5C.,;:@" ]+)*@$/;
	  var localPartfilter2 = /^"[^\r\n]+"@$/;
	  var domainfilter = /^([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]|[a-zA-Z0-9])(\.([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]|[a-zA-Z0-9]))(\.([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]|[a-zA-Z0-9]))*$/;
	  var sepPos = 0;
	  var localPart;
	  var domain;
	  var localPartOk = false;
	  var domainOk    = false;
	  sepPos = s.lastIndexOf("@");
	  localPart = s.substring(0,sepPos+1);
	  domain    = s.substring(sepPos+1,s.length);
	  if  (localPartfilter1.test(localPart))
	    localPartOk = true;
	  else if (localPartfilter2.test(localPart))
	    localPartOk = true;
	  else
	    localPartOk = false;
	  if (domainfilter.test(domain))
	    domainOk = true;
	  else
	    domainOk = false;
	    
	  if (localPartOk != true || domainOk != true)
	    return false;
  }
  
  return true;
}

/** 
 * Testa se la stringa passata ? un URL
 */ 
function Is_URL(theUrl){
  if(theUrl != "") {
	  var j = new RegExp(); 
	  j.compile("^[A-Za-z]+://[A-Za-z0-9-]+\.[A-Za-z0-9]+"); 
	  if (!j.test(theUrl))
	    return false; 
	}
    
  return true;
}

/**
 * Restituisce true se il combo box ? selezionato.
 */
function Is_Select(theSel){
  if(theSel.options[theSel.selectedIndex].value == "")
	  return false
	return true;
}

// La funzione seleziona tutte le opzioni
// di una select multipla
// Da invocare prima del submit altrimenti
// non vengono passate le option contenute
function seleziona(theSel) {
  for (i=0; i<theSel.options.length; i++)
    theSel.options[i].selected=true;
}

/**
 * Svuota la select 
 * Elimino sempre l'indice 0, anche perch? utilizzando
 * come indice i, cancello 0, poi vado a cancellare l'1 ma
 * non funziona perch? adesso l'indice 1 ? diventato 0...
 * Un'altra alternativa ? cancellare leggendo le option 
 * in ordine inverso
 */
function removeAllOpt(theSel){
  var selLength = theSel.length;
	for(i=0; i<=selLength; i++) {
	  theSel.options[0]=null;
	}
} 

/**
 * Aggiunge una option alla select
 */
function addOneOpt(theSel, theName, theValue){
  var newOpt = new Option(theName, theValue);
	var selLength = theSel.length;
	theSel.options[selLength] = newOpt;  
}   

/**
 * Aggiunge una option alla select
 */
function addOneOptLang(theSel, theName, theValue, theLang){
  var newOpt = new Option(theName, theValue);
  newOpt.lang = theLang;
	var selLength = theSel.length;
	theSel.options[selLength] = newOpt;  
} 

/**
 * Il formato delle date è dd/mm/yyyy
 *
 * dData1>dData2: return -1
 * dData1<dData2: return 1
 * dData1=dData2: return 0
 
 * N.B. possono essere entrambe '', in questo caso viene ritornato 0
 */ 
function comparaDate(data1, data2) {
	if (data1=='' || data2=='')
		return 0;
		
	var dData1=new Date(data1.substring(3,5)+'/'+data1.substring(0,2)+'/'+data1.substring(6,10));
	var dData2=new Date(data2.substring(3,5)+'/'+data2.substring(0,2)+'/'+data2.substring(6,10));

	if (dData1>dData2) 
		return -1;
	if (dData1<dData2) 
		return 1;
	if (dData1==dData2) 
		return 0;
}

/**
 * La funzione ritorna la differenza in giorni tra due stringhe
 * che rappresentano date il cui formato è dd/mm/yyyy
 * 
 * Si presuppone che data1>data2
 */
function getDifferenceInDays(data1, data2){
	if (data1=='' || data2=='')
		return 0;
		
	var dData1=new Date(data1.substring(3,5)+'/'+data1.substring(0,2)+'/'+data1.substring(6,10));
	var dData2=new Date(data2.substring(3,5)+'/'+data2.substring(0,2)+'/'+data2.substring(6,10));
	
	var diff = new Date;
	diff.setTime(Math.abs(dData1.getTime() - dData2.getTime()));
	var timediff = diff.getTime();
	
	return Math.floor(timediff / (1000 * 60 * 60 * 24));
	
}

/**
 * Somma numDays giorni alla data rappresntata dalla stringa aDate
 * il formato della data è yyyymmdd
 */ 
function addDaysToDate(aDate, numDays){
	if(aDate=="" || numDays==0)
		return aDate;
		
	var dDate = new Date(aDate.substring(4,6)+'/'+aDate.substring(6,8)+'/'+aDate.substring(0,4));
	var newDate=new Date;
	newDate.setTime(Math.abs(dDate.getTime() + (numDays*1000*60*60*24)));
	
	var dd=newDate.getDate();
	if(dd<10)
		dd="0"+dd;
	var mm=(newDate.getMonth()+1);
	if(mm<10)
		mm="0"+mm;
	
	return dd+"/"+mm+"/"+newDate.getFullYear();
}

/**
 * Converte una stringa passata nel formato dd/mm/yyyy
 * in una stringa nel formato yyyymmdd
 */
function toTimestamp_f(aDate){
  if(aDate.length < 10) return "";
  
  return aDate.substring(6,10)+aDate.substring(3,5)+aDate.substring(0,2);
}

/**
 * Versione lasca della precedente. Formati accettati:
 *  - ddmmyyyy
 *  - dd$mm$yyyy, dove $ ? un qualsiasi carattere.
 */
function toTimestamp(aDate){
  if((aDate.length != 8)&&(aDate.length != 10)) return "";
  
  if(aDate.length == 8)
    return aDate.substr(4,4)+aDate.substr(2,2)+aDate.substring(0,2);
  else  
    return aDate.substring(6,10)+aDate.substring(3,5)+aDate.substring(0,2);  
}

/**
 * Converte una stringa passata nel formato yyyymmdd 
 * in una stringa nel formato dd/mm/yyyy
 */
function toDate(aTs){
  if(aTs.length < 8) return "";
  
  return aTs.substring(6,8)+"/"+aTs.substring(4,6)+"/"+aTs.substring(0,4);
}

function checkReal(elem){
  ok = true;
  elem.value = elem.value.replace(/\,/g,".");
  if((elem.value != "")&&(parseFloat(elem.value) != elem.value)) {
    ok = false;
  }
  elem.value = elem.value.replace(/\./g,",");
  return ok;
}

/**
 * Controlla che l'elemento sia della forma dd/mm/yyyy
 */
function Is_Date_f(theElement) {
  var DayArray =new Array(31,28,31,30,31,30,31,31,30,31,30,31);
  var MonthArray = new Array("01","02","03","04","05","06","07","08","09","10","11","12");
  var thisYear = null;
  var thisMon = null;
  var thisDay = null;
  var today = null;
  inpDate = theElement;
  if (inpDate.length == 0 ) 
    return true;
  thisDay = inpDate.substr(0,2);
  thisMonth = inpDate.substr(3,2);
  thisYear = inpDate.substr(6,4);
  var filter=/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/;
  if (! filter.test(inpDate))
    return false;
  var filter=/01|02|03|04|05|06|07|08|09|10|11|12/ ;
  if (! filter.test(thisMonth))
    return false;
  N=Number(thisYear);
  if ( ( N%4==0 && N%100 !=0 ) || ( N%400==0 ) )
    DayArray[1]=29;
  for(var ctr=0; ctr<=11; ctr++){
    if (MonthArray[ctr]==thisMonth){
      if (thisDay<= DayArray[ctr] && thisDay >0 )
        return true;
      else
        return true;
    }
  }
  return true;
}

/**
 * Questa ? una versione un po' pi? lasca della precedente
 * nel senso che permette di inserire date nei formati
 *  - ddmmyyyy
 *  - dd$mm$yyyy, dove $ ? un qualsiasi carattere.
 */
function Is_Date(theElement) {
  var DayArray =new Array(31,28,31,30,31,30,31,31,30,31,30,31);
  var thisYear = null;
  var thisMon = null;
  var thisDay = null;
  var today = null;
  inpDate = theElement;

  if(inpDate.length == 8) {
    thisDay = inpDate.substr(0,2);
    thisMonth = inpDate.substr(2,2);
    thisYear = inpDate.substr(4,4);
  } else if(inpDate.length == 10) {
    thisDay = inpDate.substr(0,2);
    thisMonth = inpDate.substr(3,2);
    thisYear = inpDate.substr(6,4);
  } else if (inpDate.length == 0 ) {
    return true;
  } else  {
    return false;
  }
  
  var filter=/01|02|03|04|05|06|07|08|09|10|11|12/ ;
  if (! filter.test(thisMonth))
    return false;
  N=Number(thisYear);
  if ( ( N%4==0 && N%100 !=0 ) || ( N%400==0 ) )
    DayArray[1]=29;
    
  M=Number(thisMonth);
  if (thisDay<=DayArray[(M-1)] && thisDay >0 )
    return true;
  else
    return false;
}

/*
 * Testa se il campo di tipo Orario
 * ? della forma h[h][:mm] (formato ISO 8601)
 */
function Is_Time(sTime) {
  return /^([01]?[0-9]|[2][0-3])(:[0-5][0-9])?$/.test(sTime);
}

/*
 * Data una stringa validata con Is_Time, 
 * la ritorna paddata nella forma hh:mm
 */
function padTime(sTime){
	// controllo se esiste il separatore
 	if(sTime.indexOf(':')==-1){
 	  if(sTime.length<2) 
 	    return "0"+sTime+":00";
 	  else
 	    return sTime+":00";
 	} else {
 	  ss=sTime.split(':');
 	  if(ss[0].length<2) 
 	    return "0"+ss[0]+":"+ss[1];
 	  else
 	    return sTime;
 	}
}

function Is_CAP(theCap){
  if((parseInt(theCap.value) != theCap.value)&&(theCap.value.length!=5)) 
    return false;    
  return true;
}

function Is_PIVA(sDato) {
	if(sDato.length !=11)
		return false;

	SOMMADISPARI=0;
	SOMMAPARI=0;

	for (i=0;i<9;i+=2)
	{
    SOMMADISPARI+=sDato.substr(i,1)-'0';
		DIVQ=parseInt((2*(sDato.substr(i+1,1))-'0')/10,10);
		DIVR=(2*(sDato.substr(i+1,1)-'0') % 10);
		SOMMAPARI+= (DIVQ + DIVR);
	}
	SOMMACTR=SOMMADISPARI+SOMMAPARI;
	DIVI= ((10-(SOMMACTR % 10)) % 10);
	if ((sDato.substr(10,1)-'0')==DIVI)
	  return true;
	else
	  return false;
}

function Is_FiscalCode(sDato) {

	if (sDato.length !=16)
		return false;
	sDato=sDato.toUpperCase();
	iChecksum=0;
	iPos=-1;
	iSum=0;
	bPari=true;
	sCaratteri = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	sCodiciPari= "000102030405060708091011121314151617181920212223242500010203040506070809";
	sCodiciDispari="010005070913151719210204182011030608121416102225242301000507091315171921";
	for (iloop=0; iloop<16; iloop++)
	{
	  sCheck=sDato.substr(iloop,1);
	  iPos=((sCaratteri.indexOf(sCheck)+1)*2)-1;
 	  if ( (iloop%2) != 0)
 	  {
	  	iSum = parseInt(sCodiciPari.substr(iPos-1,2),10);
	 		//alert(iPos + ' ' + iSum);
	  }
	  else
	  {
			iSum = parseInt(sCodiciDispari.substr(iPos-1,2),10);
 			//alert(iPos + ' ' + iSum);
 	  }
	  if (iloop != 15)
			iChecksum = iChecksum +	iSum;
	}
	//alert(iSum + ' ' + (iChecksum % 26));
	if ((iChecksum % 26) !=	iSum)
		return false;
	else
		return true;
}

/**
 * nella forma dd/mm/yyyy
 */
function getToday(){
  oggi = new Date();
  gg  = oggi.getDate();
  mm = oggi.getMonth() + 1;
  aa = oggi.getFullYear();
  
  if(gg<10) 
    gg="0"+gg;
  if(mm<10)  
    mm="0"+mm;
    
  return gg+"/"+mm+"/"+aa;
}

/**
 * nella forma yyyymmdd
 */
function getTodayT(){
  oggi = new Date();
  gg  = oggi.getDate();
  mm = oggi.getMonth() + 1;
  aa = oggi.getFullYear();
  
  if(gg<10) 
    gg="0"+gg;
  if(mm<10)  
    mm="0"+mm;
    
  return aa+mm+gg;
}

/**
 * nella forma hh:mm
 */
function getTime() {
	data_ora=new Date();
	hh=data_ora.getHours();
	min=data_ora.getMinutes();
	if (hh<10)
		hh="0"+hh;
	if (min<10)
		min="0"+min;
		
	return hh+":"+min;
}

/**
 * Traking
 */
function str_tra(ogg, theForm) {
	if (theForm.id.value != "") {
		str=theForm.track.value;
		if(str.search(ogg) < 0){
			theForm.track.value=theForm.track.value+ogg+" - ";
		}
	}
}

/**
 * 
 *  str         --> stringa (This is a test of the JavaScript RegExp object)
 *  regex       --> espressione regolare (es \bt[a-z]+\b)
 *  replacement --> stringa da sostituire (es replaced)
 *  
 *  risultato   --> This is a replaced of replaced JavaScript RegExp object
 */
function replace(str, regex, replacement){
  var re = new RegExp(regex);
  return str.replace(re, replacement);
}

/**
 * Testa se il valore passato ? un numero
 */
function IsNumeric(sText) {
  var ValidChars = "0123456789";
  var IsNumber=true;
  var Char;

  for (jj = 0; jj < sText.length && IsNumber == true; jj++) { 
	  Char = sText.charAt(jj); 
	  if (ValidChars.indexOf(Char) == -1) {
	  	IsNumber = false;
	  }
  }
  return IsNumber;  
}
 
/**
 * Collassa sezione
 */ 
function nascondi_sez(id_sezione, path_base){
	obj=document.getElementById("sez_r"+id_sezione);
	if(obj){
		objIMG=document.getElementById("sez_img"+id_sezione);
		if (obj.style.display=="none"){
			objIMG.src=path_base+"/images/minus.jpg";
			obj.style.display="";
		}else{
			objIMG.src=path_base+"/images/add.jpg";
			obj.style.display="none";
		}
	}
}

/**
 * calendario
 */
function initCal() {
  calendario = new CalendarPopup();
  calendario.showYearNavigation();
  calendario.setMonthNames("Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre");
  calendario.setWeekStartDay(1);
  calendario.setDayHeaders("D","L","M","M","G","V","S");
  calendario.setTodayText("Oggi");
  calendario.showYearNavigationInput();
}	

/**
 * Dichiara la funzione da chiamare alla selezione della data
 * La funzione è onChangeCal()
 */ 
function initCalFun() {
  calendario = new CalendarPopup();
  calendario.showYearNavigation();
  calendario.setMonthNames("Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre");
  calendario.setWeekStartDay(1);
  calendario.setDayHeaders("D","L","M","M","G","V","S");
  calendario.setTodayText("Oggi");
  calendario.showYearNavigationInput();
  calendario.setReturnFunction('onChangeCal');
}	

/**
 * id_dt --> id del campo data
 * anch --> anchor name del calendario associato
 */
function openCal(id_dt, anch){
  var oo = document.getElementById(id_dt);
  if(oo)
    calendario.select(oo,anch,'dd/MM/yyyy');
}

/**
 * analoga del php
 */
function isset(varname)  {
	if(typeof( window[ varname ] ) != "undefined") return true;
	else return false;
}
 
//funzione per controllare se viene cliccato più volte il pulsante
//deve essere presente nella pagina una funzione chiamata checkForm() che fa il controllo se serve
//e ritorna 1 se tutto va bene o 0 se c'è qualcosa che non va.
//come parametro vuole:
//form : oggetto form a cui fare la submit
//bypassCTRL: può essere non passato, se settato a 1 viene bypassata la funzione checkForm()
// 
// Nota. Fa uso della fDelay definita nel top
function submitOnce(form, bypassCTRL){
	if (!isset("checkAttivo")){
		checkAttivo=1;
	}

	if (checkAttivo) {
		checkAttivo=0;
		var check=bypassCTRL || checkForm();
		if (check){
			fDelay(form);
		}else{
			checkAttivo=1;
		}
	}else{
		alert ("Attenzione!\nAvete già cliccato il comando. Attendere prego!");
	}
}

// Copia Clipboard
function clipBoard(theElId){
  if (!document.all){
    alert("Funzionalità disponibile solo in IE");
    return; // IE only 
  } 
  var otext = document.getElementById(theElId);
  otext.focus();
  otext.select();
  var trange = otext.createTextRange();
  copyRange = trange.execCommand("Copy");
}

// Copia Clipboard per campo hidden
function clipBoardHid(theElId){
  if (!document.all){
    alert("Funzionalità disponibile solo in IE");
    return false; // IE only 
  } 
  var otext = document.getElementById(theElId);
  otext.select();
  var trange = otext.createTextRange();
  copyRange = trange.execCommand("Copy");
  return true;
}

//
function cookiequery() {
 	if (document.cookie == "") {
  	alert("Attenzione!\n\nAbilitare il proprio browser all'utilizzo dei cookie per accedere alle aree riservate.");
   	return false;
 	}
 	return true;
}

/**
 * Apre una popup on focus
 * Nota.
 * In IE pop_nome non può contenere spazi
 * Non può essere utilizzata se contiene documento PDF
 */
function popupOpen(pop_url, pop_nome, pop_opts){
	var sWin=window.open(pop_url, pop_nome, pop_opts);
	if(sWin) sWin.focus();
	return sWin;
}

//
function popupOpenSimple(pop_url){
	var pp_str='width=200,height=200,left=0,top=0,toolbar=no,directories=no,menubar=no,status=no,scrollbars=no,resizable=yes';
	var sWin=window.open(pop_url, "SimplePop", pp_str);
	if(sWin) sWin.focus();
}