/*
'**********************************************************
'*	Pagina creata da MADISON - M&IT Consulting s.r.l.
'*	Marco Manservigi
'*	martedì 5 luglio 2005 15.02.40 CEST
'*
'*	Controlli javascript dei dati inseriti.
'*	(testati con IE5.5 o superiore e Firefox)
'**********************************************************
*/

////////////////////////////////////////////////////
//	CALENDARIO
////////////////////////////////////////////////////
function showCalendar(dataItem){
	var location
	location="../calendario.asp?data="+dataItem.value
	location+="&target="+dataItem.form.name+"."+dataItem.name
	window.open(location,"Calendario","width=200,height=260,status=no,resizable=yes,top=200,left=200")
	return false
}

/** 
*	Pressione sul pulsante di cambio stato per workflow.
*	sezione campo dello stato della sezione
*	stato nuovo stato
*/
function salva(sezione,stato,ref){
	if(validazione(sezione.form)){
		sezione.value=stato
//		sezione.form.action=sezione.form.action+"#"+ref
		sezione.form._nextRef.value=ref
		sezione.form.submit()
		return true
	}else
		return false
}

/**
*	Viene chiamata sull'evento submit e chiama i controlli
*	sui dati inseriti.
*	Per compatibilità con vecchi moduli. Meglio usare la successiva.
*/
function validazione() {
	return validazione(document.forms[0]);
}

/**
*	Viene chiamata sull'evento submit e chiama i controlli
*	sui dati inseriti.
*/
function validazione(form) {
	var index
	var element
	var valid
	var lastName=""
	var type
	for(index=0;index<form.elements.length;index++) {
		element=form.elements[index]
		//per radio e checkbox voglio un solo elemento
		if(lastName==element.name)
			continue;
		lastName=element.name
		valid=null
		type=element.getAttribute("_type")
		if((type=="small-text")||(type=="large-text")){
			valid=validaTesto(element)
		}else if(type=="date"){
			valid=validaData(element)
		}else if(type=="time"){
			valid=validaOra(element)
		}else if(type=="integer"){
			valid=validaIntero(element)
		}else if(type=="double"){
			valid=validaDecimale(element)
		}else if((type=="single-choice")||(type=="single-A")||
		(type=="single-P")||(type=="single-T")){	//vale anche per parasuraman
			valid=validaChoice(element,true)
		}else if(type=="single-choice-select"){
			//niente
		}else if(type=="single-select"){
			valid=validaSelect(element)
		}else if(type=="multi-choice"){
			valid=validaChoice(element,false)
		}else if((type=="file")||(type=="link")){
			valid=validaFile(element)
		}
		if((valid!=null)&&(!valid)){
			if((!element.disabled)&&(!element.type=="hidden")) element.focus()
//			if(!element.disabled) element.focus()
			return false
		}
		if(type=="sum"){	//somma di un gruppo numerico
			if(!validaSezioneNumerica(element)) return false
		}
	}
	return true;
}

/** Funzione di validazione per domande link e file.
 * @param element oggetto input
 * @return false se errore
 */
function validaFile(element){
	var value=element.getAttribute("_value")
	if(((!element.disabled)&&(element.value==""))||(element.disabled)&&(value=="")){
		if(!validaObbligatorio(element))
			return false
	}
//	if((!element.disabled)&&(element.value=="")){
//		return confirm("Cancellare il file "+getTesto(element)+"?")
//	}	
	return true
}

/** Funzione di validazione per domande di testo.
 * @param element oggetto input
 * @return false se errore
 */
function validaTesto(element){
	if((element.value=="")&&(!element.disabled)){
		return validaObbligatorio(element)
	}
	var maxLength=element.getAttribute("_maxLength")
	if((maxLength!=null)&&(element.value.length>parseInt(maxLength))){
		alert("Alla domanda "+getTesto(element) +" è necessario rispondere con al massimo "+maxLength+" caratteri")
		return false
	}
	return true
}

/** Funzione di validazione per domande numeriche intere.
 * @param element oggetto input
 * @return false se errore
 */
