/*
jQuery common scripts for Loewy GridMenu
- Sukiman, suki@webexcellence.net, http://www.webexcellence.net/
*/
(function($){
	$.loewy = $.loewy || {};
	
	$.fn.loewyGridMenu = function(o) {
		return this.each(function() {
			new $.loewy.loewyGridMenu(this,o);
		});
	}
	
	$.loewy.loewyGridMenu = function(ele, o) {
		var options = $.extend({ 
			showDuration: 500,
			hideDuration: 400,
			animType: 1,
			backgroundColor: "#1A314F",
			easeShow:"easeInQuad",
			easeHide:"easeOutQuad"
		},o);
		var timeouts = new Array();
		var self = this;
		var p = ele;
		var current = null;
		var isFixed = false;
		var colors = new Array();
		var parentcolor = undefined;
		var submenu = undefined;
		var trigger = undefined;
		var width = 0;
		var submenuitems = new Array();
		var onOver = false;
		var hideTimeout = 0;
		
		var hideIdx = 0;
		var showIdx = 0;
		
		var init = function() {
			if ($(p).is(".fixed")) {
				$(".fixedSel > a", p).css("background", options.backgroundColor);
				$(".gridMenu, .gridMenu2",p).show();
				isFixed = true;
				
			} else {
				if ($(".subMenuItems",p).length > 0) {
					submenu = $($(".subMenuItems",p)[0]);
					
					if (submenu.prev().is(".gridMenu") || submenu.prev().is(".gridMenu2")) {
						trigger = submenu.prev();
						trigger = $($(".gridMenuItem, .gridMenuContainer",trigger)[0]);
					} else {
						subMenu = undefined;
					}
				}
				
				if (submenu && trigger) {
					var w = 0;
					var i = 0;
					
					parentcolor = $(trigger).css("background-color") || options.backgroundColor;
					
					$(".gridMenu, .gridMenu2", submenu).each(function() {
						if (options.animType == 2) {
							if (w==0) {
								w += $(this).outerWidth();
							}
						} else {
							w += $(this).outerWidth();
						}
						
						colors[i] = $(".gridMenuItem, .gridMenuContainer",this).css("backgroundColor") || parentColor;
						submenuitems[i] = {};
						submenuitems[i].e = $(this);
						submenuitems[i].w = $(this).outerWidth();
						submenuitems[i].h = $(this).outerHeight();
						submenuitems[i].c = colors[i];
						submenuitems[i].a = $($(".gridMenuItem, .gridMenuContainer",this)[0]);
						submenuitems[i].i = i;
						
						submenuitems[i].d = undefined;
						if ($(".loewDropDownMenu",submenuitems[i].e).length > 0) {
							submenuitems[i].d = $(".loewDropDownMenu",submenuitems[i].e);
							submenuitems[i].d.css({visibility:"hidden"});
						}
						
						//submenuitems[i].e.css({width:"0px",height:"0px"});
						submenuitems[i].a.css({backgroundColor:parentcolor});
						
						$(this).data("loewyGridMenuItem",submenuitems[i]);
						
						submenuitems[i].e.bind("mouseover",onSubMenuMouseOver);
						submenuitems[i].e.bind("mouseout",onSubMenuMouseOut);
						
						i++;
					});
					
					width = w;
					submenu.css({width: width+"px"});
					
					trigger.bind("mouseover",onTriggerMouseOver);
					trigger.bind("mouseout",onTriggerMouseOut);
				}
			}
		};
		
		var hideSubMenu = function() {
			var n = submenuitems.length;
			
			for(var i=hideIdx;i>=0;i--) {
				var sub = submenuitems[i];
				
				if (sub == undefined) continue;
				
				var anim = {};
				var duration = options.showDuration;
				
				if (options.animType == 2 && i > 0) {
					duration = duration / 2;
				}
				
				if (options.animType == 2 && i > 0) {
					anim.height = "hide";
				} else {
					anim.width = "hide";
				}
				
				if (sub.d) {
					sub.d.css({visibility:"hidden"});
					sub.d.each(function() {
						d = $(this).data("loewydropdown_forcehide");
						if (typeof d == "function") {
							d();
						}
					});
				}
				
				sub.e.stop();
				sub.e.animate(anim,{duration:duration,queue:false,easing:options.easeHide,complete:function(){
					var me = $(this).data("loewyGridMenuItem");
					if (options.animType == 2 && me.i==1) {
						hideIdx = 0;
						hideSubMenu();
					}
				}});
				
				sub.a.stop();
				sub.a.animate({backgroundColor:parentcolor},{duration:duration*1.5,queue:false,easing:options.easeHide});
				
				if (options.animType == 2 && i==1) {
					break;
				}
			}
		};
		
		var showSubMenu = function() {
			var n = submenuitems.length;
			
			for(var i=showIdx;i<n;i++) {
				var sub = submenuitems[i];
				var anim = {};
				var duration = options.showDuration;
				
				if (options.animType == 2 && i > 0) {
					duration = duration / 2;
				}
				
				if (options.animType == 2 && i > 0) {
					sub.e.css({width:sub.w+"px"});
					
					var h = sub.e.outerHeight();
					
					sh = sub.h - h;
					
					if (sh > 0) {
						ah = "+="+sh;
					} else if (sh < 0) {
						ah = "-="+(sh*-1);
					} else {
						ah = "show";
					}
					
					anim.height = ah;
					
				} else {
					sub.e.css({height:sub.h+"px"});
					var w = sub.e.outerWidth();
					
					sw = sub.w - w;
					if (sw > 0) {
						aw = "+="+sw;
					} else if (sw < 0) {
						aw = "-="+(sw*-1);
					} else {
						aw = "show";
					}
					
					anim.width = aw;
				}
				
				sub.e.stop();
				sub.e.animate(anim,{duration:duration,queue:false,easing:options.easeShow,complete:function(){
					var me = $(this).data("loewyGridMenuItem");
					if (options.animType == 2 && me.i==0) {
						showIdx = 1;
						showSubMenu();
					}
					
					if (me.d) {
						me.d.css({visibility:"visible"});
						me.d.each(function() {
							d = $(this).data("loewydropdown_resetvalue");
							if (typeof d == "function") {
								d();
							}
							
							d = $(this).data("loewydropdown_forceshow");
							if (typeof d == "function") {
								d();
							}
						});
					}
					
					
					
				}});
				
				sub.a.stop();
				if (aw == "show") {
					//sub.a.css({backgroundColor:parentcolor});
				}
				sub.a.animate({backgroundColor:sub.c},{duration:duration*1.5,queue:false,easing:options.easeShow});
				
				if (options.animType == 2 && i==0) {
					break;
				}
			}
		};
		
		var onTriggerMouseOver = function() {
			cancelHide();
			showIdx = 0;
			showSubMenu();
			onOver = true;
		};
		
		var onSubMenuMouseOver = function() {
			cancelHide();
			onOver = true;
		};
		
		var onTriggerMouseOut = function() {
			initHide();
			onOver = false;
		};
		
		var onSubMenuMouseOut = function() {
			initHide();
			onOver = false;
		};
		
		var initHide = function() {
			cancelHide();
			hideIdx = submenuitems.length-1;
			hideTimeout = window.setTimeout(hideSubMenu,300);
		};
		
		var cancelHide = function() {
			if (hideTimeout > 0) {
				window.clearTimeout(hideTimeout);
			}
			hideTimeout = 0;
		};
		
		
		init();
	}
	
	
})($);


