Mercurial > hg > rr-repo
diff sites/all/modules/ctools/js/dropbutton.js @ 0:ff03f76ab3fe
initial version
author | danieleb <danielebarchiesi@me.com> |
---|---|
date | Wed, 21 Aug 2013 18:51:11 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sites/all/modules/ctools/js/dropbutton.js Wed Aug 21 18:51:11 2013 +0100 @@ -0,0 +1,94 @@ +/** + * @file + * Implement a simple, clickable dropbutton menu. + * + * See dropbutton.theme.inc for primary documentation. + * + * The javascript relies on four classes: + * - The dropbutton must be fully contained in a div with the class + * ctools-dropbutton. It must also contain the class ctools-no-js + * which will be immediately removed by the javascript; this allows for + * graceful degradation. + * - The trigger that opens the dropbutton must be an a tag wit hthe class + * ctools-dropbutton-link. The href should just be '#' as this will never + * be allowed to complete. + * - The part of the dropbutton that will appear when the link is clicked must + * be a div with class ctools-dropbutton-container. + * - Finally, ctools-dropbutton-hover will be placed on any link that is being + * hovered over, so that the browser can restyle the links. + * + * This tool isn't meant to replace click-tips or anything, it is specifically + * meant to work well presenting menus. + */ + +(function ($) { + Drupal.behaviors.CToolsDropbutton = { + attach: function() { + // Process buttons. All dropbuttons are buttons. + $('.ctools-button') + .once('ctools-button') + .removeClass('ctools-no-js'); + + // Process dropbuttons. Not all buttons are dropbuttons. + $('.ctools-dropbutton').once('ctools-dropbutton', function() { + var $dropbutton = $(this); + var $button = $('.ctools-content', $dropbutton); + var $secondaryActions = $('li', $button).not(':first'); + var $twisty = $(".ctools-link", $dropbutton); + var open = false; + var hovering = false; + var timerID = 0; + + var toggle = function(close) { + // if it's open or we're told to close it, close it. + if (open || close) { + // If we're just toggling it, close it immediately. + if (!close) { + open = false; + $secondaryActions.slideUp(100); + $dropbutton.removeClass('open'); + } + else { + // If we were told to close it, wait half a second to make + // sure that's what the user wanted. + // Clear any previous timer we were using. + if (timerID) { + clearTimeout(timerID); + } + timerID = setTimeout(function() { + if (!hovering) { + open = false; + $secondaryActions.slideUp(100); + $dropbutton.removeClass('open'); + }}, 500); + } + } + else { + // open it. + open = true; + $secondaryActions.animate({height: "show", opacity: "show"}, 100); + $dropbutton.addClass('open'); + } + } + // Hide the secondary actions initially. + $secondaryActions.hide(); + + $twisty.click(function() { + toggle(); + return false; + }); + + $dropbutton.hover( + function() { + hovering = true; + }, // hover in + function() { // hover out + hovering = false; + toggle(true); + return false; + } + ); + }); + } + } +})(jQuery);