|
1 /* |
|
2 * Superfish v1.4.8 - jQuery menu widget |
|
3 * Copyright (c) 2008 Joel Birch |
|
4 * |
|
5 * Dual licensed under the MIT and GPL licenses: |
|
6 * http://www.opensource.org/licenses/mit-license.php |
|
7 * http://www.gnu.org/licenses/gpl.html |
|
8 * |
|
9 * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt |
|
10 */ |
|
11 |
|
12 ;(function($){ |
|
13 $.fn.superfish = function(op){ |
|
14 |
|
15 var sf = $.fn.superfish, |
|
16 c = sf.c, |
|
17 $arrow = $(['<span class="',c.arrowClass,'"> »</span>'].join('')), |
|
18 over = function(){ |
|
19 var $$ = $(this), menu = getMenu($$); |
|
20 clearTimeout(menu.sfTimer); |
|
21 $$.showSuperfishUl().siblings().hideSuperfishUl(); |
|
22 }, |
|
23 out = function(){ |
|
24 var $$ = $(this), menu = getMenu($$), o = sf.op; |
|
25 clearTimeout(menu.sfTimer); |
|
26 menu.sfTimer=setTimeout(function(){ |
|
27 o.retainPath=($.inArray($$[0],o.$path)>-1); |
|
28 $$.hideSuperfishUl(); |
|
29 if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);} |
|
30 },o.delay); |
|
31 }, |
|
32 getMenu = function($menu){ |
|
33 var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0]; |
|
34 sf.op = sf.o[menu.serial]; |
|
35 return menu; |
|
36 }, |
|
37 addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); }; |
|
38 |
|
39 return this.each(function() { |
|
40 var s = this.serial = sf.o.length; |
|
41 var o = $.extend({},sf.defaults,op); |
|
42 o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){ |
|
43 $(this).addClass([o.hoverClass,c.bcClass].join(' ')) |
|
44 .filter('li:has(ul)').removeClass(o.pathClass); |
|
45 }); |
|
46 sf.o[s] = sf.op = o; |
|
47 |
|
48 $('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() { |
|
49 if (o.autoArrows) addArrow( $('>a:first-child',this) ); |
|
50 }) |
|
51 .not('.'+c.bcClass) |
|
52 .hideSuperfishUl(); |
|
53 |
|
54 var $a = $('a',this); |
|
55 $a.each(function(i){ |
|
56 var $li = $a.eq(i).parents('li'); |
|
57 $a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);}); |
|
58 }); |
|
59 o.onInit.call(this); |
|
60 |
|
61 }).each(function() { |
|
62 menuClasses = [c.menuClass]; |
|
63 if (sf.op.dropShadows && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass); |
|
64 $(this).addClass(menuClasses.join(' ')); |
|
65 }); |
|
66 }; |
|
67 |
|
68 var sf = $.fn.superfish; |
|
69 sf.o = []; |
|
70 sf.op = {}; |
|
71 sf.IE7fix = function(){ |
|
72 var o = sf.op; |
|
73 if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined) |
|
74 this.toggleClass(sf.c.shadowClass+'-off'); |
|
75 }; |
|
76 sf.c = { |
|
77 bcClass : 'sf-breadcrumb', |
|
78 menuClass : 'sf-js-enabled', |
|
79 anchorClass : 'sf-with-ul', |
|
80 arrowClass : 'sf-sub-indicator', |
|
81 shadowClass : 'sf-shadow' |
|
82 }; |
|
83 sf.defaults = { |
|
84 hoverClass : 'sfHover', |
|
85 pathClass : 'overideThisToUse', |
|
86 pathLevels : 3, |
|
87 delay : 800, |
|
88 animation : {opacity:'show'}, |
|
89 speed : 'normal', |
|
90 autoArrows : true, |
|
91 dropShadows : true, |
|
92 disableHI : false, // true disables hoverIntent detection |
|
93 onInit : function(){}, // callback functions |
|
94 onBeforeShow: function(){}, |
|
95 onShow : function(){}, |
|
96 onHide : function(){} |
|
97 }; |
|
98 $.fn.extend({ |
|
99 hideSuperfishUl : function(){ |
|
100 var o = sf.op, |
|
101 not = (o.retainPath===true) ? o.$path : ''; |
|
102 o.retainPath = false; |
|
103 var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass) |
|
104 .find('>ul').hide().css('visibility','hidden'); |
|
105 o.onHide.call($ul); |
|
106 return this; |
|
107 }, |
|
108 showSuperfishUl : function(){ |
|
109 var o = sf.op, |
|
110 sh = sf.c.shadowClass+'-off', |
|
111 $ul = this.addClass(o.hoverClass) |
|
112 .find('>ul:hidden').css('visibility','visible'); |
|
113 sf.IE7fix.call($ul); |
|
114 o.onBeforeShow.call($ul); |
|
115 $ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); }); |
|
116 return this; |
|
117 } |
|
118 }); |
|
119 |
|
120 })(jQuery); |