/*
		Validate form fields
		Created: 23-02-2010
		Updated: 29-03-2010

		Esegue il controllo dei campi presenti all'interno di un form dove l'utente andrà
		ad inserire le proprie informazioni personali.
		
		
	Copyright (c) 2010 Wabi-sabi.
	All rights reserved.

	Redistribution and use in source and binary forms, with or without
	modification, for any use is STRICTLY prohibited.

	Neither the name of Wabi-sabi nor the names of its
	contributors may be used to endorse or promote products derived from this
	software without specific prior written permission.

	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
	AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
	ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
	LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
	CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
	POSSIBILITY OF SUCH DAMAGE.
*/

// interruttori:	1=ON  (interruttore acceso: il campo corrispondente verrà controllato)
//					0=OFF (interruttore spento: il campo corrispondente non verrà controllato)
var check_all = 0;				// se attivo (impostato a 1) controlla tutti i campi del form, altrimenti verranno controllati solo quelli
								// per cui è stato attivato il relativo interruttore tra quelli sottostanti

var check_nome_hotel= 0;		// controlla il campo Nome_hotel: almeno un hotel dev'essere selezionato tra quelli disponibili
var check_nome 		= 1;		// controlla il campo Nome: dev'essere inserito un nome
var check_cognome	= 0;		// controlla il campo Cognome: dev'essere inserito un cognome
var check_indirizzo = 0;		// controlla il campo Indirizzo: dev'essere inserito un indirizzo
var check_citta 	= 0;		// controlla il campo Città: dev'essere inserita una città
var check_mail 		= 1;		// controlla il campo E-mail: dev'essere inserita una mail valida

var check_mese_arrivo 	  = 1;	// controlla il campo Mese di arrivo: deve venire selezionato un mese di arrivo
var check_mese_partenza   = 1;	// controlla il campo Mese di partenza: deve venire selezionato un mese di partenza
var check_giorno_arrivo	  = 1;	// controlla il campo Giorno di arrivo: deve venire selezionato un giorno di arrivo
var check_giorno_partenza = 1;	// controlla il campo Giorno di partenza: deve venire selezionato un giorno di partenza
var check_trattamento 	  = 0;	// controlla il campo Trattamento: deve venire selezionata una tipologia di trattamento (es. pensione completa, ecc.)
var check_camere		  = 0;	// controlla il campo Camere: dev'essere selezionato il numero di camere da prenotare

// gestione degli errori
var error = 0;					// il codice relativo all'errore verificatosi
var error_color = "#F99";		// colore da applicare al campo in presenza di errori
var default_color = "#FFF";		// colore da applicare al campo in assenza di errori

/* ===========================================================================================
	Controlla il form. Se non viene passato alcun valore alla variabile 'field' controlla l'intera form,
	altrimenti controlla solamente il campo in questione.

	Parametri:
		-form		: puntatore all'oggetto form della pagina HTML, contenente i moduli da controllare
		-field		: modulo specifico da controllare. Se non viene passato alcun valore, controlla tutti i moduli del form
		
	Restituisce:
		0
============================================================================================ */
function validate_form(form,field) {
	
	// controlla che la variabile form (indispensabile) non sia vuota
	if (!form) {
		//alert ("parameter form missing!");
		return;
	}

	// controlla se è stato selezionato un modulo specifico da controllare, e in tal caso controllalo...
	if (field) {
		validate_field(form,field.id,1);
	} else {
		// ...altrimenti controlla tutti i moduli del form. Appena viene trovato un modulo contenente errori,
		// avvisa l'utente con un messaggio specifico
		
		// controllo campo NOME HOTEL (checkboxes)
		if (check_all || check_nome_hotel) {
			error = validate_field(form,"nome_hotel[]");
			if (error) {
				alert ("Selezionare un hotel a cui inviare la richiesta.");
				return;
			}
		}
		// controllo campo NOME
		if (check_all || check_nome) {
			error = validate_field(form,"nome");
			if (error) {
				alert ("Inserire un nome.");
				return;
			}
		}
		// controllo campo COGNOME
		if (check_all || check_cognome) {
			error = validate_field(form,"cognome");
			if (error) {
				alert ("Inserire un cognome.");
				return;
			}
		}
		// controllo campo INDIRIZZO
		if (check_all || check_indirizzo) {
			error = validate_field(form,"indirizzo");
			if (error) {
				alert ("Inserire un indirizzo.");
				return;
			}
		}
		// controllo campo CITTA'
		if (check_all || check_citta) {
			error = validate_field(form,"citta");
			if (error) {
				alert ("Inserire una città.");
				return;
			}
		}
		// controllo campo E-MAIL
		if (check_all || check_mail) {
			error = validate_field(form,"email");
			if (error) {
				alert ("Indirizzo e-mail non valido.");
				return;
			}
		}
		// controllo campo MESE DI ARRIVO
		if (check_all || check_mese_arrivo) {
			error = validate_field(form,"mese_arrivo");
			if (error) {
				alert ("Specificare la data di arrivo.");
				return;
			}
		}
		// controllo campo MESE DI PARTENZA
		if (check_all || check_mese_partenza) {
			error = validate_field(form,"mese_partenza");
			if (error) {
				alert ("Specificare la data di partenza.");
				return;
			}
		}
		// controllo campo GIORNO DI ARRIVO
		if (check_all || check_giorno_arrivo) {
			error = validate_field(form,"giorno_arrivo");
			if (error) {
				alert ("Specificare la data di arrivo.");
				return;
			}
		}
		// controllo campo GIORNO DI PARTENZA
		if (check_all || check_giorno_partenza) {
			error = validate_field(form,"giorno_partenza");
			if (error) {
				alert ("Specificare la data di partenza.");
				return;
			}
		}
		// controllo campo TRATTAMENTO
		if (check_all || check_trattamento) {
			error = validate_field(form,"trattamento");
			if (error) {
				alert ("Scegliere un trattamento.");
				return;
			}
		}
		// controllo campo CAMERE
		if (check_all || check_camere) {
			error = validate_field(form,"camere");
			if (error) {
				alert ("Scegliere il numero di camere.");
				return;
			}
		}
		form.submit(); // in assenza di errori, invia il form
	}
	
}

