<!--

//	-----   feel free to use this stuff   ---   play with it   ---   copy as You  like   -----
//	-----   but leave this authors comment untouched:   pseliger@gmx.net  [june 2003]    -----
//
//	extended javascript-api-methods		:
//	* jsApi-extension-name / file-name	: "jsApi.NumberString.flexibleConverting.js"
//	* original download-location		: "http://www.pseliger.de/jsExtendedApi/jsApi.NumberString.flexibleConverting.js"
//
//	last revision		: june 2003		- there was still some tuning to do according to size and
//										  performance of the code  -  no further revision planned;
//										- the pure js-code comes with 3.356 bytes;
//	second revision		: march 2003	- code of all methods, I belief, is on its edge now;
//										- no further revision planned (5.435 / 11.338 bytes);
//	first revision		: january 2003	- the pure js-code has now 3.167 bytes only;
//	first public release: august 2002	- the pure js-code comes with 3.265 bytes;
//
Number.prototype.flexibleRound = function(){var content=this;if(isNaN(content)){return content;}if((arguments.length==1)&&(!isNaN(parseFloat(arguments[0])))){var digits=Math.round(parseFloat(arguments[0]));content=((digits>=1)?(Math.round(content*Math.pow(10,digits))/Math.pow(10,digits)):(Math.round(content)));}else{content=Math.round(content);}return content;};
String.prototype.flexibleRound = function(){var content=parseFloat(this);if(isNaN(content)){return content;}return content.flexibleRound(((arguments.length==1)&&(!isNaN(parseFloat(arguments[0]))))?(arguments[0]):("")).toString();};
	// - wird auf Numbers oder Strings angewandt - liefert einen gerundeten zahlenwert im selben typ (number oder string) zurueck oder aber NaN - erwartet einen ganzzahligen parameter, der die anzahl der nachkommastellen enthaelt, auf die es zu runden gilt	- bei anderen parametern oder ohne jegliche angabe verhaelt sich die methode wie "Math.round()";
	// - is to be used with both Numbers/Strings - returns the roundet value of a number transforming it into the calling-type  or  returns NaN - accepts a parameter of type integer that represents the number of digits behind the comma that will be rounded to	- with other parameters or without any specification the method behaves like "Math.round()";

Number.prototype.fixedDigits = function(){var content=this;if(isNaN(content)){return content;}var separator="comma";var digits=-1;var comma="";var block="";for(var i=0;i<arguments.length;i++){if(arguments[i].constructor==Number){digits=Math.round(arguments[i]);}else if(arguments[i].constructor==String){if(separator=="comma"){comma=arguments[i];}else if(separator=="block"){block=arguments[i];}separator=((separator=="block")?("comma"):((separator=="comma")?("block"):("comma")));}}if(digits<0){digits=((content.toString().indexOf(".")>=0)?((content.toString().split("."))[1].length):(0));}if(comma===""){comma=".";}content=(Math.round(content*Math.pow(10,digits))/Math.pow(10,digits)).toString();if(digits>=1){content=content.split(".");}else{content=new Array(content);comma="";}content[content.length]="";var blockCounter=0;for(var i=content[0].length-1;i>=0;i--){content[content.length-1]=content[0].charAt(i)+content[content.length-1];blockCounter++;if(blockCounter==3){blockCounter=0;content[content.length-1]=block+content[content.length-1];}}content[0]=content[content.length-1];content.length=content.length-1;if(content.length==1){content[1]="";}for(var i=content[1].length;i<digits;i++){content[1]+="0";}content=new String(content[0]+comma+content[1]);if(content.charAt(0)==" "){content=content.substring(1);}return content;};
String.prototype.fixedDigits = function(){var content=parseFloat(this);if(isNaN(content)){return content;}var separator="comma";var digits=-1;var comma="";var block="";for(var i=0;i<arguments.length;i++){if(arguments[i].constructor==Number){digits=Math.round(arguments[i]);}else if(arguments[i].constructor==String){if(separator=="comma"){comma=arguments[i];}else if(separator=="block"){block=arguments[i];}separator=((separator=="block")?("comma"):((separator=="comma")?("block"):("comma")));}}return content.fixedDigits(digits,comma,block);};
	// - wird auf Numbers oder Strings angewandt - liefert immer einen als string formatierten zahlenwert oder aber NaN zurueck - akzeptiert kombinationen aus bis zu maximal 3 parametern: ein parameter vom typ integer wird immer als anzahl der erzwungenen nachkommastellen (z.b.:586.0100) interpretiert / der erste string-parameter (der vorletzte bei mehreren string-parametern) wird bei der formatierung als komma verwendet   / der zweite string-parameter (der letzte bei mehr als 2 string-parametern) wird als  trenn-zeichen fuer die visuelle teilung der zahl in tausender-bloecke genutzt - fehlt das argument vom typ number, werden alle nachkommastellen uebernommen;
	// - is to be used with both Numbers/Strings - returns always a string that represents a formatted number  or  returns NaN	- accepts combinations of 3 or less parameters			  : a integer-type-parameter always gets interpreted as amount of forced digits (f.i.:586.0100) behind the comma	   / the first string-type-parameter (the last but one if more string-parameters) gets used as comma by the formatting-process / the second string-type-parameter (the last one if more then 2 string-parameters) gets used as separator while dividing the number visually in blocks of thousends - is the number-type-argument missing all digits behind the comma are excepted;

String.prototype.forceToNumber = function(){var content=this;var posDot=content.lastIndexOf(".");var posComma=content.lastIndexOf(",");var comma="";var regExpValue=/\d+/g;var regExpMatch=null;if((posDot>=0)||(posComma>=0)){if(((content.split(".")).length==2)&&((content.split(",")).length==2)){content=content.split((posDot>posComma)?("."):(","));}else if(((content.split(".")).length==2)&&((content.split(",")).length!=2)){content=content.split(".");}else if(((content.split(".")).length!=2)&&((content.split(",")).length==2)){content=content.split(",");}else{content=new Array(content);}}else{content=new Array(content);}for(var i=0;i<content.length;i++){regExpMatch=content[i].match(regExpValue);content[i]="";if(regExpMatch){for(var k=0;k<regExpMatch.length;k++){content[i]+=regExpMatch[k].toString();}}}return parseFloat((content.length==1)?(content[0]):(content[0]+"."+content[1]));};
	// - wird nur auf Strings angewandt - versucht, einen formatierten dezimalzahl-string in einen zahlenwert umzuwandeln	 - liefert diesen wert oder NaN zurueck;
	// - to be used with Strings only	- tries to convert a formatted string that represents a decimal-number into a number - returns this value or returns NaN;
