// =============================================================================
// JavaScript Document
//
// Author:	Franco
// Version: 2.0 (alfa)
//
// Changes:
//  - (04/10/2008) 1.0 Multi language support
//  - (24/10/2008) 1.0 Fix error: Same year next month gave old date msg
//  - (31/10/2008) 1.0 Date check for 30/31 and bissextile
//  - (12/11/2008) 1.0 More languages
//  - (16/02/2010) 2.0 UTF-8
// =============================================================================

var sLang				= new Array("eng","ita","fra","deu","esp","rus");
var cLang				= 0;							// Set default language

var oHotels				= new Object();					// Contains hotel code name location
var oLoc				= new Object();					// Unique location list
var oMonth				= new Object();					// Months Translations
var nMonthDays			= new Array( 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);	// last day of the month

var sMsgOldDate			= "";							// "Warning: the date is in the paste."
var sMsgWrongDate		= "";							// "Warning: the date is in wrong."
var sMsgNumAdult		= "";							// "at least one adult is needed to continue"
var sMsgNumNights		= "";							// "input the number of nights to continue"
var sMsgChildAge		= "";							// "input children age to continue"
var sMsgOccRoom			= "";							// "insert at least one adult per room to continue"
var sBookNow			= "";							// "Quick Reserve"
var sHotel				= "";			 				// "Hotel"
var sAllHotels			= "";							// "All the hotels"
var sArrival			= "";							// "Arrival Date"
var sArrivalText		= "";							// "Arrival Date"
var sArrivalDay			= "";							// "Arrival Date"
var sArrivalMonth			= "";							// "Arrival Date"
var sArrivalYear			= "";							// "Arrival Date"
var sMsgOnlyNumbers                     = "";
var sMsgFarDate                     = "";

var sNights				= "";							// "Nights"
var sAdults				= "";							// "Adults"
var sChild				= "";							// "Children"
var sRooms				= "";							// "Rooms"
var sCodCli				= "";							// "Customer code"
var sImageUrl			= "";							// "images/quick_reserve/prenota_ing.png"
var sPromo				= "";							// "Special code"
var sButton				= "";							// "Reserve"
var sAllLocations		= "";							// "All the locations"
var sDelMod				= "";							// "Cancella/Modifica prenotazione"

var	nIdStile			= "";							// "VB ID_STILE"
var	nNightMax			= "";							// "MAX Number of  Nights in preselect list"
var	nAdultMax			= "";							// "MAX Number of  Adults in preselect list"
var	nChildMax			= "";							// "MAX Number of  Children in preselect list"
var	nRoomMax			= "";							// "MAX Number of  Rooms in preselect list"
var	nNightSel			= "";							// "Preselect Nights"
var	nAdultSel			= "";							// "Preselect Adults"
var	nChildSel			= "";							// "Preselect Children"
var	nRoomSel			= "";							// "Preselect Rooms"
var	sPromoSel			= "";							// "Preselect Special code"
var	sCodCliSel			= "";							// "Preselect Customer code"var	nGroupID
var	nIdCanale			= "";							// "Vertical Channel ID"
var	nIdGruppo			= "";							// "Vertical Channel ID"
var	nMostraCat			= "";							// "Show catedory in results"
var nMostraLoc			= "";							// ""
var nMostraZone			= "";							// ""
var nIdCatProd			= "";							// "Search only in specific category"
var nIdProdSel			= "";							// "Search only in specific product"
var bGATrack			= false;						// "Eanble GA tracking 0=NO 1=YES"
var bGAEvent			= false;						// "Enagle GA Event Tracking"
var sGAEventCat			= "";							// "Define Event Tracking Category"
var sGAEventSubCat		= "";							// "Define Event Tracking SubCategory"
var sGAEventDesc		= "";							// "Description of the event"
var bTestPrn			= false;						// "Test flag "



