// --- [start /site/booking_process.js] ---
/* ********************************************************* */
// initMonthCalendar function - this function is called when a page loads to 
// pre-populate the month calendar table
/* ********************************************************* */

function eventProductInit() {
	hideFormSubmits();
	dropdownSubmit();
}

function eventAvailabilityInit() {
	initMonthCalendar();
	dropdownSubmit();
}

var basket;
function ticketAddToBasketInit() {
	basket = new Basket('ticketOrder');
	basket.getProduct();
}


// *********************************************************** //
// eventDate function - this function is called by the available 
// calendar cells to highlight the event date on the calendar and 
// writes the date onto the UI
// *********************************************************** //

function highlightDate(obj) {
	if (lm.e(selectCell)) {
		lm.e(selectCell).className='available';
	}
	
	var cellId = obj.id;
	var radioInputId = lm.e(cellId + '_radio');	
	radioInputId.checked = 'checked';
	obj.setAttribute('class','selected');
	obj.setAttribute('className','selected');
	selectCell = cellId;	
}


function initMonthCalendar() {	
	var calendar = lm.e('availabilityCalendar');
	var dateFields = calendar.getElementsByTagName('input');	
	for (var i = 0, j = dateFields.length; i < j; i++) {	
		if (dateFields[i].getAttribute('type') == 'radio') {
			var cell = dateFields[i].parentNode;			
			if (dateFields[i].checked == true) { 		
				cell.className = 'selected';
				this.selectCell = cell.id;
				highlightDate(cell);
				performanceDateLoad(cell); 
			} else {					
				cell.className = 'available'; 
			}				
			cell.onclick = function() {				
				highlightDate(this);
				performanceDateLoad(this);
			}
		}
	}
}

function performanceDateLoad(obj) {			
	// Load jsonDateObj data
	var date = lm.e(obj.id + '_radio').value;
	var dateString = jsonDateObj[date]['date'];
	var performanceTimes = jsonDateObj[date]['performanceTimes'];
	var startTime = (isTheatreResult) ? performanceTimes[performanceTimes.length-1]['time'] : performanceTimes[0]['time'];
	var tickets = (isTheatreResult) ? performanceTimes[performanceTimes.length-1]['tickets'] : performanceTimes[0]['tickets'];
	
	lm.e('eventDate').innerHTML = dateString;
	lm.e('ticketDate').innerHTML = dateString;	
	lm.e('eventTime').innerHTML = startTime;
	lm.e('ticketTime').innerHTML = startTime;
	
	setDateHiddenField(date);
	setTimeHiddenField(startTime);
	updateTickets(tickets);
	updateTimeSelect(performanceTimes);
}

function setDateHiddenField(date) {
	//Create a hidden field to pass the exact date if it doesn't exist or update it if it does
	var hiddenFields = lm.getElementsBy({
		parentNode:'ticketDetails',				
		tagName:'input'		
	});
	
	var exactDate = [];	
	lm.forEach(hiddenFields, function(item) {
		if (item.name == 'exactDate' && item.type == 'hidden') {
			exactDate.push(item);
			return;
		}
	});
	
	if (!(exactDate.length)) {	
		var hiddenField = lm.ce('input');
		hiddenField.setAttribute('type','hidden');
		hiddenField.setAttribute('name','exactDate');
		hiddenField.setAttribute('value', date);
		hiddenField.setAttribute('id', 'hiddenFieldDate');
		lm.append(hiddenField,lm.e('ticketDetails'));		
	} else if (lm.e('hiddenFieldDate') && exactDate.length == 1) {		
		lm.e('hiddenFieldDate').value = date;			
	}
}

function setTimeHiddenField(time) {		
	//Create a hidden field to pass the time if it doesn't exist or update the time if it does
	if (!(lm.e('hiddenFieldTime'))) {		
		var hiddenField = lm.ce('input');
		hiddenField.setAttribute('type','hidden');
		hiddenField.setAttribute('name','time');
		hiddenField.setAttribute('value', time);
		hiddenField.setAttribute('id', 'hiddenFieldTime');
		lm.append(hiddenField,lm.e('ticketDetails'));
	} else if (lm.e('hiddenFieldTime')) {		
		lm.e('hiddenFieldTime').value = time;			
	}
}

function resetTickets() {
	// Remove current rows from ticket availability table
	var tbodyTickets = lm.e('ticketsBody');
	while (tbodyTickets.firstChild) {
		tbodyTickets.removeChild(tbodyTickets.firstChild);
	}
}