function validaIntero(element){
	if(element.value==""){
		return (element.disabled?true:validaObbligatorio(element))
	}
	if(!isInteger(element)){
		alert("Alla domanda "+getTesto(element) +" è necessario rispondere con un valore numerico intero")
		return false
	}
	var max=element.getAttribute("_maxValue")
	var min=element.getAttribute("_minValue")
	var errore
	errore=(max!=null)&&(parseInt(element.value)>parseInt(max))
	errore|=(min!=null)&&(parseInt(element.value)<parseInt(min))
	if(errore){
		if(max==null)
			alert("Alla domanda "+getTesto(element) +" inserire un valore maggiore o uguale a "+min)
		else if(min==null)
			alert("Alla domanda "+getTesto(element) +" inserire un valore minore o uguale a "+max)
		else	//entrambi non nulli (se non non avevo errore)
			alert("Alla domanda "+getTesto(element) +" inserire un valore compreso tra "+min+" e "+max)
		return false
	}
	return true
}

/** Funzione di validazione per domande numeriche decimali.
 * @param element oggetto input
 * @return false se errore
 */
function validaDecimale(element){
	var value=element.value
	if(value==""){
		return (element.disabled?true:validaObbligatorio(element))
	}
	value=stringToFloat(value)
//	if(!isFloatValue(value)){
	if(isNaN(value)){
		alert("Alla domanda "+getTesto(element) +" è necessario rispondere con un valore numerico")
		return false
	}
	var max=element.getAttribute("_maxValue")
	var min=element.getAttribute("_minValue")
	var errore
//	errore=(max!=null)&&(parseFloat(value)>parseFloat(max))
//	errore|=(min!=null)&&(parseFloat(value)<parseFloat(min))
//	errore=(max!=null)&&(value>parseFloat(max))
//	errore|=(min!=null)&&(value<parseFloat(min))
	errore=(max!=null)&&(value>stringToFloat(max))
	errore|=(min!=null)&&(value<stringToFloat(min))
	if(errore){
		if(max==null)
			alert("Alla domanda "+getTesto(element) +" inserire un valore maggiore o uguale a "+min)
		else if(min==null)
			alert("Alla domanda "+getTesto(element) +" inserire un valore minore o uguale a "+max)
		else	//entrambi non nulli (se non non avevo errore)
			alert("Alla domanda "+getTesto(element) +" inserire un valore compreso tra "+min+" e "+max)
		return false
	}
	var digit=element.getAttribute("_digit")
	if(digit!=null){
		var index=element.value.indexOf('.')
		if(index<0)
			index=element.value.indexOf(',')
		if((index>0)&&(index+parseInt(digit)+1<element.value.length)){
			alert("Alla domanda "+getTesto(element) +" inserire un valore con al massimo "+digit+" cifre decimali")
			return false
		}
	}
	return true
}

/** Funzione di validazione per domande con data.
 * @param element oggetto input
 * @return false se errore
 */
function validaData(element){
	if((element.value=="")&&(!element.disabled)){
		return validaObbligatorio(element)
	}
	var format=element.getAttribute("_format")
	if((format=="")||(format==null))
		return false
	var days=(format.indexOf("gg")>=0)
	var months=(format.indexOf("mm")>=0)
	var years=(format.indexOf("aaaa")>=0)
	if(!isDate(element,days,months,years,true)){
		alert("Alla domanda "+getTesto(element) +" è necessario rispondere con una data nel formato "+format)
		return false
	}
	return true
}

/** Funzione di validazione per domande con orario.
 * @param element oggetto input
 * @return false se errore
 */
