123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- /*
- * jdMenu 1.4.1 (2008-03-31)
- *
- * Copyright (c) 2006,2007 Jonathan Sharp (http://jdsharp.us)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://jdsharp.us/
- *
- * Built upon jQuery 1.2.1 (http://jquery.com)
- * This also requires the jQuery dimensions >= 1.2 plugin
- */
- // This initializes the menu
- $(function() {
- $('ul.jd_menu').jdMenu();
- });
- (function($){
- function addEvents(ul) {
- var settings = $.data( $(ul).parents().andSelf().filter('ul.jd_menu')[0], 'jdMenuSettings' );
- $('> li', ul)
- .bind('mouseenter.jdmenu mouseleave.jdmenu', function(evt) {
- $(this).toggleClass('jdm_hover');
- var ul = $('> ul', this);
- if ( ul.length == 1 ) {
- clearTimeout( this.$jdTimer );
- var enter = ( evt.type == 'mouseenter' );
- var fn = ( enter ? showMenu : hideMenu );
- this.$jdTimer = setTimeout(function() {
- fn( ul[0], settings.onAnimate, settings.isVertical );
- }, enter ? settings.showDelay : settings.hideDelay );
- }
- })
- .bind('click.jdmenu', function(evt) {
- var ul = $('> ul', this);
- if ( ul.length == 1 &&
- ( settings.disableLinks == true || $(this).hasClass('accessible') ) ) {
- showMenu( ul, settings.onAnimate, settings.isVertical );
- return false;
- }
-
- // The user clicked the li and we need to trigger a click for the a
- if ( evt.target == this ) {
- var link = $('> a', evt.target).not('.accessible');
- if ( link.length > 0 ) {
- var a = link[0];
- if ( !a.onclick ) {
- window.open( a.href, a.target || '_self' );
- } else {
- $(a).trigger('click');
- }
- }
- }
- if ( settings.disableLinks ||
- ( !settings.disableLinks && !$(this).parent().hasClass('jd_menu') ) ) {
- $(this).parent().jdMenuHide();
- evt.stopPropagation();
- }
- })
- .find('> a')
- .bind('focus.jdmenu blur.jdmenu', function(evt) {
- var p = $(this).parents('li:eq(0)');
- if ( evt.type == 'focus' ) {
- p.addClass('jdm_hover');
- } else {
- p.removeClass('jdm_hover');
- }
- })
- .filter('.accessible')
- .bind('click.jdmenu', function(evt) {
- evt.preventDefault();
- });
- }
- function showMenu(ul, animate, vertical) {
- var ul = $(ul);
- if ( ul.is(':visible') ) {
- return;
- }
- ul.bgiframe();
- var li = ul.parent();
- ul .trigger('jdMenuShow')
- .positionBy({ target: li[0],
- targetPos: ( vertical === true || !li.parent().hasClass('jd_menu') ? 1 : 3 ),
- elementPos: 0,
- hideAfterPosition: true
- });
- if ( !ul.hasClass('jdm_events') ) {
- ul.addClass('jdm_events');
- addEvents(ul);
- }
- li .addClass('jdm_active')
- // Hide any adjacent menus
- .siblings('li').find('> ul:eq(0):visible')
- .each(function(){
- hideMenu( this );
- });
- if ( animate === undefined ) {
- ul.show();
- } else {
- animate.apply( ul[0], [true] );
- }
- }
-
- function hideMenu(ul, animate) {
- var ul = $(ul);
- $('.bgiframe', ul).remove();
- ul .filter(':not(.jd_menu)')
- .find('> li > ul:eq(0):visible')
- .each(function() {
- hideMenu( this );
- })
- .end();
- if ( animate === undefined ) {
- ul.hide()
- } else {
- animate.apply( ul[0], [false] );
- }
- ul .trigger('jdMenuHide')
- .parents('li:eq(0)')
- .removeClass('jdm_active jdm_hover')
- .end()
- .find('> li')
- .removeClass('jdm_active jdm_hover');
- }
-
- // Public methods
- $.fn.jdMenu = function(settings) {
- // Future settings: activateDelay
- var settings = $.extend({ // Time in ms before menu shows
- showDelay: 200,
- // Time in ms before menu hides
- hideDelay: 500,
- // Should items that contain submenus not
- // respond to clicks
- disableLinks: true
- // This callback allows for you to animate menus
- //onAnimate: null
- }, settings);
- if ( !$.isFunction( settings.onAnimate ) ) {
- settings.onAnimate = undefined;
- }
- return this.filter('ul.jd_menu').each(function() {
- $.data( this,
- 'jdMenuSettings',
- $.extend({ isVertical: $(this).hasClass('jd_menu_vertical') }, settings)
- );
- addEvents(this);
- });
- };
-
- $.fn.jdMenuUnbind = function() {
- $('ul.jdm_events', this)
- .unbind('.jdmenu')
- .find('> a').unbind('.jdmenu');
- };
- $.fn.jdMenuHide = function() {
- return this.filter('ul').each(function(){
- hideMenu( this );
- });
- };
- // Private methods and logic
- $(window)
- // Bind a click event to hide all visible menus when the document is clicked
- .bind('click.jdmenu', function(){
- $('ul.jd_menu ul:visible').jdMenuHide();
- });
- })(jQuery);
|