Adding template from http://www.freehtml5templates.com/adropabove-html5-css3-and...
[treecutter.git] / style / adropabove / js / supersubs.js
diff --git a/style/adropabove/js/supersubs.js b/style/adropabove/js/supersubs.js
new file mode 100755 (executable)
index 0000000..4522151
--- /dev/null
@@ -0,0 +1,90 @@
+
+/*
+ * 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