//
//	------------------------------------------------------------------------------------------
//	------------------------------------------------------------------------------------------

/* *** Datumsfunktionen *** */

function runden(x) {
// der Eingabewert wird gerundet und in einen String umgewandelt:
  var k = (Math.round(x * 100) / 100).toString();

// bei glatten Werten wird .00 angehängt:
  k += (k.indexOf('.') == -1)? '.00' : '00';

// fehlende führende Nullen werden aufgespürt und ggf. eingesetzt,
// Punkte werden durch Komata ersetzt:
  var p = k.indexOf('.'), m = k.indexOf('-.');
  var f = (p == 0 || m == 0)? '0.' : '.';

// der Rückgabewert wird zusammengesetzt:
  return k.substring(0, p) + f + k.substring(p+1, p+3);
}

function updateNottiPrezzo(){
	var i;
	for (i = 0; i < 3; i++){
		mostraPrezzo(i);
	}
}

function getSeasonStartYear(relDateSeasonStart, relDateSeasonEnd, dateClient){
	var seasonStart_month = parseInt(relDateSeasonStart.getMonth());
	var seasonEnd_day = parseInt(relDateSeasonEnd.getDate());
	var seasonEnd_month = parseInt(relDateSeasonEnd.getMonth());
	var dateClient_year = parseInt(dateClient.getYear());
	var SeasonEndVirtual;
		
	//Falls Saison einen Jahreswechsel kreuzt
	if (seasonEnd_month < seasonStart_month) {
		SeasonEndVirtual = new Date(dateClient_year, seasonEnd_month, seasonEnd_day);
		if (dateClient < SeasonEndVirtual) {
			return dateClient_year-1;
		}
		else {
			return dateClient_year;
		}	
	}
	else {
		return dateClient_year;	
	}
}


function getNumberInvolvedSeasons(dateClientArrival, dateClientDeparture, dateSeasonStartArrival, dateSeasonEndDeparture, seasonCrossingNewYear){
	var yearFullSeasonStart = parseInt(dateSeasonStartArrival.getYear());
	var yearFullSeasonEnd = parseInt(dateSeasonEndDeparture.getYear());
	var numberInvolvedSeasons;
	
	if (seasonCrossingNewYear == false){
		//alert("no seasonCrossingNewYear");
		numberInvolvedSeasons = yearFullSeasonEnd - yearFullSeasonStart;
	}
	else {
		//alert("seasonCrossingNewYear");
		numberInvolvedSeasons = yearFullSeasonEnd - (yearFullSeasonStart+1);
	}
	
	//alert("numberInvolvedSeasons= " + numberInvolvedSeasons);
	return numberInvolvedSeasons;
}

