/** Numero di anni futuri per cui è possibile fare una prenotazione */
var FUTURE_YEARS = 5;

/** Numero massimo di camere prenotabili */
var MAX_ROOMS = 34;

/** Numero massimo di persone per camera */
var MAX_OCCUPANCY_PER_ROOM = 4.0;

/** Nome dei mesi dell'anno */
var monthNames = new Array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12');

/** Numero di giorni di ciascun mese dell'anno. Febbraio è considerato inizialmente di 28 */
var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

/** Data corrente e data di domani */
var ONE_DAY = 86400000;

var today = createDate(0);
var firstDate  = createDate(2 * ONE_DAY);
var secondDate = createDate(4 * ONE_DAY);

/** Costanti indicanti alcuni mesi chiave */
var FEBRUARY = 1;





/**
 * Genera una data aggiungendo il numero di millisecondi indicati
 * dall'offset alla data di oggi
 * @param	offset		Millisecondi da aggiungere alla data odierna
 * @return				Data a cui è stato aggiunto l'offset
 */
function createDate(offset) {
	var date = new Date();
	date.setTime(date.getTime() + offset);
	date.setHours(12);
	date.setMinutes(0);
	date.setSeconds(0);
	var millis = date.getTime();
	//Restituisce la data 
	date.setTime(parseInt(millis / 1000) * 1000);
	return date;
}





/**
 * Estrae l'anno, aggiustandone il valore per supportare i diversi browser:
 * Internet Explorer restituisce l'anno 2008
 * FireFox restituisce 108 per l'anno 2008
 * @param	date	Data da cui estrarre l'anno
 * @return			Anno estratto dalla data
 */
function extractYear(date) {
	var year = date.getYear();
	if (year < 1900) {
		year = year + 1900;
	}
	return year;
}





/** 
 * Formatta un numero in una stringa di 2 cifre, anteponento uno '0'
 * @param       n       Intero
 * @return              Stringa formattata
 */
function addZero(n) {
    var s = "" + n;
    if (n < 10) { 
        s = "0" + s;
    }
    return(s);
}





/**
 * Ritorna TRUE se l'anno 'year' è bisestile, altrimenti FALSE
 * @param       year        Anno da verificare
 * @return                  TRUE se bisestile, FALSE altrimenti
 */
function isLeap(year) { 
    return ((0 == year % 4) && (0 != year % 100)) || (0 == year % 400);
}





/**
 * Controlla e corregge il numero di giorni del mese di febbraio (28 o 29)
 * @param       year        Anno da verificare
 */
function checkFebruaryDays(year) {
	if (isLeap(year)) {
		daysInMonth[FEBRUARY] = 29;
	}
	else {
		daysInMonth[FEBRUARY] = 28;
	}
}





/** 
 * Calcola i giorni per il mese e l'anno selezionati, scrivendoli nella
 * combo box 'dd', contenente i giorni del mese
 * @param       yy      ComboBox contenente gli anni
 * @param       mm      ComboBox contenente i mesi dell'anno
 * @param       dd      ComboBox contenente i giorni del mese
 */
function calculateDays(yy, mm, dd) {
    var selectedMonth = mm.selectedIndex;
    var selectedYear = yy.options[yy.selectedIndex].text;
	checkFebruaryDays(selectedYear);
    for (var i = 0; i < 31; i++) {
        if (dd.options[i].value <= daysInMonth[selectedMonth]) {
            dd.options[i].text = i + 1;
        }
        else {
            dd.options[i].text = "";
        }
    }
}





/** 
 * Crea un calendario inizialmente inizializzato col la data
 * specificate, contenente le combo-box aventi i nomi e la
 * lingua specificate
 * @param       ddName	Nome della combo box contenente i giorni del mese
 * @param       mmName	Nome della combo box contenente i mesi
 * @param       yyName	Nome della combo box contenente gli anni
 * @param       date	Data iniziale del calendario
 */
