// modified by radu.ilies @ tehostaja
// v.2011-11-11 r.3

var selectedHotelID = 0;
var dt = new Date();
var selectedMonth = dt.getMonth();
var selectedYear = dt.getFullYear();
var calendarMonth=new Date(selectedYear,selectedMonth,15);
var priceDays = [  ];
var nonVacantDays = [ ];
var selectedStartDate;
var selectedEndDate;
var differnceOfDays = 0;
var displayPricesTimerId = null;
var selectMenu;
var numberOfRooms;
var isDateChanged = false;
var offeredHotelID;
var offeredHotelLongitude;
var offeredHotelLatitude;
var userSelectedLocale;
var danishCountryHotelId = 225;
var currencyCode = new Array();

var localizedShortMonthStrings = new Array();
localizedShortMonthStrings[0]="Jan";
localizedShortMonthStrings[1]="Feb";
localizedShortMonthStrings[2]="Mar";
localizedShortMonthStrings[3]="Apr";
localizedShortMonthStrings[4]="May";
localizedShortMonthStrings[5]="Jun";
localizedShortMonthStrings[6]="Jul";
localizedShortMonthStrings[7]="Aug";
localizedShortMonthStrings[8]="Sep";
localizedShortMonthStrings[9]="Oct";
localizedShortMonthStrings[10]="Nov";
localizedShortMonthStrings[11]="Dec";

$(document).ready(function() {

	$("select[ name^=hotel] ").bind('change', changeHotel);
	$("select[ name^=room] ").bind('change', changeRoom);
	numberOfRooms = document.getElementById("room_count").value;

	$('#notification-beginreservation').hide();

	$('#datepicker').datepick({minDate: -1, maxDate: '+2Y', rangeSelect: true, altField: '#Range', changeMonth: false, changeYear: false, currentText: '',
		dateFormat: 'mm/dd/yy', onHover: onHowerDates , onSelect: onSelectDateRange, onChangeMonthYear: onMonthChange,
		 beforeShowDay: disableDays});

	getLoggedInUserFirstname();
	initQuickSummaryPanel();
});

function getLoggedInUserFirstname(){
	document.getElementById("bookingManagementDiv").style.display = "block";
	$.getJSON("/reservation/ws/rs/hotelresource/getLoggedInUserFirstname", {
		randomnumber: Math.random()
	}, function(json){

		if(json != null){
			if(json.string != ""){
				document.getElementById("userInformationDiv").style.display = "block";
			 	document.getElementById("bookingManagementDiv").style.display = "none";
			}else{
				document.getElementById("bookingManagementDiv").style.display = "block";
				document.getElementById("userInformationDiv").style.display = "none";
			}
		}
	});
}

function getCurrencyCode() {
	return currencyCode[selectedHotelID];
}

// Display single day price when user mouse over on calendar for single day
function onHowerDates(value, date) {
	var str = value.split("/");
	var localizedMonth= $.datepick._defaults["monthNamesShort"][parseInt(str[0])-1];
	var displayValue = str[1] + " " + localizedMonth + " " + str[2];
	if(date == null) { return [true, ''];  }
	for (i = 0; i < priceDays.length; i++) {
		var priceOnDate = priceDays[date]	;
    	if (priceOnDate != undefined) {
    		$('#price_summary_date').text(displayValue + "........................... ");
    		$('#price_summary_price').text(roundNumber(priceOnDate,2) + " " + getCurrencyCode());
    		return [false, priceOnDate + '_day'];
        }
    }
    return [true, ''];
}

function onMonthChange(year, month) {
	selectedMonth = month-1;
	selectedYear = year;
	calendarMonth=new Date(selectedYear,selectedMonth,15);
	scheduleLoadCalendar(0);
}

function disableDays(date) {
    if (selectedStartDate != null && date.getTime() == selectedStartDate.getTime()) {
        return [true, 'datepick-arrival'];
    }

    if (selectedEndDate != null && date.getTime() == selectedEndDate.getTime()) {
            return [true, 'datepick-departure'];
    }

    for (i = 0; i < nonVacantDays.length; i++) {
        if (date.getTime() == nonVacantDays[i].getTime()) {
                return [true, 'datepick-selectable'];
        }
    }
    return [true, ''];
}