function getNumeroNottiSconto(stagioneID){

	var sumDays = 0;
	var bsID = -1;
	var bsIni;
	var bsFine;
	var dataBsIni_month;
	var dataBsIni_day;
	var dataBsIni_year;
	var dataBsFine_month;
	var dataBsFine_day;
	var dataBsFine_year;
	var dataBsFineUnaStag_Arr_year;
	var dataBsFineUnaStag_Par_year;
	var dataBsIni;
	var dataBsFine;
	var seasonStartYearArrival;
	var seasonEndYearArrival;
	var seasonStartYearDeparture;
	var seasonEndYearDeparture;
	var seasonCrossesNewYear = false;
	
	//season years relative to arrival/departure
	var dataBsIni_Arr_year;
	var dataBsFine_Arr_year;
	var dataBsIni_Par_year;
	var dataBsFine_Par_year;

	var dataArrivo_day = parseInt(document.Prenotaform.dataArrivo.value.substr(0,2));
	var dataArrivo_month = parseInt(document.Prenotaform.dataArrivo.value.substr(3,2) - 1);
	var dataArrivo_year = parseInt(document.Prenotaform.dataArrivo.value.substr(6,4));
	var dataArrival = new Date(dataArrivo_year, dataArrivo_month, dataArrivo_day);
	
	var dataPartenza_day = parseInt(document.Prenotaform.dataPartenza.value.substr(0,2));
	var dataPartenza_month = parseInt(document.Prenotaform.dataPartenza.value.substr(3,2) - 1);
	var dataPartenza_year = parseInt(document.Prenotaform.dataPartenza.value.substr(6,4));
	var dataDeparture = new Date(dataPartenza_year, dataPartenza_month, dataPartenza_day);
	
	var n = document.Prenotaform.info_dataStagioneID.length;
	//alert("info_dataStagioneID.length = " + n);
	var i;
	var diffYears_Arr_Par;
	var diffDays_Arr_Ini;
	var diffDays_Arr_Fine;
	var diffDays_Par_Ini;
	var diffDays_Par_Fine;
	var	diffDays_Arr_Par;
	var	diffDays_Fine_Ini;
	var dayUnits = 86400000;
	var posStag_Arr; //-1= prima, 0= in, 1= dopo bassa stagione
	var posStag_Par;//-1= prima, 0= in, 1= dopo bassa stagione
	
	dataBsFineUnaStag_Arr_year = parseInt(dataArrivo_year);
	dataBsFineUnaStag_Par_year = parseInt(dataPartenza_year);

	for(i=1; i < n; i++){
		
		if (document.Prenotaform.info_dataStagioneID[i].value == stagioneID){
			//stagioneID > 1: bassa stagione, stagione invernale, ecc.
			//alert(stagioneID);
			bsID = document.Prenotaform.info_dataStagioneID[i].value;
			bsIni = document.Prenotaform.info_dataStagioneInizio[i].value;
			bsFine = document.Prenotaform.info_dataStagioneFine[i].value;
			//alert(bsID);
			//alert(bsIni);
			//alert(bsFine);
		}
	}	

	if (bsID != -1){
		dataBsIni_day = parseInt(bsIni.substr(0,2));
		dataBsIni_month = parseInt(bsIni.substr(3,2) - 1);
		dataBsIni_year = parseInt(dataArrivo_year);
		
		dataBsIni = new Date(dataBsIni_year, dataBsIni_month, dataBsIni_day);
		dataBsFine = new Date(dataPartenza_year, bsFine.substr(3,2) - 1, bsFine.substr(0,2));
		dataBsFine = DayAdd(dataBsFine, 1);
		
		dataBsFine_day = parseInt(dataBsFine.getDate());
		dataBsFine_month = parseInt(dataBsFine.getMonth());
		dataBsFine_year = parseInt(dataBsFine.getYear());
		
		seasonStartYearArrival = getSeasonStartYear(dataBsIni, dataBsFine, dataArrival);
		seasonEndYearArrival = parseInt(seasonStartYearArrival);
		seasonStartYearDeparture = getSeasonStartYear(dataBsIni, dataBsFine, dataDeparture);
		seasonEndYearDeparture = parseInt(seasonStartYearDeparture);
		//Falls Saison einen Jahreswechsel kreuzt
		if (dataBsFine_month < dataBsIni_month) {
			seasonCrossesNewYear = true;
			seasonEndYearArrival++;
			seasonEndYearDeparture++;			
		}
		//alert("seasonStartYear Arrival = " + seasonStartYearArrival);
		//alert("seasonEndYear Arrival = " + seasonEndYearArrival);
		//alert("seasonStartYear Departure = " + seasonStartYearDeparture);
		//alert("seasonEndYear Departure = " + seasonEndYearDeparture);		
	}
	
	//alert(dataBsIni_day + "." +dataBsIni_month + "." + dataBsIni_year);
	//alert(dataBsFine_day + "." +dataBsFine_month + "." + dataBsFine_year);	
	//diffYears_Arr_Par = parseInt(dataPartenza_year) - parseInt(dataArrivo_year);
	
	var dateSeasonStartArrival = new Date(seasonStartYearArrival, dataBsIni_month, dataBsIni_day);
	var dateSeasonEndDeparture = new Date(seasonEndYearDeparture, dataBsFine_month, dataBsFine_day);
	var numberFullSeasons;	
	//alert(seasonCrossesNewYear);

	diffYears_Arr_Par = getNumberInvolvedSeasons(dataArrival, dataDeparture, dateSeasonStartArrival, dateSeasonEndDeparture, seasonCrossesNewYear)
	//alert("diffYears_Arr_Par = " + diffYears_Arr_Par);	
	
	diffDays_Arr_Ini = (Date.UTC(seasonStartYearArrival,dataBsIni_month,dataBsIni_day,00,00,00) - Date.UTC(dataArrivo_year,dataArrivo_month,dataArrivo_day,00,00,00)) / dayUnits;
	diffDays_Arr_Fine = (Date.UTC(seasonEndYearArrival,dataBsFine_month,dataBsFine_day,00,00,00) - Date.UTC(dataArrivo_year,dataArrivo_month,dataArrivo_day,00,00,00)) / dayUnits;
	diffDays_Par_Ini = (Date.UTC(seasonStartYearDeparture,dataBsIni_month,dataBsIni_day,00,00,00) - Date.UTC(dataPartenza_year,dataPartenza_month,dataPartenza_day,00,00,00)) / dayUnits;
	diffDays_Par_Fine = (Date.UTC(seasonEndYearDeparture,dataBsFine_month,dataBsFine_day,00,00,00) - Date.UTC(dataPartenza_year,dataPartenza_month,dataPartenza_day,00,00,00)) / dayUnits;
	
	diffDays_Ini_Fine = (Date.UTC(seasonEndYearArrival,dataBsFine_month,dataBsFine_day,00,00,00) - Date.UTC(seasonStartYearArrival,dataBsIni_month,dataBsIni_day,00,00,00)) / dayUnits;
		
	//alert("diffDays_Arr_Ini = " + diffDays_Arr_Ini);
	//alert("diffDays_Arr_Fine = " + diffDays_Arr_Fine);
	//alert("diffDays_Par_Ini = " + diffDays_Par_Ini);
	//alert("diffDays_Par_Fine = " + diffDays_Par_Fine);
	//alert("diffDays_Ini_Fine = " + diffDays_Ini_Fine);
	
	//assegna posizioni arrivo relativo alla bassa stagione
	if(diffDays_Arr_Ini > 0){
		if(diffDays_Arr_Fine >= 0)
			posStag_Arr = -1; // prima della bassa stagione
		}
	else{
		if(diffDays_Arr_Fine >= 0){
			posStag_Arr = 0; // in bassa stagione
		}
		else{
			posStag_Arr = 1; // dopo la bassa stagione
		}
	}
		
	//assegna posizioni partenza relativa alla bassa stagione
	if(diffDays_Par_Ini >= 0){
		if(diffDays_Par_Fine >= 0)
			posStag_Par = -1; // prima della bassa stagione
		}
	else{
		if(diffDays_Par_Fine >= 0){
			posStag_Par = 0; // in bassa stagione
		}
		else{
			posStag_Par = 1; // dopo la bassa stagione
		}
	}
			
	//alert("posStag_Arr = " + posStag_Arr);
	//alert("posStag_Par = " + posStag_Par);			
	
	//distingui 2 casi:
	// arrivo e partenza nello stesso anno
	if (diffYears_Arr_Par == 0){
		
		diffDays_Arr_Par = (Date.UTC(dataPartenza_year,dataPartenza_month,dataPartenza_day,00,00,00) - Date.UTC(dataArrivo_year,dataArrivo_month,dataArrivo_day,00,00,00)) / dayUnits;
		
		if(posStag_Arr == -1){
			if(posStag_Par == 0){
				sumDays += Math.abs(diffDays_Par_Ini);				
			}
			else if(posStag_Par == 1){
				sumDays += Math.abs(diffDays_Ini_Fine);
			}
		}
		else if(posStag_Arr == 0){
			if(posStag_Par == 0){
				sumDays += Math.abs(diffDays_Arr_Par);				
			}			
			else if(posStag_Par == 1){
				sumDays += Math.abs(diffDays_Arr_Fine);
			}
		}
	}
	else{
	// arrivo e partenza in anni diversi
		// primo anno
		if(posStag_Arr == -1){
			sumDays += Math.abs(diffDays_Ini_Fine);
		}
		else if(posStag_Arr == 0){
			sumDays += Math.abs(diffDays_Arr_Fine);
		}
		// ultimo anno
		if(posStag_Par == 0){
			sumDays += Math.abs(diffDays_Par_Ini);
		}
		else if(posStag_Par == 1){
			sumDays += Math.abs(diffDays_Ini_Fine);
		}	
			
		// se diffYears_Arr_Par > 1
		if(diffYears_Arr_Par > 1){
			sumDays += ((Math.abs(diffDays_Ini_Fine)) * (diffYears_Arr_Par - 1));
		}
	}
	
	//alert("sumDays = " + sumDays);
	return sumDays;

}


