/*-------------------------------------------------------------------- 
Scripts for creating and manipulating custom menus based on standard <ul> markup
Version: 3.0, 03.31.2009

By: Maggie Costello Wachs (maggie@filamentgroup.com) and Scott Jehl (scott@filamentgroup.com)
	http://www.filamentgroup.com
	* reference articles: http://www.filamentgroup.com/lab/jquery_ipod_style_drilldown_menu/
		
Copyright (c) 2009 Filament Group
Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
--------------------------------------------------------------------*/
var allUIMenus=[];$.fn.menu=function(b){b=b;var a=new Menu(this,b);allUIMenus.push(a);$(this).mousedown(function(){a.menuOpen||a.showLoading()}).click(function(){a.menuOpen==false?a.showMenu():a.kill();return false});return a};
function Menu(b,a){var e=this;b=$(b);var c=$('<div id="menuContainer" class="fg-menu-container ui-widget ui-widget-content ui-corner-all">'+a.content+"</div>");this.menuExists=this.menuOpen=false;a=jQuery.extend({content:null,width:180,maxHeight:180,positionOpts:{posX:"left",posY:"bottom",offsetX:0,offsetY:0,directionH:"right",directionV:"down",detectH:true,detectV:true,linkToFront:false},showSpeed:200,callerOnState:"ui-state-active",loadingState:"ui-state-loading",linkHover:"ui-state-hover",linkHoverSecondary:"li-hover",
crossSpeed:200,crumbDefaultText:"Choose an option:",backLink:true,backLinkText:"Back",flyOut:false,flyOutOnState:"ui-state-default",nextMenuLink:"ui-icon-triangle-1-e",topLinkText:"All",nextCrumbLink:"ui-icon-carat-1-e"},a);var f=function(){$.each(allUIMenus,function(d){allUIMenus[d].menuOpen&&allUIMenus[d].kill()})};this.kill=function(){b.removeClass(a.loadingState).removeClass("fg-menu-open").removeClass(a.callerOnState);c.find("li").removeClass(a.linkHoverSecondary).find("a").removeClass(a.linkHover);
a.flyOutOnState&&c.find("li a").removeClass(a.flyOutOnState);a.callerOnState&&b.removeClass(a.callerOnState);c.is(".fg-menu-ipod")&&e.resetDrilldownMenu();c.is(".fg-menu-flyout")&&e.resetFlyoutMenu();c.parent().hide();e.menuOpen=false;$(document).unbind("click",f);$(document).unbind("keydown")};this.showLoading=function(){b.addClass(a.loadingState)};this.showMenu=function(){f();e.menuExists||e.create();b.addClass("fg-menu-open").addClass(a.callerOnState);c.parent().show().click(function(){e.kill();
return false});c.hide().slideDown(a.showSpeed).find(".fg-menu:eq(0)");e.menuOpen=true;b.removeClass(a.loadingState);$(document).click(f);$(document).keydown(function(d){var g;if(d.which!="")g=d.which;else if(d.charCode!="")g=d.charCode;else if(d.keyCode!="")g=d.keyCode;var h=$(d.target).parents("div").is(".fg-menu-flyout")?"flyout":"ipod";switch(g){case 37:if(h=="flyout"){$(d.target).trigger("mouseout");$("."+a.flyOutOnState).size()>0&&$("."+a.flyOutOnState).trigger("mouseover")}if(h=="ipod"){$(d.target).trigger("mouseout");
$(".fg-menu-footer").find("a").size()>0&&$(".fg-menu-footer").find("a").trigger("click");$(".fg-menu-header").find("a").size()>0&&$(".fg-menu-current-crumb").prev().find("a").trigger("click");$(".fg-menu-current").prev().is(".fg-menu-indicator")&&$(".fg-menu-current").prev().trigger("mouseover")}return false;case 38:if($(d.target).is("."+a.linkHover)){g=$(d.target).parent().prev().find("a:eq(0)");if(g.size()>0){$(d.target).trigger("mouseout");g.trigger("mouseover")}}else c.find("a:eq(0)").trigger("mouseover");
return false;case 39:if($(d.target).is(".fg-menu-indicator"))if(h=="flyout")$(d.target).next().find("a:eq(0)").trigger("mouseover");else if(h=="ipod"){$(d.target).trigger("click");setTimeout(function(){$(d.target).next().find("a:eq(0)").trigger("mouseover")},a.crossSpeed)}return false;case 40:if($(d.target).is("."+a.linkHover)){g=$(d.target).parent().next().find("a:eq(0)");if(g.size()>0){$(d.target).trigger("mouseout");g.trigger("mouseover")}}else c.find("a:eq(0)").trigger("mouseover");return false;
case 27:f();break;case 13:if($(d.target).is(".fg-menu-indicator")&&h=="ipod"){$(d.target).trigger("click");setTimeout(function(){$(d.target).next().find("a:eq(0)").trigger("mouseover")},a.crossSpeed)}}})};this.create=function(){c.css({width:a.width}).appendTo("body").find("ul:first").not(".fg-menu-breadcrumb").addClass("fg-menu");c.find("ul, li a").addClass("ui-corner-all");c.find("ul").attr("role","menu").eq(0).attr("aria-activedescendant","active-menuitem").attr("aria-labelledby",b.attr("id"));
c.find("li").attr("role","menuitem");c.find("li:has(ul)").attr("aria-haspopup","true").find("ul").attr("aria-expanded","false");c.find("a").attr("tabindex","-1");if(c.find("ul").size()>1)a.flyOut?e.flyout(c,a):e.drilldown(c,a);else c.find("a").click(function(){e.chooseItem(this);return false});a.linkHover&&c.find(".fg-menu li a").hover(function(){$(this);$("."+a.linkHover).removeClass(a.linkHover).blur().parent().removeAttr("id");$(this).addClass(a.linkHover).focus().parent().attr("id","active-menuitem")},
function(){$(this).removeClass(a.linkHover).blur().parent().removeAttr("id")});a.linkHoverSecondary&&c.find(".fg-menu li").hover(function(){$(this).siblings("li").removeClass(a.linkHoverSecondary);a.flyOutOnState&&$(this).siblings("li").find("a").removeClass(a.flyOutOnState);$(this).addClass(a.linkHoverSecondary)},function(){$(this).removeClass(a.linkHoverSecondary)});e.setPosition(c,b,a);e.menuExists=true};this.chooseItem=function(d){e.kill();page&&page.popup&&page.popup.menu&&page.popup.menu.selected?
page.popup.menu.selected(d):$("#menuSelection").text($(d).text())}}
Menu.prototype.flyout=function(b,a){var e=this;this.resetFlyoutMenu=function(){b.find("ul ul").removeClass("ui-widget-content").hide()};b.addClass("fg-menu-flyout").find("li:has(ul)").each(function(){var c=b.width(),f,d,g=$(this).find("ul");g.css({left:c,width:c}).hide();$(this).find("a:eq(0)").addClass("fg-menu-indicator").html("<span>"+$(this).find("a:eq(0)").text()+'</span><span class="ui-icon '+a.nextMenuLink+'"></span>').hover(function(){clearTimeout(d);var h=$(this).next();fitVertical(h,$(this).offset().top)||
h.css({top:"auto",bottom:0});fitHorizontal(h,$(this).offset().left+100)||h.css({left:"auto",right:c,"z-index":999});f=setTimeout(function(){h.addClass("ui-widget-content").show(a.showSpeed).attr("aria-expanded","true")},300)},function(){clearTimeout(f);var h=$(this).next();d=setTimeout(function(){h.removeClass("ui-widget-content").hide(a.showSpeed).attr("aria-expanded","false")},400)});$(this).find("ul a").hover(function(){clearTimeout(d);$(this).parents("ul").prev().is("a.fg-menu-indicator")&&$(this).parents("ul").prev().addClass(a.flyOutOnState)},
function(){d=setTimeout(function(){g.hide(a.showSpeed);b.find(a.flyOutOnState).removeClass(a.flyOutOnState)},500)})});b.find("a").click(function(){e.chooseItem(this);return false})};
Menu.prototype.drilldown=function(b,a){var e=this,c=b.find(".fg-menu"),f=$('<ul class="fg-menu-breadcrumb ui-widget-header ui-corner-all ui-helper-clearfix"></ul>'),d=$('<li class="fg-menu-breadcrumb-text">'+a.crumbDefaultText+"</li>"),g=$('<li class="'+(a.backLink?"fg-menu-prev-list":"fg-menu-all-lists")+'"><a href="#" class="'+(a.backLink?"ui-state-default ui-corner-all":"")+'">'+(a.backLink?'<span class="ui-icon ui-icon-triangle-1-w"></span>':"")+(a.backLink?a.backLinkText:a.topLinkText)+"</a></li>");
b.addClass("fg-menu-ipod");a.backLink?f.addClass("fg-menu-footer").appendTo(b).hide():f.addClass("fg-menu-header").prependTo(b);f.append(d);var h=function(i){i.height()>a.maxHeight&&i.addClass("fg-menu-scroll");i.css({height:a.maxHeight})},m=function(i){i.removeClass("fg-menu-scroll").removeClass("fg-menu-current").height("auto")};this.resetDrilldownMenu=function(){$(".fg-menu-current").removeClass("fg-menu-current");c.animate({left:0},a.crossSpeed,function(){$(this).find("ul").each(function(){$(this).hide();
m($(this))});c.addClass("fg-menu-current")});$(".fg-menu-all-lists").find("span").remove();f.empty().append(d);$(".fg-menu-footer").empty().hide();h(c)};c.addClass("fg-menu-content fg-menu-current ui-widget-content ui-helper-clearfix").css({width:b.width()}).find("ul").css({width:b.width(),left:b.width()}).addClass("ui-widget-content").hide();h(c);c.find("a").each(function(){$(this).next().is("ul")?$(this).addClass("fg-menu-indicator").each(function(){$(this).html("<span>"+$(this).text()+'</span><span class="ui-icon '+
a.nextMenuLink+'"></span>')}).click(function(){var i=$(this).next(),p=$(this).parents("ul:eq(0)"),n=p.is(".fg-menu-content")?0:parseFloat(c.css("left"));n=Math.round(n-parseFloat(b.width()));var l=$(".fg-menu-footer");m(p);h(i);c.animate({left:n},a.crossSpeed);i.show().addClass("fg-menu-current").attr("aria-expanded","true");var q=function(j){var k=$(".fg-menu-current"),o=k.parents("ul:eq(0)");k.hide().attr("aria-expanded","false");m(k);h(o);o.addClass("fg-menu-current").attr("aria-expanded","true");
if(o.hasClass("fg-menu-content")){j.remove();l.hide()}};if(a.backLink){if(l.find("a").size()==0){l.show();$('<a href="#"><span class="ui-icon ui-icon-triangle-1-w"></span> <span>Back</span></a>').appendTo(l).click(function(){var j=$(this),k=parseFloat(c.css("left"))+b.width();c.animate({left:k},a.crossSpeed,function(){q(j)});return false})}}else{if(f.find("li").size()==1){f.empty().append(g);g.find("a").click(function(){e.resetDrilldownMenu();return false})}$(".fg-menu-current-crumb").removeClass("fg-menu-current-crumb");
i=$(this).find("span:eq(0)").text();i=$('<li class="fg-menu-current-crumb"><a href="javascript://" class="fg-menu-crumb">'+i+"</a></li>");i.appendTo(f).find("a").click(function(){if($(this).parent().is(".fg-menu-current-crumb"))e.chooseItem(this);else{var j=-($(".fg-menu-current").parents("ul").size()-1)*180;c.animate({left:j},a.crossSpeed,function(){q()});$(this).parent().addClass("fg-menu-current-crumb").find("span").remove();$(this).parent().nextAll().remove()}return false});i.prev().append(' <span class="ui-icon '+
a.nextCrumbLink+'"></span>')}return false}):$(this).click(function(){e.chooseItem(this);return false})})};
Menu.prototype.setPosition=function(b,a,e){var c={refX:a.offset().left,refY:a.offset().top,refW:a.getTotalWidth(),refH:a.getTotalHeight()},f,d,g=$('<div id="menuHelper" class="positionHelper"></div>');g.css({position:"absolute",left:c.refX,top:c.refY,width:c.refW,height:c.refH,zIndex:2001});b.wrap(g);switch(e.positionOpts.posX){case "left":f=0;break;case "center":f=c.refW/2;break;case "right":f=c.refW}switch(e.positionOpts.posY){case "top":d=0;break;case "center":d=c.refH/2;break;case "bottom":d=
c.refH}f+=e.positionOpts.offsetX;d+=e.positionOpts.offsetY;if(e.positionOpts.directionV=="up"){b.css({top:"auto",bottom:d});e.positionOpts.detectV&&!fitVertical(b)&&b.css({bottom:"auto",top:d})}else{b.css({bottom:"auto",top:d});e.positionOpts.detectV&&!fitVertical(b)&&b.css({top:"auto",bottom:d})}if(e.positionOpts.directionH=="left"){b.css({left:"auto",right:f});e.positionOpts.detectH&&!fitHorizontal(b)&&b.css({right:"auto",left:f})}else{b.css({right:"auto",left:f});e.positionOpts.detectH&&!fitHorizontal(b)&&
b.css({left:"auto",right:f})}e.positionOpts.linkToFront&&a.clone().addClass("linkClone").css({position:"absolute",top:0,right:"auto",bottom:"auto",left:0,width:a.width(),height:a.height()}).insertAfter(b)};function sortBigToSmall(b,a){return a-b}jQuery.fn.getTotalWidth=function(){return $(this).width()+parseInt($(this).css("paddingRight"))+parseInt($(this).css("paddingLeft"))+parseInt($(this).css("borderRightWidth"))+parseInt($(this).css("borderLeftWidth"))};
jQuery.fn.getTotalHeight=function(){return $(this).height()+parseInt($(this).css("paddingTop"))+parseInt($(this).css("paddingBottom"))+parseInt($(this).css("borderTopWidth"))+parseInt($(this).css("borderBottomWidth"))};function getScrollTop(){return self.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop}function getScrollLeft(){return self.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft}
function getWindowHeight(){var b=document.documentElement;return self.innerHeight||b&&b.clientHeight||document.body.clientHeight}function getWindowWidth(){var b=document.documentElement;return self.innerWidth||b&&b.clientWidth||document.body.clientWidth}function fitHorizontal(b,a){var e=parseInt(a)||$(b).offset().left;return e+$(b).width()<=getWindowWidth()+getScrollLeft()&&e-getScrollLeft()>=0}
function fitVertical(b,a){var e=parseInt(a)||$(b).offset().top;return e+$(b).height()<=getWindowHeight()+getScrollTop()&&e-getScrollTop()>=0}
Number.prototype.pxToEm=String.prototype.pxToEm=function(b){b=jQuery.extend({scope:"body",reverse:false},b);var a=this==""?0:parseFloat(this),e;e=function(){var c=document.documentElement;return self.innerWidth||c&&c.clientWidth||document.body.clientWidth};e=b.scope=="body"&&$.browser.msie&&(parseFloat($("body").css("font-size"))/e()).toFixed(1)>0?(parseFloat($("body").css("font-size"))/e()).toFixed(3)*16:parseFloat(jQuery(b.scope).css("font-size"));return b.reverse==true?(a*e).toFixed(2)+"px":(a/
e).toFixed(2)+"em"};
