// Funzioni di Controllo sull'immissione dei dati nei form
// Pandolfo Luca 2002


// Inserisce automaticamente il titolo di un doc inserito in un campo File
// in un campo text togliendo l'estensione
// TheFileInput : rif. al form File
// TheTextInput : rif. al form Text
function setTitle (TheFileInput, TheTextInput)
{
 	var strFile = TheFileInput.value;
	var nLastSlash;
	var nLastDot;
	var nDiff;
	
	if ((nLastDot = strFile.lastIndexOf ('.')) < 0) nLastDot = strFile.length;
 	if ((nLastSlash = strFile.lastIndexOf ('\\')) < 0) nLastSlash = strFile.lastIndexOf ('/');
	nDiff = nLastDot - nLastSlash - 1 ;
	if (nDiff < 0)
		return;
	if (nDiff > 255)
		TheTextInput.value = strFile.substring (nLastSlash + 1, nLastSlash + 51)
	else
		TheTextInput.value = strFile.substring (nLastSlash + 1, nLastDot);
}

// variabile che viene posta a TRUE con l'evento onkeyup nel form di inserimento della data
var formDataCambiato = false;
// richiamato al onblur nel form di inserimento della data, permette
// di eseguire la funzione ceckData dopo che la data è stata modificata:
// questo perche' se si riscrive la stessa data (sbagliata) l'evento onchange non viene generato.
// tester : viene passata la var. booleana formDataCambiato
// form : rif. al form Text dove viene inserita la data
// toform : rif. al form hidden dove viene scritta la data nel formato corretto
function ceckDataIfChanged (tester, form, toform) {
	if (tester) ceckData (form, toform);
}

// controlla la correttezza della data
// data in formato italiano divida da "/" o da "."
// form : rif. al form Text dove viene inserita la data
// toform : rif. al form hidden dove viene scritta la data nel formato corretto
function ceckData (form, toform, prefix) {
	formDataCambiato = false;
	if (!form.value=="") {
		var dataSplitted;
		var dataString;
		var dataCorretta;
		var questaData;
		dataCorretta = false;
		dataString = form.value;
		var charSeparatore;
		if (dataString.indexOf("/")>=0) {
			charSeparatore = "/";
		} else {
			charSeparatore = ".";
		}
		
		dataSplitted = dataString.split(charSeparatore);
		if (dataSplitted.length==3) {
			if ( !isNaN(dataSplitted[0]) && !isNaN(dataSplitted[1]) && !isNaN(dataSplitted[2]) ) {
				if ((parseInt(dataSplitted[0])==0) && (dataSplitted[0].length=2)) { dataSplitted[0] = dataSplitted[0].substr(1,2); }
				if ((parseInt(dataSplitted[1])==0) && (dataSplitted[1].length=2)) { dataSplitted[1] = dataSplitted[1].substr(1,2); }
				if ( (parseInt(dataSplitted[0])>0) && (parseInt(dataSplitted[0])<=31) && (parseInt(dataSplitted[1])>0) && (parseInt(dataSplitted[1])<=12) && (parseInt(dataSplitted[2])>1900) ) {
					questaData = new Date(dataSplitted[2], dataSplitted[1]-1, dataSplitted[0]);
					if ( (questaData.getDate()==dataSplitted[0]) && (questaData.getMonth()==dataSplitted[1]-1) && (questaData.getFullYear()==dataSplitted[2]) )
						dataCorretta = true;
				} 
			} 
		} 
		if (dataCorretta) {
			if (!prefix) {
				toform.value = dataSplitted[1] +"/"+ dataSplitted[0] +"/"+ dataSplitted[2];
			} else {
				toform.value = prefix + dataSplitted[1] +"/"+ dataSplitted[0] +"/"+ dataSplitted[2];
			}
			//alert ("Form Destinazione settato a: " + toform.value);
		}
		else {
				form.focus();
				form.value="";
				toform.value="";
				alert("La data inserita ("+ dataString +") non è accettabile. Il formato corretto è gg/mm/aaaa o gg.mm.aaaa");
				form.focus();
		}
	}
	else {
		toform.value="";
	}
}