// Date
var data    = new Date();
var gg1	    = data.getDate();
var mm1	    = data.getMonth();
var aa1	    = data.getFullYear();

//correzione necessaria per firefox
// if (aa1 < 199) {var  aaaa=1900+aa1; }else // getFullYear fix it
var aaaa	= aa1;														//per gli altri browser diversi da firefox
var now		= new Date(data.getFullYear(), data.getMonth(), data.getDate()-1);
var qrForm;

function InitData( parameterFile, sLang) {
  // Load XML in to array
	try {
		var oXML 	= xml2array(caricaXMLSync(parameterFile));
		var oParam  = oXML.Contents.Parameter;

		if (oXML) {

			// Load Hotels information
			// sHotels = oParam.Contents.Hotel;
			// extract locations information
			oLoc 	= new Object();     // just in case recall InitData();
			oHotels = new Object();

			i=0;
			for (var key in oXML.Contents.Hotel) {
				oLoc[oXML.Contents.Hotel[key].location] = 1;
				oHotels[key] = oXML.Contents.Hotel[key];
				i++;
			}
			if(oXML.Contents.Hotel[0]) {
				// Hotels group or Channel
				nHotelsInList	= i;		// number of hotels in hotels list  - obj has not the lenght
			} else {
				// Single Hotel
                nHotelsInList	= 1;
			}
			// Translated text
			oMonth			= oXML.Contents.Translation[sLang].month;
			sMsgOldDate		= oXML.Contents.Translation[sLang].sMsgOldDate;
			sMsgWrongDate	= oXML.Contents.Translation[sLang].sMsgWrongDate;
			sMsgNumAdult	= oXML.Contents.Translation[sLang].sMsgNumAdult;
			sMsgNumNights	= oXML.Contents.Translation[sLang].sMsgNumNights;
			sMsgChildAge	= oXML.Contents.Translation[sLang].sMsgChildAge;
			sMsgOccRoom		= oXML.Contents.Translation[sLang].sMsgOccRoom;
			sBookNow		= oXML.Contents.Translation[sLang].sBookNow;
			sHotel			= oXML.Contents.Translation[sLang].sHotel;
			sAllHotels		= oXML.Contents.Translation[sLang].sAllHotels;
			sArrival		= oXML.Contents.Translation[sLang].sArrival;
		  	// CUSTOM-PDR
			sArrivalText                = oXML.Contents.Translation[sLang].sArrivalText;
			sArrivalDay                 = oXML.Contents.Translation[sLang].sArrivalDay;
			sArrivalMonth               = oXML.Contents.Translation[sLang].sArrivalMonth;
			sArrivalYear                = oXML.Contents.Translation[sLang].sArrivalYear;
			sMsgOnlyNumbers             = oXML.Contents.Translation[sLang].sMsgOnlyNumbers;
			sMsgFarDate                 = oXML.Contents.Translation[sLang].sMsgFarDate;
		  
		        // END CUSTOM
			sNights			= oXML.Contents.Translation[sLang].sNights;
			sAdults			= oXML.Contents.Translation[sLang].sAdults;
			sChild			= oXML.Contents.Translation[sLang].sChild;
			sRooms			= oXML.Contents.Translation[sLang].sRooms;
			sCodCli			= oXML.Contents.Translation[sLang].sCodCli;
			sImageUrl		= oXML.Contents.Translation[sLang].sImageUrl;
			sPromo			= oXML.Contents.Translation[sLang].sPromo;
			sButton			= oXML.Contents.Translation[sLang].sButton;
			sAllLocations	= oXML.Contents.Translation[sLang].sAllLocations;
			sLocLabel		= oXML.Contents.Translation[sLang].sLocLabel;
			sDelMod			= oXML.Contents.Translation[sLang].sDelMod;
                        
			// Parameters
			nIdStile		= getParam( oParam, "nIdStile"		, "");
			nNightMax		= getParam( oParam, "nNightMax"		, 4);
			nAdultMax		= getParam( oParam, "nAdultMax"		, 4);
			nChildMax		= getParam( oParam, "nChildMax"		, 0);
			nRoomMax		= getParam( oParam, "nRoomMax"		, 4);
			nNightSel		= getParam( oParam, "nNightSel"		, 1);
			nAdultSel		= getParam( oParam, "nAdultSel" 	, 1);
			nChildSel		= getParam( oParam, "nChildSel" 	, 0);
			nRoomSel		= getParam( oParam, "nRoomSel"		, 1);
			sCodCliSel		= getParam( oParam, "sCodCliSel"	, "");
			sPromoSel		= getParam( oParam, "sPromoSel"		, "");
			nIdGruppo		= getParam( oParam, "nIdGruppo"     , "");
			nIdCanale		= getParam( oParam, "nIdCanale"     , "");
			nMostraCat		= getParam( oParam, "nMostraCat"    , "");
			nMostraLoc		= getParam( oParam, "nMostraLoc"    , "");
			nMostraZone		= getParam( oParam, "nMostraZone"	, "");
			nIdCatProd		= getParam( oParam, "nIdCatProd"	, "");
			nIdProdSel		= getParam( oParam, "nIdProdSel"	, "");
			bGATrack		= getParam( oParam, "bGATrack"		, false);
			bGAEvent		= getParam( oParam, "bGAEvent"		, false);
			sGAEventCat		= getParam( oParam, "sGAEventCat"	, "");
			sGAEventSubCat	= getParam( oParam, "sGAEventSubCat", "");
			sGAEventDesc	= getParam( oParam, "sGAEventDesc"	, "");
			bTestPrn		= getParam( oParam, "bTestPrn"		, false);
	
		}
	} catch(e) {
		alert("Init Data error: "+e.message);
	}

}

