2009-03-10 16:09:39 +01:00
/ *
2013-02-15 20:51:35 +01:00
* Superfish v1 . 5.3 - jQuery menu widget
* Copyright ( c ) 2013 Joel Birch
2009-03-10 16:09:39 +01:00
*
* Dual licensed under the MIT and GPL licenses :
* http : //www.opensource.org/licenses/mit-license.php
* http : //www.gnu.org/licenses/gpl.html
*
* /
; ( function ( $ ) {
2009-03-31 13:53:44 +02:00
$ . fn . superfish = function ( op ) {
2009-03-10 16:09:39 +01:00
2009-03-31 13:53:44 +02:00
var sf = $ . fn . superfish ,
c = sf . c ,
2013-02-15 20:51:35 +01:00
$arrow = $ ( '<span class="' + c . arrowClass + '"> »</span>' ) ,
over = function ( e ) {
2009-03-31 13:53:44 +02:00
var $$ = $ ( this ) , menu = getMenu ( $$ ) ;
2013-02-15 20:51:35 +01:00
if ( e . type === 'mouseenter' || e . type === 'focusin' ) {
$$ . children ( 'a' ) . data ( 'follow' , true ) ;
}
2009-03-31 13:53:44 +02:00
clearTimeout ( menu . sfTimer ) ;
$$ . showSuperfishUl ( ) . siblings ( ) . hideSuperfishUl ( ) ;
} ,
2013-02-15 20:51:35 +01:00
out = function ( e ) {
2009-03-31 13:53:44 +02:00
var $$ = $ ( this ) , menu = getMenu ( $$ ) , o = sf . op ;
2013-02-15 20:51:35 +01:00
var close = function ( ) {
2009-03-31 13:53:44 +02:00
o . retainPath = ( $ . inArray ( $$ [ 0 ] , o . $path ) > - 1 ) ;
$$ . hideSuperfishUl ( ) ;
2013-02-15 20:51:35 +01:00
if ( o . $path . length && $$ . parents ( 'li.' + o . hoverClass ) . length < 1 ) {
o . onIdle . call ( ) ;
$ . proxy ( over , o . $path , e ) ( ) ;
}
} ;
if ( e . type !== 'mouseleave' && e . type !== 'focusout' ) {
close ( ) ;
} else {
clearTimeout ( menu . sfTimer ) ;
menu . sfTimer = setTimeout ( close , o . delay ) ;
}
if ( e . type === 'mouseleave' || e . type === 'focusout' ) {
$$ . children ( 'a' ) . data ( 'follow' , false ) ;
}
2009-03-31 13:53:44 +02:00
} ,
2013-02-15 20:51:35 +01:00
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 ] ;
2009-03-31 13:53:44 +02:00
sf . op = sf . o [ menu . serial ] ;
return menu ;
} ,
2013-02-15 20:51:35 +01:00
applyHandlers = function ( $menu ) {
var targets = 'li:has(ul)' ;
if ( ! sf . op . useClick ) {
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 ) ;
$menu . on ( 'click' , 'a' , clickHandler ) ;
} ,
clickHandler = function ( e ) {
var $a = $ ( this ) ;
var $submenu = $a . next ( 'ul' ) ;
var follow = $a . data ( 'follow' ) ;
if ( $submenu . length && ( sf . op . useClick || ! follow ) ) {
e . preventDefault ( ) ;
if ( $submenu . is ( ':visible' ) ) {
$ . proxy ( out , $ ( this ) . parent ( ) , e ) ( ) ;
} else {
$ . proxy ( over , $ ( this ) . parent ( ) , e ) ( ) ;
}
}
} ,
addArrows = function ( $li , o ) {
if ( o . autoArrows ) {
$li . children ( 'a' ) . each ( function ( ) {
addArrow ( $ ( this ) ) ;
} ) ;
}
} ,
2009-03-31 13:53:44 +02:00
addArrow = function ( $a ) { $a . addClass ( c . anchorClass ) . append ( $arrow . clone ( ) ) ; } ;
2009-03-10 16:09:39 +01:00
2013-02-15 20:51:35 +01:00
return this . addClass ( c . menuClass ) . each ( function ( ) {
2009-03-31 13:53:44 +02:00
var s = this . serial = sf . o . length ;
var o = $ . extend ( { } , sf . defaults , op ) ;
2013-02-15 20:51:35 +01:00
var $$ = $ ( this ) ;
var $liHasUl = $$ . find ( 'li:has(ul)' ) ;
o . $path = $$ . find ( 'li.' + o . pathClass ) . slice ( 0 , o . pathLevels ) . each ( function ( ) {
$ ( this ) . addClass ( o . hoverClass + ' ' + c . bcClass )
2009-03-31 13:53:44 +02:00
. filter ( 'li:has(ul)' ) . removeClass ( o . pathClass ) ;
} ) ;
sf . o [ s ] = sf . op = o ;
2009-03-10 16:09:39 +01:00
2013-02-15 20:51:35 +01:00
addArrows ( $liHasUl , o ) ;
applyHandlers ( $$ ) ;
$liHasUl . not ( '.' + c . bcClass ) . hideSuperfishUl ( ) ;
2009-03-10 16:09:39 +01:00
2009-03-31 13:53:44 +02:00
o . onInit . call ( this ) ;
2009-03-10 16:09:39 +01:00
2009-03-31 13:53:44 +02:00
} ) ;
} ;
2009-03-10 16:09:39 +01:00
2009-03-31 13:53:44 +02:00
var sf = $ . fn . superfish ;
sf . o = [ ] ;
sf . op = { } ;
2013-02-15 20:51:35 +01:00
2009-03-31 13:53:44 +02:00
sf . c = {
bcClass : 'sf-breadcrumb' ,
menuClass : 'sf-js-enabled' ,
anchorClass : 'sf-with-ul' ,
2013-02-15 20:51:35 +01:00
arrowClass : 'sf-sub-indicator'
2009-03-31 13:53:44 +02:00
} ;
sf . defaults = {
hoverClass : 'sfHover' ,
pathClass : 'overideThisToUse' ,
pathLevels : 1 ,
delay : 800 ,
animation : { opacity : 'show' } ,
2013-02-15 20:51:35 +01:00
animationOut : { opacity : 'hide' } ,
2009-03-31 13:53:44 +02:00
speed : 'normal' ,
2013-02-15 20:51:35 +01:00
speedOut : 'fast' ,
2009-03-31 13:53:44 +02:00
autoArrows : true ,
disableHI : false , // true disables hoverIntent detection
2013-02-15 20:51:35 +01:00
useClick : false ,
2009-03-31 13:53:44 +02:00
onInit : function ( ) { } , // callback functions
onBeforeShow : function ( ) { } ,
onShow : function ( ) { } ,
2013-02-15 20:51:35 +01:00
onHide : function ( ) { } ,
onIdle : function ( ) { }
2009-03-31 13:53:44 +02:00
} ;
$ . fn . extend ( {
hideSuperfishUl : function ( ) {
var o = sf . op ,
not = ( o . retainPath === true ) ? o . $path : '' ;
o . retainPath = false ;
2013-02-15 20:51:35 +01:00
var $ul = $ ( 'li.' + o . hoverClass , this ) . add ( this ) . not ( not )
. find ( '>ul' ) . stop ( ) . animate ( o . animationOut , o . speedOut , function ( ) {
$ul = $ ( this ) ;
$ul . css ( 'visibility' , 'hidden' ) . parent ( ) . removeClass ( o . hoverClass ) ;
o . onHide . call ( $ul ) ;
} ) ;
2009-03-31 13:53:44 +02:00
return this ;
} ,
showSuperfishUl : function ( ) {
var o = sf . op ,
$ul = this . addClass ( o . hoverClass )
. find ( '>ul:hidden' ) . css ( 'visibility' , 'visible' ) ;
o . onBeforeShow . call ( $ul ) ;
2013-02-15 20:51:35 +01:00
$ul . stop ( ) . animate ( o . animation , o . speed , function ( ) {
o . onShow . call ( $ul ) ;
} ) ;
2009-03-31 13:53:44 +02:00
return this ;
}
} ) ;
2009-03-10 16:09:39 +01:00
} ) ( jQuery ) ;