function getSeasonPrice(index, numberNightsReduc, arrPriceReduc, priceReducOut, priceReducTotalRoomType) {
	var roomType = document.Prenotaform.tipocamera[index];
	var numberRooms = document.Prenotaform.camere[index];
	var arrPriceHigh = document.Prenotaform.info_prezzo_massimo;
	var numberNights = document.Prenotaform.NumPernott.value;
	var priceHighOut = document.Prenotaform.CameraPrezzoNotte;
	var priceTotalRoomType = document.Prenotaform.CameraPrezzo;
	
	var amountTotal = document.Prenotaform.TotalePrezzo;
	var reductionTotal = document.Prenotaform.ScontoStagBassa;
	var amountToPay = document.Prenotaform.ImportoDaPagare;
	var roomSel;
	var numberSel;
	var	priceHighIn;
	var	priceLowIn;
	
	var	priceHelp;
	var	reducHelp;
	var i;	
		
	if(roomType[0].selected == false){
	    roomSel = roomType.selectedIndex;
		priceHighIn = arrPriceHigh[roomSel].value.forceToNumber();
		priceLowIn = arrPriceReduc[roomSel].value.forceToNumber();
		priceHighOut[index].value = runden(priceHighIn);
		priceReducOut[index].value = runden(priceLowIn);
	
		if(numberRooms[0].selected == false){
		    numberSel = numberRooms.selectedIndex;
			
			priceHelp = priceHighIn * numberRooms.options[numberSel].value;
			priceHelp = priceHelp * numberNights;  //.value;
			priceTotalRoomType[index].value = runden(priceHelp);			
			
			reducHelp = (priceHighIn - priceLowIn) * numberRooms.options[numberSel].value;
			reducHelp = reducHelp * numberNightsReduc;  //.value;
			priceReducTotalRoomType[index].value = runden(reducHelp);
			//alert("numberNightsReduc = " + numberNightsReduc);
			//alert("reduction = " + reducHelp);
			//alert("priceReducTotalRoomType[index].value  = " + priceReducTotalRoomType[index].value );
		}
		else{
			priceTotalRoomType[index].value = "";	
			priceReducTotalRoomType[index].value = "";	
		}		
	}		
	
	else{
		priceHighOut[index].value = "";	
		priceTotalRoomType[index].value = "";
		priceReducOut[index].value = "";	
		priceReducTotalRoomType[index].value = "";
	}
}

function mostraPrezzo(index){
	var arrPriceLow = document.Prenotaform.info_prezzo_minimo;	
	//var arrPriceWinter = document.Prenotaform.info_prezzo_invernale;
	
	var numberOffSeasons = document.Prenotaform.info_numeroStagioni.value;
	var numberNightsLowSeason;
	//var numberNightsWinterSeason;
	
	var priceLowOut = document.Prenotaform.CameraPrezzoNotteBS;
	//var priceWinterOut = document.Prenotaform.CameraPrezzoNotteInverno;
	
	var priceTotalRoomType = document.Prenotaform.CameraPrezzo;
	var reducLowTotalRoomType = document.Prenotaform.CameraScontoBS;
	//var reducWinterTotalRoomType = document.Prenotaform.CameraScontoInverno;
	
	var amountTotal = document.Prenotaform.TotalePrezzo;
	var reductionTotal = document.Prenotaform.ScontoStagBassa;
	var amountToPay = document.Prenotaform.ImportoDaPagare;
	
	var	priceHelp;
	var	reducHelp;
	var i;	
	
	var amountTotalHelp = 0;
	var reductionTotalHelp = 0;
	var totaleSconto = 0;
	
	numberNightsLowSeason = getNumeroNottiSconto(2);
	//numberNightsWinterSeason = getNumeroNottiSconto(3);
	//alert("numberNightsLowSeason = " + numberNightsLowSeason);
	////alert("numberNightsWinterSeason = " + numberNightsWinterSeason);
	
	getSeasonPrice(index, numberNightsLowSeason, arrPriceLow, priceLowOut, reducLowTotalRoomType);
	//getSeasonPrice(index, numberNightsWinterSeason, arrPriceWinter, priceWinterOut, reducWinterTotalRoomType);
	
	for (i = 0; i < 3; i++){
		//prezzoAltaStagione
		priceHelp = priceTotalRoomType[i].value.forceToNumber();
		if (isNaN(priceHelp)){priceHelp = 0};
		amountTotalHelp = amountTotalHelp + priceHelp;
		
		//prezzoBassaStagione
		reducHelp = reducLowTotalRoomType[i].value.forceToNumber();
		if (isNaN(reducHelp)){reducHelp = 0};
		reductionTotalHelp = reductionTotalHelp + reducHelp;	
		//alert("Sconto BS = " + reducHelp);
		
		////prezzoStagioneInvernale
		//reducHelp = reducWinterTotalRoomType[i].value.forceToNumber();
		//if (isNaN(reducHelp)){reducHelp = 0};
		//reductionTotalHelp = reductionTotalHelp + reducHelp;	
		//alert("Sconto invernale = " + reducHelp);
	}
	if (amountTotalHelp > 0){
		amountTotal.value = runden(amountTotalHelp);
		reductionTotal.value = runden(reductionTotalHelp); 
		amountToPay.value = runden(amountTotalHelp - reductionTotalHelp);
	}
	else{
		amountTotal.value = "";
		reductionTotal.value = "";
		amountToPay.value = "";
	}	
	
}

