$(document).ready(function()
{

	// some easy access options
	var minHeight = 250;
	var doFade = !$.browser.msie;
	var fadeOutSpeed = 400;
	var fadeInSpeed = 400;
	var heightSpeed = 900;
	var autoInterval = 3500;
	var autoDirection = 'up';

	// some globals
	var offerlist = $('ul#offer-list');
	var offerlistParent;
	var offerlistContainer
	var sliding = false;
	var hovering = false;
	
	initializeOfferlist();
	function initializeOfferlist()
	{
		// determine the maximum height for the offerlist and whether or not the offerlist is longer than that height
		offerlistParent = offerlist.parent();
		var height = offerlistParent.height();
		var footer = $('div#footer');
		offerlist.css('display', 'none'); // hide the offerlist so that it doesn't affect the footer position
		var heightDifference = footer.offset().top - offerlistParent.offset().top;
		if (heightDifference < height) height = heightDifference;
		
		// ensure that the height is at least min height
		var hasChildren = offerlist.find('li').length > 0;
		if (hasChildren && height < minHeight) height = minHeight;
		
		offerlistParent.css('height', height);
		
		// place the offerlist inside a new div
		offerlistContainer = $('<div id=\'offerlist-container\'></div>')
			.css({	position: 	'relative',
					height:		height + 500	})
			.appendTo(offerlistParent);
		offerlist.appendTo(offerlistContainer);
		
		// display the offerlist and fix its height
		offerlist.css({display: 'block', height: height});
		
		
		bindButtons();
		bindHover();
		startLoop();
	}
	
	function slideUp()
	{
		if (sliding === false)
		{
			sliding = true;
			
			var items = offerlist.children('li');
			var firstItem = $(items.get(0));
			
			// determine whether or not we should fade the item
			determinedFadeOutSpeed = fadeOutSpeed;
			determinedFadeInSpeed = fadeInSpeed;
			determinedOpacity = 0;
			if (!doFade)
			{
				determinedOpacity = 1;
				determinedFadeOutSpeed = 0;
				determinedFadeInSpeed = 0;
			}
			
			// fade out the first item
			firstItem.animate({opacity: determinedOpacity}, determinedFadeOutSpeed,
				function()
				{
					var itemHeight = firstItem.outerHeight(true);
					offerlistContainer.animate({top: -itemHeight}, heightSpeed,
						function()
						{
							firstItem.appendTo(offerlist);
							offerlistContainer.css('top', 0);
							sliding = false;
							restartLoop();
							firstItem.animate({opacity: 1}, determinedFadeInSpeed);
						});
				});
		}
	}
	
	function slideDown()
	{
		if (sliding === false)
		{
			sliding = true;
			
			var items = offerlist.children('li');
			var firstItem = $(items.get(0));
			var lastItem = $(items.get(items.length - 1));
			
			// determine whether or not we should fade the item
			determinedFadeOutSpeed = fadeOutSpeed;
			determinedFadeInSpeed = fadeInSpeed;
			determinedOpacity = 0;
			if (!doFade)
			{
				determinedOpacity = 1;
				determinedFadeOutSpeed = 0;
				determinedFadeInSpeed = 0;
			}
			
			// fade out the first item
			lastItem.animate({opacity: determinedOpacity}, determinedFadeInSpeed,
				function()
				{
					var itemHeight = lastItem.outerHeight(true);
					offerlistContainer.animate({top: itemHeight}, heightSpeed,
						function()
						{
							lastItem.prependTo(offerlist);
							offerlistContainer.css('top', 0);
							sliding = false;
							restartLoop();
							lastItem.animate({opacity: 1}, determinedFadeOutSpeed);
						});
				});	
		}
	}
	
	function bindButtons()
	{
		var slideUpButton = $('#offer-up');
		var slideDownButton = $('#offer-down');
		
		slideUpButton.bind('click', {}, slideUpBind);
		slideDownButton.bind('click', {}, slideDownBind);
	}
	
	function bindHover()
	{
		offerlist.bind('mouseenter', {}, hoverBind);
		offerlist.bind('mouseleave', {}, unhoverBind);
	}
	
	function startLoop()
	{
		if (autoInterval > 0 && !sliding && !hovering)
		{
			offerlist.get(0).loop = window.setInterval(
				function()
				{
					if (autoDirection === 'up') slideUp();
					else slideDown();
				}, autoInterval);
		}
	}
	
	function restartLoop()
	{
		stopLoop();
		startLoop();
	}

	function stopLoop()
	{
		clearInterval(offerlist.get(0).loop);
	};
	
	function hoverBind(ev)
	{
		hovering = true;
		stopLoop();	
	};
	
	function unhoverBind(ev)
	{
		hovering = false;
		startLoop();
	};
	
	function slideUpBind(ev)
	{
		ev.preventDefault();
		slideUp();
	}
	
	function slideDownBind(ev)
	{
		ev.preventDefault();
		slideDown();
	}

});