function nextDay (strData) {
	dataSplitted = strData.split("/");
//	alert (dataSplitted[2] +"."+ (dataSplitted[0]-1) +"."+ dataSplitted[1]);
	numMillSec = Date.UTC(dataSplitted[2], dataSplitted[0]-1, dataSplitted[1], 0, 0, 0, 0);
	questaData = new Date(numMillSec);
//	alert ( questaData );
//	alert ( questaData.getMonth() );
//	alert ( questaData.getDate() );
//	alert ( questaData.getFullYear() );
	fusoOrario = questaData.getTimezoneOffset();
	numMillSecOK = numMillSec + (fusoOrario*60*1000) + (24*60*60*1000);
	questaData = new Date(numMillSecOK);
	toReturn = (questaData.getMonth()+1) +"/"+ questaData.getDate() +"/"+ questaData.getFullYear();
//	alert ( questaData.getMonth() );
//	alert ( questaData.getDate() );
//	alert ( questaData.getFullYear() );
//	alert ( valDateExpire );
	return toReturn;
}

// controlla la correttezza del periodo compreso fra due date
// data in formato italiano divida da "/" o da "."
// dataStart : stringa con la data iniziale
// dataEnd : stringa con la data finale
// arrFormToReset : array con i rif. ai form da resettare in caso di periodo non valido
function ceckPeriodo (dataStart, dataEnd, arrFormToReset) {
	if (dataStart!="" && dataEnd!="") {
		if (dataStart.indexOf("/")>=0) {
			charSeparatore = "/";
		} else {
			charSeparatore = ".";
		}
		arrInizio = dataStart.split(charSeparatore);
		dataInizio = new Date(arrInizio[2], arrInizio[1], arrInizio[0]);
		if (dataEnd.indexOf("/")>=0) {
			charSeparatore = "/";
		} else {
			charSeparatore = ".";
		}
		arrFine = dataEnd.split(charSeparatore);
		dataFine = new Date(arrFine[2], arrFine[1], arrFine[0]);
		if (dataFine<dataInizio) {
			alert ("La data "+ arrFine[0] +"/"+ arrFine[1] +"/"+ arrFine[2] +" è minore della data "+ arrInizio[0] +"/"+ arrInizio[1] +"/"+ arrInizio[2]);
			for (i in arrFormToReset) {
				arrFormToReset[i].value="";
			}
			return false;
		} else {
			return true;
		}
	} else {
		return true;
	}
}

// controlla la correttezza di un numero intero
// form : rif. al form Text dove viene inserito il valore
// msg: nome del campo da visualizzare nell'alert in caso di errore
// maxInt : valore massimo
// minInt : valore minimo, default=0
function ceckNumeric (form, msg, maxInt, minInt) {
	if (!minInt) minInt=0;
	var valInt = "";
	intCorretto = true;
	re = /\./gi;
	valInt = form.value.replace(re, "");
	if (isNaN(valInt)) {
		intCorretto = false;
	} else {
		if (!( (parseInt(valInt)>=minInt) && (parseInt(valInt)<=maxInt) )) {
			intCorretto = false;
		} else {
			if (valInt.indexOf(".")>=0) {
				intCorretto = false;
			} else {
				if (valInt.indexOf(",")>=0) {
					intCorretto = false;
				}
			}
		}
	}
	if (!intCorretto) {
		alert("Il campo "+msg+" deve essere un numero intero compreso fra "+minInt+" e "+maxInt);
		form.value="";
		form.focus();
	} else {
		form.value=valInt;
	}
}

// controlla la correttezza di un numero da ins. nel DB nel formato "Int 4"
// form : rif. al form Text dove viene inserito il valore
// msg: nome del campo da visualizzare nell'alert in caso di errore
function ceckInt4 (form, msg) {
	ceckNumeric (form, msg, 2147483647, 0);
}

