(function($)
{
	var basket;
	var basket_link;

	$(document).ready(function()
	{
		basket = $('#minibasket');

		/* move the minibasket element to the bottom of document */
		basket.appendTo('body');

		// reposition off page while initially displaying
		basket.css({
			position: 'absolute',
			left: '-5000px',
			top: '-5000px',
			display: 'block'
		});

		basket_link = $('#basket-link a');

		/* show the checkout links on page load, if necessary */
		if(!basket.find('p.empty-text').is(':visible'))
		{
			basket.find('.checkout-links').show();
		}
	});

	$(window).ready(function()
	{
		/* set up elements initial position */
		setPosition();

		/* setup opaque layer */
		setupUnderlay();

		/* hide now we've set the initial position */
		basket.hide();

		setupIndicator();

		basket_link.click(function(e)
		{
			e.preventDefault();

			if(basket.is(':visible') || basket.is(':animated'))
			{
				return false;
			}

			/* create clickable underlay */
			$('<div />')
				.attr('id', 'hide-basket')
				.css({
					position: 'absolute',
					top: 0,
					left: 0,
					width: '100%',
					height: $(document).height()
				})
				.click(function()
				{
					if(basket.not(':animated').is(':visible'))
					{
						$(this).remove();
						basket.hide('slide', {direction: 'up'}, 300); // comment out if we need to work on styling for this
					}
				})
				.insertBefore(basket);

				basket.show('slide', {direction: 'up'}, 500);
		});

		$('#minibasket a').click(function(e)
		{
			e.preventDefault();
			window.location.href = $(this).attr('href');
		});

		$('#add_to_basket').live('click', function(e)
		{
			e.preventDefault();

			var _form = $('form#booking');

			var _url = _form.attr('action');
			var _data = _form.serialize();
			
			var indicatorElement = $('.basket-buttons #add_to_basket'); // if exists

			if(indicatorElement.length)
			{
				var button_text = indicatorElement.text();
				indicatorElement.text('Adding...');

				redrawCufon();
			}

			/* ajax post */
			$.ajax({
				type: 'GET',
				url: '/ajax_add_to_basket',
				data: _data,
				dataType: 'json',
				success: function(response)
				{
					if(indicatorElement.length)
					{
						indicatorElement.text('Added');
						redrawCufon();

						setTimeout(function()
						{
							indicatorElement.text(button_text);
							redrawCufon();
						}, 2000)
					}
					updateBasket(response);

					/** if response contains success:error trigger overlay notice */
					if(response.success == 'error')
					{
						displayErrorOverlay('Attention', response.message);
					}
					else
					{
						$('#add_and_checkout', _form).parent().show();
					}
				}
			});
		});
	})
	.resize(function()
	{
		setPosition();
		recalcIndicator();
	});

	function redrawCufon()
	{
		if(window.Cufon)
		{
			Cufon.refresh();
		}
	}

	function updateBasket(response)
	{
		/* update basket total */
		basket_link.find('span').text(response.basket_total.toFixed(2));

		if(response.basket.length)
		{
			basket.find('.num-additional-products').text(parseInt(response.basket.length - 1));

			/*
			 * set up to only rewrite the existing content - but could be modified to handle
			 * creating new rows
			 */
			for(var i in response.basket)
			{
				var _date = response.basket[i].performance;

				basket.find('.date').html(_date + ',');
				basket.find('.title a').html(response.basket[i].event_title + ' (x' + response.basket[i].quantity + ')');
				basket.find('.price').html('&pound;' + response.basket[i].total);
				basket.find('.title a').attr('href', response.basket[i].url);

				/* show elements if hidden */
				basket.find('.empty-text').remove();
				basket.find('.additional-items, ul').show();

				recalcUnderlay();

				// break on first element
				break;
			}

			basket_link.click();

			setTimeout(function()
			{
				$('#hide-basket').click();
			}, 4000);

			return true;
		}
		return false;
	}

	var marker;

	function setupIndicator()
	{
		var pos = getPosition();

		marker = $('<div />')
		.attr('id', 'minibasket-indicator')
		.css({
			position: 'absolute',
			height: '6px',
			width: basket_link.width(),
			backgroundColor: $('.minibasket-outer', basket).css('background-color')
		})
		.appendTo('body');

		basket.find('.price').css({
			color: $('.minibasket-outer', basket).css('background-color')
		});

		recalcIndicator();
	}

	function recalcIndicator()
	{
		var pos = getPosition();

		marker.css({
			left: pos[0],
			top: pos[1] - 6
		})
	}

	function setPosition()
	{
		var vals = getPosition(true);
		
		// handle positioning offsets, effects, etc
		basket.css({
			top: vals[1],
			left: vals[0]
		});
	}

	/**
	* @var boolean corrected Return an offset corrected value
	* @return Array
	*/
	function getPosition(corrected)
	{
		var x = basket_link.offset().left;
		var y = $('#head-strip').innerHeight() - parseInt($('#head-strip').css('padding-bottom'));

		var w = basket.width();

		/* calc how much to offset the element by (relative right) */
		var offset_x = x - w + basket_link.width();
		offset_x = offset_x + parseInt($('.minibasket-outer', basket).css('padding-right')) + parseInt($('.minibasket-container', basket).css('padding-right'));

		if(corrected)
		{
			return new Array(offset_x, y);
		}
		else
		{
			return new Array(x, y);
		}
	}

	function setupUnderlay()
	{
		$('<div />')
			.addClass('underlay')
			.prependTo(basket);

		recalcUnderlay();
	}

	function recalcUnderlay()
	{
		$('.underlay', basket)
			.css({
				top: 0,
				left: 0,
				position: 'absolute',
				height: basket.height() + 'px',
				width: basket.width() + 'px',
				backgroundColor: basket.find('.minibasket-outer').css('background-color'),
				opacity: 0.4
			});
	}
})
(jQuery);