function updateTickets(tickets) {	
	resetTickets();
	var availableText = 'available:';
	for ( var x = 0, y = tickets.length; x < y; x++) {
		var description = tickets[x].description;
		var availQuantity = tickets[x].availQuantity;
		availQuantity = (availQuantity > 20) ? "20+" : availQuantity;
		var price = currencyFormat(tickets[x].price, 'GBP' , 'en_GB',2);														
			
		//Adds price summary option as a row - uses lm.element library		
		new lm.element.block({ p:'ticketsBody', id:'row'+x, className: (x==y-1) ? 'footer':'', tagName:'tr'});
		new lm.element.block({ p:'row'+x, tagName:'td', className:'left', innerHTML:description});
		new lm.element.block({ p:'row'+x, tagName:'td', className: (x==y-1) ? 'middle':'', innerHTML:'<div class="available">'+availQuantity+' '+availableText+'</div>'});
		new lm.element.block({ p:'row'+x, tagName:'td', className:'right', innerHTML:'<strong>'+price+'</strong>' });				
	}												
}

function updateTimeSelect(performanceTimes) {
	var evTime = lm.e('eventTime');
	var evTimeTitle = lm.e('eventTimeTitle');
	for (var i = 0, j = performanceTimes.length; i < j; i++) {    
		if (j > 1) {									
				if (!(selectTime)) {									
					var selectTime = lm.ce('select')
					selectTime.setAttribute('class','t2');
					var firstOption = lm.ce('option');
					firstOption.setAttribute('value',performanceTimes[i].time);
					firstOption.innerHTML = performanceTimes[i].time;
					lm.append(firstOption, selectTime);
					selectTime.onchange = function() {
					updateTicketTime(performanceTimes,this);
					}
				}				
				else if (selectTime) {
					var nextOption = lm.ce('option');
					nextOption.setAttribute('value',performanceTimes[i].time);
					if ((i == (j-1)) && (isTheatreResult)) {
						nextOption.setAttribute('selected','selected');
					}
					nextOption.innerHTML = performanceTimes[i].time;
					lm.append(nextOption, selectTime);
				}				
				if (i == (j-1))  {	
					evTimeTitle.innerHTML = 'Choose time:';
					evTime.innerHTML = '';
					lm.append(selectTime, evTime);
					updateTicketTime(performanceTimes,this);
				}				
		}		
		else if (j == 1) {
			// Single performance time event			
			evTimeTitle.innerHTML = 'Event time:';
			evTime.innerHTML = '';
			evTime.innerHTML = performanceTimes[i].time;
			updateTicketTime(performanceTimes,this);
		}	
	}
}
													
function updateTicketTime(performanceTimes,e) {	
 	for (var i = 0, j = performanceTimes.length; i < j; i++) {   
		if (performanceTimes[i]['time'] == e.value) {
			lm.e('ticketTime').innerHTML = e.value;
			var ticketsObj = performanceTimes[i]['tickets'];							
			updateTickets(ticketsObj);
			setTimeHiddenField(e.value);
		}	
	}
}

// Hide all submit buttons on the event-availability.html page
// This will make the UI useable even with JS turned off when it can be used as normal form


function hideFormSubmits() {
	var allInputs = document.getElementsByTagName('input');
	for (var i = 0, j = allInputs.length; i < j; i++) {	
		if (allInputs[i].getAttribute('type') == 'submit') {			
			allInputs[i].style.display = "none"; }
	}
}

function dropdownSubmit() {	
	var allDropdowns = document.getElementsByTagName('select');	
	for (var i = 0, j = allDropdowns.length; i < j; i++) {	
		
		if (allDropdowns[i].parentNode.nodeName == "FORM") {		
			var _i = i;
			allDropdowns[_i].onchange = function() {
				var form = allDropdowns[_i].parentNode;
				form.submit(); }
		}
	}	
}


// *********************************************************** //
// Tickey price and quantity calculator
// Called on the tickey and types page
// *********************************************************** //