function validaOra(element){
	var obl=null
	var format=element.getAttribute("_format")
	if((format=="")||(format==null))
		return false
	var hours=(format.indexOf("HH")>=0)
	var minutes=(format.indexOf("MM")>=0)
	var seconds=(format.indexOf("SS")>=0)

	//se esiste il campo data, verifico se sono riempiti entrambi o nessuno
	var items=document.getElementsByName(element.name.substring(0,element.name.length-2))	//tolgo _H)
	//alert(element.name.substring(0,element.name.length-2))
	if((items!=null)&&(items.length>=1)){
		if((items[0].value=="")&&(element.value!="")){	//se c'è l'ora e non la data --> errore
			alert("Alla domanda "+getTesto(element) +" è necessario rispondere inserendo sia la data che l'orario ")
			return false
		}else if ((items[0].value!="")&&(element.value=="")){	//se c'è la data e non l'ora --> in automatico 00:00:00
			element.value="00:00"+(seconds?":00":"")
		}
	}

	if((element.value=="")&&(!element.disabled)){
		obl=validaObbligatorio(element)
		if(!obl)
			return false
	}
	if(obl!=null) return true;

	if(!isTime(element,hours,minutes,seconds)){
		alert("Alla domanda "+getTesto(element) +" è necessario rispondere con un orario nel formato "+format)
		return false
	}
	return true
}

/** Funzione di validazione per domande a scelta multipla.
 * @param element oggetto input
 * @param singola se true è scelta singola, se false scelta multipla
 * @return false se errore
 */
function validaChoice(element,singola){
	var items=document.getElementsByName(element.name)
	var selected=0
	var i
	for(i=0;i<items.length;i++){
		if(items[i].checked)
			selected++
	}
	if((selected==0)&&(!element.disabled)){
		return validaObbligatorio(element)
	}
	if(singola) return true;
	var minValue=element.getAttribute("_minValue")
	var maxValue=element.getAttribute("_maxValue")
	if(((selected<minValue)||(selected>maxValue))&&(!element.disabled)){
		alert("Nella domanda "+getTesto(element)+" è necessario selezionare da "+minValue+" a "+maxValue+" opzioni")
		return false;
	}
	return true;
}

/** Funzione di validazione per domande anagrafiche.
 * @param element oggetto input
 * @return false se errore
 */
function validaSelect(element){
	var index=element.selectedIndex
	if((index==0)&&(!element.disabled)){
		return validaObbligatorio(element)
	}
	return true;
}

/** Funzione di validazione per sezioni numeriche.
 * @param element oggetto input
 * @return false se errore
 */
function validaSezioneNumerica(element){
	var items=element.getAttribute("_items")
	if((element.value==null)||(element.value=="")||(items==null)||(items=="")){
		return true
	}
	var arr=items.split(";")
	var i,item
	var tot=0
	var almenoUna=false
	for(i=0;i<arr.length;i++){
		item=document.getElementsByName(arr[i])[0]
		if(isNaN(eval(item.value))){
			if(almenoUna){
				//se è obbligatorio rispondere non ci vado mai qui (già controllato)
				alert("Nella sezione "+getTesto(element)+" è necessario rispondere a nessuna o a tutte le domande")
				item.focus() 
				return false
			}
		}else
			almenoUna=true
		tot+=eval(item.value)
	}
	//arrivo qui se hanno risposto a tutte o a nessuna
	if(almenoUna&&(tot!=eval(element.value))){
		alert("Nella sezione "+getTesto(element)+" è necessario che la somma delle risposte valga "+element.value)
		document.getElementsByName(arr[0])[0].focus() 
		return false
	}
	return true
}

/** Funzione di validazione dell'obbligatorietà per tutte le domande.
 * Da chiamare solo se non è stata data risposta alla domanda.
 * @param element oggetto input
 * @return false se errore
 */
function validaObbligatorio(element){
	var obligatory=element.getAttribute("_obligatory")
	if(obligatory=="true"){
		alert("E' necessaio rispondere alla domanda "+getTesto(element));
		return false
	}else if(obligatory=="alert"){
		return confirm("Non è stata data risposta alla domanda "+getTesto(element)+" Continuare?")
	}
	return true
}

function getTesto(element){
	return "\n\'"+element.getAttribute("_text")+"\'\n";
}

function isInteger(item){
	if(item.value=="")
	  return true
	var intero=parseInt(item.value)
	if(isNaN(intero)||(item.value!=intero)){
	  return false
	}
	return true
}

function isFloat(item){
	if(item.value=="")
	  return true
	var decimale=parseFloat(item.value)
	if(isNaN(decimale)||(item.value!=decimale)){
	  return false
	}
	return true
}