// Convert parameter in the right type or return a default value

function getParam( oObj, sParam, xDefVal) {
	var xParam = oObj[sParam];
	try {
		if (xParam) {
		    switch(typeof xDefVal) {
		      case 'number':            // Convert the number to a hexadecimal integer
		        return ( (Number(xParam) != NaN) ? Number(xParam): xDefVal);
		      case 'boolean':           // Convert to TRUE or FALSE, in uppercase
		        return ( (xParam.toLowerCase()=="false") ? false : Boolean( xParam ));
		      case 'string':            // Return the string enclosed in quotes
		      default:                  // Convert any other type in the usual way
		        return xParam;
		    }
		}
		return xDefVal;
	} catch (e) {
		return xDefVal;
	}
}

function frmcheck(frm) {
	if (parseInt(frm.aa.value) < aaaa) 	{
		alert (sMsgOldDate);
		frm.aa.focus();
		return false;
	} else {
		if (parseInt(frm.aa.value) == aaaa) {
			if (parseInt(frm.mm.value) < mm1+1) {
				alert (sMsgOldDate);
				frm.mm.focus();
				return false;
			} else {
				if (parseInt(frm.mm.value) == mm1+1) {
					if (parseInt(frm.gg.value) < gg1) {
						alert (sMsgOldDate);
						frm.gg.focus();
						return false;
					}
				}
			}
		}
	}
	// alert(frm.gg.value+"/"+frm.mm.value+"/"+frm.aa.value);
	if(parseInt(frm.gg.value)==31){
		switch(parseInt(frm.mm.value)) {
			case 2:
			case 4:
			case 6:
			case 9:
			case 11:
				alert (sMsgWrongDate);
				return false;
				break;
			default:
				break;
		}
	}
	if(parseInt(frm.mm.value)==2 && parseInt(frm.gg.value)>28){
		if ( (( parseInt(frm.aa.value) % 4 != 0)  ||  (parseInt(frm.aa.value) % 100 == 0))  &&  (parseInt(frm.aa.value) % 400 != 0 )) {
			alert (sMsgWrongDate);
			return false;
		}
	}
	var tot_adulti_pren = 0;
	var tot_camere_pren = 0;

	if (parseInt(frm.tot_adulti.value) < 1) {
		alert(sMsgNumAdult);
		frm.tot_adulti.focus();
		return false;
	}
	if (!(parseInt(frm.notti_1.value) > 0)) {
		alert(sMsgNumNights);
		frm.notti_1.focus();
		return false;
	}
	if (0) {
	  //(parseInt(frm.tot_bambini.value)>0)&&(parseInt(frm.tot_camere.value)==1)) {
		tutto_ok = 1;
		for (i=1; i<=parseInt(frm.tot_bambini.value); i++) {
			myvar = "st1bamb" + i;
			eta = parseInt(document.getElementById(myvar).value);
			if (eta < 0) tutto_ok = 0;
		}
		if (tutto_ok==0) {
			alert(sMsgChildAge);
			frm.st1bamb1.focus();
			return false;
		}
	}

	tot_adulti_pren 	= parseInt(frm.tot_adulti.value);
	tot_camere_pren 	= parseInt(frm.tot_camere.value);
	tot_bambini_pren 	= parseInt(frm.tot_bambini.value);
	tot_occupanti_pren 	= tot_adulti_pren + tot_bambini_pren;
	// str = "occ = " + tot_occupanti_pren + " cam = " + tot_camere_pren;
	// alert(str); // debug
	if (tot_occupanti_pren < tot_camere_pren || isNaN(tot_occupanti_pren) )	{
		alert(sMsgOccRoom);
		frm.tot_adulti.focus();
		return false;
	}
//debugger; // alert(frm.)
  return true;
}