function mostraCamere(){
	var n = document.Prenotaform.tipocamera[0].length;
	var i;
		for(i=1; i < n; i++){
			alert(document.Prenotaform.tipocamera[0].options[i].value);
		    alert(document.Prenotaform.info_prezzo_massimo[i].value);
			alert(document.Prenotaform.info_prezzo_minimo[i].value);
			alert(document.Prenotaform.info_dataStagioneInizio[i].value);
			alert(document.Prenotaform.info_dataStagioneFine[i].value);		
		}	
		return false;
}

function isDate(p_Expression){
	return !isNaN(new Date(p_Expression));
}


// REQUIRES: isDate()
// NOT SUPPORTED: firstdayofweek and firstweekofyear (defaults for both)
function dateDiff(p_Interval, p_Date1, p_Date2){
	if(!isDate(p_Date1)){return "invalid date: '" + p_Date1 + "'";}
	if(!isDate(p_Date2)){return "invalid date: '" + p_Date2 + "'";}

	var dt1 = new Date(p_Date1);
	var dt2 = new Date(p_Date2);

	//get ms between dates (UTC) and make into "difference" date
	var iDiffMS = dt2.valueOf() - dt1.valueOf();
	var dtDiff = new Date(iDiffMS);

	// calc various diffs
	var nYears = dtDiff.getUTCFullYear()-1970;
	var nMonths =	dtDiff.getUTCMonth() + (nYears!=0 ? nYears*12 : 0);
	var nQuarters = parseInt(nMonths/3);
	var nWeeks = parseInt(iDiffMS/1000/60/60/24/7);
	var nDays	= parseInt(iDiffMS/1000/60/60/24);
	var nHours = parseInt(iDiffMS/1000/60/60);
	var nMinutes = parseInt(iDiffMS/1000/60);
	var nSeconds= parseInt(iDiffMS/1000);
	var nMilliseconds = iDiffMS;

	// return requested difference
	var iDiff = 0;		
	switch(p_Interval.toLowerCase()){
		case "yyyy": return nYears;
		case "q": return nQuarters;
		case "m": return nMonths;
		case "y": 		// day of year
		case "d": return nDays;
		case "w": return nDays;
		case "ww":return nWeeks;		// week of year	// <-- inaccurate, WW should count calendar weeks (# of sundays) between
		case "h": return nHours;
		case "n": return nMinutes;
		case "s": return nSeconds;
		case "ms":return nMilliseconds;	// millisecond	// <-- extension for JS, NOT available in VBScript
		default: return "invalid interval: '" + p_Interval + "'";
	}
}


function CountDays(txtDateStart, txtDateEnd)
{
	var dayUnits = 86400000;
	var numDays;	
	var nDays;
	
	var dataArrivo_g = txtDateStart.value.substr(0,2);
	var dataArrivo_m = txtDateStart.value.substr(3,2) - 1;
	var dataArrivo_a = txtDateStart.value.substr(6,4);
	
	var dataPartenza_g = txtDateEnd.value.substr(0,2);
	var dataPartenza_m = txtDateEnd.value.substr(3,2) - 1;
	var dataPartenza_a = txtDateEnd.value.substr(6,4);
	
	numDays = (Date.UTC(dataPartenza_a,dataPartenza_m,dataPartenza_g,00,00,00) - Date.UTC(dataArrivo_a,dataArrivo_m,dataArrivo_g,00,00,00)) / dayUnits;
	
	/*
	var n = document.Prenotaform.info_dataStagioneDesc.length;
	var i;
		for(i=1; i < n; i++){
			alert(document.Prenotaform.info_dataStagioneDesc[i].value);
			alert(document.Prenotaform.info_dataStagioneInizio[i].value);
			alert(document.Prenotaform.info_dataStagioneFine[i].value);		
		}	
	*/
	
	return numDays;
}

function DateAdd(startDate, numDays, numMonths, numYears)
{
	var returnDate = new Date(startDate.getTime());
	var yearsToAdd = numYears;
	
	var month = returnDate.getMonth()	+ numMonths;
	if (month > 11)
	{
		yearsToAdd = Math.floor((month+1)/12);
		month -= 12*yearsToAdd;
		yearsToAdd += numYears;
	}
	returnDate.setMonth(month);
	returnDate.setFullYear(returnDate.getFullYear()	+ yearsToAdd);
	
	returnDate.setTime(returnDate.getTime()+60000*60*24*numDays);
	
	return returnDate;

}

function DayAdd(startDate, numDays)
{
		return DateAdd(startDate,numDays,0,0);
}


function setDates()
{
	var dataCorrente = new Date();
	var dataArrivo = DayAdd(dataCorrente, 1);
	var dataPartenza = DayAdd(dataArrivo, 1);
	var dataArrivoForm;
	var dataPartenzaForm;
	var giorno;
	var mese;
	
	giorno = dataArrivo.getDate();
	if (giorno < 10){giorno = "0" + giorno};	
	mese = dataArrivo.getMonth() +1;
	if (mese < 10){mese = "0" + mese};
	document.Prenotaform.dataArrivo.value = giorno + '.' + mese + '.' + dataArrivo.getFullYear();
	
	giorno = dataPartenza.getDate();
	if (giorno < 10){giorno = "0" + giorno};	
	mese = dataPartenza.getMonth() +1;
	if (mese < 10){mese = "0" + mese};
	document.Prenotaform.dataPartenza.value = giorno + '.' + mese + '.' + dataPartenza.getFullYear();
	
	numDays = CountDays(document.Prenotaform.dataArrivo, document.Prenotaform.dataPartenza);
	document.Prenotaform.NumPernott.value = numDays;

}


