Prototype.Browser.IE6 = navigator.userAgent.indexOf('MSIE 6.0') > -1;
Prototype.Browser.Chrome = navigator.userAgent.indexOf('Chrome') > -1;						   
			
var slotListWidth = ((!Prototype.Browser.IE6) ? 177 : 180);
var slotHeight = ((!Prototype.Browser.IE6) ? 32 : 36);
		
var Booker = Class.create({
						  
	initialize: function(element, options)
	{
		var options = Object.extend({
		'product': 	'3',
		'slot':		'',
		'width':	'800px',
		'height':	'100%'
		}, options || {});
		
		$(element).style.width = options.width;
		$(element).style.height = options.height;

		this.element = element;
		this.product = options.product;
		this.slot = options.slot;
		
		this.month = null;
		
		eval('window.showMonth' + element + ' = this.show.bind(this);');
		
		window.calculate = this.calculate.bind(this);
		window.showBook = this.book.bind(this);
		window.showContact = this.contact.bind(this);
		window.clearPopup = this.clear.bind(this);
		window.cancelBooking = this.cancelBooking.bind(this);
		window.update = this.update.bind(this);
		
		this.update();
	},
	
	update: function()
	{
		//alert('e=' + this.element + '&month=' + this.month + '&product=' + this.product + '&slot=' + this.slot);
		
		new Ajax.Request('booker/booker.php', {
			parameters: 'e=' + this.element + '&month=' + this.month + '&product=' + this.product + '&slot=' + this.slot,
			onSuccess: this.display
		});
	},
	
	display: function(result)
	{
		var json = result.responseText.evalJSON(true);

		// The container we are working with
		var root = $(json.e);
		
		var rootWidth = root.getWidth() - slotListWidth;
		
		root.className = 'booking-client';
		
		var scrollId = 'scroll-' + json.d.product;
		
		var buffer = new Array();
		
		

		// Booking Header Month List
		buffer.push('<div class="top">');
		
		for(m = 0; m < 12; m++)
		{
			buffer.push('<a href="javascript:void(0);" onClick="javascript:showMonth' + json.e + '(\'' + m + '\');' + '" title="Click to show this month" class="' + ((json.d.current.month == json.d.months[m]) ? 'current' : '') + '">' + json.d.months[m] + '</a>');
		}

		buffer.push('</div>');
		
		// Build Slot List
		buffer.push('<ul class="slot-list">');
		
		buffer.push('<li class="heading"></li>');
		
		for(s in json.d.s)
		{
			buffer.push('<li id="slot-' +  json.d.s[s].i + '" class="slot-name"><h3>' + json.d.s[s].n + '</h3><span>Sleeps ' + json.d.s[s].c + '</span></li>');
		}
		
		buffer.push('</ul>');
		
		
		buffer.push('<div id="scroll-' + json.d.product + '" class="scroll" id="' + scrollId + '">');
		
		
		// Shadows for browsers that can handle it
		if(!Prototype.Browser.IE6)
		{
		//	buffer.push('<div class="shadow-right" style="margin-left: ' + ((Prototype.Browser.IE ? 0 : slotListWidth) + rootWidth - 4) + 'px;" ></div>');
		//	buffer.push('<div class="shadow-left" style="margin-left: ' + (Prototype.Browser.IE ? 0 : slotListWidth) + 'px;" /></div>');	
		}
		
		// Build the day columns
		buffer.push('<table class="month">');
		
		// Build Day Names
		buffer.push('<thead>');
		
		buffer.push('<tr>');
		
		var dayCount = parseInt(json.d.sd) + parseInt(json.d.td);

		
		
		for(d = 0; d < parseInt(json.d.td); d++)
		{
			var day = json.d.days[d];
			
			buffer.push('<td class="heading"><h3>' + day.d + '</h3><span>' + day.n + 'day</span></td>');
		}
		
		buffer.push('</tr>');
		
		buffer.push('</thead>');
		
		
		
		// Build Slots 
		buffer.push('<tbody>');
		
		var cellHeight = 0;
		
		for(s in json.d.s)
		{
			buffer.push('<tr>');
			
			var day = null;
			
			for(d = 0; d < parseInt(json.d.td); d++)
			{
				day = json.d.days[d];
		
				var slotClass = 'slot';
				
				if(day.n == 'Sun' || day.n == 'Satur')
					slotClass += ' weekend';
				
				switch(day.s[s].a)
				{
					default:
					case 0:
						buffer.push('<td class="' + slotClass + '" id="' + json.d.product + '-' + day.s[s].n + '-' + json.d.s[s].i + '-' + json.d.s[s].c + '"></td>');
					break;
					
					case 1:
						buffer.push('<td class="' + slotClass + '" id="' + json.d.product + '-' + day.s[s].n + '-' + json.d.s[s].i + '-' + json.d.s[s].c + '">');
						
						buffer.push('<div>$' + day.s[s].p + '</div>');
						
						buffer.push('<img slot="' + json.d.s[s].i + '" src="booker/images/book_small.gif" class="book-button" onClick="javascript:showBook(this);" />');
						
						buffer.push('</td>');
					break;
					
					case 2: // Closed
						slotClass += ' disabled';
						
						buffer.push('<td class="' + slotClass + '" id="' + json.d.product + '-' + day.s[s].n + '-' + json.d.s[s].i + '-' + json.d.s[s].c + '">-</td>');
					break;
					
					case 4: // Booked
						slotClass += ' disabled';
						
						buffer.push('<td class="' + slotClass + '" id="' + json.d.product + '-' + day.s[s].n + '-' + json.d.s[s].i + '-' + json.d.s[s].c + '">No<br />Vacancy</td>');
					break;
					
					case 8: // Phone
						slotClass += ' phone';
						
						buffer.push('<td class="' + slotClass + '" id="' + json.d.product + '-' + day.s[s].n + '-' + json.d.s[s].i + '-' + json.d.s[s].c + '"><img src="booker/images/phone.gif" height="15" /><br /><img src="booker/images/call_small.gif" onClick="javascript:showContact(this);" class="book-button" /></td>');
					break;
				}
			}
			
			buffer.push('</tr>');
		}
		
		buffer.push('</tbody>');
		
		buffer.push('</table>');


		// Scroll End
		buffer.push('</div>');
	
		
		// Checkout Button
		buffer.push('<div id="cart-' + json.d.product + '" class="cart">');
		
		buffer.push('<a href="checkout.php" class="cart-button checkout" ' + ((parseInt(json.d.totalcart) > 0) ? '' : 'style="display: none;"') + '>Checkout</a>');
		
		buffer.push('<span id="cart-count-' + json.d.product + '">' + json.d.totalcart + ' Item' + ((parseInt(json.d.totalcart) != 1) ? 's' : '') + ', $' + json.d.totalcost + '</span>');
		
		buffer.push('</div>');

		// Apply the buffer to the container element
		root.innerHTML = buffer.join('');;
		
		
		// Set scroll box height (for IE mainly)
		$(scrollId).style.width = rootWidth + 'px'; 
		
		$(scrollId).style.height = 24 + 36 + (json.d.totalslots * slotHeight) + 'px';

		/*
		if(!Prototype.Browser.IE6)
		{
			var shadows = $$('.shadow-left, .shadow-right');
			
			for(i = 0; i < shadows.length; i++)
			{
				$(shadows[i]).style.height = ($(scrollId).getHeight() - 16) + 'px';
			}
		}
		*/
		
		// Hack to make Safari behave like a real browser
		if(Prototype.Browser.WebKit && !Prototype.Browser.Chrome)
		{
			$$('.booking-client .top').each(function(obj) { $(obj).style.height = '23px';});	
			$$('.booking-client .slot-list li').each(function(obj) { $(obj).style.height = '32px';});	
			$$('.booking-client .slot-list .heading').each(function(obj) { $(obj).style.height = '36px';});
		}
		
		if(Prototype.Browser.Chrome)
		{
			$$('.booking-client .slot-list li').each(function(obj) { $(obj).style.height = '32px';});
			$$('.booking-client .slot-list .heading').each(function(obj) { $(obj).style.height = '36px';});
		}
		
		// 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(); });
	},
	
	contact: function(m)
	{
		this.clear();
		
		var cellId = m.parentNode.id;
		
		// 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();
		
		this.popup.appendChild(Builder.node('img', {src: 'booker/images/book_on.gif', className: 'book-top'}));
		
		this.popup.appendChild(Builder.node('h3', 'Contact Details'));
		this.popup.appendChild(Builder.node('img', {src: 'booker/images/close.gif', onClick: 'javascript:clearPopup();', className: 'close'}));
		
		var fields = Builder.node('ul');
		
		new Ajax.Request('booker/booker.php?mode=contact', {onComplete: function(result) { 
			var json = result.responseText.evalJSON(true);															
					
			if(json.phone.length > 0)
				fields.appendChild(Builder.node('li', [Builder.node('label', 'Phone'), json.phone]));
			if(json.fax.length > 0)
				fields.appendChild(Builder.node('li', [Builder.node('label', 'Fax'), json.fax]));
			if(json.freephone.length > 0)
				fields.appendChild(Builder.node('li', [Builder.node('label', 'Freephone'), json.freephone]));
			if(json.email.length > 0)
				fields.appendChild(Builder.node('li', [Builder.node('label', 'Email'), json.email]));				
		}});
		

		
		this.popup.appendChild(fields);
		
		m.parentNode.appendChild(this.popup);
		
		
		if(Prototype.Browser.WebKit || navigator.userAgent.indexOf('Chrome') > -1)
		{
			var offsets = this.popup.parentNode.parentNode.parentNode.parentNode.cumulativeScrollOffset();

			offsets.left += 107;
			
			$(this.popup).style.marginLeft = '-' + offsets.left + 'px';
		}
		
		// Fuck Safari, Fuck Apple
		if(Prototype.Browser.WebKit || Prototype.Browser.Chrome)
		{
			var offsets = $(this.popup).parentNode.parentNode.parentNode.parentNode.parentNode.cumulativeScrollOffset() + 180;
			
			this.popup.style.marginLeft = '-' + offsets.left + 'px';
		}
		
		this.popup.show();
	},
	
	book: function(m)
	{
		this.clear();
		
		// Get the cell lookup
		var cellId = m.parentNode.id;
		
		var dateMatch = /([0-9]+)-([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 slotCapacity = regMatch[6];
		
		// 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).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('img', {src: 'booker/images/close.gif', onClick: 'javascript:clearPopup();', className: 'close'}));
		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 Nights
		var nightSelect = Builder.node('select', {className: 'field', id: 'num-nights', onchange: 'javascript:calculate(this);'});
		
		for(s = 1; s <= 30; s++)
			nightSelect.appendChild(Builder.node('option', {value: s}, s + ' Night' + ((s != 1) ? 's' : '') ));

		$(nightSelect).selectedIndex = 0;
		
		fields.appendChild(Builder.node('li', [Builder.node('label', 'Number of Nights'), nightSelect]));
		
		
		
		// Number of Adults
		var adultSelect = Builder.node('select', {className: 'field', id: 'num-adults', onchange: 'javascript:calculate(this);'});
		
		for(s = 0; s <= slotCapacity; s++)
			adultSelect.appendChild(Builder.node('option', {value: s}, s + ' Adult' + ((s != 1) ? 's' : '') ));

		$(adultSelect).selectedIndex = 0;
		
		fields.appendChild(Builder.node('li', [Builder.node('label', 'Number of Adults'), adultSelect]));
		
		
		
		// Number of Children
		var childSelect = Builder.node('select', {className: 'field', id: 'num-children', onchange: 'javascript:calculate(this);'});
		
		for(s = 0; s <= slotCapacity; s++)
			childSelect.appendChild(Builder.node('option', {value: s}, s + ((s != 1) ? ' Children' : ' Child') ));

		$(childSelect).selectedIndex = 0;
		
		fields.appendChild(Builder.node('li', [Builder.node('label', 'Number of Children'), childSelect]));
		
		
		
		// Number of Infants
		var infantSelect = Builder.node('select', {className: 'field', id: 'num-infants', onchange: 'javascript:calculate(this);'});
		
		for(s = 0; s <= 5; s++)
			infantSelect.appendChild(Builder.node('option', {value: s}, s + ' Infant' + ((s != 1) ? 's' : '') ));

		$(infantSelect).selectedIndex = 0;
		
		fields.appendChild(Builder.node('li', [Builder.node('label', 'Number of Infants'), infantSelect]));
		
		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', {id: 'book-now-' + productId, type: 'submit', value: 'Book Now', disabled: 'disabled'}));
		
		$(submitButton).observe('click', function() 
		{
			// Get Booking info	
			var cellId = $F('data');
			
			var dateMatch = /([0-9]+)-([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 slotCapacity 	= regMatch[6];
		
			var numNights 	= $F('num-nights');
			var numAdults 	= $F('num-adults');
			var numChildren = $F('num-children');
			var numInfants 	= $F('num-infants');
			
			// Send the booking
			new Ajax.Request('booker/booker.php', {parameters: 'mode=book&product=' + productId + '&slotId=' + slotId + '&year=' + slotYear + '&month=' + slotMonth + '&monthType=absolute&day=' + slotDay + '&nights=' + numNights + '&adults=' + numAdults + '&children=' + numChildren + '&infants=' + numInfants, onComplete: function(result) 
			{ 
				var json = result.responseText.evalJSON(true);
				
				if(json.error) 
				{
					switch(json.error)
					{
						case 16:
							alert('The number of people you have chosen will not fit into the selected room.');
						break;
						
						case 8:
							alert('Some of the dates you have selected are not available. Please review your selection.');
						break;
					}
				}
				else
				{
					// Update the number of bookings
					$('cart-count-' + productId).innerHTML = json.totalcart + ' Item' + ((json.totalcart > 1) ? 's' : '') + ', $' + json.totalcost;
					
					if(parseInt(json.totalcart) > 0)
					{
						var buttons = $$('.checkout');
						
						for(i = 0; i < buttons.length; i++)
						{
							new Effect.Appear($(buttons[i]), {duration: 0.2});
						}
					}
			
					//new Effect.Highlight('cart-' + productId);
					
					update();
				}
			}});
			
			new Effect.Fade(this.parentNode.parentNode, {duration: 0.2});
		});
		
		form.appendChild(submitButton);
		
		this.popup.appendChild(form);
		
		m.parentNode.appendChild(this.popup);
		
		if(Prototype.Browser.WebKit || navigator.userAgent.indexOf('Chrome') > -1)
		{
			var offsets = this.popup.parentNode.parentNode.parentNode.parentNode.cumulativeScrollOffset();

			offsets.left += 107;
			
			$(this.popup).style.marginLeft = '-' + offsets.left + 'px';
		}
		
		// Fuck Safari, Fuck Apple
		if(Prototype.Browser.WebKit || Prototype.Browser.Chrome)
		{
			var offsets = $(this.popup).parentNode.parentNode.parentNode.parentNode.parentNode.cumulativeScrollOffset() + 180;
			
			this.popup.style.marginLeft = '-' + offsets.left + 'px';
		}
		
		this.popup.show();
		
		//new Effect.BlindDown(this.popup, {duration: 0.4});
	},
	
	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);

		$('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 formObj = 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(formObj.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 = $(formObj).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;
			}
		}
		
		//alert('mode=price&product=' + productId + '&slotId=' + slotId + '&year=' + slotYear + '&month=' + slotMonth + '&monthType=absolute&day=' + slotDay + '&nights=' + nights + '&adults=' + adults + '&children=' + children + '&infants=' + infants);
		
		new Ajax.Request('booker/booker.php', {onSuccess: this.displayTotal, parameters: 'mode=price&product=' + productId + '&slotId=' + slotId + '&year=' + slotYear + '&month=' + slotMonth + '&monthType=absolute&day=' + slotDay + '&nights=' + nights + '&adults=' + adults + '&children=' + children + '&infants=' + infants});
	},
	
	displayTotal : function(result)
	{
		var json = result.responseText.evalJSON(true);
		
		switch(json.message)
		{
			case 64:
				alert('The minimum stay for this date is ' + parseInt(json.minstay) + ' nights. Please review your booking.');
			break;
			
			case 32:
				alert('There must be at least 1 adult in your booking.');
			break;
			
			case 16:
				alert('The number of people you have chosen will not fit into the selected room.');
			break;
			
			case 8:
				alert('Some of the dates you have selected are not available. Please review your selection.');
			break;
		}
		
		$('book-now-' + json.product).disabled = !json.bookable;
			
		$('total-cost').innerHTML = '$' + json.price;
	}
	
});