// controlla la correttezza di una stringa per essere inserita correttamente in un file XML
// form : rif. al form Text dove viene inserita la stringa
// listCharBloked : stringa contenente i caratteri non ammessi (default: "<>|")
function ceckString (form, listCharBloked) {
	if (!listCharBloked) {
		listCharBloked="[<>|#]";
	} else {
		listCharBloked = "[" + listCharBloked + "]";
	}
	var re;
	re = new RegExp(listCharBloked, "gi");
	if (form.value.search(re)!=-1) 
	{
		form.value = form.value.replace(re, "");
		alert("carattere vietato!!");
	}
}

// spezza una stringa lunga in due campi evitando di troncare le parole
// form : rif. al form Text o TextArea con la stringa
// split1: rif. al primo form Text
// split2: rif. al secondo form Text
// maxCharOnSplit2: nuumero max di caratteri nel secondo form
// per evitare di spezzare una parola il secondo form text deve poter contenere
// un numero inferiore di car. rispetto a quello che sarebbe permesso nel DB...
function splitTextArea (form, split1, split2, maxCharOnSplit2)
{
	var positionOfLastSpace = -1;
	var valTextArea = form.value;
	var lengthTextArea = valTextArea.length;
	split1.value = "";	
	split2.value = "";	
	if (lengthTextArea<=255) {
		// ci sta tutto sul primo campo
		split1.value = valTextArea;
	} else {
		// si usano due campi
		positionOfLastSpace = valTextArea.lastIndexOf(" ", 254);
		if (positionOfLastSpace>-1) {
			// è stato trovato uno spazio entro i primi 255 caratteri
			if ((lengthTextArea - ( positionOfLastSpace + 1)) <= maxCharOnSplit2) {
				// ci sta tutto comodamente su due campi
				split1.value = valTextArea.slice(0, positionOfLastSpace);
				split2.value = valTextArea.slice(positionOfLastSpace);
			} else {
				// non si riesce a spezzare bene la stringa, si tronca quindi una parola!
				split1.value = valTextArea.slice(0, 254);
				split2.value = valTextArea.slice(254);
			}
		} else {
			// non è stato trovato uno spazio entro i primi 255 caratteri.
			// Praticamente impossibile.. comunque previsto.
			split1.value = valTextArea.slice(0, 254);
			split2.value = valTextArea.slice(255);
		}
	}
}

// sposta le options selezionate in un form select in un altro form select
// controllando di non immettere doppioni
// form : rif. al form Select dove vengono selezionate le voci
// toform : rif. al form Text dove vengono inserite le voci selezionate
function addOptions (form, toform) {
	var optionExist = false;
	for (var i = 0; i < form.options.length; i++) {
		if (form.options[i].selected) {
			optionExist = false;
			for (var j = 0; j < toform.options.length; j++) {
				if (form.options[i].value==toform.options[j].value) {
					optionExist = true;
					break;
				}
			}
			if (!optionExist) {
				optionAdded = new Option(form.options[i].text, form.options[i].value, false, false);
				toform.options[toform.length] = optionAdded;
			}
		}
	}
}

// sposta le options selezionate in un form select ANNIDATO in un altro form select
// controllando di non immettere doppioni
// arrForm : array di rif. ai form Select dove vengono selezionate le voci
// toform : rif. al form Text dove vengono inserite le voci selezionate
function addOptionsMultiLevel (arrForm, toform) {
	var optionExist = false;
	var newOptionText = "";
	var form, thisForm;
	for (var k = arrForm.length-1; k>=0; k--) {
		form = arrForm[k];
		if (form.selectedIndex!=0) {
			for (var i = 0; i < form.options.length; i++) {
				if (form.options[i].selected) {
					optionExist = false;
					for (var j = 0; j < toform.options.length; j++) {
						if (form.options[i].value==toform.options[j].value) {
							optionExist = true;
							break;
						}
					}
					if (!optionExist) {
						newOptionText = form.options[i].text;
						for (var y=k-1; y>=0; y--) {
							thisForm = arrForm[y];
							if (thisForm.selectedIndex>0) {
								newOptionText = thisForm.options[thisForm.selectedIndex].text + " - " + newOptionText;
							}
						}
						optionAdded = new Option(newOptionText, form.options[i].value, false, false);
						toform.options[toform.length] = optionAdded;
					}
				}
			}
			break;
		}
	}
}