function controlDates()
{
	var minDiff = 86400000;
	var ok = true;
	
	var dataCorrente = new Date();
	var dataArrivoMin = DayAdd(dataCorrente, 1);
	
	var dataCorrente_g = dataCorrente.getDate();
	var dataCorrente_m = dataCorrente.getMonth() +1;
	var dataCorrente_a = dataCorrente.getFullYear();
	
	var dataArrivoMin_g = dataArrivoMin.getDate();
	var dataArrivoMin_m = dataArrivoMin.getMonth() +1;
	var dataArrivoMin_a = dataArrivoMin.getFullYear();
	
	//alert(dataCorrente_m);
	//(alert(dataArrivoMin_m);
	
	var dataArrivo_g = document.Prenotaform.dataArrivo.value.substr(0,2);
	var dataArrivo_m = document.Prenotaform.dataArrivo.value.substr(3,2);
	var dataArrivo_a = document.Prenotaform.dataArrivo.value.substr(6,4);
	
	var dataPartenza_g = document.Prenotaform.dataPartenza.value.substr(0,2);
	var dataPartenza_m = document.Prenotaform.dataPartenza.value.substr(3,2);
	var dataPartenza_a = document.Prenotaform.dataPartenza.value.substr(6,4);
	
	if ((Date.UTC(dataArrivo_a,dataArrivo_m,dataArrivo_g,00,00,00) - Date.UTC(dataCorrente_a,dataCorrente_m,dataCorrente_g,00,00,00)) < minDiff){
		ok = false;
		alert(document.Prenotaform.corr_data_arr.value);
		document.Prenotaform.dataArrivo.focus();
	}
	
	if (ok == true){
		if ((Date.UTC(dataPartenza_a,dataPartenza_m,dataPartenza_g,00,00,00) - Date.UTC(dataArrivoMin_a,dataArrivoMin_m,dataArrivoMin_g,00,00,00)) < minDiff){
			ok = false;
			alert(document.Prenotaform.corr_data_part.value);
			document.Prenotaform.dataPartenza.focus();
		}
	}

	if (ok == true){
		if ((Date.UTC(dataPartenza_a,dataPartenza_m,dataPartenza_g,00,00,00) - Date.UTC(dataArrivo_a,dataArrivo_m,dataArrivo_g,00,00,00)) < minDiff){
			ok = false;
			alert(document.Prenotaform.corr_data_ord.value);
			document.Prenotaform.dataPartenza.focus();
		}
	}

	return ok;

}

function adaptDate(ctlDateToPlace)
{

	var dataCorrente = new Date();
	var dataArrivoMin = DayAdd(dataCorrente, 1);
	var dataPartenzaMin = DayAdd(dataArrivoMin, 1);
	
	var minDiff = 86400000;
	var giorno;
	var mese;
	var numDays;
	
	var dataArrivoMin_g = dataArrivoMin.getDate();
	var dataArrivoMin_m = dataArrivoMin.getMonth() +1;
	var dataArrivoMin_a = dataArrivoMin.getFullYear();
	
	var dataPartenzaMin_g = dataPartenzaMin.getDate();
	var dataPartenzaMin_m = dataPartenzaMin.getMonth() +1;
	var dataPartenzaMin_a = dataPartenzaMin.getFullYear();

	var dataArrivo_g = document.Prenotaform.dataArrivo.value.substr(0,2);
	var dataArrivo_m = document.Prenotaform.dataArrivo.value.substr(3,2);
	var dataArrivo_a = document.Prenotaform.dataArrivo.value.substr(6,4);
	
	var dataPartenza_g = document.Prenotaform.dataPartenza.value.substr(0,2);
	var dataPartenza_m = document.Prenotaform.dataPartenza.value.substr(3,2);
	var dataPartenza_a = document.Prenotaform.dataPartenza.value.substr(6,4);
	

	if (ctlDateToPlace.name == 'dataArrivo'){
		if ((Date.UTC(dataArrivo_a,dataArrivo_m,dataArrivo_g,00,00,00) - Date.UTC(dataArrivoMin_a,dataArrivoMin_m,dataArrivoMin_g,00,00,00)) < 0){
			dataArrivo_a = dataArrivoMin_a;
			dataArrivo_m = dataArrivoMin_m;
			dataArrivo_g = dataArrivoMin_g;
			
			var dataArrivo = new Date();
			dataArrivo.setDate(dataArrivo_g);
			dataArrivo.setMonth(dataArrivo_m -1);
			dataArrivo.setYear(dataArrivo_a);
			giorno = dataArrivo.getDate();
			if (giorno < 10){giorno = "0" + giorno};	
			mese = dataArrivo.getMonth() +1;
			if (mese < 10){mese = "0" + mese};
			document.Prenotaform.dataArrivo.value = giorno + '.' + mese + '.' + dataArrivo.getFullYear();
		}
	}
	else{
		if ((Date.UTC(dataPartenza_a,dataPartenza_m,dataPartenza_g,00,00,00) - Date.UTC(dataPartenzaMin_a,dataPartenzaMin_m,dataPartenzaMin_g,00,00,00)) < 0){
			dataPartenza_a = dataPartenzaMin_a;
			dataPartenza_m = dataPartenzaMin_m;
			dataPartenza_g = dataPartenzaMin_g;
			
			var dataPartenza = new Date();
			dataPartenza.setDate(dataPartenza_g);
			dataPartenza.setMonth(dataPartenza_m -1);
			dataPartenza.setYear(dataPartenza_a);
			giorno = dataPartenza.getDate();
			if (giorno < 10){giorno = "0" + giorno};	
			mese = dataPartenza.getMonth() +1;
			if (mese < 10){mese = "0" + mese};
			document.Prenotaform.dataPartenza.value = giorno + '.' + mese + '.' + dataPartenza.getFullYear();
		}	
	}
	
	if ((Date.UTC(dataPartenza_a,dataPartenza_m,dataPartenza_g,00,00,00) - Date.UTC(dataArrivo_a,dataArrivo_m,dataArrivo_g,00,00,00)) < minDiff){
		if (ctlDateToPlace.name == 'dataArrivo'){
			var dataArrivo = new Date();
			dataArrivo.setDate(dataArrivo_g);
			dataArrivo.setMonth(dataArrivo_m -1);
			dataArrivo.setYear(dataArrivo_a);
			
			var dataPartenza = DayAdd(dataArrivo, 1);
			
			giorno = dataPartenza.getDate();
			if (giorno < 10){giorno = "0" + giorno};	
			mese = dataPartenza.getMonth() +1;
			if (mese < 10){mese = "0" + mese};
			document.Prenotaform.dataPartenza.value = giorno + '.' + mese + '.' + dataPartenza.getFullYear();
			
		}
		else{
			var dataPartenza = new Date();
			dataPartenza.setDate(dataPartenza_g);
			dataPartenza.setMonth(dataPartenza_m -1);
			dataPartenza.setYear(dataPartenza_a);
			
			var dataArrivo = DayAdd(dataPartenza, -1);
			
			giorno = dataArrivo.getDate();
			if (giorno < 10){giorno = "0" + giorno};	
			mese = dataArrivo.getMonth() +1;
			if (mese < 10){mese = "0" + mese};
			document.Prenotaform.dataArrivo.value = giorno + '.' + mese + '.' + dataArrivo.getFullYear();
		}
	}
	
	numDays = CountDays(document.Prenotaform.dataArrivo, document.Prenotaform.dataPartenza);
	document.Prenotaform.NumPernott.value = numDays;
	
}


