// [MODULE-HEADER]
// *************************************************************************************************
//
// Name:				ShoWareFrontEndSkiTicket.js
//
// Created:			13/10/2009 VisionOne AG, St. Gallen lbo
// Modified:		13/10/2009 VisionOne AG, St. Gallen lbo	: Creation
//
// *************************************************************************************************

var resortsControl;
var calendarControl;
var ticketDefinitionsControl;
var categoriesPanel;
var categoriesControls;
var panelToBlockControl;
var totalPriceControl;

var keepBlocked = false;
var blockUICustomMessage = null;
var tabControls;
var tabContentControls;
var resortInfoBoxes;
var resortImagesControl;

//----------------------------------------------------------------------------------------------------------
//	Page initializations.
//----------------------------------------------------------------------------------------------------------
$(document).ready(function(){

	// initialize controls variables
	calendarControl = $('#SkiTicket_Calendar');
	resortsControl = $(".SkiTicket_ResortList");
	ticketDefinitionsControl = $("#SkiTicket_TicketDefinitions");
	categoriesPanel = $('#SkiTicket_CategoriesPanel');
	categoriesControls = $('.SkiTicket_CategoriesSelected');
	panelToBlockControl = $('#SkiTicket_BlockContent');
	tabControls = $('ul.tabs a');
	tabContentControls = $('.TabContent');
	resortInfoBoxes = $('#SkiTicket_ResortInfoBoxes');
	resortImagesControl = $('#SkiTicket_ResortImages');
	// set up the controls
	calendarControl.datepicker({ 
		altField: '#txtDate', 
		altFormat: "mm/dd/yy",
		hideIfNoPrevNext: true,
		monthNames: monthNames,
		monthNamesShort: monthNamesShort,
		dayNames: dayNames,
		dayNamesShort: dayNamesShort,
		dayNamesMin: dayNamesMin,
		prevText: label_previous,
		nextText: label_next,
		onSelect: function(dateText, datePickerInstance) {
			refreshCategories();
			}
		});
	resortsControl.change( onResortChanged );
	ticketDefinitionsControl.change( refreshCategories );
	tabControls.click( function() {
		tabControls.removeClass('active');
		$(this).addClass('active');
		tabContentControls.hide();
		tabContentControls.filter('#' + $(this).attr('tabContentName')).show();
		return false;
	}).eq(1).addClass('active');
	// set up the UI for ajax requests
	$().ajaxStart(function() {
		var msg;
		if (blockUICustomMessage != null)
		{
			msg = blockUICustomMessage;
			blockUICustomMessage = null;
		}
		else
			msg = message_loadingresortdata;
		panelToBlockControl.block({ message: '<h3 class="Loading"><div align="center" width="100%"><table><tr><td><img src="../image/loading.gif"></td><td>' + msg + '</td></tr></table></div></h3>' });
		});

	$().ajaxStop(function() {
		if (!keepBlocked)
			panelToBlockControl.unblock();
		});
	
	// ensure the proper pre-selected resort (if any) is shown.
	//onResortChanged();
	if (startingResortID && startingResortID > 0)
		resortsControl.val(startingResortID);
	resortsControl.change();
	
	// once everything is set up, show the whole content.
	$("#SkiTicket_Content").show();
});

//----------------------------------------------------------------------------------------------------------
//	onResortChanged
//	Gets the ticket definitions (1 day pass, 2 days pass, etc.) from the server for the selected resort.
//----------------------------------------------------------------------------------------------------------
function onResortChanged()
{
	hideCategories();
	var resortID = resortsControl.val();
	if (resortID)
	{
		var url = '?ACTION=getResort&PERFORMANCEID=' + resortID + 
					'&L=' + authenticationContext_currentCulture + 
					'&V=' + resortsCacheVersion;
		$.getJSON(url, function(resort) {
				if (resort && !resort.error)
				{
					$('#SkiTicket_ResortID').val(resort.id);
					$('#SkiTicket_ResortName').html(resort.name);
					$('#SkiTicket_ResortDescription').html(resort.description);
					$('#SkiTicket_ResortPricing').html(resort.pricing);
					$('#SkiTicket_ResortPanoramicMap').html(resort.panoramicMap);
					$('#SkiTicket_ResortImage').attr('src', resort.imageUrl);
					calendarControl.datepicker('option', 'minDate', resort.start);
					calendarControl.datepicker('option', 'maxDate', resort.end);
					ticketDefinitionsControl.html("");
					if (resort.ticketDefinitions)
						$.each(resort.ticketDefinitions, function(){
							ticketDefinitionsControl.append($("<option></option>").val(this.id).html(this.name));
						});

					if (startingDate && startingDate >= resort.start && startingDate <= resort.end)
					{
						calendarControl.datepicker('setDate', startingDate);
						// sets it only the first time
						startingDate = null;
					}
					if (startingTicketDefinitionID)
						ticketDefinitionsControl.val(startingTicketDefinitionID);
					refreshCategories();
					
					resortInfoBoxes.empty();
					$.each(resort.infoBoxes, function(){
						var title = $('<div class="ResortBoxTitle" />').html(this.title);
						var content = $('<div class="ResortBoxText" />').html(this.content);
						var box = $('<div class="ResortBox" />').append(title).append(content);
						resortInfoBoxes.append(box);
					});
					
					resortImagesControl.empty();
					$('.SkiTicket_ResortSelected').show();

					if (resort.images.length > 0)
					{
						var imagesList = $('<ul class="ResortImages"></ul>');
						$.each(resort.images, function(){
							imagesList.append($('<li></li>').append($('<img src="' + this + '">')));
						});
						
						resortImagesControl.append(imagesList);
					
						resortImagesControl.show()
					}
					else
						resortImagesControl.hide()
					
				}
				else 
				{
					$('.SkiTicket_ResortSelected').hide();

					if (resort && resort.error) 
						alert('[' + resort.error + ']:' + resort.errorMessage);
				}
			});
	}
	else
		$('.SkiTicket_ResortSelected').hide();
}