function getDateString(y_obj,m_obj,d_obj) {
	var y = y_obj.options[y_obj.selectedIndex].value;
	var m = m_obj.options[m_obj.selectedIndex].value;
	var d = d_obj.options[d_obj.selectedIndex].value;
	if (y=="" || m=="") {
		return null;
	}
	if (d=="") {
		d=1;
	}
	return str= y+'-'+m+'-'+d;
}

// Populate option list with hotels if location is selected

function populateData(oOptions) {
	nIndex= oOptions.options.selectedIndex;

	var name = oOptions.options[nIndex].value;

	var oSelect	=	qrForm.tappa_1_id_albergo;

	// 0 - mostra solo le nuove opzioni
	// 1 - mostra la prima opzione esistente più le nuove opzioni
	count	= 1;
	// Cancella la vecchia lista (se count = 0)
	oSelect.options.length = count;
	// Inserisce nelle opzioni della lista tutte le categorie corrispondenti
	// oSelect.options[count++] = new Option( sHotels[1][0] );
	
	for (var key in oHotels) {
		if( oHotels[key].location == name || nIndex==0) {
			oSelect.options[count++] = new Option( oHotels[key].name, oHotels[key].code );
		}
	}

	// Imposta quali opzioni della sottocategoria devono essere selezionate
	oSelect.options.selectedIndex = 0;
	// Da il focus alle sottocategorie
	// oSelect.focus();
}

// Update ID_albergo if changed for cancel/Modify link
function updateCanHref() {
	try {
		// Add cancel modify reservation link
		obj	= document.getElementById("ModCancLinkText");
		obj.href = "https://www.aec-internet.it/booking_engine/prenota.htm?id_stile="+nIdStile+"&id_albergo="+ qrForm.tappa_1_id_albergo.value +"&id_canale="+nIdCanale+"&id_gruppo="+nIdGruppo+"&dc=&lingua_int="+sLang[cLang]+"&tst_prntz="+(bTestPrn? "si":"")+"&headvar=ok&cancel=pren";
		// Add cancel modify reservation Label

		if(bGATrack) {
			var sFunc = "pageTracker._link(this.href);"+"alert('Funziona!!!!!!!');";
			if(bGAEvent) {
				sFunc += "pageTracker._trackEvent("+sGAEventCat+","+sGAEventSubCat+","+sGAEventDesc+", 0); ";
			}
			obj.onclick	= "javascript:"+sFunc;
		};
	} catch(e) {
	}
}