// elimina le options selezionate in un form select 
// form : rif. al form Select dove vengono selezionate le voci da eliminare
function delOptions (form) {
	for (var i = 0; i < form.options.length; i++) {
		if (form.options[i].selected) {
			form.options[i] = null;
			i--;
		}
	}
}

// Inserisce in un select le options partendo da una lista di codici su stringa
// ed individuandole in un select di riferimento.
// utile per settare all'inizio il contenuto del select
// form : rif. al form Select dove sono presenti tutte le possibili voci
// toform : rif. al form Text dove vengono inserite le voci contenute nella stringa
// strValues : stringa contenente tutti i value delle options da inserire
// strSeparator : stringa contenente il carattere che separa i values nella stringa precedente (di default il pipe |)
function addOptionsFromValues(form, toform, strListValues, strSeparator ){
	if ( (!strSeparator) || (strSeparator=="")) {
		strSeparator = "|";
	}
	arrValues = strListValues.split(strSeparator);
	for (var nsplit=0; nsplit<arrValues.length; nsplit++) {
		for (var i=0; i<form.options.length; i++) {
			if (form.options[i].value==arrValues[nsplit]) {
					optionAdded = new Option(form.options[i].text, form.options[i].value, false, false);
					toform.options[toform.length] = optionAdded;
					break;
			}
		}
	}
}

// Inserisce in un select le options partendo da una lista di codici su stringa
// ed individuandole nell'array che crea la select multipla di riferimento.
// utile per settare all'inizio il contenuto di un select multilivello con selezione multipla
// arrDesc : array contenente gli array con le descrizioni che popolano il Select a più livelli dove sono presenti tutte le possibili voci
// arrId : array contenente gli array con gli ID che popolano il Select a più livelli dove sono presenti tutte le possibili voci
// toform : rif. al form Select dove vengono inserite le voci ricavate dalla stringa
// strValues : stringa contenente tutti i value delle options da inserire, devono essere o l'ultimo codice o ad albero (con i codici divisi dal pipe "|")
// strSeparator : stringa contenente il carattere che separa i values nella stringa precedente (di default il pipe |), conviene usare in questo caso "><" per separare le stringhe
function addOptionsFromMultiLevel(arrDesc, arrId, toform, strListValues, strSeparator ){
	var newOptionText = "";
	var thisCode = "";
	var thisArrayDesc;
	var arrValues;
	if ( (!strSeparator) || (strSeparator=="")) {
		strSeparator = "|";
	}
	arrValues = strListValues.split(strSeparator);
	for (var nsplit=0; nsplit<arrValues.length; nsplit++) {
		arrSingleValues = arrValues[nsplit].split("|");
		newOptionText = "";
		thisCode = arrSingleValues[arrSingleValues.length-1]; //ultimo codice
		theFinalCode = thisCode;
		for (var i=arrDesc.length-1; i>=0; i--) {
			thisArrayDesc = arrDesc[i];
			thisArrayId = arrId[i];
			if (thisArrayDesc[thisCode]) {
				if (newOptionText!="") {
					newOptionText = thisArrayDesc[thisCode] + " - " + newOptionText;
				} else {
					newOptionText = thisArrayDesc[thisCode];
				}
				thisCode = thisArrayId[thisCode];
			}
		}
		optionAdded = new Option(newOptionText, theFinalCode, false, false);
		toform.options[toform.length] = optionAdded;
	}
}