/* *** Funktionen zur Filterung von Eingabefehlern *** */
	
/* prueft, ob Radiobutton/Checkbox - Gruppe angeklickt */
	function okRadioCheck(gruppe, num, hinweis){
	var i;
	var ok = false;
		for(i=0; i < num; i++){
			if (gruppe[i].checked){ok = true}
		}
		if (ok == false){alert(hinweis); gruppe[0].focus(); return false}
	}

/* mod */	
	function modulo(z, n){
	var h, res;
		h = Math.floor(z / n);
		res = z - (h * n);
		return res
	}
	
/* Zahl auf Gueltigkeit pruefen */
	function istKeinePositiveZahl(zahl, feld, hinweis){
		if ((isNaN(zahl) == true) || (zahl <= 0)){
			alert(hinweis); feld.focus(); return false
		}
	}	


/* Zahl auf Gueltigkeit innerhalb Intervall pruefen */
	function istKeineZahl(zahl, ini, end, feld, hinweis){
		if ((zahl == "")  || (isNaN(zahl) == true) || (zahl < ini) || (zahl > end)){
			alert(hinweis); feld.focus(); return false
		}
	}	

/* Aktuelles Datum*/
	function getToday()
	     {
	      var Jetzt = new Date();
	      var Tag = Jetzt.getDate();
	      var Monat = Jetzt.getMonth();
	      var Jahr = Jetzt.getYear();
	      alert(Jahr + "-" + Monat + "-" + Tag);
	     }
	
/* prueft, ob Textfeld oder -bereich nicht leer */
    function okTextEingabe(feld, hinweis){
     	if (feld.value == ""){alert(hinweis); feld.focus(); return false}
	}

/* Parser fuer Zimmertyp*/
	function okCamera(tipo, num_camere){
	var t = tipo.value;
	var nc = num_camere.value;
	var camOk = true;
		if (t == 'niente'){
			alert(document.Prenotaform.corr_tipocamera.value);
			tipo.focus();
			return false;
		}
		if (nc == 'niente'){
			alert(document.Prenotaform.corr_camere.value);
			num_camere.focus();
			return false;
		}

		if (camOk == false){alert(errormess); gebT.focus(); return false}

	}	

	
/* Auswahlliste<->"Anders"-Feld pruefen */
	function checkComboOther(combo, anders, hinweis1, hinweis2){
	var last = combo.length - 1;
		if ((combo.options[last].selected) && (anders.value == "")){
			alert(hinweis1); anders.focus(); return false
		}
		else if((combo.options[last].selected == false) && (anders.value != "")){
			alert(hinweis2); combo.focus(); return false
		}
	}
	

/*e-mail Parser*/
	function parseEmail(email){
		var em = email;
		var i, j;
		
		if (em.length < 6) {return false};
		
		if (em.indexOf("@") == -1){return false}
		else{
			if (em.indexOf("@") != em.lastIndexOf("@")){return false}
		}
		if (em.indexOf("@") < 1){return false}
		if (em.length - em.indexOf("@") < 5){return false}
		
		if (em.indexOf(".") == -1){return false}
		else{
			if (em.indexOf("@") > em.lastIndexOf(".")){return false}
		}
		if (em.charAt(em.indexOf("@") - 1) == "."){return false}
     	if (em.charAt(em.indexOf("@") + 1) == "."){return false}		
		if (em.charAt(0) == "."){return false}
		if (em.length - em.lastIndexOf(".") < 3){return false}
		if (em.length - em.lastIndexOf(".") > 4){return false}

		j = em.lastIndexOf(".");		
		for (i=0; i < j; i++){
			if (em.charAt(i) > "z"){return false}
			if (em.charAt(i) == "`"){return false}
			if ((em.charAt(i) > "Z") && (em.charAt(i) < "_")){return false}
			if ((em.charAt(i) > "9") && (em.charAt(i) < "?")){return false}
			if (em.charAt(i) == "/"){return false}
			if ((em.charAt(i) > "&") && (em.charAt(i) < "-")){return false}
			if (em.charAt(i) < "!"){return false}
		}
		j++;
		for (i = j; i < em.length; i++){
			if (em.charAt(i) > "z"){return false}
			if ((em.charAt(i) > "Z") && (em.charAt(i) < "a")){return false}
			if (em.charAt(i) < "A"){return false}
		}
		return true;
	}
	
	
	function checkEmail(input, errormess){
		if (input.value == ""){return true}
		if (parseEmail(input.value) == false){
			alert(errormess);
			input.focus();
	        return false;
		}
	}

/*URL Parser*/
	function parseURL(){
		var url = document.Prenotaform.M_UrlP.value;
		var i;
		if (url.charAt(0) != "h"){return false}
		if (url.charAt(1) != "t"){return false}
		if (url.charAt(2) != "t"){return false}
		if (url.charAt(3) != "p"){return false}
		if (url.charAt(4) != ":"){return false}
		if (url.charAt(5) != "/"){return false}
		if (url.charAt(6) != "/"){return false}
		for (i = 7; i < url.length; i++){
			if (url.charAt(i) == " "){return false}
		}

		return true;
	}
		
	function checkURL(){
		if (document.Prenotaform.M_UrlP.value == ""){return true}
		if (parseURL() == false){
			alert("Incorrect input.\nThe homepage - URL must start with\n\nhttp://\n\nand must not contain any blanks.")
			document.Prenotaform.M_UrlP.focus();
	        return false;
		}
	}
	
	
/* *** Funktionen zur Formatierung der Templates *** */

