Prototype.Browser.IE6 = navigator.userAgent.indexOf('MSIE 6.0') > -1;
Prototype.Browser.Chrome = navigator.userAgent.indexOf('Chrome') > -1;		

var Booker = Class.create({
						  
	initialize: function(element, product)
	{
		this.element = element;
		this.product = product;
		
		this.month = null;
		
		eval('window.showMonth' + element + ' = this.show.bind(this);');
		eval('window.showCart' + element + ' = this.showCart.bind(this);');
		eval('window.update' + product + ' = this.update.bind(this);');
		
		window.calculate = this.calculate.bind(this);
		window.showBook = this.book.bind(this);
		window.clearPopup = this.clear.bind(this);
		window.cancelBooking = this.cancelBooking.bind(this);
		
		this.update();
	},
	
	update: function()
	{
		new Ajax.Request('booker/booker.php', {
			parameters: 'e=' + this.element + '&month=' + this.month + '&product=' + this.product,
			onSuccess: this.display
		});
	},
	
	display: function(result)
	{
		var json = result.responseText.evalJSON(true);

		var root = $(json.element);
		
		root.className = 'booking-client';
		
		root.innerHTML = '';
		
		// Build Slot List
		var list = Builder.node('ul', {className: 'slot-list'});
		
		list.appendChild(Builder.node('li', {className: 'heading'}));
		
		var s = 0;
		//for(s in json.data.s)
		{
			var node = Builder.node('li', {id: 'slot-' +  json.data.s[s].i, className: 'slot-name'});
			
			node.appendChild(Builder.node('h3', json.data.s[s].n));
			node.appendChild(Builder.node('span', ' '));
			
			list.appendChild(node);
		}
		
		root.appendChild(list);
		
		var table = Builder.node('table', {className: 'month'});
		
		// Build Day Names
		var header = Builder.node('thead');
		
		var row = Builder.node('tr');
		
		for(d = json.data.sd; d < parseInt(json.data.sd) + parseInt(json.data.td); d++)
		{
			var day = json.data.days[d];
			
			var column = Builder.node('td', {className: 'heading'});
			
			var date = Builder.node('h3', day.d);
			var name = Builder.node('span', day.n + 'day');
			
			column.appendChild(date);
			column.appendChild(name);
			
			row.appendChild(column);
		}
		
		header.appendChild(row);
		
		table.appendChild(header);
		
		// Build Slots 
		var tbody = Builder.node('tbody');
		
		var cellHeight = 0;
		
		var s = 0;

		{
			var row = Builder.node('tr');
			
			var day = null;
			
			for(d = json.data.sd; d < parseInt(json.data.sd) + parseInt(json.data.td); d++)
			{
				day = json.data.days[d];
		
				var slotClass = 'slot';
				
				if(day.n == 'Sunday' || day.n == 'Saturday')
					slotClass += ' weekend';
				
				var column = Builder.node('td');
				
				switch(day.s[s].a)
				{
					default:
					case 0:
						column = Builder.node('td', {className: slotClass, id: json.data.product + '-' + day.s[s].n + '-' + json.data.s[s].i});
					break;
					
					case 1:
						var button = Builder.node('img', {slot: json.data.s[s].i, src: 'booker/images/book_small.gif', className: 'book-button'});
						
						column = Builder.node('td', {className: slotClass, id: json.data.product + '-' + day.s[s].n + '-' + json.data.s[s].i});
						
						$(column).appendChild(Builder.node('div', day.s[s].c + ' Seats'));
						$(column).appendChild(button);
						
						$(button).observe('click', showBook);
					break;
					
					case 2:
						slotClass += ' disabled';
						
						column = Builder.node('td', {className: slotClass, id: json.data.product + '-' + day.s[s].n + '-' + json.data.s[s].i}, '-');
					break;
				}
				
				row.appendChild(column);
			}
			
			tbody.appendChild(row);
		}
		
		table.appendChild(tbody);
		

		// Booking Header
		var mainHeader = Builder.node('div', {className: 'top'});
		
		for(m = 0; m < 12; m++)
		{
			var tab = Builder.node('a', {href: 'javascript:void(0);', onClick: 'javascript:showMonth' + json.element + '(\'' + m + '\');', title: 'Click to show this Month', className: (json.data.current.month == json.data.months[m]) ? 'current' : ''}, json.data.months[m]);

			mainHeader.appendChild(tab);
		}

		root.appendChild(mainHeader);

		var scrollId = 'scroll-' + json.data.product;
		
		root.appendChild(Builder.node('div', {id: scrollId, className: 'scroll'}, table));
		
		// Checkout button
		var checkout = Builder.node('div', {className: 'checkout'});
		checkout.appendChild(Builder.node('a', {href: 'javascript:document.location.href = \'checkout.php\';', className: 'cart-button'}, 'Checkout'));
		root.appendChild(checkout);
		
		
		// Booking Cart
		var cart = Builder.node('div', {id: 'cart-' + json.data.product, className: 'cart'});
		cart.appendChild(Builder.node('a', {href: 'javascript:void(0);', onClick: 'javascript:showCart' + json.element + '(\'' + json.data.product + '\');', className: 'cart-button'}, 'Booking Cart'));
		
		cart.appendChild(Builder.node('span', {id: 'cart-count-' + json.data.product}, json.data.totalcart + ' Item' + ((parseInt(json.data.totalcart) != 1) ? 's' : '')));

		cart.appendChild(Builder.node('div', {id: 'cart-list-' + json.data.product}));
		
		root.appendChild(cart);
		
		
		// Set scroll box height (for IE)
		if(Prototype.Browser.IE)
		{
			$(scrollId).style.height = 47 + (json.data.totalslots * 44) + 'px';
			
			// Slot Heights
			var slotNames = $$('.booking-client .slot-name');
			
			for(i = 0; i < slotNames.length; i++)
			{
				slotNames[i].style.paddingTop = '10px';
				slotNames[i].style.paddingBottom = '11px';
			}
			
			// Booker Width
			$(scrollId).style.width = '512px';
			$(scrollId).style.height = '96px';
		}

		// Fade the data in
		$(scrollId).hide();
		new Effect.Appear($(scrollId), {duration: 0.4});
		
		// Remove the popup if the user scrolls
		Event.observe($(scrollId), 'scroll', clearPopup);
	},
	
	clear: function()
	{
		if($('popup'))
		{
			$('popup').remove();
		}
		
		$$('.cart-list').each(function(node){ node.remove(); });
		$$('.cart .bottom').each(function(node){ node.remove(); });
	},
	
	book: function(m)
	{
		this.clear();
		
		// Get the cell lookup
		var cellId = m.target.parentNode.id;
		
		var dateMatch = /([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)/;
		var dateRegex = new RegExp(dateMatch);

		var regMatch = dateRegex.exec(cellId);
		
		var productId = regMatch[1];
		var slotYear = regMatch[2];
		var slotMonth = regMatch[3];
		var slotDay = regMatch[4];
		var slotId = regMatch[5];
		
		// Build the booking form
		this.popup = Builder.node('div', {className: 'popup', id: 'popup'});
		
		if(Prototype.Browser.IE)
			$(this.popup).addClassName('popup-ie');
			
		$(this.popup).hide();
		
		var slot = m.target.readAttribute('slot');
		
		this.popup.appendChild(Builder.node('img', {src: 'booker/images/book_on.gif', className: 'book-top'}));
		
		this.popup.appendChild(Builder.node('h3', $('slot-' + slot).firstChild.innerHTML));
		this.popup.appendChild(Builder.node('h4', slotDay + '/' + slotMonth + '/' + slotYear));
		
		var form = Builder.node('form', {action: 'javascript:void(0);', method: 'post'});
		
		form.appendChild(Builder.node('input', {type: 'hidden', id: 'data', value: cellId}));
		
		var fields = Builder.node('ul');
		
		// Number of Adults
		var adultSelect = Builder.node('select', {className: 'field', id: 'num-adults', onchange: 'javascript:calculate(this);'});
		
		for(s = 1; s <= 20; s++)
			adultSelect.appendChild(Builder.node('option', {value: s}, s + ' Adult' + ((s != 1) ? 's' : '') ));

		$(adultSelect).selectedIndex = 1;
		
		fields.appendChild(Builder.node('li', [Builder.node('label', 'Number of Adults'), adultSelect]));

		form.appendChild(fields);
		
		// Total Price
		fields.appendChild(Builder.node('li', [Builder.node('label', 'Total'), Builder.node('span', {id: 'total-cost', className: 'total-cost'}, '-')]));
		
		// Submit Button
		var submitButton = Builder.node('div', {align: 'center'}, Builder.node('input', {type: 'submit', value: 'Book Now'}));
		
		$(submitButton).observe('click', function() 
		{
			// Get Booking info	
			var cellId = $F('data');
			
			var dateMatch = /([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)/;
			var dateRegex = new RegExp(dateMatch);
	
			var regMatch = dateRegex.exec(cellId);
			
			var productId = regMatch[1];
			var slotYear = regMatch[2];
			var slotMonth = regMatch[3];
			var slotDay = regMatch[4];
			var slotId = regMatch[5];
		
			var seatMatch = /([0-9]+) Seats/;
			var seatRegex = new RegExp(seatMatch);
			
			var regMatch = seatRegex.exec($(cellId).firstChild.innerHTML);
			
			var seats = regMatch[1];
			
			var numAdults = $F('num-adults');
			
			if(numAdults > seats)
			{
				alert('There are not enough seats available on this day.');	
				return;
			}
			
			// Send the booking
			new Ajax.Request('booker/booker.php', {parameters: 'mode=book&product=' + productId + '&slotId=' + slotId + '&year=' + slotYear + '&month=' + slotMonth + '&day=' + slotDay + '&adults=' + numAdults, onComplete: function(result) 
			{ 
				eval('update' + productId + '();');
				
				if(result.responseText.length) 
					alert(result.responseText); 
				else
				{
					$(cellId).addClassName('my-booking');	
				}
			}});
			
			new Effect.Fade(this.parentNode.parentNode, {duration: 0.2});
			
			new Effect.Highlight('cart-' + productId);
			
			// Update the number of bookings
			var cartCount = parseInt($('cart-count-' + productId).innerHTML) + 1;
			$('cart-count-' + productId).innerHTML = cartCount.toString() + ' Item' + ((cartCount > 1) ? 's' : '');
		});
		
		form.appendChild(submitButton);
		
		this.popup.appendChild(form);
		
		m.target.parentNode.appendChild(this.popup);
		
		if(Prototype.Browser.WebKit || Prototype.Browser.Chrome)
		{
			var offsets = this.popup.parentNode.parentNode.parentNode.parentNode.cumulativeScrollOffset();

			offsets.left += 107;
			
			$(this.popup).style.marginLeft = '-' + offsets.left + 'px';
		}
		
		this.popup.show();
		
		//new Effect.BlindDown(this.popup, {duration: 0.4});
	},
	
	showCart: function(p)
	{
		this.clear();
		
		var cartList = Builder.node('ul', {className: 'cart-list'});
		
		$('cart-list-' + p).appendChild(cartList);
		$('cart-list-' + p).appendChild(Builder.node('img', {className: 'bottom', src: 'booker/images/bottom.gif'}));
		
		//$(cartList).hide();
		$(cartList).addClassName('loading');
		
		//new Effect.Appear(cartList, {duration: 0.2});
		
		new Ajax.Request('booker/booker.php', {parameters: 'mode=cart&product=' + p, onComplete: function(result)
		{
			$$('.cart-list').each(function(node) { node.removeClassName('loading') } );
			
			var json = result.responseText.evalJSON(true);
			
			var cartList = $('cart-list-' + json.product);
			
			cartList.firstChild.appendChild(Builder.node('h3', 'Bookings'));
			
			for(i = 0; i < json.count; i++)
			{
				var cartItem = Builder.node('li', {id: 'booking-' + json.bookings[i].id});
			
				var nightText = json.bookings[i].adults + ((parseInt(json.bookings[i].adults) > 1) ? ' People' : ' Person');
				
				var itemDate = json.bookings[i].day + '/' + json.bookings[i].month + '/' + json.bookings[i].year;
				
				var cancelButton = Builder.node('img', {src: 'booker/images/cancel.gif', className: 'cancel-button', onclick: 'javascript:cancelBooking(\'' + json.bookings[i].product + '\', \'' + json.bookings[i].id + '\')'});
				
				cartItem.appendChild(cancelButton);
				
				cartItem.appendChild(Builder.node('h4', json.bookings[i].slotName));
				cartItem.appendChild(Builder.node('span', itemDate + ', ' + nightText));
				
				cartList.firstChild.appendChild(cartItem);
			}			
		}});
	},
	
	cancelBooking: function(p, id)
	{
		// Update the number of bookings
		var cartCount = parseInt($('cart-count-' + p).innerHTML) - 1;
		$('cart-count-' + p).innerHTML = cartCount.toString() + ' Item' + ((cartCount > 1) ? 's' : '');
		
		new Effect.Highlight('cart-' + p);
		
		//new Effect.BlindUp('booking-' + id, {duration: 0.5});
		$('booking-' + id).remove();
		
		new Ajax.Request('booker/booker.php', {parameters: 'mode=cancel&booking=' + id});
	},
	
	show: function(m)
	{
		this.clear();
		
		$('scroll-' + this.product).addClassName('loading');
		
		this.month = m;
		this.update();
	},
	
	calculate: function(ref)
	{
		var form = ref.parentNode.parentNode.parentNode;

		var dateMatch = /([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)/;
		var dateRegex = new RegExp(dateMatch);

		var regMatch = dateRegex.exec(form.parentNode.parentNode.id);
		
		var productId = regMatch[1];
		var slotYear = regMatch[2];
		var slotMonth = regMatch[3];
		var slotDay = regMatch[4];
		var slotId = regMatch[5];
		
		var fields = form.select('select');

		var nights = 0;
		var rooms = 0;
		var adults = 0;
		var children = 0;
		var infants = 0;

		for(f in fields)
		{
			switch(fields[f].id)
			{
				case 'num-nights':
					nights = parseInt(fields[f].value);
				break;
				
				case 'num-rooms':
					rooms = parseInt(fields[f].value);
				break;
				
				case 'num-adults':
					adults = parseInt(fields[f].value);
				break;
				
				case 'num-children':
					children = parseInt(fields[f].value);
				break;
				
				case 'num-infants':
					infants = parseInt(fields[f].value);
				break;
			}
		}
		
		var totalField = form.select('#total-cost');
		
		totalField = totalField[0];
		
		
		new Ajax.Request('booker/booker.php', {onSuccess: this.displayTotal, parameters: 'mode=price&field=' + totalField + '&product=' + productId + '&slot=' + slotId + '&year=' + slotYear + '&month=' + slotMonth + '&day=' + slotDay + '&nights=' + nights + '&rooms=' + rooms + '&adults=' + adults + '&children=' + children + '&infants=' + infants});
	},
	
	displayTotal : function(result)
	{
		var json = result.responseText.evalJSON(true);
		
		switch(json.message)
		{
			case 16:
				alert('The number of people you have chosen will not fit into the selected number of rooms.\n\nPlease increase the number of rooms.');
			break;
		}
		
		$('total-cost').innerHTML = '$' + json.price;
	}
	
});