// come prima ma accetta solo codice ad albero...
function addOptionsFromMultiLevelOnlyTree (arrDesc, toform, strListValues, strSeparator ){
	var newOptionText = "";
	var thisCode = "";
	var thisArrayDesc;
	var arrValues;
	if ( (!strSeparator) || (strSeparator=="")) {
		strSeparator = "|";
	}
	arrValues = strListValues.split(strSeparator);
	for (var nsplit=0; nsplit<arrValues.length; nsplit++) {
		arrSingleValues = arrValues[nsplit].split("|");
		newOptionText = "";
		for (var j=0; j<arrSingleValues.length; j++) {
			thisArrayDesc = arrDesc[j];
			thisCode = arrSingleValues[j];
			if (newOptionText!="") {
				newOptionText = newOptionText + " - " + thisArrayDesc[thisCode];
			} else {
				newOptionText = thisArrayDesc[thisCode];
			}
		}
		optionAdded = new Option(newOptionText, thisCode, false, false);
		toform.options[toform.length] = optionAdded;
	}
}

// Imposta un select alla options il cui value corrisponde a quello specificato
// form : rif. al form Select dove sono caricate le possibili voci
// strValue : il value corrispondente all'option da selezionare
function setSingleSelectByValue (form, strValue) {
	for (var i=0; i<form.options.length; i++) {
		if (form.options[i].value==strValue) {
			form.options[i].selected=true;
			//form.selectedIndex=i;
			break;
		}
	}
}

// Imposta una serie di select collegati alle options i cui valori corrispondono a quelli specificati
// provvede in automatico a ripopolare i select
// arrform : array con i rif. ai Select
// strListValue : stringa con i value corrispondenti alle options da selezionare
//                la lista di values deve partire dal primo select inserito in arrForm ed avere la stessa sequenza
// strSeparator : stringa contenente il carattere che separa i values nella stringa precedente (di default il pipe |)
// arrId : array contenete i rif. ai vari array con gli ID per popolare i select
// arrDs : array contenete i rif. ai vari array con le Descrizioni per popolare i select
function setMultipleSelectByValues (arrForm, strListValues, strSeparator, arrId, arrDs) {
	if (strListValues!="") {
		if ( (!strSeparator) || (strSeparator=="")) {
			strSeparator = "|";
		}
		arrValues = strListValues.split("|");
		for (var nsplit=0; nsplit<arrValues.length; nsplit++) {
			if (nsplit == arrForm.length) break;
			thisSelect = arrForm[nsplit];
			for (var i=0; i<thisSelect.options.length; i++) {
				if ( thisSelect.options[i].value==arrValues[nsplit]) {
					thisSelect.selectedIndex=i;
					if (nsplit != arrForm.length-1) {
						refreshList(thisSelect, arrForm[nsplit+1], arrId[nsplit+1], arrDs[nsplit+1]);
						break;
					}
				}
			}
		}
	}
}

// Imposta una serie di select collegati alle options in modo tale che la chiamata della function
// setResult su questi dia come risultato il codice passato in input a questa function
// arrform : array con i rif. ai Select
// strValue : stringa con il value selezionato
// arrId : array contenete i rif. ai vari array con gli ID per popolare i select
// arrDs : array contenete i rif. ai vari array con le Descrizioni per popolare i select
function setListByLastValue (arrForm, strValue, arrId, arrDs) {
	var thisArrId;
	var thisArrDs;
	var strListValues;
	var tmpValue;
	strListValues = strValue;
	tmpValue = strValue;
	for (var j=arrId.length-1; j>0; j--) {
		thisArrId = arrId[j];
		thisArrDs = arrDs[j];
		if ( thisArrId[tmpValue] ) {
			strListValues= thisArrId[tmpValue] +"|"+ strListValues;
			tmpValue = thisArrId[tmpValue];
		}
	}
	setMultipleSelectByValues (arrForm, strListValues, "|", arrId, arrDs);
}