function onSelectDateRange(value, date){
	if (date[1] < date[0]) {
		tmp = new Date(date[0]);
		date[0] = date[1];
		date[1] = tmp;
		$('#datepicker').datepick('setDate', date[0], date[1]);
	}
	if (date[0] == date[1]) { // first click
		date[1] = new Date(date[0]);
		date[1].setDate(date[1].getDate()+1);
		$('#datepicker').datepick('setDate', date[0], date[1]);
	}

	selectedStartDate = new Date(date[0]);
	selectedEndDate = new Date(date[1]);
	isDateChanged = true;

	scheduleDisplayPrices();
}

var loadCalendarTimerId = null;
function scheduleLoadCalendar(displayPricesCall)
{

	if(null != loadCalendarTimerId)
	{
		clearTimeout(loadCalendarTimerId);
	}
	loadCalendarTimerId = setTimeout("loadCalendar(" + displayPricesCall + ")", 200);
}

function scheduleDisplayPrices()
{
	if(null != displayPricesTimerId)
	{
		clearTimeout(displayPricesTimerId);
	}
	displayPricesTimerId = setTimeout('displayPrices()', 200);
}

/*
function roundNumber(num, dec) {
	var rem = num % 100;
	var result = Math.floor(num/100)+"."+(rem < 10 ? "0":"") + rem;
	return result;
}
*/
// fixed by Mikkel Steen Andersen on 2011-11-09
function roundNumber(num, dec) {
	dec = parseInt(dec);
	if (isNaN(dec) || isNaN(num)) return 'error';
	return Math.round((num/100)*Math.pow(10,dec))/Math.pow(10,dec);
}

function changeHotel(){

	selectedEndDate = new Date(selectedStartDate);
	selectedEndDate.setDate(selectedEndDate.getDate()+1);

	$('#datepicker').datepick('setDate', selectedStartDate ,selectedEndDate);
	selectedHotelID = this.value;
	scheduleLoadCalendar(1);
}

function changeRoom(){
	numberOfRooms = this.value;
	scheduleLoadCalendar(1);
}

function initQuickSummaryPanel(){

	selectedStartDate = new Date();
	selectedEndDate = new Date(selectedStartDate);
	selectedEndDate.setDate(selectedEndDate.getDate()+1);

	selectMenu = document.getElementById("hotel_code");
	userSelectedLocale=document.getElementById("locale").value;
	$.getJSON("/reservation/ws/rs/hotelresource/getAllHotelsGroupedByCountryAndCity", {
		randomnumber: Math.random(),userSelectedLocale: userSelectedLocale
	}, function(json){


		if (json.map.length > 0) {
			for (i = 0; i < json.map.length; i++) {
				var countryName = json.map[i][0];

				var countryElement = document.createElement("optgroup");
				countryElement.label = countryName;

				for (j = 0; j < json.map[i][1].length; j++) {
					var hotel = json.map[i][1][j];
					var optionElement = document.createElement("option");
					optionElement.value = hotel.id;
					optionElement.innerHTML = hotel.cityName + "," + hotel.streetAddress;
					countryElement.appendChild(optionElement);
					currencyCode[hotel.id] = hotel.currencyCode;
				}

				if (countryElement.hasChildNodes()) {
					selectMenu.appendChild(countryElement);
				}
			}
		}
		scheduleLoadCalendar(1);
	});
	document.getElementById("roomsAvailability").style.display = "none";
}

function loadCalendar(displayPriceCall) {
	loadCalendarTimerId = null;

	//on hotel change, hide all validation messages
	hideAllValidationErrors();
	   $.getJSON("/reservation/ws/rs/hotelresource/getQuickReservationCalendarByHotel",
		    	{hotel: selectedHotelID, calendarMonth: calendarMonth, numberOfRooms:numberOfRooms, randomnumber:Math.random()},
		    		function(json) {

		    			if(null == json || null == json.CalendarInfoDto.hotelId) {
							return;
						}
						if(selectedHotelID != json.CalendarInfoDto.hotelId){
							return;
						}

						nonVacantDays = [ ];
						priceDays = [ ];
						for(var i=0; i<json.CalendarInfoDto.nonVacantDates.length; i++){
							var strDate = json.CalendarInfoDto.nonVacantDates[i].iso;
							nonVacantDays[i] = new Date(Math.floor(strDate / 10000), Math.floor((strDate % 10000) / 100) - 1, strDate % 100, 0, 0, 0);
						}

						for(var j=0; j<json.CalendarInfoDto.dateWisePriceList.length; j++){
							var strDate = json.CalendarInfoDto.dateWisePriceList[j].date.iso;
							var d = new Date(Math.floor(strDate / 10000), Math.floor((strDate % 10000) / 100) - 1, strDate % 100, 0, 0, 0);
							priceDays[d] = json.CalendarInfoDto.dateWisePriceList[j].pricePerDate;
						}

		    			$('#datepicker').datepick('refresh');

						if(displayPriceCall == 1){
		    				displayPrices();
						}
		    		}
			);


	if (document.getElementById("roomsAvailability")) {
    		document.getElementById("roomsAvailability").style.display = "none";
    	}
}