function Basket(formName) { 
	this.formName = formName;
	this.formObject = document.forms[formName];
   this.products = [];


	var currencyCode = 'GBP';
	var locale = 'en_GB';
	if (currencyCode=='GBP'){
		var currencySymbol='£';		
	} else if (currencyCode=='EUR' && locale=='it_IT') {
		currencySymbol='EUR ';
	} else if (currencyCode=='EUR' && locale=='fr_FR') {
		currencySymbol='EUR';	
	} else {
		currencySymbol='?';
	}
	
   this.total = function(){
		  var sum = 0;
		  for(var i = 0, j = this.products.length; i < j; i++){
			  sum += this.products[i].total()
		  }				
		  lm.e('totalBasketPrice').innerHTML = currencyFormat(sum, currencyCode, locale, 2);														
	}		
	
	var _this = this;
	
	this.Product = function(i) { 
	
			this.quantity = function(){
				return parseInt(lm.e('quantity'+i).value);
			}
			
			this.price = function() {	
					this.priceString = parseFloat(lm.e('price' + i).innerHTML.replace(currencySymbol,''));				
					return this.priceString;	
					}	
			
			this.total = function() {
					return this.price()*this.quantity();	 }
			 
			_this.products.push(this);
	}
	
	this.getProduct = function(){
		this.formObject = _this.formObject;
		for(var i = 0, j = this.formObject.length; i < j; i++) {
			if(lm.e('quantity'+i)){				
				new this.Product(i);
			}			
		}
	}
}

// *********************************************************** //
// Error bubble validation
// Ticket quantity
// Form text input fields cleanup
// *********************************************************** //

var firstNameDefault = 'First name';
var lastNameDefault = 'Last name';

function fieldValidation() {
	
	if(lm.e('firstNameField') && lm.e('lastNameField'))
	{
		var fnField = lm.e('firstNameField');	
		var lnField = lm.e('lastNameField');	
		
		//Initialise form text field
		fnField.value = (fnField.value == '') ? firstNameDefault : fnField.value;
		lnField.value = (lnField.value == '') ? lastNameDefault : lnField.value;
		
		fnField.onfocus = function() { if (fnField.value == firstNameDefault) { fnField.value = '';	}}			
		lnField.onfocus = function() { if (lnField.value == lastNameDefault) {lnField.value = '';	}}	
			
		fnField.onblur = function() { if (fnField.value == '') { fnField.value = firstNameDefault;}}	
		lnField.onblur = function() { if (lnField.value == '') { lnField.value = lastNameDefault;}}	
	}
}

function firstNameFieldNotDefault(){
	return (lm.e('firstNameField').value == firstNameDefault) ? true : false; }

function lastNameFieldNotDefault(){
	return (lm.e('lastNameField').value == lastNameDefault) ? true : false; }
	
function quantityValidation(){	
	return (parseInt(lm.e('totalBasketPrice').innerHTML) == 0 )  ? true : false; }

function checkboxNotChecked() {		
	var checkBoxes = document.getElementsByTagName('input');
	for (var i=0, j=checkBoxes.length; i < j; i++) {
		if ((checkBoxes[i].type == 'checkbox') && (checkBoxes[i].id.indexOf('confirmId') > -1)) {
			var checkId = checkBoxes[i].id;
			if (checkBoxes[i].checked == false) {
				return true;
			}
		}
	}	
	return false;
}

	var ticketFormObject = new lm.form.utility('ticketOrder');
	
	ticketFormObject.validate = [
		{referring_element:'firstNameField', message:'Please enter a valid first name', evaluate:firstNameFieldNotDefault},
		{referring_element:'lastNameField', message:'Please enter a valid last name', evaluate:lastNameFieldNotDefault},
		{referring_element:'totalBasketPrice', message:'You have not selected any tickets', evaluate:quantityValidation},
		{referring_element:'confirmId-0', message:'Please confirm by checking the checkbox', evaluate:checkboxNotChecked}
	];

function createMessageShell_from_string(){
	var ico_error = 'http://cdn.lastminute.com/site/ico_error.gif?skin=engb.lastminute.com';
	var ico_error_arrow_right = 'http://cdn.lastminute.com/site/error_bubble_ico_arrow_right.gif?skin=engb.lastminute.com';
	var html = '<div id="lmErrorBubbleContent" class="text_error clearFloat"><img src="'+ico_error+'" alt="!" width="16" height="16" /><div id="lmErrorBubbleMessage"></div><div id="lmErrorBubbleLink"><a href="javascript:ticketFormObject.message.hide()" class="text_error"><strong>OK</strong>&nbsp;<img src="'+ico_error_arrow_right+'" alt="&gt;" /></a></div></div>';	
    ticketFormObject.message.builtShell(html, 'lmErrorBubble', 'lmErrorBubbleMessage');
}

//Add events to the onload
if(typeof lm == 'object'){
	lm.addEvent({fn:createMessageShell_from_string});
	lm.addEvent({fn:fieldValidation});
}
// --- [end prdpcthpb0311:5004 - /site/booking_process.js - Feb 9, 2010 6:24 pm GMT - akamai,pcth0308,pct0410 - BbzHYwqoQ1UAAFJCS14AADB9 - cache 1800 ] ---