function writeCalendar(ddName, mmName, yyName, date) {
	//Estraggo i parametri della data
	var dateDay = date.getDate();
	var dateMonth = date.getMonth();
	var dateYear = extractYear(date);
	checkFebruaryDays(dateYear);

	//Day combo box
	document.write("<select class=\"small\" name=\"" + ddName + "\">");
	for (var i = 1; i < 32; i++) {
		if (i <= daysInMonth[dateMonth]) {
			document.write("<option value=\"" + i + "\"" + (dateDay == i ? " selected" : "") + ">" + i);
		}
		else {
			document.write("<option value=\"" + i + "\">");
		}
	}
	document.write("</select>");
	document.write("&nbsp;");

	//Month combo box
	document.write("<select class=\"medium\" name=\"" + mmName + "\" onchange=\"javascript:calculateDays(" + yyName + ", " + mmName + ", " + ddName +");\">");
	for (var i = 0; i < 12; i++) {
		document.write("<option value=\"" + i + "\"" + (dateMonth == i ? " selected" : "") + ">" + monthNames[i]);
	}
	document.write("</select>");
	document.write("&nbsp;");

	//Year combo box
	document.write("<select class=\"small\" name=\"" + yyName + "\" onchange=\"javascript:calculateDays(" + yyName + ", " + mmName + ", " + ddName +");\">");
	for (var i = dateYear; i < dateYear + FUTURE_YEARS; i++) {
		document.write("<option value=\"" + i + "\"" + (i == dateYear ? " selected" : "") + ">" + i);
	}
	document.write("</select>");
}





/**
 * Crea le combo-box per inserire il numero di occupanti di ciascuna camera
 * @param	maxRooms		Numero massimo di camere prenotabili
 * @param	room_label		Label rappresentante la camera
 * @param	adult_label		Label rappresentante gli adulti
 * @param	child_label		Label rappresentante i bambini
 * @param	infant_label	Label rappresentante i neonati
 */
function writeOccupancy(maxRooms, room_label, adult_label, child_label, infant_label) {
	//Per ciascuna camera...
	for (var i = 0; i < maxRooms; i++) {
		//Creo il record della camera
		document.write("<div id=\"room" + i + "\">");
		document.write("<table class=\"booking-room\">");
		document.write("<tr>");
			document.write("<td>");
				document.write(room_label + " " + addZero(i + 1) + ":");
			document.write("</td>");

			document.write("<td>");
				document.write("<p class=\"space\">&nbsp;</p>");
			document.write("</td>");

			document.write("<td>");
				//Creo la combo per gli adulti nella camera (minimo 1, massimo 4)
				document.write(adult_label + "&nbsp;");
				document.write("<select class=\"small\" name=\"adult" + (i + 1) + "\">");
					document.write("<option value=\"1\">1");
					document.write("<option value=\"2\">2");
					document.write("<option value=\"3\">3");
					document.write("<option value=\"4\">4");
				document.write("</select>");
			document.write("</td>");

			document.write("<td>");
				document.write("<p class=\"space\">&nbsp;</p>");
			document.write("</td>");

			document.write("<td>");
				//Creo la combo per i bambini nella camera (minimo 0, massimo 3)
				document.write(child_label + "&nbsp;");
				document.write("<select class=\"small\" name=\"child" + (i + 1) + "\">");
					document.write("<option value=\"0\"> ");
					document.write("<option value=\"1\">1");
					document.write("<option value=\"2\">2");
					document.write("<option value=\"3\">3");
				document.write("</select>");
			document.write("</td>");

			document.write("<td>");
				document.write("<p class=\"space\">&nbsp;</p>");
			document.write("</td>");

			document.write("<td>");
				//Creo la combo per i neonati nella camera (minimo 0, massimo 3)
				document.write(infant_label + "&nbsp;");
				document.write("<select class=\"small\" name=\"infant" + (i + 1) + "\">");
					document.write("<option value=\"0\"> ");
					document.write("<option value=\"1\">1");
					document.write("<option value=\"2\">2");
					document.write("<option value=\"3\">3");
				document.write("</select>");
			document.write("</td>");
		document.write("</tr>");
		document.write("</table>");
		document.write("</div>");
	}
}





/**
 * Restituisce l'oggetto identificato dall'ID, compatibilmente
 * con i vari browser esistenti
 * @param	id		ID dell'oggetto
 * @return			Oggetto corrispondente all'ID
 */
function getObjectByID(id) {
	if (document.layers) {
		return document.layers[id];
	}
	else if (document.all) {
		return document.all[id];
	}
	else if (document.getElementById) {
		return document.getElementById(id);
	}
	return null;
}





/**
 * Mostra o nasconde le righe che rappresentano il numero di occupanti
 * delle camere della prenotazione
 * @param	count		Numero di righe da visualizzare
 * @param	maxRooms	Numero massimo di righe (camere)
 */
function changeOccupancy(count, maxRooms) {
	for (var i = 0; i < count; i++) {
		getObjectByID("room" + i).style.display = 'block';
	}
	for (var i = count; i < maxRooms; i++) {
		getObjectByID("room" + i).style.display = 'none';
	}
}





