+++ /dev/null
-/*
- * Supersubs v0.4b - jQuery plugin
- * Copyright (c) 2013 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.
- *
- */
-/*
- * This is not the original jQuery Supersubs plugin.
- * Please refer to the README for more information.
- */
-
-(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
- // Although this is unnecessary due to the way the module uses these plugins.
- for (var a = 0; a < this.length; a++) {
- // cache selections
- var $$ = $(this).eq(a),
- // support metadata
- o = $.meta ? $.extend({}, opts, $$.data()) : opts;
- // Jump one level if it's a "NavBar"
- if ($$.hasClass('sf-navbar')) {
- $$ = $$.children('li').children('ul');
- }
- // cache all ul elements
- var $ULs = $$.find('ul'),
- // get the font size of menu.
- // .css('fontSize') returns various results cross-browser, so measure an em dash instead
- fontsize = $('<li id="menu-fontsize">—</li>'),
- size = fontsize.attr('style','padding:0;position:absolute;top:-99999em;width:auto;')
- .appendTo($$)[0].clientWidth; //clientWidth is faster than width()
- // remove em dash
- fontsize.remove();
-
- // loop through each ul in menu
- for (var b = 0; b < $ULs.length; b++) {
- var
- // cache this ul
- $ul = $ULs.eq(b);
- // If a multi-column sub-menu, and only if correctly configured.
- if (o.multicolumn && $ul.hasClass('sf-multicolumn') && $ul.find('.sf-multicolumn-column').length > 0){
- // Look through each column.
- var $column = $ul.find('div.sf-multicolumn-column > ol'),
- // Overall width.
- mwWidth = 0;
- for (var d = 0; d < $column.length; d++){
- resize($column.eq(d));
- // New column width, in pixels.
- var colWidth = $column.width();
- // Just a trick to convert em unit to px.
- $column.css({width:colWidth})
- // Making column parents the same size.
- .parents('.sf-multicolumn-column').css({width:colWidth});
- // Overall width.
- mwWidth += parseInt(colWidth);
- }
- // Resizing the columns container too.
- $ul.add($ul.find('li.sf-multicolumn-wrapper, li.sf-multicolumn-wrapper > ol')).css({width:mwWidth});
- }
- else {
- resize($ul);
- }
- }
- }
- function resize($ul){
- var
- // get all (li) children of this ul
- $LIs = $ul.children(),
- // get all anchor grand-children
- $As = $LIs.children('a');
- // force content to one line and save current float property
- $LIs.css('white-space','nowrap');
- // remove width restrictions and floats so elements remain vertically stacked
- $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.
- var emWidth = $ul.get(0).clientWidth / size;
- // 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.add($As).css({float:'',width:'',whiteSpace:''});
- // update offset position of descendant ul to reflect new width of parent.
- // set it to 100% in case it isn't already set to this in the CSS
- for (var c = 0; c < $LIs.length; c++) {
- var $childUl = $LIs.eq(c).children('ul');
- var offsetDirection = $childUl.css('left') !== undefined ? 'left' : 'right';
- $childUl.css(offsetDirection,'100%');
- }
- }
- return this;
- };
- // expose defaults
- $.fn.supersubs.defaults = {
- multicolumn: true, // define width for multi-column sub-menus and their columns.
- minWidth: 12, // requires em unit.
- maxWidth: 27, // requires em unit.
- extraWidth: 1 // 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