/* * Supersubs v0.2b - jQuery plugin * Copyright (c) 2008 Joel Birch * * Dual licensed under the MIT and GPL licenses: *  http://www.opensource.org/licenses/mit-license.php *  http://www.gnu.org/licenses/gpl.html * * * This plugin automatically adjusts submenu widths of suckerfish-style menus to that of * their longest list item children. If you use this, please expect bugs and report them * to the jQuery Google Group with the word 'Superfish' in the subject line. * */;(function($){ // $ will refer to jQuery within this closure    $.fn.supersubs = function(options){        var opts = $.extend({}, $.fn.supersubs.defaults, options);        // return original object to support chaining        return this.each(function() {            // cache selections            var $$ = $(this);            // support metadata            var o = $.meta ? $.extend({}, opts, $$.data()) : opts;            // get the font size of menu.            // .css('fontSize') returns various results cross-browser, so measure an em dash instead            var fontsize = $('<li id="menu-fontsize">&#8212;</li>').css({                'padding' : 0,                'position' : 'absolute',                'top' : '-999em',                'width' : 'auto'            }).appendTo($$).width(); //clientWidth is faster, but was incorrect here            // remove em dash            $('#menu-fontsize').remove();            // cache all ul elements            $ULs = $$.find('ul');            // loop through each ul in menu            $ULs.each(function(i) {                 // cache this ul                var $ul = $ULs.eq(i);                // get all (li) children of this ul                var $LIs = $ul.children();                // get all anchor grand-children                var $As = $LIs.children('a');                // force content to one line and save current float property                var liFloat = $LIs.css('white-space','nowrap').css('float');                // remove width restrictions and floats so elements remain vertically stacked                var emWidth = $ul.add($LIs).add($As).css({                    'float' : 'none',                    'width' : 'auto'                })                // this ul will now be shrink-wrapped to longest li due to position:absolute                // so save its width as ems. Clientwidth is 2 times faster than .width() - thanks Dan Switzer                .end().end()[0].clientWidth / fontsize;                // add more width to ensure lines don't turn over at certain sizes in various browsers                emWidth += o.extraWidth;                // restrict to at least minWidth and at most maxWidth                if (emWidth > o.maxWidth)       { emWidth = o.maxWidth; }                else if (emWidth < o.minWidth)  { emWidth = o.minWidth; }                emWidth += 'em';                // set ul to width in ems                $ul.css('width',emWidth);                // restore li floats to avoid IE bugs                // set li width to full width of this ul                // revert white-space to normal                $LIs.css({                    'float' : liFloat,                    'width' : '100%',                    'white-space' : 'normal'                })                // update offset position of descendant ul to reflect new width of parent                .each(function(){                    var $childUl = $('>ul',this);                    var offsetDirection = $childUl.css('left')!==undefined ? 'left' : 'right';                    $childUl.css(offsetDirection,emWidth);                });            });                    });    };    // expose defaults    $.fn.supersubs.defaults = {        minWidth        : 9,        // requires em unit.        maxWidth        : 25,       // requires em unit.        extraWidth      : 0         // extra width can ensure lines don't sometimes turn over due to slight browser differences in how they round-off values    };    })(jQuery); // plugin code ends