function isDate(item,days,months,years,twoDigitYears){
	var value
	var day,month,year
	if(item.value=="")
		return true
	value=item.value
	if(days){
		day = value.substring(0, value.indexOf('/'))// day
		day=StringToInt(day)
//		alert("day="+day)
		if(day==null){
			return false
		}
	}
	if(months){
		if(days)
			value = value.substring(value.indexOf('/')+1)
		month = value.substring(0, value.indexOf('/'))
		month=StringToInt(month)
//		alert("month="+month)
		if(month==null){
			return false
		}
	}
	if(years){
		if(days||month)
			year = value.substring(value.indexOf('/')+1)
		else
			year=value
		if(twoDigitYears&&(year.length==2))
		   year=(year<50)?"20"+year:"19"+year
		if(year.length!=4)
			return false
		year=StringToInt(year)
//		alert("year="+year)
		if(year==null){
			return false
		}
	}
	//basic error checking
	if (months&&(month<1 || month>12)) return false
	if (days&&(day<1 || day>31)) return false
	if (years&&(year<0 || year>9999)) return false

	//advanced error checking

	// months with 30 days
	if (months&&days&&(month==4 || month==6 || month==9 || month==11)){
		if (day==31) return false
	}

	// february, leap year
	if (months&&days&&(month==2)){
		// feb
		var g=parseInt(year/4)
		if (isNaN(g)) {
			return false
		}
		if (day>29) return false
		if (day==29 && ((year/4)!=parseInt(year/4))) return false
	}
	return true
}

function isTime(item,hours,minutes,seconds){
	var value
	var hour,minute,second
	if(item.value=="")
		return true
	value=item.value

	if(hours){
//		value = value.substring(value.indexOf(' ')+1)
		hour=value.substring(0,value.indexOf(':'))
//		alert(hour+"**")
		hour=StringToInt(hour)
//		alert("hour="+hour)
		if(hour==null){
			return false
		}
	}

	if(minutes){
		value = value.substring(value.indexOf(':')+1)
		if(seconds)
			minute=value.substring(0,value.indexOf(':'))
		else
			minute=value
		minute=StringToInt(minute)
//		alert("minute="+minute)
		if(minute==null){
			return false
		}
	}

	if(seconds){
		value = value.substring(value.indexOf(':')+1)
//		alert(value)
		second=value
		second=StringToInt(second)
//		alert("minute="+minute)
		if(second==null){
			return false
		}
	}

	//basic error checking
	if (hours&&(hour<0 || hour>23)) return false
	if (minutes&&(minute<0 || minute>59)) return false
	if (seconds&&(second<0 || second>59)) return false

	return true
}

function StringToInt(value){
	var i,num,first
	if((value=="")||(isNaN(value)))
		return null;
	num=""
	first=false
	for(i=0;i<value.length;i++){
		if((value.charAt(i)<'0')||(value.charAt(i)>'9'))
			return null;
		if(first||(value.charAt(i)!='0')){
			num+=value.charAt(i);
			first=true
		}
	}
//	alert(value)
	if(num=="")
		return 0;
	i=eval(num)
	return (i!=num)?(value.length>0?0:null):i;
//	return (i!=num)?null:i;	//questo non gestisce caso 00
}

/** Converte una stringa numerica in un float JavaScript 
 *	(esempio: "3,5" in 3.5)
 *	@param n stringa
 *	@return numero float
 */
	function stringToFloat(n){
		if(typeof(n)=="string"){
			n=n.replace('.','')	//separatore migliaia
			n=n.replace(',','.')	//separatore decimali
			var val=parseFloat(n)
			if(isNaN(val)||(val!=n)) return NaN	//null
			return val
		}
		return n
	}

/** Converte un float JavaScript in una stringa
 *	(esempio: 3.5 in "3,5")
 *	@param n numero float
 *	@return stringa
 */
	function floatToString(n){
		var s
		if(typeof(n)=="number"){
			s=""+n
			s=s.replace('.',',')
			return s;
		}
		return n
	}

