]> git.uio.no Git - usit-rt.git/blobdiff - share/static/js/superfish.js
Putting 4.2.0 on top of 4.0.17
[usit-rt.git] / share / static / js / superfish.js
diff --git a/share/static/js/superfish.js b/share/static/js/superfish.js
new file mode 100644 (file)
index 0000000..45d2e9a
--- /dev/null
@@ -0,0 +1,126 @@
+
+/*
+ * Superfish v1.5.1 - jQuery menu widget
+ * 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
+ *
+ */
+
+;(function($){
+       $.fn.superfish = function(op){
+
+               var sf = $.fn.superfish,
+                       c = sf.c,
+                       $arrow = $('<span class="'+c.arrowClass+'"> &#187;</span>'),
+                       over = function(e){
+                               var $$ = $(this), menu = getMenu($$);
+                               clearTimeout(menu.sfTimer);
+                               $$.showSuperfishUl().siblings().hideSuperfishUl();
+                       },
+                       out = function(){
+                               var $$ = $(this), menu = getMenu($$), o = sf.op;
+                               clearTimeout(menu.sfTimer);
+                               menu.sfTimer=setTimeout(function(){
+                                       o.retainPath=($.inArray($$[0],o.$path)>-1);
+                                       $$.hideSuperfishUl();
+                                       if (o.$path.length && $$.parents('li.'+o.hoverClass).length<1){
+                                               o.onIdle.call(this);
+                                               over.call(o.$path);
+                                       }
+                               },o.delay);     
+                       },
+                       getMenu = function($child){
+                               if ($child.hasClass(c.menuClass)){
+                                       $.error('Superfish requires you to update to a version of hoverIntent that supports event-delegation, such as this one: https://github.com/joeldbirch/onHoverIntent');
+                               }
+                               var menu = $child.closest('.'+c.menuClass)[0];
+                               sf.op = sf.o[menu.serial];
+                               return menu;
+                       },
+                       applyHandlers = function($menu){
+                               var targets = 'li:has(ul)';
+                               if ($.fn.hoverIntent && !sf.op.disableHI){
+                                       $menu.hoverIntent(over, out, targets);
+                               } else {
+                                       $menu.on('mouseenter', targets, over);
+                                       $menu.on('mouseleave', targets, out);
+                               }
+                               $menu.on('focusin', targets, over);
+                               $menu.on('focusout', targets, out);
+                       },
+                       addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
+                       
+               return this.addClass(c.menuClass).each(function() {
+                       var s = this.serial = sf.o.length;
+                       var o = $.extend({},sf.defaults,op);
+                       var $$ = $(this);
+                       o.$path = $$.find('li.'+o.pathClass).slice(0,o.pathLevels).each(function(){
+                               $(this).addClass(o.hoverClass+' '+c.bcClass)
+                                       .filter('li:has(ul)').removeClass(o.pathClass);
+                       });
+                       sf.o[s] = sf.op = o;
+                       
+                       applyHandlers($$);
+                       
+                       $$.find('li:has(ul)').each(function() {
+                               if (o.autoArrows) {
+                                       addArrow( $('>a:first-child',this) );
+                               }
+                       })
+                       .not('.'+c.bcClass)
+                               .hideSuperfishUl();
+                       
+                       o.onInit.call(this);
+                       
+               });
+       };
+
+       var sf = $.fn.superfish;
+       sf.o = [];
+       sf.op = {};
+
+       sf.c = {
+               bcClass     : 'sf-breadcrumb',
+               menuClass   : 'sf-js-enabled',
+               anchorClass : 'sf-with-ul',
+               arrowClass  : 'sf-sub-indicator'
+       };
+       sf.defaults = {
+               hoverClass      : 'sfHover',
+               pathClass       : 'overideThisToUse',
+               pathLevels      : 1,
+               delay           : 800,
+               animation       : {opacity:'show'},
+               speed           : 'normal',
+               autoArrows      : true,
+               disableHI       : false,                // true disables hoverIntent detection
+               onInit          : function(){}, // callback functions
+               onBeforeShow: function(){},
+               onShow          : function(){},
+               onHide          : function(){},
+               onIdle          : function(){}
+       };
+       $.fn.extend({
+               hideSuperfishUl : function(){
+                       var o = sf.op,
+                               not = (o.retainPath===true) ? o.$path : '';
+                       o.retainPath = false;
+                       var $ul = $('li.'+o.hoverClass,this).add(this).not(not).removeClass(o.hoverClass)
+                                       .find('>ul').hide().css('visibility','hidden');
+                       o.onHide.call($ul);
+                       return this;
+               },
+               showSuperfishUl : function(){
+                       var o = sf.op,
+                               $ul = this.addClass(o.hoverClass)
+                                       .find('>ul:hidden').css('visibility','visible');
+                       o.onBeforeShow.call($ul);
+                       $ul.animate(o.animation,o.speed,function(){ o.onShow.call($ul); });
+                       return this;
+               }
+       });
+
+})(jQuery);