function displayPrices(){
	displayPricesTimerId = null;

	var price = 0;
	var d = new Date(selectedStartDate);

	var sDate = (((selectedStartDate.getFullYear() * 100) +
			(selectedStartDate.getMonth() + 1)) * 100) +
			selectedStartDate.getDate();
	var eDate = (((selectedEndDate.getFullYear() * 100) +
			(selectedEndDate.getMonth() + 1)) * 100) +
			selectedEndDate.getDate();

	$.getJSON("/reservation/ws/rs/hotelresource/displayQuickReservationPrices",
	    	{hotelID: selectedHotelID, numberOfRooms:numberOfRooms, startDate:sDate,endDate:eDate,randomnumber:Math.random(),userSelectedLocale: userSelectedLocale},
	    		function(json) {

	    		var currentHotel = json.list[0];
	    		var offeredHotel = json.list[1];

	    		if(currentHotel.id == selectedHotelID){
				{
						var selectedDatePrices = currentHotel.selectedDateRangePrices;

						var pricedatahtml = "";
						var numberOfDays = selectedDatePrices.length;
						var totalPrice = 0;
						for(var i = 0;i < selectedDatePrices.length;i++) {
							pricedatahtml += selectedDatePrices[i].localizedDate + "&nbsp; X &nbsp;" + numberOfRooms +
									"&nbsp; = &nbsp;" + roundNumber(selectedDatePrices[i].pricePerDate,2) + " " + getCurrencyCode() + "<br/>";
							totalPrice += parseInt(selectedDatePrices[i].pricePerDate);
						}
						document.getElementById("date_price").innerHTML = pricedatahtml;
				}
				totalPrice = roundNumber(totalPrice,2);
				document.getElementById("total_price").innerHTML = totalPrice + " " + getCurrencyCode();

				if(isDateChanged){
					//offeredHotelId = -1 hotel is vacant selected date range so no need to offer hotel
					//offeredHotelId =  0 hotel is not vacant and no other hotel is NOT found to offer
					//offeredHotelId = $hotelID hotel is not vacant so other hotel is found to offer

					if(currentHotel.offeredHotelId == 0){
						document.getElementById("popUpHotelNotVacant").style.display="block";
						document.getElementById("messagewindow").style.display="block";
					}
					if(currentHotel.offeredHotelId != 0 && currentHotel.offeredHotelId != -1){
						offeredHotelID = offeredHotel.id;
						offeredHotelLongitude = offeredHotel.longitude;
						offeredHotelLatitude = offeredHotel.latitude;
						document.getElementById("offeredHotelDetails").innerHTML = offeredHotel.streetAddress + "," + offeredHotel.areaCode;
						document.getElementById("hotelNameForMap").innerHTML = offeredHotel.hotelName + " - " + offeredHotel.streetAddress + "," + offeredHotel.areaCode;
						document.getElementById("popUpOfferAnotherHotel").style.display="block";
						document.getElementById("messagewindow").style.display="block";
					}
				}

    			}
      		}
		);

	document.getElementById("roomsAvailability").style.display = "none";
}