// Update form fields
function updateQRForm() {
    qrForm = document.getElementById('myForm');
	try {
		// Add BookNow Title
		AddContent("bookNow", sBookNow );

		obj	=	qrForm.loc_tappa_1;

		// Add Place List data only for group or channel
		if(nHotelsInList > 1) {
			i=1;
			obj.options[0] = new Option( sAllLocations, "");
			for (var key in oLoc) {
				obj.options[i] = new Option( key);
				i++;
			}
			if(i > 1) {
				// Add Places list label
			        AddContent("LocListLabel", sLocLabel);
				obj.onchange	= function( ) {
					 populateData( this );
				};
			}
		}
		// Add Hotels list if grou or Channel or hotel id if single hotel
		obj	=	qrForm.tappa_1_id_albergo;

		if(nHotelsInList > 1) {
			// Add Hotel Label
			AddContent("HotelsListLabel", sHotel);

			// Add Hotel List
			i=1;
			obj.options[0] = new Option( sAllHotels, "");
			for (var key in oHotels ) {
				obj.options[i] = new Option( oHotels[key].name, oHotels[key].code);
				i++;
			}

			obj.onchange	= function( ) {
				updateCanHref( this );
			};

		} else {
			// Add Hotel code if is not a group
			if (obj.tagName=="SELECT") {
				obj.options[0] = new Option( oHotels.name,oHotels.code, true, true );
			} else {
				obj.value =  oHotels.code;
				obj.type  = 'hidden';
			}
		}


		// Add Arrival Date Label
		AddContent("ArrivalDateLabel",sArrival);
	        // CUSTOM-PDR
		AddContent("ArrivalDayLabel",sArrivalDay);
		AddContent("ArrivalMonthLabel",sArrivalMonth);
		AddContent("ArrivalYearLabel",sArrivalYear);

		// Add List Box for year select
		obj	=	qrForm.aa;
		obj.name  ="aa";
		obj.id    ="yearList";
		obj.size  = 1;
		obj.onchange = function( ) {
			setDayOfTheMonth( );
		};

		obj.options[0] = new Option( (aaaa.toString()).substr(2),aaaa , true, true);
		obj.options[1] = new Option( ((aaaa+1).toString()).substr(2),aaaa+1 );

		// Add List Box for month select
		obj	=	qrForm.mm;

		obj.size  = 1;
		obj.onchange = function( ) {
			setDayOfTheMonth();
		};

		for (i=0; i<12; i++)
			obj.options[i] = new Option( oMonth[i], i+1, (mm1==i),  (mm1==i));
			

		// Add List Box for day select

		setDayOfTheMonth( true);

		// Add Nights Label
		AddContent("NightsLabel", sNights);

		// Add number of nights
		obj	=	qrForm.notti_1;

		obj.options[0] = new Option( "", 0);
		for (i=1; i<=nNightMax; i++)
			obj.options[i] = new Option( i, i, (nNightSel==i), (nNightSel==i));
		// Add Adults Number Label
		AddContent("AdultsLabel", sAdults);

		// Add number of Adults
		obj	=	qrForm.tot_adulti;

		obj.options[0] = new Option( "", 0);
		for (i=1; i<=nAdultMax; i++)
			obj.options[i] = new Option( i, i, (nAdultSel==i), (nAdultSel==i));

		// Add Children Number Label
		AddContent("ChildLabel", sChild);

		// Add number of Children
		obj	=	qrForm.tot_bambini;

		obj.options[0] = new Option( "", 0);
		for (i=1; i<=nChildMax; i++)
			obj.options[i] = new Option( [i], i, (nChildSel==i), (nChildSel==i));

		// Add Rooms Number Label
		AddContent("RoomLabel", sRooms);

		// Add number of Rooms
		obj	=	qrForm.tot_camere;

		obj.options[0] = new Option( "", 0);
		for (i=1; i<=nRoomMax; i++)
			obj.options[i] = new Option( [i], i, (nRoomSel==i), (nRoomSel==i));

		// Add customer code Label
		AddContent("CodeCliLabel", sCodCli);

		// Add Customer code preselect
		obj	=	qrForm.codice_cli;
		obj.value = sCodCliSel;

		// Add Special code Label
		AddContent("PromoLabel", sPromo);

		// Add Special code preselect
		obj	=	qrForm.sconto;
		obj.value = sPromoSel;

		// Add Special code preselect
		obj	=	qrForm.confirm;
		obj.value = sButton;

		// Add cancel modify reservation link
		updateCanHref();
		// obj	= document.getElementById("ModCanc");
		// obj.href = "https://www.aec-internet.it/booking_engine/prenota.htm?id_stile="+nIdStile+"&id_albergo="+ qrForm.tappa_1_id_albergo.value +"&id_canale="+nIdCanale+"&id_gruppo="+nIdGruppo+"&dc=&lingua_int="+sLang[cLang]+"&tst_prntz=&headvar=ok&cancel=pren";
		// Add cancel modify reservation Label
		AddContent("ModCancLinkText",sDelMod);

		// set hidden data
		 qrForm.lingua_int.value		= sLang[cLang];
		 qrForm.id_stile.value 		= nIdStile;
		 qrForm.id_canale.value		= nIdCanale;
		 qrForm.id_gruppo.value		= nIdGruppo;
		 qrForm.id_prodotto_sel.value	= nIdProdSel;
		 qrForm.mostra_loc.value		= nMostraLoc;
		 qrForm.mostra_zone.value		= nMostraZone;
		 qrForm.mostra_cat.value		= nMostraCat;
		 qrForm.id_cat_prod.value		= nIdCatProd;
         qrForm.tst_prntz.value		= bTestPrn;
		 
		// set tracking parameters
		if(bGATrack) {
			var sFunc = "pageTracker._linkByPost(this);";
			if(bGAEvent) {
				sFunc += "pageTracker._trackEvent("+sGAEventCat+","+sGAEventSubCat+","+sGAEventDesc+", 0); ";
			}
			qrForm.onSubmit= sFunc;
		}
  
	} catch(e){
		alert("Data update error: "+e.message);
	}

}