function refreshCategories()
{
	var resortID = resortsControl.val();
	var date = $('#txtDate').val();
	var ticketDefinitionID = ticketDefinitionsControl.val();
	if (resortID && date && ticketDefinitionID)
	{
		var url = '?ACTION=getCategories&PERFORMANCEID=' + resortID + 
					'&DATE=' + date + 
					'&TICKETDEFINITIONID=' + ticketDefinitionID + 
					'&L=' + authenticationContext_currentCulture +
					'&V=' + resortsCacheVersion;
		blockUICustomMessage = message_gettingresortprices;
		categoriesPanel.load(url, function(responseText, textStatus, XMLHttpRequest) {
			$('.SkiTicket_AddToBasket', this).click(function(){
				onAddToBasketClicked();
				return false;
				});
			totalPriceControl = $('#SkiTicket_TotalPrice', this);
			$('.SkiTicket_Quantity', this).change( updateTotal );
			updateQuantities();			
			updateTotal();
			categoriesPanel.show();
			categoriesControls.show();
			});
	}
	else
		hideCategories();
}

function hideCategories()
{
	categoriesPanel.hide();
	categoriesControls.hide();
}

function goToBasket()
{
	window.location = NAVIGATIONHELPER_ShoWareFrontEndBasket;
}

function onAddToBasketClicked()
{
	var rows = $('.SkiTicket_BookingData', categoriesPanel);
	var postData = '';
	var index;
	var totalQuantity = 0;
	for (index = 0; index < rows.length; index++)
	{
		if (postData.length > 0)
			postData += '&';
		postData += 'PriceCategoryID' + (index + 1) + '=' + $('.SkiTicket_PriceCategoryID', rows[index]).val();
		postData += '&Price' + (index + 1) + '=' + $('.SkiTicket_Price', rows[index]).val();
		var qtyControl = $('.SkiTicket_Quantity', rows[index]);
		var qty = parseInt(qtyControl.val(), 10);
		if (!isNaN(qty) && (qty > 0))
			totalQuantity += qty;
		postData += '&Quantity' + (index + 1) + '=' + qtyControl.val();
	}
	if (totalQuantity > 0)
	{
		var resortID = resortsControl.val();
		var date = $('#txtDate').val();
		var ticketDefinitionID = ticketDefinitionsControl.val();
		var url = '?ACTION=addToBasket&PERFORMANCEID=' + resortID + 
					'&DATE=' + date + 
					'&TICKETDEFINITIONID=' + ticketDefinitionID + 
					'&L=' + authenticationContext_currentCulture +
					'&V=' + resortsCacheVersion;
		$.post(url, postData, function(data) {
				if (data)
				{
					if(data.ok)
					{
						keepBlocked = true;
						panelToBlockControl.block({ message: '<h3><img src="../image/loading.gif"><span style="font-size:0.8em">&nbsp;&nbsp;' + message_redirectingtobasket + '</span></h3>' });
						goToBasket();
					}
					else
					{
						if (data.errorMessage)
							alert(data.errorMessage);
					}
				}
			}, "json");
	}
	else
	{
		alert(message_noticketsselected);
	}
}

function updateTotal()
{
	var rows = $('.SkiTicket_BookingData', categoriesPanel);
	var total = 0;
	$.each(rows, function() {
		var qtyControl = $('.SkiTicket_Quantity', this);
		var qty = parseInt(qtyControl.val(), 10);
		if (!isNaN(qty) && (qty > 0))
		{
			var priceControl = $('.SkiTicket_Price', this);
			total += (qty * parseFloat(priceControl.val()));
		}
	});
	totalPriceControl.text(total.toFixed(2));
}


function updateQuantities()
{
	if (startingCategories == null)
		return;
		
	var rows = $('.SkiTicket_BookingData', categoriesPanel);
	$.each(rows, function() {
		var qtyControl = $('.SkiTicket_Quantity', this);
		var categoryControl = $('.SkiTicket_PriceCategoryID', this);
		if (qtyControl && categoryControl)
		{
			var categoryID = categoryControl.val();
			var index = 0;
			for (index = 0; index < startingCategories.length; index++)
			{
				var category = startingCategories[index];
				if (category.id == categoryID)
				{
					qtyControl.val(category.quantity);
					break;
				}
			}
		}
	});
}