function submitQRForm(locale){
	var selectedHotel = document.getElementById('hotel_code').value;
	var discountCode = document.getElementById('discount_code').value;
	if (selectedHotel.length < 1) {
		$('#hotel_code').css('border', '2px solid #ed1c24');
		$('#qr-error').show();

		document.getElementById("invalidHotel").style.display = "block";
		document.getElementById("invalidDiscountCode").style.display = "none";
		document.getElementById("roomsAvailability").style.display = "none";
		return false;
	}

	var sDate = (((selectedStartDate.getFullYear() * 100) +
			(selectedStartDate.getMonth() + 1)) * 100) +
			selectedStartDate.getDate();
	var eDate = (((selectedEndDate.getFullYear() * 100) +
			(selectedEndDate.getMonth() + 1)) * 100) +
			selectedEndDate.getDate();

	$.getJSON("/reservation/ws/rs/reservationsessionresource/saveQuickReservation",
			{hotelID: selectedHotelID, numberOfRooms:numberOfRooms, startDate:sDate, endDate:eDate, discountCode:discountCode, randomnumber:Math.random()},
	    		function(json) {

				if(json.string == "INVALID_DISCOUNT") {
					document.getElementById("qr-error").style.display = "block";
					document.getElementById("invalidDiscountCode").style.display = "block";
					document.getElementById("invalidHotel").style.display = "none";
					document.getElementById("roomsAvailability").style.display = "none";
				}
				else if(json.string != "0"){
					document.getElementById("qr-error").style.display = "none";
					document.getElementById("roomsAvailability").style.display = "none";
					document.getElementById("invalidDiscountCode").style.display = "none";
					document.getElementById("invalidHotel").style.display = "none";
					document.getElementById("quickReservationId").value = json.string;
					document.forms["quickReservationForm"].submit();
	    		} else {
					document.getElementById("qr-error").style.display = "block";
					document.getElementById("roomsAvailability").style.display = "block";

					document.getElementById("invalidHotel").style.display = "none";
					document.getElementById("invalidDiscountCode").style.display = "none";
	    		}
      		}
		);
}


function addHiddenInput(form, name, value) {
	var el = document.createElement("input");
	el.type = "hidden";
	el.name = name;
	el.id = name;
	el.value = value;
	form.appendChild(el);

}

function hidepopUpHotelNotVacant() {
	document.getElementById("popUpHotelNotVacant").style.display="none";
	document.getElementById("messagewindow").style.display="none";
}

function hidepopUpOfferAnotherHotel(){
	document.getElementById("popUpOfferAnotherHotel").style.display="none";
	document.getElementById("messagewindow").style.display="none";
}

function selectOfferedHotel(){
	var sel = document.getElementById("hotel");
	var newValue = offeredHotelID;

	fireChangeHotelEvent(sel, newValue);
	document.getElementById("popUpOfferAnotherHotel").style.display="none";
	document.getElementById("messagewindow").style.display="none";
}


function fireChangeHotelEvent(sel, changeHotelId){

	for (var i=0; i< sel.options.length; i++){
        if (sel.options[i].value == changeHotelId){
                sel.options[i].selected = true;
                break;
        }
	}

	if(sel.fireEvent){
		sel.fireEvent('onchange');
	}
	if(document.createEvent)
	{
		var evt = document.createEvent('HTMLEvents');
		if(evt.initEvent){
			evt.initEvent('change', true, true);
		}
		if(sel.dispatchEvent){
			sel.dispatchEvent(evt);
		}
	}
}

function createMarker(point,name,html) {
    var marker = new GMarker(point);
    GEvent.addListener(marker, "click", function() {
      marker.openInfoWindowHtml(html);
    });
    return marker;
}

function makeOfferedHotelLargeMap() {
	if (GBrowserIsCompatible()){
  		document.getElementById("popUpLargeMap").style.display="block";
  		document.getElementById("messagewindow").style.display="block";
  		mapHotel = new GMap(document.getElementById("largeMap"));
  		mapHotel.enableScrollWheelZoom();
  		mapHotel.enableContinuousZoom();
		mapHotel.centerAndZoom(new GPoint(offeredHotelLongitude,offeredHotelLatitude), 2);
		var point = new GPoint(offeredHotelLongitude,offeredHotelLatitude);
		var marker =createMarker(point,'Hotel',document.getElementById("hotelNameForMap").innerHTML);
		mapHotel.addOverlay(marker);
	}
}

function hideLargerMap(){
	document.getElementById("popUpLargeMap").style.display="none";
}

function hideAllValidationErrors(){
	$('#hotel_code').css('border', '1px solid #999999');
	document.getElementById("hotel_code").className = " MyClass";
	document.getElementById("qr-error").style.display = "none";
	document.getElementById("invalidHotel").style.display = "none";
	document.getElementById("invalidDiscountCode").style.display = "none";
	document.getElementById("roomsAvailability").style.display = "none";
}
