2009-02-08 23:49:43 +00:00
/ *
2013-02-03 18:48:30 -05:00
* Superfish v1 . 5.1 - jQuery menu widget
* Copyright ( c ) 2013 Joel Birch
2009-02-08 23:49:43 +00: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 ( $ ) {
$ . fn . superfish = function ( op ) {
var sf = $ . fn . superfish ,
c = sf . c ,
2013-02-03 18:48:30 -05:00
$arrow = $ ( '<span class="' + c . arrowClass + '"> »</span>' ) ,
over = function ( e ) {
2009-02-08 23:49:43 +00:00
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 ( ) ;
2013-02-03 18:48:30 -05:00
if ( o . $path . length && $$ . parents ( 'li.' + o . hoverClass ) . length < 1 ) {
o . onIdle . call ( this ) ;
over . call ( o . $path ) ;
}
2009-02-08 23:49:43 +00:00
} , o . delay ) ;
} ,
2013-02-03 18:48:30 -05: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-02-08 23:49:43 +00:00
sf . op = sf . o [ menu . serial ] ;
return menu ;
} ,
2013-02-03 18:48:30 -05:00
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 ) ;
} ,
2009-02-08 23:49:43 +00:00
addArrow = function ( $a ) { $a . addClass ( c . anchorClass ) . append ( $arrow . clone ( ) ) ; } ;
2013-02-03 18:48:30 -05:00
return this . addClass ( c . menuClass ) . each ( function ( ) {
2009-02-08 23:49:43 +00:00
var s = this . serial = sf . o . length ;
var o = $ . extend ( { } , sf . defaults , op ) ;
2013-02-03 18:48:30 -05:00
var $$ = $ ( this ) ;
o . $path = $$ . find ( 'li.' + o . pathClass ) . slice ( 0 , o . pathLevels ) . each ( function ( ) {
$ ( this ) . addClass ( o . hoverClass + ' ' + c . bcClass )
2009-02-08 23:49:43 +00:00
. filter ( 'li:has(ul)' ) . removeClass ( o . pathClass ) ;
} ) ;
sf . o [ s ] = sf . op = o ;
2013-02-03 18:48:30 -05:00
applyHandlers ( $$ ) ;
$$ . find ( 'li:has(ul)' ) . each ( function ( ) {
if ( o . autoArrows ) {
addArrow ( $ ( '>a:first-child' , this ) ) ;
}
2009-02-08 23:49:43 +00:00
} )
. not ( '.' + c . bcClass )
. hideSuperfishUl ( ) ;
o . onInit . call ( this ) ;
} ) ;
} ;
var sf = $ . fn . superfish ;
sf . o = [ ] ;
sf . op = { } ;
2013-02-03 18:48:30 -05:00
2009-02-08 23:49:43 +00:00
sf . c = {
bcClass : 'sf-breadcrumb' ,
menuClass : 'sf-js-enabled' ,
anchorClass : 'sf-with-ul' ,
2013-02-03 18:48:30 -05:00
arrowClass : 'sf-sub-indicator'
2009-02-08 23:49:43 +00:00
} ;
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 ( ) { } ,
2013-02-03 18:48:30 -05:00
onHide : function ( ) { } ,
onIdle : function ( ) { }
2009-02-08 23:49:43 +00:00
} ;
$ . fn . extend ( {
hideSuperfishUl : function ( ) {
var o = sf . op ,
not = ( o . retainPath === true ) ? o . $path : '' ;
o . retainPath = false ;
2013-02-03 18:48:30 -05:00
var $ul = $ ( 'li.' + o . hoverClass , this ) . add ( this ) . not ( not ) . removeClass ( o . hoverClass )
2009-02-08 23:49:43 +00:00
. 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 ) ;
2013-02-03 18:48:30 -05:00
$ul . animate ( o . animation , o . speed , function ( ) { o . onShow . call ( $ul ) ; } ) ;
2009-02-08 23:49:43 +00:00
return this ;
}
} ) ;
} ) ( jQuery ) ;