/*
	Author: Joel Greutman
	Email: joelgreutman@gmail.com
	Any distribution/use of this file must be requested of, and keeping the author's name and email in the file
		as designated.
*/

jQuery(function($) {
	$.z_index = 3;
	$.fadeInTime = 200;
	$.delayTime = 300;
	$.fadeOutTime = 150;
	
	var nav_list = $("#header ul[role='navigation']"); // Get the main navigation list

	// Get the items that have child ul's
	var items_with_sublist = nav_list.children("li").filter(function() {
		return $(this).children("ul").length > 0;
	});
	
	items_with_sublist.each(function(i){ $(this).fadeMenu({test: i}); });
});

(function(jQuery) {
	$ = jQuery;
	
	$.fn.fadeMenu = function(o) {
	  return this.each(function() {
	    new $.fadeMenu(this,o);
	  });
	};

	$.fadeMenu = function(el, o) {
		el.o = o;
		el.is_open = false;
		el.timeout = null;
		el.subMenu = $(el).children("ul");
		var this_pos = $(el).position();
		
		el.subMenu.children("li").css({
			display: "block"
		});
		
		if($.isRunningIE6OrBelow) {
			el.subMenu.each(function() {
				var longest_len = 0;
				var longest = null;
				$(this).children().each(function(i) {
					if($(this).text().length > longest_len) {
						longest = i;
						longest_len = $(this).text().length;
					}
				});
				$(this).css("width", parseInt(longest_len / 2 + 2) + "em");
			});
		}
		
		el.subMenu.each(function(){
			var self = getDOM($(this).parent());
			var parent_position_center_x = parseInt($(this).parent("li").offset().left) + parseInt($(this).parent("li").width()) / 2;
			var top = parseInt($(self).parent().position().top) + parseInt($(self).parent().outerHeight()) + 5;
			var left = parent_position_center_x - $(this).width() / 2;
			left += 10;
			$(this).css({
				"position": "absolute", // set them to have absolute position
				"top": top + ($.isRunningIE6OrBelow ? 10 : 0),
				"left": left,
				"margin": "0px",
				"zIndex": $.z_index+=3
			});
			var height = $(this).outerHeight();
			var width = $(this).outerWidth();
			
			var offset_y = 1;
			var offset_x = 1;
			var blur = 1;
			var opacity = 1;
			var shadow;
			var color = "#808080";
			
			// Add in the shadow container
			shadow_container = $('<div class="shadow-container" style="position:absolute; display:none; background-color: transparent;"></div>')
			.css({
				position: "absolute",
				height: height + blur * 2,
				width: width + blur * 2,
				left: left + offset_x - blur,
				top : top + offset_y - blur
			});
			$(self).append(shadow_container);
			self.shadow = $(self).find("div.shadow-container");
			self.shadowOffset = {top: offset_x - blur, left: offset_y - blur};
			
			var cur_width = width-blur*2;
			var cur_height = height-blur*2;
			var cur_offset_y = blur*2;
			var cur_offset_x = blur*2;
			var cur_opacity = opacity;
			
			// Only make the shadow if the browser supports opacity
			if(!$.isRunningIE6OrBelow) {
				for(var i = 0 - blur; i <= blur*2; i++) {
					shadow = $('<div class="drop-shadow" style="position: absolute; background-color: ' + color + ';" />')
					.css({
						filter: "alpha(opacity=" + parseInt(cur_opacity * 50) + ")",
						opacity: cur_opacity / 2.0,
						left: cur_offset_x + 1,
						top: cur_offset_y,
						width: cur_width - 2,
						height: cur_height
					});
					self.shadow.append(shadow);
				
					shadow = $('<div class="drop-shadow" style="position: absolute; background-color: ' + color + ';" />')
					.css({
						filter: "alpha(opacity=" + parseInt(cur_opacity * 50) + ")",
						opacity: cur_opacity / 2.0,
						left: cur_offset_x,
						top: cur_offset_y + 1,
						width: cur_width,
						height: cur_height - 2
					});
					self.shadow.append(shadow);
				
					cur_offset_x -= 1;
					cur_offset_y -= 1;
					cur_opacity  -= cur_opacity / (blur*2.0 + 1);
					cur_width += 2;
					cur_height += 2;
				}
			}
		});
		
		
		//Add in the show/hide on hover
		$(el).mouseenter(function() {
			var self = getDOM(this);
			clearTimeout(self.timeout);
			$(self).open();
		});
		$(el).mouseleave(function() {
			var self = getDOM(this);
			$(self).close();
		});
		
		$.fn.open = function() {
			var self = getDOM(this);
			if(!self.is_open) {
				// calculate the position and open it
				self.calculateSubmenuPosition();
				self.shadow.css("zIndex", $.z_index+=1);
				self.subMenu.css("zIndex", $.z_index+=1).add(self.shadow).fadeIn($.fadeInTime);
				self.is_open = true;
				clearTimeout(self.timeout);
			}
		};

		$.fn.close = function() {
			var self = getDOM(this);
			if(self.is_open) {
				self.timeout = $.timeout(function(){ self.subMenu.add(self.shadow).fadeOut($.fadeOutTime); }, $.delayTime);
				self.is_open = false;
			}
		}
		
		el.calculateSubmenuPosition = function() {
			var parent_position_center_y = parseInt($(el).offset().left) + parseInt($(el).width()) / 2;
			var top = parseInt($(el).parent().position().top) + parseInt($(el).parent().outerHeight()) + 5;
			var left = parent_position_center_y - el.subMenu.width() / 2;
			el.subMenu.css({
				"top": top,
				"left": left
			});
			el.shadow.css({
				top: top + el.shadowOffset.top,
				left: left + el.shadowOffset.left
			});
		};
		
		function getDOM(el) {
			return $(el).get(0);
		}
		
	};
	
})(jQuery);
