//Menu Plugin - Version: 3.5
(function($){
	$.fn.menu_wh = function(data,options) {
		var defaults = {
			directionL2:"down",
			directionL3:"right",
			directionL4:"right",
			currentL1:0,
			speed:500,
			closeDelay:100,
			showL3s:true,
			showL4s:true,
			reverseL2:true,
			debug:false
		};
		var dataStore = {
			currentActive:0,//currently active L1
			timeout:"",//the timout that hides the menus when a user rolls off them.
			L3Divs:0, //object of L3 Menus
			L4Divs:0, //object of L4 Menus
			data:data
		};

		var options = $.extend(defaults, options);
				
		return this.each(function() {
			var menuid = $.getNextID();
			var $menuHolder = $(this);
			
			if(dataStore.data.length > 0){
				buildMenus();
			}else{
				if(options.debug){$.log("No Data to build the menu with");}
			}
			
			if(options.speed == 0){
				options.speed = 1;
			}
			
			function buildMenus(){				
				for(var a = 0; a < dataStore.data.length; a++){
					var $menuButton = $("#"+$menuHolder.attr("id")+"_"+dataStore.data[a].id);
							
					var L1id = dataStore.data[a].id;
					if(L1id == options.currentL1){
						$("#"+$menuHolder.attr("id")+"_"+L1id).addClass("on");
					}
					
					var $subMenu;
					var $L2Holder;
						
					if(dataStore.data[a].L2.length > 0){
						$menuHolder.after("<div id='L2"+menuid+"_"+L1id+"' class='L2Menu_"+options.directionL2+"'></div>");
						$subMenu = $("#L2"+menuid+"_" + L1id);
						$L2Holder = $("<div class='L2Holder'></div>");
						$subMenu.append($L2Holder);
						$subMenu.css("display","none");
						
						if(options.directionL2 == "up" && options.reverseL2){						
							dataStore.data[a].L2.reverse();
						}
						
						for(var b = 0; b < dataStore.data[a].L2.length; b++){
							if(typeof dataStore.data[a].L2[b].url !== "undefined"){
								var target = dataStore.data[a].L2[b].target == true ? "_blank":"_self";
								var $L2Tag = $(document.createElement("a"))
										.addClass("L2MenuItems_"+options.directionL2)
										.attr("href", dataStore.data[a].L2[b].url)
										.attr("target",target)
										.attr("id","L2Item"+menuid+"_"+dataStore.data[a].L2[b].id)
										.append("<span>"+dataStore.data[a].L2[b].title+"</span>");
								$L2Tag.hover(function(){							
									//check for L3s
									var L2pageid = $(this).attr("id").split("_")[1];
									animateAllL3Out(L2pageid);
									if($("#L3"+menuid+"_"+L2pageid).length > 0){
										animateL3HolderIn(L2pageid);
									}
								},function(){
									//empty now, yay
								});
								//append new L2
								$L2Holder.append($L2Tag);
								
								//L3s
								if(dataStore.data[a].L2[b].L3.length > 0 && options.showL3s){
									var $L3Menu;
									$menuHolder.after("<div id='L3"+menuid+"_"+dataStore.data[a].L2[b].L3[0].parentid+"' class='L3Menu_"+options.directionL3+"'></div>");
									$L3Menu = $("#L3"+menuid+"_" + dataStore.data[a].L2[b].L3[0].parentid);
									$L3Holder = $("<div class='L3Holder'></div>");
									$L3Menu.append($L3Holder);
									$L3Menu.css("display","none");
									for(var c = 0; c < dataStore.data[a].L2[b].L3.length; c++){
										if(typeof dataStore.data[a].L2[b].L3[c].url !== "undefined"){
											var target = dataStore.data[a].L2[b].L3[c].target == true ? "_blank":"_self";
											var $L3Tag = $(document.createElement("a"))
														.addClass("L3MenuItems_"+options.directionL3)
														.attr("id", "L3Item"+menuid+"_"+dataStore.data[a].L2[b].L3[c].id)
														.attr("href", dataStore.data[a].L2[b].L3[c].url)
														.attr("target",target)
														.append("<span>"+dataStore.data[a].L2[b].L3[c].title+"</span>");
														
											$L3Tag.hover(function(){
												dataStore.currentActive = L1id;
								    			clearTimeout(dataStore.timeout);
								    			//if(options.debug){$.log("CLEARED TIMEOUT");}
												//check for L4s
												var L3pageid = $(this).attr("id").split("_")[1];												
												animateAllL4Out(L3pageid);
												if($("#L4"+menuid+"_"+L3pageid).length > 0){
													animateL4HolderIn(L3pageid);
												}
								    		},function(){
								    			dataStore.currentActive = 0;
								    			dataStore.timeout = setTimeout(function(){ animateAllOut()}, options.closeDelay);
								    			if(options.debug){$.log("L3 OUT!");}
								    		});
								    		$L3Holder.append($L3Tag);
											
											
											
											
											
											//L4s
											if(dataStore.data[a].L2[b].L3[c].L4.length > 0 && options.showL4s){
												var $L4Menu;
												$menuHolder.after("<div id='L4"+menuid+"_"+dataStore.data[a].L2[b].L3[c].L4[0].parentid+"' class='L4Menu_"+options.directionL4+"'></div>");
												$L4Menu = $("#L4"+menuid+"_" + dataStore.data[a].L2[b].L3[c].L4[0].parentid);
												$L4Holder = $("<div class='L4Holder'></div>");
												$L4Menu.append($L4Holder);
												$L4Menu.css("display","none");
												for(var d = 0; d < dataStore.data[a].L2[b].L3[c].L4.length; d++){
													if(typeof dataStore.data[a].L2[b].L3[c].L4[d].url !== "undefined"){
														var target = dataStore.data[a].L2[b].L3[c].L4[d].target == true ? "_blank":"_self";
														var $L4Tag = $(document.createElement("a"))
																	.addClass("L4MenuItems_"+options.directionL4)
																	.attr("id", "L4Item"+menuid+"_"+dataStore.data[a].L2[b].L3[c].L4[d].id)
																	.attr("href", dataStore.data[a].L2[b].L3[c].L4[d].url)
																	.attr("target",target)
																	.append("<span>"+dataStore.data[a].L2[b].L3[c].L4[d].title+"</span>");
																	
														$L4Tag.hover(function(){
															dataStore.currentActive = L1id;
															clearTimeout(dataStore.timeout);
															if(options.debug){$.log("CLEARED TIMEOUT");}
														},function(){
															dataStore.currentActive = 0;
															dataStore.timeout = setTimeout(function(){ animateAllOut()}, options.closeDelay);
															if(options.debug){$.log("L4 OUT!");}
														});
														$L4Holder.append($L4Tag);
													}
													
												}//end for loop L4s
												
												$L4Holder.children(":first").addClass('first-link');
												$L4Holder.children(":last").addClass('last-link');
												
												$L4Menu.prepend("<div id='L4Menu-header'><!-- --></div>")
												.append("<div id='L4Menu-footer'><!-- --></div>")
												.wrapInner("<div id='holder'></div>")
												.css("overflow","hidden");
												var $itemHolder = $L4Menu.children();
												
												
												$itemHolder.children().filter(function(){  
													return $(this).attr("id") == "L4Menu-header" || $(this).attr("id") == "L4Menu-footer";
												})
												.hover(function(){
													dataStore.currentActive = L1id;
													clearTimeout(dataStore.timeout);
												},function(){
													dataStore.currentActive = 0;
													dataStore.timeout = setTimeout(function(){ animateAllOut()}, options.closeDelay);
												});
												
												$L3Tag.data("hasMenu",true).addClass("submenu");
												positionL4MenuHolder($L4Menu);
											}//end show L4s
											
											
											
											
											
											
										}
										
									}//end for loop L3s
									
									$L3Holder.children(":first").addClass('first-link');
									$L3Holder.children(":last").addClass('last-link');
									
									$L3Menu.prepend("<div id='L3Menu-header'><!-- --></div>")
						    		.append("<div id='L3Menu-footer'><!-- --></div>")
						    		.wrapInner("<div id='holder'></div>")
						    		.css("overflow","hidden");
									var $itemHolder = $L3Menu.children();
									
									
									$itemHolder.children().filter(function(){  
									    return $(this).attr("id") == "L3Menu-header" || $(this).attr("id") == "L3Menu-footer";
									})
									.hover(function(){
									    dataStore.currentActive = L1id;
									    clearTimeout(dataStore.timeout);
									},function(){
									    dataStore.currentActive = 0;
									    dataStore.timeout = setTimeout(function(){ animateAllOut()}, options.closeDelay);
									});
									
									$L2Tag.data("hasMenu",true).addClass("submenu");
									positionL3MenuHolder($L3Menu);
								}//end show L3s
							}//end L2 url check
						}//end for loop for L2s
																						
						var hOffset = (!isNaN(parseInt($menuButton.attr("hoffset")))) ? $menuButton.attr("hoffset") : 0;
						var vOffset = (!isNaN(parseInt($menuButton.attr("voffset")))) ? $menuButton.attr("voffset") : 0;

						$L2Holder.children(":first").addClass('first-link');
						$L2Holder.children(":last").addClass('last-link');
						
						$L2Holder.hover(function(){
							dataStore.currentActive = L1id;
							clearTimeout(dataStore.timeout);
						},function(){
						    dataStore.currentActive = 0;
						    dataStore.timeout = setTimeout(function(){ animateAllOut()}, options.closeDelay);
						    if(options.debug){$.log("L2 HOLDER OUT");}
						});
					
						$subMenu.prepend("<div id='L2Menu-header'><!-- --></div>")
						    .append("<div id='L2Menu-footer'><!-- --></div>")
						    .wrapInner("<div id='holder'></div>")
						    .css("overflow","hidden")
						    .data("hOffset",hOffset)
						    .data("vOffset",vOffset);
						
						var $itemHolder = $subMenu.children();
						
						$itemHolder.children().filter(function(){  
						    return $(this).attr("id") == "L2Menu-header" || $(this).attr("id") == "L2Menu-footer";
						}).hover(function(){
						    dataStore.currentActive = L1id;
						    clearTimeout(dataStore.timeout);
						},function(){
						    dataStore.currentActive = 0;
						    dataStore.timeout = setTimeout(function(){ animateAllOut()}, options.closeDelay);
						});
						
						var $tempMenuItems = $itemHolder.children().filter(function(){  
						    return $(this).attr("id") != "L2Menu-header" || $(this).attr("id") != "L2Menu-footer";
						});
						
						$tempMenuItems.filter("div:first").addClass("menufirst");							
						
						var mylength = $itemHolder.children().filter(function(){  
						    return $(this).attr("id") != "L2Menu-header" || $(this).attr("id") != "L2Menu-footer";
						}).length;
						
						$menuButton.data("hasMenu",true);
						positionSubMenuHolder($subMenu);
					}//end if hav L2s	
				}//end for loop for L1s
				
				//need this to happen after menu is written...
				buildMenuAction();
				dataStore.L3Divs = $(".L3Menu_"+options.directionL3);
				dataStore.L4Divs = $(".L4Menu_"+options.directionL4);
				//if horizontal, open current L2
				if(options.directionL2 == "horizontal"){
				    $obj = $("#"+$menuHolder.attr("id")+"_"+options.currentL1);
				    if($obj.data("hasMenu")){
				    	var pageID =  $obj.data("pageID");
				    	animateSubMenuHolderIn(pageID);
				    }
				}
			}//end buildMenus()
						
			function buildMenuAction(){
				var $menuItems = $("#"+$menuHolder.attr("id")+" li a");
				$menuItems.each(function(){
					$obj = $(this);
					$obj.data("pageID",$(this).attr("id").substring($menuHolder.attr("id").length+1,$(this).attr("id").length));
				});
				
				$menuItems.hover(function () {
					killCurrentL2();
					
					var $obj = $(this);
					$obj.addClass("hover");
					if($obj.data("hasMenu")){
						var pageID =  $obj.data("pageID");
						dataStore.currentActive = pageID;
						animateSubMenuHolderIn(pageID);
					}
				}, 
				function () {
					var $obj = $(this);
					var pageID = $obj.data("pageID");
										
					if($obj.data("hasMenu")){
						dataStore.currentActive = 0;
						dataStore.timeout = setTimeout(function(){ animateAllOut()}, options.closeDelay);
					} else {
						$obj.removeClass("hover");
					}
					if(options.directionL2 == "horizontal" && !$obj.data("hasMenu")){
						dataStore.timeout = setTimeout(function(){ animateAllOut()}, options.closeDelay);
					}
					
				});
				if(options.debug){$.log("Menu Actions Built");}
			}//end buildMenuAction
			
			/*-------------------ANIMATE ALL FUNCTIONS--------------------*/
			
			function killCurrentL2(){
				killAllL3Out();
				killAllL4Out();
				//dataStore.currentActive = 0;
				if(options.directionL2 == "horizontal"){
					animateSubMenuHolderOut(options.currentL1);
				}
			}			
			
			function animateAllOut(){
				killAllL3Out();
				killAllL4Out();
				var $menuItems = $("#"+$menuHolder.attr("id")+" li a");
				$menuItems.each(function(){
					var pageid = $(this).attr("id").split("_")[1];
					if(pageid != dataStore.currentActive){
						animateSubMenuHolderOut(pageid);
					}
					
					if(options.directionL2 == "horizontal" && (options.currentL1 == pageid && dataStore.currentActive == 0)){
						animateSubMenuHolderIn(options.currentL1);
					}
				});
			}
			
			function killAllL3Out(){
				$L3s = dataStore.L3Divs;
				$L3s.each(function(){
					var pageid = $(this).attr("id").split("_")[1];
					animateL3HolderOut(pageid,false);
				});
			}
			
			function animateAllL3Out(currentActiveL2){
				$L3s = dataStore.L3Divs;
				$L3s.each(function(){
					var pageid = $(this).attr("id").split("_")[1];					
					if(pageid != currentActiveL2)
						animateL3HolderOut(pageid);
				});
			}
			
			function killAllL4Out(){
				$L4s = dataStore.L4Divs;
				$L4s.each(function(){
					var pageid = $(this).attr("id").split("_")[1];
					animateL4HolderOut(pageid,false);
				});
			}
			
			function animateAllL4Out(currentActiveL3){
				$L4s = dataStore.L4Divs;
				$L4s.each(function(){
					var pageid = $(this).attr("id").split("_")[1];					
					if(pageid != currentActiveL3)
						animateL4HolderOut(pageid);
				});
			}
			
			/*-------------------L2 FUNCTIONS--------------------*/
			
			function positionSubMenu($menuButton, $subMenu){
				var offset = $menuButton.getTopLeft();
				
				var top = 0;
				var left = 0;
				switch (options.directionL2){
				case "up":
					top = parseInt(offset.top) - parseInt($subMenu.height()) + parseInt($subMenu.data("vOffset"));
					left = parseInt(offset.left) + parseInt($subMenu.data("hOffset"));
					break;
				case "down":
					top = parseInt(offset.top) + $menuButton.height() + parseInt($subMenu.data("vOffset"));
					left = parseInt(offset.left) + parseInt($subMenu.data("hOffset"));	
					break;
				case "left":
					top = parseInt(offset.top) + parseInt($subMenu.data("vOffset"));
					left = parseInt(offset.left) - $subMenu.width() + parseInt($subMenu.data("hOffset"));
					//console.debug(left);
					break;
				case "right":
					top = parseInt(offset.top) + parseInt($subMenu.data("vOffset"));
					left = parseInt(offset.left) + $menuButton.width() + parseInt($subMenu.data("hOffset"));	
					break;
				case "horizontal":
					//set to the left positon of the main ul container
					var offset = $menuHolder.getTopLeft();
					top = parseInt(offset.top) + $menuHolder.height() + parseInt($subMenu.data("vOffset"));
					left = parseInt(offset.left) + parseInt($subMenu.data("hOffset"));
					break;
				default:
					top = parseInt(offset.top) + $menuButton.height() + parseInt($subMenu.data("vOffset"));
					left = parseInt(offset.left) + parseInt($subMenu.data("hOffset"));
					break;
				}
				$subMenu.css("top", top+"px");
				
				//console.debug(left);
				$subMenu.css("left", left+"px");
			}//end positionSubMenu
			
			function positionSubMenuHolder($subMenu){
				var top = 0;
				var left = 0;
				switch (options.directionL2){
					case "up":
						top = $subMenu.height();
						left = 0;
						break;
					case "down":
						top = $subMenu.height() * -1;
						left = 0;
						break;
					case "left":
						top = 0;
						left = $subMenu.width();
						break;
					case "right":
						top = 0;
						left = 0 - $subMenu.width();
						break;
					case "horizontal":
						top = $subMenu.height() * -1;
						left = 0;
						break;
					default:
						top = $subMenu.height() * -1;
						left = 0;
						break;
				}
				var $subMenuHolder = $subMenu.children("#holder");
				$subMenuHolder.css("top",top).css("left",left).css("position","relative");
			}//end positionSubMenuHolder			
						
			function animateSubMenuHolderIn(pageID) {
				if(options.debug){$.log("animate menu");}
				var $menuButton = $("#"+$menuHolder.attr("id")+"_"+pageID);
				var $subMenu =  $("#L2"+menuid+"_" + pageID);
				var $subHolder = $("#L2"+menuid+"_" + pageID+" div:first");
				var top = 0;
				var left = 0;
				
				if(options.debug){$.txt($subHolder);}
				positionSubMenu($menuButton, $subMenu);
				
				$menuButton.addClass("hover");
				$subHolder.queue("fx", []).stop();
				$subMenu.show().css("z-index",1000);
				if(options.debug){$.log("SPEED:" + options.speed);}
				//alert(options.directionL2);
				switch (options.directionL2){
					case "up":
						$subHolder.animate({top: 0},options.speed);
						break;
					case "down":
						$subHolder.animate({top: 0},options.speed);
						//$subHolder.css("top",0);
						break;
					case "left":
						$subHolder.animate({left: 0},options.speed);
						break;
					case "right":
						$subHolder.animate({left: 0},options.speed);
						break;
					case "horizontal":
						$subHolder.animate({top: 0},options.speed);
						break;
					default:
						$subHolder.animate({top: 0},options.speed);
						break;
				}
			}//end animateSubMenuHolderIn
			
			function animateSubMenuHolderOut(pageID) {
				//if(options.debug){$.log("animate OUT");}
				var $menuButton = $("#"+$menuHolder.attr("id")+"_"+pageID);
				var $subMenu =  $("#L2"+menuid+"_" + pageID);
				
				//if(options.debug){$.log("menuid:"+menuid);}
				//if(options.debug){$.log("#L2"+menuid+"_" + pageID+" #holder");}
				var $subHolder = $("#L2"+menuid+"_" + pageID+" div:first");
				//if(options.debug){$.log($menuButton);}
				var top = 0;
				var left = 0;
				
				$menuButton.removeClass("hover");
				
				
				$subMenu.css("z-index",options.speed);
				$subHolder.queue("fx", []).stop();
				switch (options.directionL2){
					case "up":
						top = $subMenu.height();
						$subHolder.animate({top: top},options.speed);
					break;
					case "down":
						top = parseInt($subMenu.height()) * -1;
						$subHolder.animate({top: top},options.speed); 
						//if(options.debug){$.log("TOP: "+top);}
						//if(options.debug){$.log("object = "+$subHolder.attr("id"));}
						//$subHolder.css({"top":top + "px"});
					break;
					case "left":
						left = parseInt($subMenu.width()) * 2;
						$subHolder.animate({left: left},options.speed);
					break;
					case "right":
						left = 0 - parseInt($subMenu.width());
						$subHolder.animate({left: left},options.speed);
					break;
					case "horizontal":
						top = parseInt($subMenu.height()) * -1;
						$subHolder.animate({top: top},options.speed); 
						break;
					default:
						top = parseInt($subMenu.height()) * -1;
						$subHolder.animate({top: top},options.speed); 
						break;
			
				}
				
				$subHolder.queue(function () {
					$(this).parent().hide();
					$(this).dequeue();
				});
					
			}//end animateSubMenuHolderOut
			
			/*-------------------L3 FUNCTIONS--------------------*/
			
			function positionL3Menu($menuButton, $subMenu){
				var offset = $menuButton.getTopLeft();
				var parentOffset = $menuButton.parent().parent().parent();
				if(options.debug){$.log(parentOffset.top +" : "+offset.top);}
				var top = 0;
				var left = 0;
				//the only ones done so far is down, up, and horizontal. left and right are very very wrong!
				switch (options.directionL3){
					//OLD
					
					case "up":
						top = parseInt(offset.top) + parseInt(parentOffset.css("top"));
						left = parseInt(offset.left) + parseInt(parentOffset.css("left")) + $menuButton.width();	
						break;
					case "down":
						top = parseInt(offset.top) + parseInt(parentOffset.css("top"));
						left = parseInt(offset.left) + parseInt(parentOffset.css("left")) + $menuButton.width();	
						break;
					case "left":
						top = parseInt(offset.top) + parseInt(parentOffset.css("top"));
						left = parseInt(offset.left) + parseInt(parentOffset.css("left")) - $subMenu.width();
						
						
						
						break;
					case "right":
						//distance from top of L2 to top of L3 holder
						//alert("parseInt(offset.top): "+parseInt(offset.top));
						
						//distance from the top of page to the L2 holder 
						//alert("parseInt(parentOffset.css('top')): "+parseInt(parentOffset.css("top")));

						//L3 holder height
						//alert("$subMenu.height(): "+$subMenu.height());
						
						//number of L3s minus the header and footer
						//alert("$subMenu.children().children().size()-2: "+($subMenu.children().children().size()-2));
						
						
						top = parseInt(offset.top) + parseInt(parentOffset.css("top"));
						left = parseInt(offset.left) + parseInt(parentOffset.css("left")) + $menuButton.width();
						
						
						//var L3_holder_height = $subMenu.height();
						//var L3Total = $subMenu.children().children().size()-2;
						//var L3Total_half = Math.floor(L3Total/2);
						//var L3Total_half_ctr = 0;
						
						
						
						
						break;
					case "horizontal":
						top = parseInt(offset.top) + parseInt(parentOffset.css("top")) + $menuButton.height();
						left = parseInt(offset.left) + parseInt(parentOffset.css("left"));
						break;
					default:
						top = parseInt(offset.top) + parseInt(parentOffset.css("top"));
						left = parseInt(offset.left) + parseInt(parentOffset.css("left")) + $menuButton.width();
						break;
				}
				$subMenu.css("top", top+"px");
				$subMenu.css("left", left+"px");
			}//end positionL3Menu
			
			function positionL3MenuHolder($subMenu){
				var top = 0;
				var left = 0;

				switch (options.directionL3){
					//OLD
					/*
					case "up":
						top = 0;
						left = 0 - $subMenu.width();
						break;
					case "down":
						top = 0;
						left = 0 - $subMenu.width();
						break;
					case "left":
						top = 0;
						left = $subMenu.width() * 2; 
						break;
					case "right":
						top = 0;
						left = 0 - $subMenu.width();
						break;
					
					*/
					//NEW
					case "up":
						top = $subMenu.height();
						left = 0;
						break;
					case "down":
						top = $subMenu.height() * -1;
						left = 0;
						break;
					case "left":
						top = 0;
						left = $subMenu.width();
						break;
					case "right":
						top = 0;
						left = 0 - $subMenu.width();
						break;
					case "horizontal":
						top = $subMenu.height() * -1;
						left = 0;
						break;
					default:
						top = 0;
						left = 0 - $subMenu.width();
						break;
				}
				var $subMenuHolder = $subMenu.children("#holder");
				$subMenuHolder.css("top",top).css("left",left).css("position","relative");
			}//end positionL3MenuHolder
			
			function animateL3HolderIn(pageid){
				var $menuButton = $("#L2Item"+menuid+"_"+pageid);
				var $subMenu =  $("#L3"+menuid+"_" + pageid);
				var $subHolder = $("#L3"+menuid+"_" + pageid+" div:first");
				var top = 0;
				var left = 0;
				
				positionL3Menu($menuButton, $subMenu);
				
				$menuButton.addClass("on");
				$subHolder.queue("fx", []).stop();
				$subMenu.show().css("z-index",1000);
				switch (options.directionL3){
					case "up":
						$subHolder.animate({left: 0},options.speed);
						break;
					case "down":
						$subHolder.animate({left: 0},options.speed);
						break;
					case "left":
						$subHolder.animate({left: 0},options.speed);
						break;
					case "right":
						$subHolder.animate({left: 0},options.speed);
						break;
					case "horizontal":
						$subHolder.animate({top: 0},options.speed);
						break;
					default:
						$subHolder.animate({left: 0},options.speed);
						break;
				}
			}//end animateL3HolderIn
			
			function animateL3HolderOut(pageid,animate){
				//checks to see if i need to animate the L3s or just hide them
				animate = typeof(animate) != 'undefined' ? animate : true;
								
				var $menuButton = $("#L2Item"+menuid+"_"+pageid);
				var $subMenu =  $("#L3"+menuid+"_" + pageid);
				var $subHolder = $("#L3"+menuid+"_" + pageid+" div:first");
				var top = 0;
				var left = 0;
				
				$menuButton.removeClass("on");
				$subMenu.css("z-index",options.speed);
				$subHolder.queue("fx", []).stop();
				switch (options.directionL3){
					case "up":		
						left = 0 - parseInt($subMenu.width());
						//figure out a cleaner way to do this....
						if(animate){
							$subHolder.animate({left: left},options.speed);
						}else{
							$subHolder.css("left",left+"px");
						}
						break;
					case "down": 
						left = 0 - parseInt($subMenu.width());
						//figure out a cleaner way to do this....
						if(animate){
							$subHolder.animate({left: left},options.speed);
						}else{
							$subHolder.css("left",left+"px");
						}
						break;
						
					/*	
					case "right":
						left = 0 - parseInt($subMenu.width());
						$subHolder.animate({left: left},options.speed);
					break;
					case "left":
						left = parseInt($subMenu.width()) * 2;
						$subHolder.animate({left: left},options.speed);
					break;
					*/	
						
					case "right":
						left = 0 - parseInt($subMenu.width());
						//figure out a cleaner way to do this....
						if(animate){
							$subHolder.animate({left: left},options.speed);
						}else{
							$subHolder.css("left",left+"px");
						}
						break;
					case "left":
						left = parseInt($subMenu.width());
						//figure out a cleaner way to do this....
						if(animate){
							$subHolder.animate({left: left},options.speed);
						}else{
							$subHolder.css("left",left+"px");
						}
						break;
					case "horizontal":
						top = parseInt($subMenu.height()) * -1;
						if(animate){
							$subHolder.animate({top: top},options.speed);
						}else{
							$subHolder.css("top",top+"px");
						}
						break;
					default:
						left = 0 - parseInt($subMenu.width());
						//figure out a cleaner way to do this....
						if(animate){
							$subHolder.animate({left: left},options.speed);
						}else{
							$subHolder.css("left",left+"px");
						}
						break;
			
				}
				$subHolder.queue(function () {
					$(this).parent().hide();
					$(this).dequeue();
				});	
			}//end animateL3HolderOut
			
			
			
			
			
			
			
			/*-------------------L4 FUNCTIONS--------------------*/
			
			function positionL4Menu($menuButton, $subMenu){
				var offset = $menuButton.getTopLeft();
				var parentOffset = $menuButton.parent().parent().parent();
				if(options.debug){$.log(parentOffset.top +" : "+offset.top);}
				var top = 0;
				var left = 0;
				//the only ones done so far is down, up, and horizontal. left and right are very very wrong!
				switch (options.directionL4){
					//OLD
					
					case "up":
						top = parseInt(offset.top) + parseInt(parentOffset.css("top"));
						left = parseInt(offset.left) + parseInt(parentOffset.css("left")) + $menuButton.width();	
						break;
					case "down":
						top = parseInt(offset.top) + parseInt(parentOffset.css("top"));
						left = parseInt(offset.left) + parseInt(parentOffset.css("left")) + $menuButton.width();	
						break;
					case "left":
						top = parseInt(offset.top) + parseInt(parentOffset.css("top"));
						left = parseInt(offset.left) + parseInt(parentOffset.css("left")) - $subMenu.width();
						
						
						
						break;
					case "right":
						//distance from top of L2 to top of L3 holder
						//alert("parseInt(offset.top): "+parseInt(offset.top));
						
						//distance from the top of page to the L2 holder 
						//alert("parseInt(parentOffset.css('top')): "+parseInt(parentOffset.css("top")));

						//L3 holder height
						//alert("$subMenu.height(): "+$subMenu.height());
						
						//number of L3s minus the header and footer
						//alert("$subMenu.children().children().size()-2: "+($subMenu.children().children().size()-2));
						
						
						top = parseInt(offset.top) + parseInt(parentOffset.css("top"));
						left = parseInt(offset.left) + parseInt(parentOffset.css("left")) + $menuButton.width();
						
						
						//var L3_holder_height = $subMenu.height();
						//var L3Total = $subMenu.children().children().size()-2;
						//var L3Total_half = Math.floor(L3Total/2);
						//var L3Total_half_ctr = 0;
						
						
						
						
						break;
					case "horizontal":
						top = parseInt(offset.top) + parseInt(parentOffset.css("top")) + $menuButton.height();
						left = parseInt(offset.left) + parseInt(parentOffset.css("left"));
						break;
					default:
						top = parseInt(offset.top) + parseInt(parentOffset.css("top"));
						left = parseInt(offset.left) + parseInt(parentOffset.css("left")) + $menuButton.width();
						break;
				}
				$subMenu.css("top", top+"px");
				$subMenu.css("left", left+"px");
			}//end positionL3Menu
			
			function positionL4MenuHolder($subMenu){
				var top = 0;
				var left = 0;

				switch (options.directionL4){
					//OLD
					/*
					case "up":
						top = 0;
						left = 0 - $subMenu.width();
						break;
					case "down":
						top = 0;
						left = 0 - $subMenu.width();
						break;
					case "left":
						top = 0;
						left = $subMenu.width() * 2; 
						break;
					case "right":
						top = 0;
						left = 0 - $subMenu.width();
						break;
					
					*/
					//NEW
					case "up":
						top = $subMenu.height();
						left = 0;
						break;
					case "down":
						top = $subMenu.height() * -1;
						left = 0;
						break;
					case "left":
						top = 0;
						left = $subMenu.width();
						break;
					case "right":
						top = 0;
						left = 0 - $subMenu.width();
						break;
					case "horizontal":
						top = $subMenu.height() * -1;
						left = 0;
						break;
					default:
						top = 0;
						left = 0 - $subMenu.width();
						break;
				}
				var $subMenuHolder = $subMenu.children("#holder");
				$subMenuHolder.css("top",top).css("left",left).css("position","relative");
			}//end positionL4MenuHolder
			
			function animateL4HolderIn(pageid){
				var $menuButton = $("#L3Item"+menuid+"_"+pageid);
				var $subMenu =  $("#L4"+menuid+"_" + pageid);
				var $subHolder = $("#L4"+menuid+"_" + pageid+" div:first");
				var top = 0;
				var left = 0;
				
				positionL4Menu($menuButton, $subMenu);
				
				$menuButton.addClass("on");
				$subHolder.queue("fx", []).stop();
				$subMenu.show().css("z-index",1000);
				switch (options.directionL4){
					case "up":
						$subHolder.animate({left: 0},options.speed);
						break;
					case "down":
						$subHolder.animate({left: 0},options.speed);
						break;
					case "left":
						$subHolder.animate({left: 0},options.speed);
						break;
					case "right":
						$subHolder.animate({left: 0},options.speed);
						break;
					case "horizontal":
						$subHolder.animate({top: 0},options.speed);
						break;
					default:
						$subHolder.animate({left: 0},options.speed);
						break;
				}
			}//end animateL4HolderIn
			
			function animateL4HolderOut(pageid,animate){
				//checks to see if I need to animate the L4s or just hide them
				animate = typeof(animate) != 'undefined' ? animate : true;
								
				var $menuButton = $("#L3Item"+menuid+"_"+pageid);
				var $subMenu =  $("#L4"+menuid+"_" + pageid);
				var $subHolder = $("#L4"+menuid+"_" + pageid+" div:first");
				var top = 0;
				var left = 0;
				
				$menuButton.removeClass("on");
				$subMenu.css("z-index",options.speed);
				$subHolder.queue("fx", []).stop();
				switch (options.directionL4){
					case "up":		
						left = 0 - parseInt($subMenu.width());
						//figure out a cleaner way to do this....
						if(animate){
							$subHolder.animate({left: left},options.speed);
						}else{
							$subHolder.css("left",left+"px");
						}
						break;
					case "down": 
						left = 0 - parseInt($subMenu.width());
						//figure out a cleaner way to do this....
						if(animate){
							$subHolder.animate({left: left},options.speed);
						}else{
							$subHolder.css("left",left+"px");
						}
						break;
						
					/*	
					case "right":
						left = 0 - parseInt($subMenu.width());
						$subHolder.animate({left: left},options.speed);
					break;
					case "left":
						left = parseInt($subMenu.width()) * 2;
						$subHolder.animate({left: left},options.speed);
					break;
					*/	
						
					case "right":
						left = 0 - parseInt($subMenu.width());
						//figure out a cleaner way to do this....
						if(animate){
							$subHolder.animate({left: left},options.speed);
						}else{
							$subHolder.css("left",left+"px");
						}
						break;
					case "left":
						left = parseInt($subMenu.width());
						//figure out a cleaner way to do this....
						if(animate){
							$subHolder.animate({left: left},options.speed);
						}else{
							$subHolder.css("left",left+"px");
						}
						break;
					case "horizontal":
						top = parseInt($subMenu.height()) * -1;
						if(animate){
							$subHolder.animate({top: top},options.speed);
						}else{
							$subHolder.css("top",top+"px");
						}
						break;
					default:
						left = 0 - parseInt($subMenu.width());
						//figure out a cleaner way to do this....
						if(animate){
							$subHolder.animate({left: left},options.speed);
						}else{
							$subHolder.css("left",left+"px");
						}
						break;
			
				}
				$subHolder.queue(function () {
					$(this).parent().hide();
					$(this).dequeue();
				});	
			}//end animateL4HolderOut
			
			
			
			
			
			
			
			
		});//end return this.each funct4on
	};//end menu function
	
	$.fn.menu_wh.version = function(){
      	if(window.console){
      		console.debug("Menu Plugin, Version: 3.5");
      	}
    };
})(jQuery);

(function($){
	var count = 0;
	jQuery.getNextID = function() {
		return count++;
	};
})(jQuery);

jQuery.txt = function() {
	return this.each(function(){
		$.log(this);
	});
};

//for debug/log stuff
jQuery.log = function(message) {
 if(window.console){
 	var str = message;
    if( typeof(message) == 'object' ){
		str = '&lt;';
		//str += message.nodeName.toLowerCase();
		for( var i = 0; i < message.attributes.length; i++ ){
			str += ' ' + message.attributes[i].nodeName.toLowerCase() + '="' + message.attributes[i].nodeValue + '"';
		}
		str += '&gt;';
	}
	console.debug(str);
 }
};