function AddContent(x, xContent ) {
	var o;
	
	if (typeof x == "string") {
		o = document.getElementById(x);
		// esiste ???
		if (o) {
			switch (typeof xContent) {
				case 'number':            // Convert the number to a hexadecimal integer
				case 'string':            // Return the string enclosed in quotes
				case 'boolean':
					xContent= document.createTextNode(xContent);
					break;
				default:
					break;
			}
			if (o.hasChildNodes())
				o.replaceChild(xContent, o.firstChild);
			else
				o.appendChild(xContent)
		}
	}
}
/**
 * Set days on the month
 */
function setDayOfTheMonth( bPreset) {
	// Add List Box for day select
	var obj	= qrForm.gg;
	var wM	= qrForm.mm.value;
	var wY	= qrForm.aa.value;

	var nSel	= obj.selectedIndex;
	var wDays	= nMonthDays[wM];

	if( bPreset)
		nSel	= gg1-1;
	if(parseInt(wM)==2) {
		if ( (( parseInt(wY) % 4 == 0)  &&  (parseInt(wY) % 100 != 0))  ||  (parseInt(wY) % 400 == 0 )) {
			wDays++;
		}
	}

	obj.length = wDays;
	for (i=0; i<wDays; i++)
  		obj.options[i] = new Option( i+1, i+1,(nSel==i),(nSel==i));

	if( nSel+1 > wDays)
		obj.selectedIndex = wDays-1;
}