/* =============================================================================================
	Controlla un singolo campo del form
	
	Parametri:
		-form				: puntatore all'elemento form contenente il modulo da controllare
								(necessario solo per moduli particolari come checkboxes e
								 radio buttons che non sono accessibili per ID)
		-field_id			: ID univoco del modulo da controllare
		-check_permission	: 0-1. 1=controlla prima che l'interruttore di controllo relativo al modulo
								in questione sia attivo. 0=ignora l'interruttore e controlla ugualmente il modulo
	Restituisce:
		-error				: codice di errore: 0=nessun errore trovato; 1=errore generico
=============================================================================================== */
function validate_field(form,field_id,check_permission) {
	
	var regex;		// Espressione regolare per controllare efficacemente il contenuto di un modulo
	var element;	// Riferimento al modulo da controllare
	
	// recupera il modulo da controllare cercando nel form il modulo
	// con l'ID corrispondente a quello passato alla variabile field_id
	element = document.getElementById(field_id);

	if (element) {
		// prima di controllare la presenza di errori, riporta il modulo allo stato originario
		element.style.backgroundColor = default_color;
	} else {
		// Un elemento con l'ID specificato non è stato trovato nel form
		// Potrebbe essere dovuto al fatto che un elemento con un simile ID non esiste,
		// oppure al fatto che l'elemento è un modulo speciale, come checkbox o radio button (che hanno ID diversi):
		// occorre verificare manualmente se si tratta di un modulo speciale
		switch (field_id) {
			case "nome_hotel[]" : // checkboxes
				//alert(document.getElementsByName("nome_hotel[]").item(1).value);
				if (document.getElementsByName("nome_hotel[]")==null || document.getElementsByName("nome_hotel[]").length==0) {
					return 0; // un elemento di nome 'nome_hotel' non esiste nel form
				}
				break;
			case "camere" : // radio buttons
				if (form.camere==null) {
					return 0; // un elemento di nome 'camere' non esiste nel form
				}
				break;
			case "trattamento" : // radio buttons
				if (form.trattamento==null) {
					return 0;	// un elemento di nome 'trattamento' non esiste nel form
				}
			  	break;
			default :
				return 0;	// l'elemento con l'ID specificato non esiste nel form e dunque non è possibile eseguire operazioni
							// su di esso in quanto genererebbero errori, pertanto la funzione termina qui
		}
	}
	
	// controlla se è necessario verificare l'interruttore relativo al modulo in questione
	if (check_permission) {
		// se l'interruttore relativo al modulo non è attivato, i controlli non verranno eseguiti e la funzione terminerà
		switch (field_id) {
			case "email" :
				if(!check_mail) {
					return;
				}
				break;
			case "nome" :
				if(!check_nome) {
					return;
				}
				break;
			case "mese_arrivo" :
				if(!check_mese_arrivo) {
					return;
				}
				break;
			case "mese_partenza" :
				if(!check_mese_partenza) {
					return;
				}
				break;
			case "giorno_arrivo" :
				if(!check_giorno_arrivo) {
					return;
				}
				break;
			case "giorno_partenza" :
				if(!check_giorno_partenza) {
					return;
				}
				break;
			default :
				return;
		}
	}
	
	// Controlla il modulo in questione: ogni modulo può avere controlli particolari da eseguire diversi dagli altri
	switch (field_id) {
		case "email" :
			// l'e-mail viene controllata tramite il confronto diretto con un'espressione regolare
			var regex = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})$/;
			if (!regex.test(element.value)) {
				element.style.backgroundColor = error_color;
				return 1;
			}
			return 0;
		case "trattamento" :
			// il campo 'trattamento' è rappresentato da una serie di radio buttons, pertanto occorre verificare
			// tutte le voci appartenenti al gruppo 'trattamento' per cercare se qualcuna è stata selezionata
			for (i=0; i<document.forms[0].trattamento.length; i++) {
				if (document.forms[0].trattamento[i].checked == true) {
					return 0;
				}
			}
			return 1;
		case "nome_hotel[]" :
			// il campo "nome_hotel" è rappresentato da una serie di checkbox, ognuno rappresentante un hotel
			// occorre verificare che almeno un checkbox sia stato selezionato
			//alert(document.getElementsByName("nome_hotel[]").length);
			for (i=0; i<document.getElementsByName("nome_hotel[]").length; i++) {
				//alert(i);
				//alert(document.getElementsByName("nome_hotel[]").item(i).checked);
				if (document.getElementsByName("nome_hotel[]").item(i).checked == true) {
					return 0;
				}
			}
			return 1;
		case "camere" :
			// uguale al campo 'trattamento'
			for (i=0; i<document.forms[0].camere.length; i++) {
				if (document.forms[0].camere[i].checked == true) {
					return 0;
				}
			}
			return 1;
		default : 	// se si tratta di un elemento che non ha bisogno di controlli particolari,
					// controlla semplicemente che nel campo sia stato scritto qualcosa
			if (element.value.length > 0) {
				return 0;
			}
			element.style.backgroundColor = error_color;
			return 1;
	}
	
}
