// Stacker menu.
	// Check for CSS.
	$('body').prepend('<div class="css-check-mark" style="height:0px;visibility:hidden;">CSS checkmark</div><div class="css-check"></div>');
	var css = false;
	if ($('.css-check-mark').offset().top == $('.css-check').offset().top)
	{
		css = true;
	}
	$('.css-check-mark').remove();
	$('.css-check').remove();

(function($)
{
	$.fn.stacker_menu = function(options)
	{
		// Set the options.
		var o = $.extend({}, $.fn.stacker_menu.defaults, options);
		
		// Go through each stacker menu.
		return this.each(function()
		{
			// Check if there is no ancestor that has already been rendered, that css is on and the tagname is ul or ol.
			if ($(this).parents('.' + o.stacker_menu.rendered_class_name).length == 0 && (css == true) && (this.tagName.toLowerCase() == 'ul' || this.tagName.toLowerCase() == 'ol'))
			{
				// Add a default and rendered class to the stacker menu.
				var stacker_menu = $(this).addClass(o.stacker_menu.default_class_name).addClass(o.stacker_menu.rendered_class_name);
				
				// Apply classes based on stacker_menu classes. e.g. ul.my-stacker_menu gets additional ul.my-stacker_menu-done (done comes from the o.stacker_menu.rendered_class_name)
				//******************************************************
				
				// Go through all sub-menus.
				var sub_menus = $(this).find('li > ul, li > ol').each(function()
				{
					// Check if the sub menu has a link before it.
					if ($(this).prev().length == 0)
					{
						// Turn the item text into an alias link. 
						$(this).parent().contents('[nodeType=3]:first').wrap('<a class="' + o.alias.class_name + '" href="#"></a>');
					}
				});
				// Wrap stacker_menu links with a div.
				$(stacker_menu).find('a').wrap('<div></div>');
				
				// Go through all sub-menus.
				$(sub_menus).each(function()
				{
					var sub_menu = this;
					
					// Add a menu class to each link.
					var link = $(sub_menu).prev().find('a');
					
					// Add the alias class to any found alias links.
					$(sub_menu).find('a[href=' + $(link).attr('href') + ']:first').each(function()
					{
						// Add an alias class to the link.
						$(link).addClass(o.alias.class_name);
					});
					
					// Check if the link is an alias.
					if ($(link).hasClass(o.alias.class_name))
					{
						// Append the toggle and store content data in the toggle.
						var toggle = $(link)
						.append('<span class="' + o.toggle.class_name + '"></span>')
						.find('.' + o.toggle.class_name)
						.data('content_when_closed', ' <img src="../images/closed' + o.stacker_menu.icon_set + '.png" alt="(open menu)" />')
						.data('content_when_open', ' <img src="../images/opened' + o.stacker_menu.icon_set + '.png" alt="(close menu)" />');
						$(toggle).html($(toggle).data('content_when_closed'));
					}
					else
					{
						// Check if a toggle goes after the link.
						if (o.stacker_menu.toggle_after_link)
						{
							$(link).after('<a class="' + o.toggle.class_name + '" href="" tabindex="0"></a>');
							$(stacker_menu).addClass(o.stacker_menu.toggle_after_class_name);
						}
						// Else put a toggle before the link.
						else
						{
							$(link).before('<a class="' + o.toggle.class_name + '" href="" tabindex="0"></a>');
							$(stacker_menu).addClass(o.stacker_menu.toggle_before_class_name);
						}
						// Append the toggle and store content data in the toggle.
						var toggle = $(link)
						.parent().find('.' + o.toggle.class_name)
						.data('content_when_closed', '<img src="../images/closed' + o.stacker_menu.icon_set + '.png" alt="open ' + $(link).text() + ' menu" />')
						.data('content_when_open', '<img src="../images/opened' + o.stacker_menu.icon_set + '.png" alt="close ' + $(link).text() + ' menu" />');
						$(toggle).html($(toggle).data('content_when_closed'));
					}
					// Close all the sub-menus.
					$(sub_menu).parent().toggleClass(o.sub_menu.closed_class_name).addClass(o.li.menu_class_name);
				});
				
				// The toggle behaviour function.
				function toggle_behaviour(e)
				{
					// Check if a key was pressed that it was the Enter key.
					if (e.type != 'keypress' || e.keyCode == 13)
					{
						// 'this' is either ul li div a.alias or ul li div a.toggle
						var li = $(this).parents('li').eq(0); // ul li
						var sub_menu = $(li).find('> ul, > ol'); // ul li ul
						var toggle = $(li).find('.' + o.toggle.class_name + ':first'); // ul li div a.toggle
						var link = $(li).find('.link:first'); // ul li div a.link
						
						// Check if the sub menu is closed.
						if ($(li).hasClass(o.sub_menu.closed_class_name))
						{
							// Close any previously opened sub_menus.
							$(li).find('li').removeClass(o.li.hidden_class_name); // ul li
							$(sub_menu).find('li').addClass(o.sub_menu.closed_class_name); // ul li ul
							$(sub_menu).find('.' + o.toggle.class_name).each(function()
							{
								$(this).html($(this).data('content_when_closed'));
							});
							
							// Open the sub menu.
							if (o.stacker_menu.animate)
							{
								$(sub_menu).slideDown(o.stacker_menu.animation_speed*o.stacker_menu.animation_ratio, function()
								{
									$(this).attr('style', '').parent().removeClass(o.sub_menu.closed_class_name);
								});
								
								var pre_all = $(li).prevAll('li:not(' + o.li.permanant_selector + ')').get().reverse();
								pre_all = $(pre_all).wrapAll('<ul style="list-style-type:none;position:relative;width:100%;margin:0;padding:0;"></ul>').parent();
								$(pre_all).slideUp(o.stacker_menu.animation_speed, function()
								{
									$(this).before($(this).children().addClass(o.li.hidden_class_name)).remove();
									$(toggle).html($(toggle).data('content_when_open'));
								});
								
								$(li).nextAll('li:not(' + o.li.permanant_selector + ')').wrapAll('<ul style="list-style-type:none;position:relative;width:100%;margin:0;padding:0;"></ul>').parent().slideUp(o.stacker_menu.animation_speed, function()
								{
									$(this).after($(this).children().addClass(o.li.hidden_class_name)).remove();
									$(toggle).html($(toggle).data('content_when_open'));
								});
							}
							else
							{
								$(li).removeClass(o.sub_menu.closed_class_name);
								$(li).siblings().not(o.li.permanant_selector).addClass(o.li.hidden_class_name);
								$(toggle).html($(toggle).data('content_when_open'));
							}
						}
						// Else the sub_menu is opened.
						else
						{
							// Close the sub_menu.
							if (o.stacker_menu.animate)
							{
								$(sub_menu).slideUp(o.stacker_menu.animation_speed*o.stacker_menu.animation_ratio, function()
								{
									$(this).attr('style', '').parent().addClass(o.sub_menu.closed_class_name);
								});
								
								var pre_all = $(li).prevAll('li:not(' + o.li.permanant_selector + ')').removeClass(o.li.hidden_class_name).get().reverse();
								$(pre_all).wrapAll('<ul style="list-style-type:none;position:relative;width:100%;display:block;height:0;overflow:hidden;margin:0;padding:0;"></ul>');
								var height = 0;
								$(pre_all).each(function()
								{
									height = height + $(this).outerHeight();
								});
								$(pre_all).parent().animate({height: height}, o.stacker_menu.animation_speed, function()
								{
									$(this).before($(this).children()).remove();
									$(toggle).html($(toggle).data('content_when_closed'));
								});
								
								var nextAll = $(li).nextAll('li:not(' + o.li.permanant_selector + ')').removeClass(o.li.hidden_class_name);
								$(nextAll).wrapAll('<ul style="list-style-type:none;position:relative;width:100%;display:block;height:0;overflow:hidden;margin:0;padding:0;"></ul>');
								var height = 0;
								$(nextAll).each(function()
								{
									height = height + $(this).outerHeight();
								});
								$(nextAll).parent().animate({height: height}, o.stacker_menu.animation_speed, function()
								{
									$(this).after($(this).children()).remove();
									$(toggle).html($(toggle).data('content_when_closed'));
								});
							}
							else
							{
								$(li).addClass(o.sub_menu.closed_class_name);
								$(li).siblings().not(o.li.permanant_selector).removeClass(o.li.hidden_class_name);
								$(toggle).html($(toggle).data('content_when_closed'));
							}
						}
						return false;
					}
				};
				
				// Bind a toggle's click and keypress to the toggle behaviour.
				$(stacker_menu).find('a.' + o.toggle.class_name).bind('click keypress', toggle_behaviour);

				// Bind a alias's click and keypress to the toggle behaviour.
				$(stacker_menu).find('a.' + o.alias.class_name).bind('click keypress', toggle_behaviour);
				
				// Check if a sub_menu should be open at startup.
				var animate = o.stacker_menu.animate;
				o.stacker_menu.animate = false;
				var els = jQuery.makeArray($(stacker_menu).find('.' + o.li.sub_menu_already_open_class_name).parents('li')).reverse();
				$(els).each(function()
				{
					$(this).find('> div .' + o.toggle.class_name).triggerHandler('click');
				});
				o.stacker_menu.animate = animate;
			}
		});
	};
	// Public defaults
	$.fn.stacker_menu.defaults = o = {};
	o.stacker_menu = {};
	o.stacker_menu.default_class_name = 'jquery-stacker-menu';
	o.stacker_menu.animate = true;
	o.stacker_menu.animation_speed = 1000;
	o.stacker_menu.animation_ratio = 1;
	o.stacker_menu.rendered_class_name = 'done';
	o.stacker_menu.toggle_after_class_name = 'after';
	o.stacker_menu.toggle_before_class_name = 'before';
	o.stacker_menu.toggle_after_link = false;
	o.stacker_menu.icon_set = '.2.1';
	o.toggle = {};
	o.toggle.class_name = 'toggle';
	o.alias = {};
	o.alias.class_name = 'alias';
	o.sub_menu = {};
	o.sub_menu.closed_class_name = 'closed';
	o.li = {};
	o.li.sub_menu_already_open_class_name = 'on';
	o.li.hidden_class_name = 'hide';
	o.li.menu_class_name = 'menu';
	o.li.permanant_selector = '.permanant';
	
})(jQuery);