// gestisce un countdown di caratteri immessi in un form Text o TextArea
// viene richiamato dall'evento onkeyup nel form Text o TextArea
// TextForm : rif. al form contenente la stringa
// CounterForm : rif. al form Text dove viene visualizzato il contatore
// nChr : numero di caratteri massimi ammessi
function counter(TextForm, CounterForm, nChr){
	var nChrStrTextArea;
	nChrStrTextArea = (TextForm.value).length; 
	isNaN(nChrStrTextArea)?nChrStrTextArea=0:nChrStrTextArea;
	var nCharDisponibili;
	nCharDisponibili = nChr - (nChrStrTextArea);
	if(nCharDisponibili<0){
		alert("Attenzione! Si è arrivati al limite consentito per l'inserimento del testo!");
		var strProvv = "";
		for(i=0;i<nChr;i++){
			strProvv += (TextForm.value).charAt(i);
			nCharDisponibili = 0;
		}
		CounterForm.value = nCharDisponibili;
		TextForm.value = strProvv
		return false;
	}
	CounterForm.value = nCharDisponibili;
}

// controlla e automatizza l'immissione dell'anno accademico
// form : rif al form text dove viene inserito il primo anno
// toform : rif al form text dove viene inserito il secondo anno (primo+1)
function ceckAnnoAccademico (form, toform) {
	var valAA = form.value;
	var annoCorretto = false;
	if (valAA!="") {
		if (!isNaN(valAA)) {
			if (parseInt(valAA)>=1999) {
				annoCorretto = true;
			}
		}
	}
	if (annoCorretto) {
		toform.value =  parseInt(valAA)+1;
		return false;
	} else {
		alert("La data inserita ("+ form.value +") non è accettabile. Il formato corretto è gg/mm/aaaa");
		toform.value="";
		form.value="";
		form.focus();
		return false;
	}
}

// SELECT MULTIPLI
// effettua il refresh dei select multipli collegati fra loro
// select : rif. al select nel quale è avvenuto il cambiamento
// form : rif. al select sul quale si ripercuote il cambiamento (ripopolamento degli options)
// arrId : array contenete i rif. ai vari array con gli ID per popolare i select
// arrDs : array contenete i rif. ai vari array con le Descrizioni per popolare i select
function refreshList(select,form, arrId, arrDs)
{
	opzioni = select.options[select.selectedIndex].value;
	form.options.length = 0;
	form.options[0] = new Option(".........",0,0,0)
	n = 1
	for (i in arrId) {
		stringa = opzioni;
		if (stringa == arrId[i]) {
			form.options[n] = new Option(arrDs[i],i,0,0);
		n++;
		}
	}
}

// Resetta il contenuto di un select
// form : rif. al select che si vuole spopolare
function resetList(form)
{
	form.options.length = 0;
	form.options[0] = new Option(".........",0,0,0)
}

// Copia il value dell'ultimo select selezionato (e diverso da "")
// su un altro campo (text, hidden..)
// arrSelect : array con i riferimenti ai select annidati
// form : rif. al form dove mettere il valore
function setResult(arrSelect, form)
{
	var i=arrSelect.length-1;
	while (arrSelect[i].selectedIndex<=0) {
		i--;
		if (i==0) break;
	}
	if (i>=0) {
		form.value=arrSelect[i].options[arrSelect[i].selectedIndex].value;
	} else {
		form.value="";
	}
}

function popolaSelectFromArray (form, arrID, arrDesc, valore) {
	form.options.length = 0;
	form.options[0] = new Option("...",0,0,0);
	var n = 1;
	for (i in arrID) {
		if (arrID[i]==valore) {
			form.options[n] = new Option(arrDesc[i],i,0,0);
			n++;
		}
	}
}

function setTextByOptionSelected (textform, selectform) {
	if (selectform.selectedIndex!=0)
		textform.value = selectform.options[selectform.selectedIndex].text
	else
		textform.value = "";
	
}