/*Aktuelles Datum und Zeit ermitteln und formatieren*/
	function aktuelleZeit(){
	var Wtag, Tag, Monat, Jahr;
	var Stunde, Minuten, GMZdiff;
	var res, resGMZdiff;
	var GMZrest = "00(GMZ DST)";
	var minFormat;
	var jetzt = new Date();
	var weekdays = new Array("Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato")

		Wtag = jetzt.getDay(); Tag = jetzt.getDate(); Monat = jetzt.getMonth() + 1; Jahr = jetzt.getYear();
		if(Jahr < 100) Jahr+=1900;
		Stunde = jetzt.getHours(); Minuten = jetzt.getMinutes(); GMZdiff = - (jetzt.getTimezoneOffset()/60);
		if (Minuten < 10){Minuten = "0" + Minuten};
		if (GMZdiff < 0){resGMZdiff = " -"}else{resGMZdiff = "   +"};
		resGMZdiff = resGMZdiff + Math.abs(GMZdiff) + GMZrest;
		/*res = "Data: " + weekdays[Wtag] + ", " + Tag + "." + Monat + "." + Jahr;*/
		res = "Ora della prenotazione: " + Stunde + "." + Minuten + resGMZdiff;
		document.Prenotaform.conf_datapren.value = res
	}
		

/*Anrede fuer Antwort-Template ermitteln*/
	function setAnrede(){
	var index = document.Prenotaform.M_Faml.selectedIndex;  	
		if(document.Prenotaform.M_Gesl[0].checked){ // wenn weiblich
			if (index == 2){ // wenn verheiratet:
				document.Prenotaform.M_Anre.value = "Dear Mrs.";
			}else{
				document.Prenotaform.M_Anre.value = "Dear Ms.";
			}
		}else{document.Prenotaform.M_Anre.value = "Dear Mr."}  
	}
	

/*URL formatieren*/ 
	function formatURL(){
		if (document.Prenotaform.M_UrlP.value == "http://"){document.Prenotaform.M_UrlP.value = ""}
	}

/*Formatiert mehrzeiliges Textfeld*/
	function formatTextfeld(feld, cr){
		if (feld.value == ""){feld.value = "[non specificato]"}
		if (cr){feld.value = "\n" + feld.value}
	}

	
	function getInputNames(){
		var res=""
		var l = document.Prenotaform.elements.length;
		for (i=0; i<l; i++){
			res += "\n" + document.Prenotaform.elements[i].name;
		}
		document.Prenotaform.M_Wann.value = res;
	}


/*Zimmerbestellung-Details formatieren*/
	function formattaCamere(){
		var camere = document.Prenotaform.camere;
		var tipocamera = document.Prenotaform.tipocamera;
		var prezzocamera = document.Prenotaform.CameraPrezzo;

		var i = 0;
		var camC;
		var res = "";
	
		for (camC=0; camC<3 ; camC++){
			if (camere[camC].value != "niente"){
				i += 1;
				res += "Camera tipo " + i + ":   " + camere[camC].value + " x " + tipocamera[camC].value + ", Euro " + prezzocamera[camC].value + "\n";
			}
		}
		document.Prenotaform.mail_TipoCamera.value = res;
	}
	
/*Zimmerbestellung-Details f. Kunde formatieren*/
	function formattaCamereCliente(lingua){
		var camere = document.Prenotaform.camere;
		var tipocamera = document.Prenotaform.tipocamera;
		var prezzocamera = document.Prenotaform.CameraPrezzo;

		var i = 0;
		var camC;
		var res = "";
		var tipocam = "";
		
		if (lingua == "ita") {tipocam = "Camera tipo ";}
		else if (lingua == "ger") {tipocam = "Zimmertyp ";}
		else if (lingua == "gbr") {tipocam = "Room type ";}		
	
		for (camC=0; camC<3 ; camC++){
			if (camere[camC].value != "niente"){
				i += 1;
				indSel = tipocamera[camC].selectedIndex;
				res += tipocam + i + ":   " + camere[camC].value + " x " + tipocamera[camC].options[indSel].text + ", Euro " + prezzocamera[camC].value + "\n";
			}
		}
		document.Prenotaform.mail_TipoCameraCliente.value = res;
	}
	
	
	
	
/*  *** Main Function ***  */
	
	function elabForm(lingua){
		
		if (okTextEingabe(document.Prenotaform.cognome, document.Prenotaform.obb_cognome.value) == false){return false};
		if (okTextEingabe(document.Prenotaform.nome, document.Prenotaform.obb_nome.value) == false){return false};
		if (okTextEingabe(document.Prenotaform.email, document.Prenotaform.obb_email.value) == false){return false};
		if (checkEmail(document.Prenotaform.email, document.Prenotaform.corr_email.value) == false){return false};
		
		if (okTextEingabe(document.Prenotaform.telefono, document.Prenotaform.obb_telefono.value) == false){return false};		
		
		/*if (okDate(document.Prenotaform.arrivo_g, document.Prenotaform.arrivo_m, document.Prenotaform.arrivo_a, document.Prenotaform.corr_data.value) == false){return false};*/
		/*if (okDate(document.Prenotaform.partenza_g, document.Prenotaform.partenza_m, document.Prenotaform.partenza_a, document.Prenotaform.corr_data.value) == false){return false};*/
		/*if (controlDates() == false){return false};*/
		
		if (okCamera(document.Prenotaform.tipocamera[0], document.Prenotaform.camere[0]) == false){return false};
		
		formattaCamere();
		formattaCamereCliente(lingua);
				
		/*if (okRadioCheck(document.Prenotaform.M_Gesl, 2, "Please indicate your sex.") == false){return false};*/
		/*if (okRadioCheck(document.Prenotaform.M_SpeM, 3, "Please choose one out of the 3 possible answers.") == false){return false};	*/
		/*if (checkComboOther(document.Prenotaform.M_Land, document.Prenotaform.M_AndL, "You have selected \"Other\" in the \"Country\" selection list.\nPlease insert a country into the \"Other\" field.", "You have selected a country in the \"Country\" selection list\nand also inserted a value into the \"Other\" field.\nPlease correct your input.") == false)
			{return false};*/
		/*if (checkSpendenInfo()== false){return false};*/
		
/*
		aktuelleZeit();
		formatTextfeld(document.Prenotaform.commento, false);
*/		
		/*setAnrede();*/		
		/*formatURL();*/
			
	}
	
//-->