/**
 * Verifica l'inserimento del giorno nella data ed eventualmente
 * effettua il submit dei dati della prenotazione. ALtrimenti mostra un
 * messaggio di errore
 * @param       form        Form HTML contenente i dati della prenotazione
 */
function submitData(form, targetRecipient, targetSubject, missingSurname, missingEmail1, missingEmail2, missingDateIn, missingDateOut, errorDateIn, errorDateOut, errorRoom) {
	var codeElements = document.getElementsByName('code');
	var name = document.getElementsByName('name').item(0);
	var surname = document.getElementsByName('surname').item(0);
	var email_address1 = document.getElementsByName('email_address1').item(0);
	var email_address2 = document.getElementsByName('email_address2').item(0);
	var dd_i = document.getElementsByName('dd_i').item(0);
	var mm_i = document.getElementsByName('mm_i').item(0);
	var yy_i = document.getElementsByName('yy_i').item(0);
	var dd_o = document.getElementsByName('dd_o').item(0);
	var mm_o = document.getElementsByName('mm_o').item(0);
	var yy_o = document.getElementsByName('yy_o').item(0);
	var rooms = document.getElementsByName('rooms').item(0);
	var note = document.getElementsByName('note').item(0);

	var recipient = document.getElementsByName('recipient').item(0);
	var email = document.getElementsByName('email').item(0);
	var subject = document.getElementsByName('subject').item(0);
	var bookingText = document.getElementsByName('booking_text').item(0);
	var bookingHtml = document.getElementsByName('booking_html').item(0);

	var date_i = new Date(yy_i.value, mm_i.value, dd_i.value, 0, 0, 0);
	var date_o = new Date(yy_o.value, mm_o.value, dd_o.value, 0, 0, 0);

	//Controllo dati della prenotazione
	if (surname.value == "") {
        alert(missingSurname);
		return;
	}
	
	if (email_address1.value == "") {
        alert(missingEmail1);
		return;
	}
	
	if (email_address1.value != email_address2.value) {
        alert(missingEmail2);
		return;
	}
	
    if (dd_i.options[dd_i.selectedIndex].text == "") {
        alert(missingDateIn);
		return;
    }

    if (dd_o.options[dd_o.selectedIndex].text == "") {
        alert(missingDateOut);
		return;
    }

	if (date_i.getTime() <= today.getTime()) {
        alert(errorDateIn);
		return;
	}
	
	if (date_o.getTime() <= date_i.getTime()) {
        alert(errorDateOut);
		return;
	}

	//Format dei dati per il form-mail
	email.value = email_address1.value;	//From
	recipient.value = targetRecipient;	//To
	subject.value = targetSubject;		//Subject

	bookingText.value = "\n";
	if (codeElements.length > 0) {
		var code = codeElements.item(0);
		bookingText.value = bookingText.value + "Codice offerta/Rate code: " + code.value + "\n";
		bookingText.value = bookingText.value + "\n";	
	}
	bookingText.value = bookingText.value + "Nominativo/Name: " + name.value + " " + surname.value + "\n";
	bookingText.value = bookingText.value + "\n";	
	bookingText.value = bookingText.value + "Arrivo/Check-in: " + addZero(dd_i.value) + " " + monthNames[mm_i.value] + " " + yy_i.value + "\n";
	bookingText.value = bookingText.value + "Partenza/Check-out: " + addZero(dd_o.value) + " " + monthNames[mm_o.value] + " " + yy_o.value + "\n";
	bookingText.value = bookingText.value + "(Notti/Nights: " + ((date_o.getTime() - date_i.getTime()) / ONE_DAY) + ")\n";
	bookingText.value = bookingText.value + "\n";	
	bookingText.value = bookingText.value + "Camere richieste/Requested rooms: " + rooms.value + "\n";
	
	bookingHtml.value = "";
	if (codeElements.length > 0) {
		var code = codeElements.item(0);
		bookingHtml.value = bookingHtml.value + "Codice offerta/Rate code: " + code.value + "<br />\n";
		bookingHtml.value = bookingHtml.value + "<br />\n";
	}
	bookingHtml.value = bookingHtml.value + "Nominativo/Name: " + name.value + " " + surname.value + "<br />\n";
	bookingHtml.value = bookingHtml.value + "<br />\n";
	bookingHtml.value = bookingHtml.value + "Arrivo/Check-in:" + addZero(dd_i.value) + " " + monthNames[mm_i.value] + " " + yy_i.value + "<br />\n";
	bookingHtml.value = bookingHtml.value + "Partenza/Check-out:" + addZero(dd_o.value) + " " + monthNames[mm_o.value] + " " + yy_o.value + "<br />\n";
	bookingHtml.value = bookingHtml.value + "(Notti/Nights: " + Math.round((date_o.getTime() - date_i.getTime()) / ONE_DAY) + ")<br />\n";
	bookingHtml.value = bookingHtml.value + "<br />\n";
	bookingHtml.value = bookingHtml.value + "Camere richieste/Requested rooms: " + rooms.value + "<br />\n";

	for (var i = 0; i < rooms.value; i++) {
		var adult  = parseFloat(document.getElementsByName('adult' + (i + 1)).item(0).value);
		var child  = parseFloat(document.getElementsByName('child' + (i + 1)).item(0).value);
		var infant = parseFloat(document.getElementsByName('infant' + (i + 1)).item(0).value);
		var total = adult + child + infant;
		var n = (i + 1);

		if (total > MAX_OCCUPANCY_PER_ROOM) {
			var roomTag = "{{ROOM_NUMBER}}";
			var idx = errorRoom.indexOf(roomTag);
			var err1 = errorRoom.substring(0, idx);
			var err2 = errorRoom.substring(idx + roomTag.length);
			alert(err1 + n + err2);
			return;
		}

		bookingText.value = bookingText.value + "Camera/Room " + n + " --- ";
		bookingText.value = bookingText.value + "     adulti/adults " + adult + ", ";
		bookingText.value = bookingText.value + "     bambini/children " + child + ", ";
		bookingText.value = bookingText.value + "     neonati/infant " + infant + "\n";

		bookingHtml.value = bookingHtml.value + "Camera/Room " + n + " --&gt; ";
		bookingHtml.value = bookingHtml.value + "     adulti/adults " + adult + ", ";
		bookingHtml.value = bookingHtml.value + "     bambini/children " + child + ", ";
		bookingHtml.value = bookingHtml.value + "     neonati/infant " + infant + "<br />\n";
	}
	
	bookingText.value = bookingText.value + "\n";
	bookingText.value = bookingText.value + "Note/Note: " + note.value;

	bookingHtml.value = bookingHtml.value + "<br />\n";
	bookingHtml.value = bookingHtml.value + "Note/Note: " + note.value;

	/*
	alert(recipient.value);
	alert(subject.value);
	alert(email.value);
	alert(bookingText.value);
	alert(bookingHtml.value);
	alert(form.action);
	*/

	//Invio dell'email
	form.submit();
}
function submitDataTest(form, targetRecipient, targetSubject, missingSurname, missingEmail1, missingEmail2, errorDateIn, errorDateOut, errorRoom) {
	var codeElements = document.getElementsByName('code');
	var name = document.getElementsByName('name').item(0);
	var surname = document.getElementsByName('surname').item(0);
	var email_address1 = document.getElementsByName('email_address1').item(0);
	var email_address2 = document.getElementsByName('email_address2').item(0);
	var check_in_date = document.getElementsByName('check_in_date').item(0);
	var check_out_date = document.getElementsByName('check_out_date').item(0);
	var dd_i = parseInt(check_in_date.value.substring(0, 2));
	var mm_i = parseInt(check_in_date.value.substring(3, 5)) - 1;
	var yy_i = parseInt(check_in_date.value.substring(6, 10));
	var dd_o = parseInt(check_out_date.value.substring(0, 2));
	var mm_o = parseInt(check_out_date.value.substring(3, 5)) - 1;
	var yy_o = parseInt(check_out_date.value.substring(6, 10));
	var rooms = document.getElementsByName('rooms').item(0);
	var note = document.getElementsByName('note').item(0);

	var recipient = document.getElementsByName('recipient').item(0);
	var email = document.getElementsByName('email').item(0);
	var subject = document.getElementsByName('subject').item(0);
	var bookingText = document.getElementsByName('booking_text').item(0);
	var bookingHtml = document.getElementsByName('booking_html').item(0);

	var date_i = new Date(yy_i, mm_i, dd_i, 0, 0, 0);
	var date_o = new Date(yy_o, mm_o, dd_o, 0, 0, 0);

	//Controllo dati della prenotazione
	if (surname.value == "") {
        alert(missingSurname);
		return;
	}
	
	if (email_address1.value == "") {
        alert(missingEmail1);
		return;
	}
	
	if (email_address1.value != email_address2.value) {
        alert(missingEmail2);
		return;
	}

	if (date_i.getTime() <= today.getTime()) {
        alert(errorDateIn);
		return;
	}
	
	if (date_o.getTime() <= date_i.getTime()) {
        alert(errorDateOut);
		return;
	}

	//Format dei dati per il form-mail
	email.value = email_address1.value;	//From
	recipient.value = targetRecipient;	//To
	subject.value = targetSubject;		//Subject

	bookingText.value = "\n";
	if (codeElements.length > 0) {
		var code = codeElements.item(0);
		bookingText.value = bookingText.value + "Codice offerta/Rate code: " + code.value + "\n";
		bookingText.value = bookingText.value + "\n";	
	}
	bookingText.value = bookingText.value + "Nominativo/Name: " + name.value + " " + surname.value + "\n";
	bookingText.value = bookingText.value + "\n";	
	bookingText.value = bookingText.value + "Arrivo/Check-in: " + addZero(dd_i.value) + " " + monthNames[mm_i.value] + " " + yy_i.value + "\n";
	bookingText.value = bookingText.value + "Partenza/Check-out: " + addZero(dd_o.value) + " " + monthNames[mm_o.value] + " " + yy_o.value + "\n";
	bookingText.value = bookingText.value + "(Notti/Nights: " + ((date_o.getTime() - date_i.getTime()) / ONE_DAY) + ")\n";
	bookingText.value = bookingText.value + "\n";	
	bookingText.value = bookingText.value + "Camere richieste/Requested rooms: " + rooms.value + "\n";
	
	bookingHtml.value = "";
	if (codeElements.length > 0) {
		var code = codeElements.item(0);
		bookingHtml.value = bookingHtml.value + "Codice offerta/Rate code: " + code.value + "<br />\n";
		bookingHtml.value = bookingHtml.value + "<br />\n";
	}
	bookingHtml.value = bookingHtml.value + "Nominativo/Name: " + name.value + " " + surname.value + "<br />\n";
	bookingHtml.value = bookingHtml.value + "<br />\n";
	bookingHtml.value = bookingHtml.value + "Arrivo/Check-in:" + addZero(dd_i) + " " + monthNames[mm_i] + " " + yy_i + "<br />\n";
	bookingHtml.value = bookingHtml.value + "Partenza/Check-out:" + addZero(dd_o) + " " + monthNames[mm_o] + " " + yy_o + "<br />\n";
	bookingHtml.value = bookingHtml.value + "(Notti/Nights: " + Math.round((date_o.getTime() - date_i.getTime()) / ONE_DAY) + ")<br />\n";
	bookingHtml.value = bookingHtml.value + "<br />\n";
	bookingHtml.value = bookingHtml.value + "Camere richieste/Requested rooms: " + rooms.value + "<br />\n";

	for (var i = 0; i < rooms.value; i++) {
		var adult  = parseFloat(document.getElementsByName('adult' + (i + 1)).item(0).value);
		var child  = parseFloat(document.getElementsByName('child' + (i + 1)).item(0).value);
		var infant = parseFloat(document.getElementsByName('infant' + (i + 1)).item(0).value);
		var total = adult + child + infant;
		var n = (i + 1);

		if (total > MAX_OCCUPANCY_PER_ROOM) {
			var roomTag = "{{ROOM_NUMBER}}";
			var idx = errorRoom.indexOf(roomTag);
			var err1 = errorRoom.substring(0, idx);
			var err2 = errorRoom.substring(idx + roomTag.length);
			alert(err1 + n + err2);
			return;
		}

		bookingText.value = bookingText.value + "Camera/Room " + n + " --- ";
		bookingText.value = bookingText.value + "     adulti/adults " + adult + ", ";
		bookingText.value = bookingText.value + "     bambini/children " + child + ", ";
		bookingText.value = bookingText.value + "     neonati/infant " + infant + "\n";

		bookingHtml.value = bookingHtml.value + "Camera/Room " + n + " --&gt; ";
		bookingHtml.value = bookingHtml.value + "     adulti/adults " + adult + ", ";
		bookingHtml.value = bookingHtml.value + "     bambini/children " + child + ", ";
		bookingHtml.value = bookingHtml.value + "     neonati/infant " + infant + "<br />\n";
	}
	
	bookingText.value = bookingText.value + "\n";
	bookingText.value = bookingText.value + "Note/Note: " + note.value;

	bookingHtml.value = bookingHtml.value + "<br />\n";
	bookingHtml.value = bookingHtml.value + "Note/Note: " + note.value;

	/**/
	alert(recipient.value);
	alert(subject.value);
	alert(email.value);
	alert(bookingText.value);
	alert(bookingHtml.value);
	alert(form.action);
	/**/

	//Invio dell'email
	//form.submit();
}



