123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653 |
- /*--------------------------------------------------------------------
- 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(options){
- var caller = this;
- var options = options;
- var m = new Menu(caller, options);
- allUIMenus.push(m);
-
- $(this)
- .mousedown(function(){
- if (!m.menuOpen) { m.showLoading(); };
- })
- .click(function(){
- if (m.menuOpen == false) { m.showMenu(); }
- else { m.kill(); };
- return false;
- });
- };
- function Menu(caller, options){
- var menu = this;
- var caller = $(caller);
- var container = $('<div class="fg-menu-container ui-widget ui-widget-content ui-corner-all">'+options.content+'</div>');
-
- this.menuOpen = false;
- this.menuExists = false;
-
- var options = jQuery.extend({
- content: null,
- width: 180, // width of menu container, must be set or passed in to calculate widths of child menus
- maxHeight: 180, // max height of menu (if a drilldown: height does not include breadcrumb)
- positionOpts: {
- posX: 'left',
- posY: 'bottom',
- offsetX: 0,
- offsetY: 0,
- directionH: 'right',
- directionV: 'down',
- detectH: true, // do horizontal collision detection
- detectV: true, // do vertical collision detection
- linkToFront: false
- },
- showSpeed: 200, // show/hide speed in milliseconds
- callerOnState: 'ui-state-active', // class to change the appearance of the link/button when the menu is showing
- loadingState: 'ui-state-loading', // class added to the link/button while the menu is created
- linkHover: 'ui-state-hover', // class for menu option hover state
- linkHoverSecondary: 'li-hover', // alternate class, may be used for multi-level menus
- // ----- multi-level menu defaults -----
- crossSpeed: 200, // cross-fade speed for multi-level menus
- crumbDefaultText: 'Choose an option:',
- backLink: true, // in the ipod-style menu: instead of breadcrumbs, show only a 'back' link
- backLinkText: 'Back',
- flyOut: false, // multi-level menus are ipod-style by default; this parameter overrides to make a flyout instead
- flyOutOnState: 'ui-state-default',
- nextMenuLink: 'ui-icon-triangle-1-e', // class to style the link (specifically, a span within the link) used in the multi-level menu to show the next level
- topLinkText: 'All',
- nextCrumbLink: 'ui-icon-carat-1-e'
- }, options);
-
- var killAllMenus = function(){
- $.each(allUIMenus, function(i){
- if (allUIMenus[i].menuOpen) { allUIMenus[i].kill(); };
- });
- };
-
- this.kill = function(){
- caller
- .removeClass(options.loadingState)
- .removeClass('fg-menu-open')
- .removeClass(options.callerOnState);
- container.find('li').removeClass(options.linkHoverSecondary).find('a').removeClass(options.linkHover);
- if (options.flyOutOnState) { container.find('li a').removeClass(options.flyOutOnState); };
- if (options.callerOnState) { caller.removeClass(options.callerOnState); };
- if (container.is('.fg-menu-ipod')) { menu.resetDrilldownMenu(); };
- if (container.is('.fg-menu-flyout')) { menu.resetFlyoutMenu(); };
- container.parent().hide();
- menu.menuOpen = false;
- $(document).unbind('click', killAllMenus);
- $(document).unbind('keydown');
- };
-
- this.showLoading = function(){
- caller.addClass(options.loadingState);
- };
- this.showMenu = function(){
- killAllMenus();
- if (!menu.menuExists) { menu.create() };
- caller
- .addClass('fg-menu-open')
- .addClass(options.callerOnState);
- container.parent().show().click(function(){ menu.kill(); return false; });
- container.hide().slideDown(options.showSpeed).find('.fg-menu:eq(0)');
- menu.menuOpen = true;
- caller.removeClass(options.loadingState);
- $(document).click(killAllMenus);
-
- // assign key events
- $(document).keydown(function(event){
- var e;
- if (event.which !="") { e = event.which; }
- else if (event.charCode != "") { e = event.charCode; }
- else if (event.keyCode != "") { e = event.keyCode; }
-
- var menuType = ($(event.target).parents('div').is('.fg-menu-flyout')) ? 'flyout' : 'ipod' ;
-
- switch(e) {
- case 37: // left arrow
- if (menuType == 'flyout') {
- $(event.target).trigger('mouseout');
- if ($('.'+options.flyOutOnState).size() > 0) { $('.'+options.flyOutOnState).trigger('mouseover'); };
- };
-
- if (menuType == 'ipod') {
- $(event.target).trigger('mouseout');
- if ($('.fg-menu-footer').find('a').size() > 0) { $('.fg-menu-footer').find('a').trigger('click'); };
- if ($('.fg-menu-header').find('a').size() > 0) { $('.fg-menu-current-crumb').prev().find('a').trigger('click'); };
- if ($('.fg-menu-current').prev().is('.fg-menu-indicator')) {
- $('.fg-menu-current').prev().trigger('mouseover');
- };
- };
- return false;
- break;
-
- case 38: // up arrow
- if ($(event.target).is('.' + options.linkHover)) {
- var prevLink = $(event.target).parent().prev().find('a:eq(0)');
- if (prevLink.size() > 0) {
- $(event.target).trigger('mouseout');
- prevLink.trigger('mouseover');
- };
- }
- else { container.find('a:eq(0)').trigger('mouseover'); }
- return false;
- break;
-
- case 39: // right arrow
- if ($(event.target).is('.fg-menu-indicator')) {
- if (menuType == 'flyout') {
- $(event.target).next().find('a:eq(0)').trigger('mouseover');
- }
- else if (menuType == 'ipod') {
- $(event.target).trigger('click');
- setTimeout(function(){
- $(event.target).next().find('a:eq(0)').trigger('mouseover');
- }, options.crossSpeed);
- };
- };
- return false;
- break;
-
- case 40: // down arrow
- if ($(event.target).is('.' + options.linkHover)) {
- var nextLink = $(event.target).parent().next().find('a:eq(0)');
- if (nextLink.size() > 0) {
- $(event.target).trigger('mouseout');
- nextLink.trigger('mouseover');
- };
- }
- else { container.find('a:eq(0)').trigger('mouseover'); }
- return false;
- break;
-
- case 27: // escape
- killAllMenus();
- break;
-
- case 13: // enter
- if ($(event.target).is('.fg-menu-indicator') && menuType == 'ipod') {
- $(event.target).trigger('click');
- setTimeout(function(){
- $(event.target).next().find('a:eq(0)').trigger('mouseover');
- }, options.crossSpeed);
- };
- break;
- };
- });
- };
-
- this.create = function(){
- container.css({ width: options.width, 'max-height': options.maxHeight, 'overflow': 'auto' }).appendTo('body').find('ul:first').not('.fg-menu-breadcrumb').addClass('fg-menu');
- container.find('ul, li a').addClass('ui-corner-all');
-
- // aria roles & attributes
- container.find('ul').attr('role', 'menu').eq(0).attr('aria-activedescendant','active-menuitem').attr('aria-labelledby', caller.attr('id'));
- container.find('li').attr('role', 'menuitem');
- container.find('li:has(ul)').attr('aria-haspopup', 'true').find('ul').attr('aria-expanded', 'false');
- container.find('a').attr('tabindex', '-1');
-
- // when there are multiple levels of hierarchy, create flyout or drilldown menu
- if (container.find('ul').size() > 1) {
- if (options.flyOut) { menu.flyout(container, options); }
- else { menu.drilldown(container, options); }
- }
- else {
- container.find('a').click(function(){
- menu.chooseItem(this);
- return false;
- });
- };
-
- if (options.linkHover) {
- var allLinks = container.find('.fg-menu li a');
- allLinks.hover(
- function(){
- var menuitem = $(this);
- $('.'+options.linkHover).removeClass(options.linkHover).blur().parent().removeAttr('id');
- $(this).addClass(options.linkHover).focus().parent().attr('id','active-menuitem');
- },
- function(){
- $(this).removeClass(options.linkHover).blur().parent().removeAttr('id');
- }
- );
- };
-
- if (options.linkHoverSecondary) {
- container.find('.fg-menu li').hover(
- function(){
- $(this).siblings('li').removeClass(options.linkHoverSecondary);
- if (options.flyOutOnState) { $(this).siblings('li').find('a').removeClass(options.flyOutOnState); }
- $(this).addClass(options.linkHoverSecondary);
- },
- function(){ $(this).removeClass(options.linkHoverSecondary); }
- );
- };
-
- menu.setPosition(container, caller, options);
- menu.menuExists = true;
- };
-
- this.chooseItem = function(item){
- menu.kill();
- if (options.callback)
- {
- options.callback({item: $(item), text: $(item).text() })
- }
- };
- };
- Menu.prototype.flyout = function(container, options) {
- var menu = this;
-
- this.resetFlyoutMenu = function(){
- var allLists = container.find('ul ul');
- allLists.removeClass('ui-widget-content').hide();
- };
-
- container.addClass('fg-menu-flyout').find('li:has(ul)').each(function(){
- var linkWidth = container.width();
- var showTimer, hideTimer;
- var allSubLists = $(this).find('ul');
-
- allSubLists.css({ left: linkWidth, width: linkWidth }).hide();
-
- $(this).find('a:eq(0)').addClass('fg-menu-indicator').html('<span>' + $(this).find('a:eq(0)').text() + '</span><span class="ui-icon '+options.nextMenuLink+'"></span>').hover(
- function(){
- clearTimeout(hideTimer);
- var subList = $(this).next();
- if (!fitVertical(subList, $(this).offset().top)) { subList.css({ top: 'auto', bottom: 0 }); };
- if (!fitHorizontal(subList, $(this).offset().left + 100)) { subList.css({ left: 'auto', right: linkWidth, 'z-index': 999 }); };
- showTimer = setTimeout(function(){
- subList.addClass('ui-widget-content').show(options.showSpeed).attr('aria-expanded', 'true');
- }, 300);
- },
- function(){
- clearTimeout(showTimer);
- var subList = $(this).next();
- hideTimer = setTimeout(function(){
- subList.removeClass('ui-widget-content').hide(options.showSpeed).attr('aria-expanded', 'false');
- }, 400);
- }
- );
- $(this).find('ul a').hover(
- function(){
- clearTimeout(hideTimer);
- if ($(this).parents('ul').prev().is('a.fg-menu-indicator')) {
- $(this).parents('ul').prev().addClass(options.flyOutOnState);
- }
- },
- function(){
- hideTimer = setTimeout(function(){
- allSubLists.hide(options.showSpeed);
- container.find(options.flyOutOnState).removeClass(options.flyOutOnState);
- }, 500);
- }
- );
- });
-
- container.find('a').click(function(){
- menu.chooseItem(this);
- return false;
- });
- };
- Menu.prototype.drilldown = function(container, options) {
- var menu = this;
- var topList = container.find('.fg-menu');
- var breadcrumb = $('<ul class="fg-menu-breadcrumb ui-widget-header ui-corner-all ui-helper-clearfix"></ul>');
- var crumbDefaultHeader = $('<li class="fg-menu-breadcrumb-text">'+options.crumbDefaultText+'</li>');
- var firstCrumbText = (options.backLink) ? options.backLinkText : options.topLinkText;
- var firstCrumbClass = (options.backLink) ? 'fg-menu-prev-list' : 'fg-menu-all-lists';
- var firstCrumbLinkClass = (options.backLink) ? 'ui-state-default ui-corner-all' : '';
- var firstCrumbIcon = (options.backLink) ? '<span class="ui-icon ui-icon-triangle-1-w"></span>' : '';
- var firstCrumb = $('<li class="'+firstCrumbClass+'"><a href="#" class="'+firstCrumbLinkClass+'">'+firstCrumbIcon+firstCrumbText+'</a></li>');
-
- container.addClass('fg-menu-ipod');
-
- if (options.backLink) { breadcrumb.addClass('fg-menu-footer').appendTo(container).hide(); }
- else { breadcrumb.addClass('fg-menu-header').prependTo(container); };
- breadcrumb.append(crumbDefaultHeader);
-
- var checkMenuHeight = function(el){
- if (el.height() > options.maxHeight) { el.addClass('fg-menu-scroll') };
- el.css({ height: options.maxHeight });
- };
-
- var resetChildMenu = function(el){ el.removeClass('fg-menu-scroll').removeClass('fg-menu-current').height('auto'); };
-
- this.resetDrilldownMenu = function(){
- $('.fg-menu-current').removeClass('fg-menu-current');
- topList.animate({ left: 0 }, options.crossSpeed, function(){
- $(this).find('ul').each(function(){
- $(this).hide();
- resetChildMenu($(this));
- });
- topList.addClass('fg-menu-current');
- });
- $('.fg-menu-all-lists').find('span').remove();
- breadcrumb.empty().append(crumbDefaultHeader);
- $('.fg-menu-footer').empty().hide();
- checkMenuHeight(topList);
- };
-
- topList
- .addClass('fg-menu-content fg-menu-current ui-widget-content ui-helper-clearfix')
- .css({ width: container.width() })
- .find('ul')
- .css({ width: container.width(), left: container.width() })
- .addClass('ui-widget-content')
- .hide();
- checkMenuHeight(topList);
-
- topList.find('a').each(function(){
- // if the link opens a child menu:
- if ($(this).next().is('ul')) {
- $(this)
- .addClass('fg-menu-indicator')
- .each(function(){ $(this).html('<span>' + $(this).text() + '</span><span class="ui-icon '+options.nextMenuLink+'"></span>'); })
- .click(function(){ // ----- show the next menu
- var nextList = $(this).next();
- var parentUl = $(this).parents('ul:eq(0)');
- var parentLeft = (parentUl.is('.fg-menu-content')) ? 0 : parseFloat(topList.css('left'));
- var nextLeftVal = Math.round(parentLeft - parseFloat(container.width()));
- var footer = $('.fg-menu-footer');
-
- // show next menu
- resetChildMenu(parentUl);
- checkMenuHeight(nextList);
- topList.animate({ left: nextLeftVal }, options.crossSpeed);
- nextList.show().addClass('fg-menu-current').attr('aria-expanded', 'true');
-
- var setPrevMenu = function(backlink){
- var b = backlink;
- var c = $('.fg-menu-current');
- var prevList = c.parents('ul:eq(0)');
- c.hide().attr('aria-expanded', 'false');
- resetChildMenu(c);
- checkMenuHeight(prevList);
- prevList.addClass('fg-menu-current').attr('aria-expanded', 'true');
- if (prevList.hasClass('fg-menu-content')) { b.remove(); footer.hide(); };
- };
-
- // initialize "back" link
- if (options.backLink) {
- if (footer.find('a').size() == 0) {
- footer.show();
- $('<a href="#"><span class="ui-icon ui-icon-triangle-1-w"></span> <span>Back</span></a>')
- .appendTo(footer)
- .click(function(){ // ----- show the previous menu
- var b = $(this);
- var prevLeftVal = parseFloat(topList.css('left')) + container.width();
- topList.animate({ left: prevLeftVal }, options.crossSpeed, function(){
- setPrevMenu(b);
- });
- return false;
- });
- }
- }
- // or initialize top breadcrumb
- else {
- if (breadcrumb.find('li').size() == 1){
- breadcrumb.empty().append(firstCrumb);
- firstCrumb.find('a').click(function(){
- menu.resetDrilldownMenu();
- return false;
- });
- }
- $('.fg-menu-current-crumb').removeClass('fg-menu-current-crumb');
- var crumbText = $(this).find('span:eq(0)').text();
- var newCrumb = $('<li class="fg-menu-current-crumb"><a href="javascript://" class="fg-menu-crumb">'+crumbText+'</a></li>');
- newCrumb
- .appendTo(breadcrumb)
- .find('a').click(function(){
- if ($(this).parent().is('.fg-menu-current-crumb')){
- menu.chooseItem(this);
- }
- else {
- var newLeftVal = - ($('.fg-menu-current').parents('ul').size() - 1) * 180;
- topList.animate({ left: newLeftVal }, options.crossSpeed, function(){
- setPrevMenu();
- });
-
- // make this the current crumb, delete all breadcrumbs after this one, and navigate to the relevant menu
- $(this).parent().addClass('fg-menu-current-crumb').find('span').remove();
- $(this).parent().nextAll().remove();
- };
- return false;
- });
- newCrumb.prev().append(' <span class="ui-icon '+options.nextCrumbLink+'"></span>');
- };
- return false;
- });
- }
- // if the link is a leaf node (doesn't open a child menu)
- else {
- $(this).click(function(){
- menu.chooseItem(this);
- return false;
- });
- };
- });
- };
- /* Menu.prototype.setPosition parameters (defaults noted with *):
- referrer = the link (or other element) used to show the overlaid object
- settings = can override the defaults:
- - posX/Y: where the top left corner of the object should be positioned in relation to its referrer.
- X: left*, center, right
- Y: top, center, bottom*
- - offsetX/Y: the number of pixels to be offset from the x or y position. Can be a positive or negative number.
- - directionH/V: where the entire menu should appear in relation to its referrer.
- Horizontal: left*, right
- Vertical: up, down*
- - detectH/V: detect the viewport horizontally / vertically
- - linkToFront: copy the menu link and place it on top of the menu (visual effect to make it look like it overlaps the object) */
- Menu.prototype.setPosition = function(widget, caller, options) {
- var el = widget;
- var referrer = caller;
- var dims = {
- refX: referrer.offset().left,
- refY: referrer.offset().top,
- refW: referrer.getTotalWidth(),
- refH: referrer.getTotalHeight()
- };
- var options = options;
- var xVal, yVal;
-
- var helper = $('<div class="positionHelper"></div>');
- helper.css({ position: 'absolute', left: dims.refX, top: dims.refY, width: dims.refW, height: dims.refH });
- el.wrap(helper);
-
- // get X pos
- switch(options.positionOpts.posX) {
- case 'left': xVal = 0;
- break;
- case 'center': xVal = dims.refW / 2;
- break;
- case 'right': xVal = dims.refW;
- break;
- };
-
- // get Y pos
- switch(options.positionOpts.posY) {
- case 'top': yVal = 0;
- break;
- case 'center': yVal = dims.refH / 2;
- break;
- case 'bottom': yVal = dims.refH;
- break;
- };
-
- // add the offsets (zero by default)
- xVal += options.positionOpts.offsetX;
- yVal += options.positionOpts.offsetY;
-
- // position the object vertically
- if (options.positionOpts.directionV == 'up') {
- el.css({ top: 'auto', bottom: yVal });
- if (options.positionOpts.detectV && !fitVertical(el)) {
- el.css({ bottom: 'auto', top: yVal });
- }
- }
- else {
- el.css({ bottom: 'auto', top: yVal });
- if (options.positionOpts.detectV && !fitVertical(el)) {
- el.css({ top: 'auto', bottom: yVal });
- }
- };
-
- // and horizontally
- if (options.positionOpts.directionH == 'left') {
- el.css({ left: 'auto', right: xVal });
- if (options.positionOpts.detectH && !fitHorizontal(el)) {
- el.css({ right: 'auto', left: xVal });
- }
- }
- else {
- el.css({ right: 'auto', left: xVal });
- if (options.positionOpts.detectH && !fitHorizontal(el)) {
- el.css({ left: 'auto', right: xVal });
- }
- };
-
- // if specified, clone the referring element and position it so that it appears on top of the menu
- if (options.positionOpts.linkToFront) {
- referrer.clone().addClass('linkClone').css({
- position: 'absolute',
- top: 0,
- right: 'auto',
- bottom: 'auto',
- left: 0,
- width: referrer.width(),
- height: referrer.height()
- }).insertAfter(el);
- };
- };
- /* Utilities to sort and find viewport dimensions */
- function sortBigToSmall(a, b) { return b - a; };
- 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 de = document.documentElement;
- return self.innerHeight || (de && de.clientHeight) || document.body.clientHeight;
- };
- function getWindowWidth(){
- var de = document.documentElement;
- return self.innerWidth || (de && de.clientWidth) || document.body.clientWidth;
- };
- /* Utilities to test whether an element will fit in the viewport
- Parameters:
- el = element to position, required
- leftOffset / topOffset = optional parameter if the offset cannot be calculated (i.e., if the object is in the DOM but is set to display: 'none') */
-
- function fitHorizontal(el, leftOffset){
- var leftVal = parseInt(leftOffset) || $(el).offset().left;
- return (leftVal + $(el).width() <= getWindowWidth() + getScrollLeft() && leftVal - getScrollLeft() >= 0);
- };
- function fitVertical(el, topOffset){
- var topVal = parseInt(topOffset) || $(el).offset().top;
- return (topVal + $(el).height() <= getWindowHeight() + getScrollTop() && topVal - getScrollTop() >= 0);
- };
- /*--------------------------------------------------------------------
- * javascript method: "pxToEm"
- * by:
- Scott Jehl (scott@filamentgroup.com)
- Maggie Wachs (maggie@filamentgroup.com)
- http://www.filamentgroup.com
- *
- * Copyright (c) 2008 Filament Group
- * Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
- *
- * Description: Extends the native Number and String objects with pxToEm method. pxToEm converts a pixel value to ems depending on inherited font size.
- * Article: http://www.filamentgroup.com/lab/retaining_scalable_interfaces_with_pixel_to_em_conversion/
- * Demo: http://www.filamentgroup.com/examples/pxToEm/
- *
- * Options:
- scope: string or jQuery selector for font-size scoping
- reverse: Boolean, true reverses the conversion to em-px
- * Dependencies: jQuery library
- * Usage Example: myPixelValue.pxToEm(); or myPixelValue.pxToEm({'scope':'#navigation', reverse: true});
- *
- * Version: 2.0, 08.01.2008
- * Changelog:
- * 08.02.2007 initial Version 1.0
- * 08.01.2008 - fixed font-size calculation for IE
- --------------------------------------------------------------------*/
- Number.prototype.pxToEm = String.prototype.pxToEm = function(settings){
- //set defaults
- settings = jQuery.extend({
- scope: 'body',
- reverse: false
- }, settings);
-
- var pxVal = (this == '') ? 0 : parseFloat(this);
- var scopeVal;
- var getWindowWidth = function(){
- var de = document.documentElement;
- return self.innerWidth || (de && de.clientWidth) || document.body.clientWidth;
- };
-
- /* When a percentage-based font-size is set on the body, IE returns that percent of the window width as the font-size.
- For example, if the body font-size is 62.5% and the window width is 1000px, IE will return 625px as the font-size.
- When this happens, we calculate the correct body font-size (%) and multiply it by 16 (the standard browser font size)
- to get an accurate em value. */
-
- if (settings.scope == 'body' && $.browser.msie && (parseFloat($('body').css('font-size')) / getWindowWidth()).toFixed(1) > 0.0) {
- var calcFontSize = function(){
- return (parseFloat($('body').css('font-size'))/getWindowWidth()).toFixed(3) * 16;
- };
- scopeVal = calcFontSize();
- }
- else { scopeVal = parseFloat(jQuery(settings.scope).css("font-size")); };
-
- var result = (settings.reverse == true) ? (pxVal * scopeVal).toFixed(2) + 'px' : (pxVal / scopeVal).toFixed(2) + 'em';
- return result;
- };
- function KillAllMenus()
- {
- $.each(allUIMenus, function(i){
- if (allUIMenus[i].menuOpen) { allUIMenus[i].kill(); };
- });
- };
|