/*************************  NOTE *******************************************************/
/*
	27/05/2005 	- aggiunto il supporto di piu form per pagina
							- controllato il supporto per innerHTML
	29/06/2005  - aggiunto il controllo per la data nel formato gg/mm/aaaa
*/
/************************* PARTE PUBBLICA COMUNE ***************************************/
		
		//MODALITA' DI VISUALIZZAZIONE DEGLI ERRORI
		// 0 -> alert javascript 
		// 1 -> popup (personalizzare il codice)
		// 2 -> innerHTML
		var displayErrorMode = 0;		
		
		//IMPOSTAZIONI PER IL POPUP
		var headerPopup = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\r<html>\r<head>\r<title>Coro Gospel \"The Golden Guys\"</title>\r	<link rel=\"STYLESHEET\" type=\"text/css\" href=\"../stile.css\">\r</head>\r<body style=\"padding: 10px;margin: 0\">\r<p style=\"margin: 0px 10px 10px 10px \">\r";
		var footerPopup = "\r</p>\r</body>\r</html>"
		var popupWidth = 300;
		var popupHeight = 150;
		
		//STILI PER LA MODIFICA DEI CAMPI DI TESTO
		var defaultBorderColor = "#A1A8AE";
		var defaultBackgroundColor = "#F2F1EB";
		var defaultTextColor = "#666666";
		
		var errorBorderColor = "#E5001B";
		var errorBackgroundColor = "#F2F1EB";
		var errorTextColor = "#666666";
		
		//TESTI PER LA VISUALIZZAZIONE DEGLI ERRORI
			// required
			// email
			// numeroGenerico
			// regExp
			// minLength	
			// notSelected	
			// minSelect
			// maxSelect
			// emptyOptionValue
		var errorDescriptions = new Array();
		errorDescriptions["1040"] = new Array(); //italiano
			errorDescriptions["1040"]["header"] = "Attenzione! Controlla i seguenti campi:";
			errorDescriptions["1040"]["required"] = "nomeCampo: obbligatorio";
			errorDescriptions["1040"]["regExp"] = "nomeCampo: il valore inserito non e' corretto";
			errorDescriptions["1040"]["email"] = "nomeCampo: l'indirizzo inserito non e' valido";
			errorDescriptions["1040"]["numeroGenerico"] = "nomeCampo: inserire un numero";
			errorDescriptions["1040"]["minLenght"] = "nomeCampo: ...";
			errorDescriptions["1040"]["notSelected"] = "nomeCampo: obbligatorio";
			errorDescriptions["1040"]["minSelect"] = "nomeCampo: selezionare il numero di opzioni richiesto";
			errorDescriptions["1040"]["maxSelect"] = "nomeCampo: sono state selezionate troppe opzioni";
			errorDescriptions["1040"]["emptyOptionValue"] = "nomeCampo: selezionare una voce dall'elenco";
			errorDescriptions["1040"]["ggmmaaaa"] = "nomeCampo: usare il formato gg/mm/aaaa (es. 10/10/2004)";
		errorDescriptions["2057"] = new Array(); //inglese
			errorDescriptions["2057"]["header"] = "Warning! Please check following fields:";
			errorDescriptions["2057"]["required"] = "nomeCampo: required";
			errorDescriptions["2057"]["regExp"] = "nomeCampo: not valid data";
			errorDescriptions["2057"]["email"] = "nomeCampo: not valid address";
			errorDescriptions["2057"]["numeroGenerico"] = "nomeCampo: number required";
			errorDescriptions["2057"]["minLenght"] = "nomeCampo: ...";
			errorDescriptions["2057"]["notSelected"] = "nomeCampo: required";		
			errorDescriptions["2057"]["minSelect"] = "nomeCampo: ...";
			errorDescriptions["2057"]["maxSelect"] = "nomeCampo: ...";				
			errorDescriptions["2057"]["emptyOptionValue"] = "nomeCampo: ...";	
			errorDescriptions["2057"]["ggmmaaaa"] = "nomeCampo: ...";	
		
		
		
		/*******************************************************************************************************/
		/*                                  PARTE RISERVATA - NON MODIFICARE                                   */
		/*******************************************************************************************************/		
		
		//UTILITA' GENERALE
		function Trim(myString) { 
			return myString.replace(/\s+$|^\s+/g,""); 
		}
		function checkDisplayErrorMode(myErrorBoxId){
			var myErrorBox = document.getElementById(myErrorBoxId);
			if(displayErrorMode == 2){
				if(!myErrorBox || myErrorBox == null) {
					displayErrorMode = 0;
				}else{
					if(myErrorBox.innerHTML == null){
						displayErrorMode = 0;
					}
				}
			}
		}
		
		/*******************************************************************************************************/
		/*                                            TIPI DI CAMPI                                            */
		/*******************************************************************************************************/
	
		//OGGETTO INPUT
		function objInput(inputLabel, required, tipo, regExpr, minLength){
			//proprieta'
			this.inputLabel = inputLabel;
			this.required = required;
			this.minLength = minLength;
			this.tipo = tipo;
			this.regExpr = regExpr;
		}
		
		objInput.prototype.checkField = function(myField, myLanguage){
			var myValue = myField.value;
			myValue = Trim(myValue);
			var myError;
			var myStrError;
			
			//1) se il campo &egrave; richiesto non puo' essere vuoto
			if(this.required){
				if (myValue == ""){
					myStrError = generateErrorMessage("required", this.inputLabel, myLanguage);
					myField.value = "";
					return myStrError;
				}
			}

			//2) se la regExpr e' diverso da null
			if(this.regExpr != null && this.regExpr!=""){
				var isMatched = myValue.match(this.regExpr);
				if(isMatched == null){
					myStrError = generateErrorMessage("regExp", this.inputLabel, myLanguage);
					return myStrError;
				}
			}
			
			//3) se e' specificato il tipo di dato
			if((this.tipo != "" && this.tipo != null) && myValue != ""){
				switch(this.tipo){
					case "email":
						var isMatched = myValue.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
						if(isMatched == null){
							myStrError = generateErrorMessage("email", this.inputLabel, myLanguage);
							return myStrError;
						}
						break;
					case "ggmmaaaa":
						var isMatched = myValue.match(/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((1[6-9]|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/);
						if(isMatched == null){
							myStrError = generateErrorMessage("ggmmaaaa", this.inputLabel, myLanguage);
							return myStrError;
						}
						break;						
					case "numeroGenerico":
						if(isNaN(myValue)) {
							myStrError = generateErrorMessage("numeroGenerico", this.inputLabel, myLanguage);
							return myStrError;
						}
						break;
					//aggiungere qui gli altri tipi previsti
					default:
						alert("Messaggio per lo sviluppatore: tipo non riconosciuto!");
				}
			}
			
			//controllo la lunghezza
			if(this.minLength != "" || this.minLength != null){
				if(myValue.length < this.minLength ){
					myStrError = generateErrorMessage("minLength", this.inputLabel, myLanguage);
					return myStrError;
				}
			}
		}
		/*''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''*/
		
		//OGGETTO TEXTAREA
		function objTextArea(inputLabel, required){
			//proprieta'
			this.inputLabel = inputLabel;
			this.required = required;
		}		
		objTextArea.prototype.checkField = function(myField, myLanguage){
			var myValue = myField.value;
			myValue = Trim(myValue);
			var myError;
			var myStrError;
			
			//1) se il campo &egrave; richiesto non puo' essere vuoto
			if(this.required){
				if (myValue == ""){
					myStrError = generateErrorMessage("required", this.inputLabel, myLanguage);
					return myStrError;
				}
			}
		}
		
		/*''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''*/
		
		//OGGETTO SELECT
		function objSelect(inputLabel, required, maxSelect, minSelect, allowEmptyValue){
			//proprieta'
			this.inputLabel = inputLabel;
			this.required = required;
			this.minSelect = minSelect;
			this.maxSelect = maxSelect;
			this.allowEmptyValue = (allowEmptyValue)?true:false;
		}		
		objSelect.prototype.checkField = function(myField, myLanguage){
			var numOfOptions = myField.length;
			var numOfChoice = 0;
			var emptyValue = false;
			var isSelected = false;
			
			var myStrError;		
			
			//recupero i valori dalla mia select;
			for (i = 0; i< numOfOptions; i++){
				if(myField.options[i].selected){
					if(myField.options[i].value == "" || myField.options[i].value == null) emptyValue = true;
					numOfChoice++;
					isSelected = true;
				}
			}
			
			//1)nessuna selezione effettutata
			if(!isSelected){
					myStrError = generateErrorMessage("notSelected", this.inputLabel, myLanguage);
					return myStrError;			
			}
			
			//2)numero minimo di scelte non effettuato
			if(numOfChoice<this.minSelect){
					myStrError = generateErrorMessage("minSelect", this.inputLabel, myLanguage);
					return myStrError;			
			}
			
			//3)numero massimo di scelte superato
			if(numOfChoice>this.maxSelect){
					myStrError = generateErrorMessage("maxSelect", this.inputLabel, myLanguage);
					return myStrError;			
			}			
			
			//4)valore selezionato vuoto
			if(!this.allowEmptyValue && emptyValue){
					myStrError = generateErrorMessage("emptyOptionValue", this.inputLabel, myLanguage);
					return myStrError;			
			}					
		}		
		/*''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''*/
		
		//OGGETTO RADIO
		function objRadio(inputLabel, required){
			//proprieta'
			this.inputLabel = inputLabel;
			this.required = required;
		}		
		objRadio.prototype.checkField = function(myField, myLanguage){
			var numOfOptions = myField.length;
			var isSelected = false;
			var myStrError;
			if(numOfOptions == null){
				if(myField.checked){isSelected = true;}
			}else{
				for(i = 0; i< numOfOptions; i++){
					if (myField[i].checked){isSelected = true;}
				}
			}
			
			//1) controllo che sia selezionato
			if(!isSelected){
				myStrError = generateErrorMessage("required", this.inputLabel, myLanguage);
				return myStrError;			
			}				
		}		
		
		/*''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''*/
		
		//OGGETTO CHECKBOX
		function objCheckbox(inputLabel, required, maxSelect, minSelect){
			//proprieta'
			this.inputLabel = inputLabel;
			this.required = required;
			this.minSelect = minSelect;
			this.maxSelect = maxSelect;
		}		
		objCheckbox.prototype.checkField = function(myField, myLanguage){
			var numOfOptions = myField.length;
			var numOfChoice = 0;
			var isSelected = false;
			var myStrError;
			if(numOfOptions == null){
				if(myField.checked){isSelected = true;}
			}else{
				for(i = 0; i< numOfOptions; i++){
					if (myField[i].checked){
						isSelected = true;
						numOfChoice ++;
					}
				}
			}
			
			//1) controllo che sia selezionato
			if(!isSelected){
				myStrError = generateErrorMessage("required", this.inputLabel, myLanguage);
				return myStrError;			
			}
			
			//2)numero minimo di scelte non effettuato
			if(numOfChoice<this.minSelect && (this.minSelect != "" && this.minSelect != null)){
					myStrError = generateErrorMessage("minSelect", this.inputLabel, myLanguage);
					return myStrError;			
			}
			
			//3)numero massimo di scelte superato
			if(numOfChoice>this.maxSelect && (this.maxSelect != "" && this.maxSelect != null)){
					myStrError = generateErrorMessage("maxSelect", this.inputLabel, myLanguage);
					return myStrError;			
			}				
		}			
		
		/*******************************************************************************************************/
		/*                                       FUNZIONI DI CONTROLLO                                         */
		/*******************************************************************************************************/
		
		//CONTROLLO GENERALE FORM
		function checkData(myForm, myFieldsArray, myLanguage, myErrorBoxId){
			//controllo la modalita' di visualizzazione
			checkDisplayErrorMode(myErrorBoxId)
			var myField;
			var errors = new Array();
			for (i in myFieldsArray){
				var myField = eval("document." + myForm.name + "." + i);
				errors[i] = new Array(myField, myFieldsArray[i].checkField(myField, myLanguage));
			}			
			//controllo la presenza di errori
			var errore = false;
			for (i in errors){
				if(errors[i][1] != null){
					errore = true;
				}
			}
			//se ci sono errori
			if(errore){
				manageErrors(errors, myLanguage, myErrorBoxId);
			}
			else{
				myForm.submit()
			}
		}
		
		//SELEZIONE MESSAGGIO ERRORE
		function generateErrorMessage(errorType, myLabel, myLanguage){
			var labelRegExp = /nomeCampo/;
			var myStrError;
			if(displayErrorMode == 0){
				myStrError = errorDescriptions[myLanguage][errorType].replace(labelRegExp, myLabel);
			}else{
				myStrError = errorDescriptions[myLanguage][errorType].replace(labelRegExp, "<strong>" + myLabel + "</strong>");
			}
			return myStrError;
		}
		
		//COMPOSIZIONE MESSAGGIO DI ERRORE
		function manageErrors(errors, myLanguage, myErrorBoxId){
			var firstError = false;
			var strError = "";
			var br;
			//scelgo il separatore funzione del modo di presentazione dei messaggi
			switch(displayErrorMode){
				case 0:
					br = "\n";
					break;
				default:
					br = "<br>"
			}
			
			for(i in errors){
				if(errors[i][1] != null){
					//setto lo stile
					if(errors[i][0].type == null){
						/*
						var numOptions = errors[i][0].length;
						for (j = 0; j < numOptions; j++){
							errors[i][0][j].style.borderColor = errorBorderColor;
							errors[i][0][j].style.backgroundColor = errorBackgroundColor;
							errors[i][0][j].style.color = errorTextColor;
						}
						*/
					}else{
						errors[i][0].style.borderColor = errorBorderColor;
						errors[i][0].style.backgroundColor = errorBackgroundColor;
						errors[i][0].style.color = errorTextColor;
					}
					
					//compongo il messaggio di errore
					strError += errors[i][1] + br;
					
					//imposto il focus sul primo errore
					if(!firstError){
						if(errors[i][0].type != null) errors[i][0].focus();
						firstError = true;
					}
				}else{
					if(errors[i][0].type == null){
						/*var numOptions = errors[i][0].length;
						for (j = 0; j < numOptions; j++){
							errors[i][0][j].style.borderColor = defaultBorderColor;
							errors[i][0][j].style.backgroundColor = defaultBackgroundColor;
							errors[i][0][j].style.color = defaultTextColor;
						}*/
					}else{
						errors[i][0].style.borderColor = defaultBorderColor;
						errors[i][0].style.backgroundColor = defaultBackgroundColor;
						errors[i][0].style.color = defaultTextColor;
					}
				}
			}
			showErrors(strError, myLanguage,myErrorBoxId);
		}
		
		//VISUALIZZAZIONE ERRORI
		function showErrors(msgErrore, myLanguage, myErrorBoxId){
			switch (displayErrorMode){
				case 0:
					alert(errorDescriptions[myLanguage]["header"] + "\n\n" + msgErrore);
					break;
				case 1:
					var errorWin = window.open("","errore","toolbar=no, screenX=0, screenY=0, left=20, top=20, location=no, status=no, menubar=no, scrollbars=yes, resizable=no, width=" +popupWidth+ ", height=" + popupHeight)
					errorWin.document.write(headerPopup + "<strong>" + errorDescriptions[myLanguage]["header"] + "</strong><br>" + msgErrore + footerPopup);
					errorWin.document.close();
					errorWin.focus();
					break;
				case 2:
					document.getElementById(myErrorBoxId).innerHTML = "<strong>" + errorDescriptions[myLanguage]["header"] + "</strong> <br>" + msgErrore;
					document.getElementById(myErrorBoxId).style.display = "block";
					break;
			}
		}
		
		/***********************************************************************************************************/
