annotate sites/all/modules/ctools/js/dropdown.js @ 0:ff03f76ab3fe

initial version
author danieleb <danielebarchiesi@me.com>
date Wed, 21 Aug 2013 18:51:11 +0100
parents
children
rev   line source
danielebarchiesi@0 1 /**
danielebarchiesi@0 2 * @file
danielebarchiesi@0 3 * Implement a simple, clickable dropdown menu.
danielebarchiesi@0 4 *
danielebarchiesi@0 5 * See dropdown.theme.inc for primary documentation.
danielebarchiesi@0 6 *
danielebarchiesi@0 7 * The javascript relies on four classes:
danielebarchiesi@0 8 * - The dropdown must be fully contained in a div with the class
danielebarchiesi@0 9 * ctools-dropdown. It must also contain the class ctools-dropdown-no-js
danielebarchiesi@0 10 * which will be immediately removed by the javascript; this allows for
danielebarchiesi@0 11 * graceful degradation.
danielebarchiesi@0 12 * - The trigger that opens the dropdown must be an a tag wit hthe class
danielebarchiesi@0 13 * ctools-dropdown-link. The href should just be '#' as this will never
danielebarchiesi@0 14 * be allowed to complete.
danielebarchiesi@0 15 * - The part of the dropdown that will appear when the link is clicked must
danielebarchiesi@0 16 * be a div with class ctools-dropdown-container.
danielebarchiesi@0 17 * - Finally, ctools-dropdown-hover will be placed on any link that is being
danielebarchiesi@0 18 * hovered over, so that the browser can restyle the links.
danielebarchiesi@0 19 *
danielebarchiesi@0 20 * This tool isn't meant to replace click-tips or anything, it is specifically
danielebarchiesi@0 21 * meant to work well presenting menus.
danielebarchiesi@0 22 */
danielebarchiesi@0 23
danielebarchiesi@0 24 (function ($) {
danielebarchiesi@0 25 Drupal.behaviors.CToolsDropdown = {
danielebarchiesi@0 26 attach: function() {
danielebarchiesi@0 27 $('div.ctools-dropdown').once('ctools-dropdown', function() {
danielebarchiesi@0 28 var $dropdown = $(this);
danielebarchiesi@0 29 var open = false;
danielebarchiesi@0 30 var hovering = false;
danielebarchiesi@0 31 var timerID = 0;
danielebarchiesi@0 32
danielebarchiesi@0 33 $dropdown.removeClass('ctools-dropdown-no-js');
danielebarchiesi@0 34
danielebarchiesi@0 35 var toggle = function(close) {
danielebarchiesi@0 36 // if it's open or we're told to close it, close it.
danielebarchiesi@0 37 if (open || close) {
danielebarchiesi@0 38 // If we're just toggling it, close it immediately.
danielebarchiesi@0 39 if (!close) {
danielebarchiesi@0 40 open = false;
danielebarchiesi@0 41 $("div.ctools-dropdown-container", $dropdown).slideUp(100);
danielebarchiesi@0 42 }
danielebarchiesi@0 43 else {
danielebarchiesi@0 44 // If we were told to close it, wait half a second to make
danielebarchiesi@0 45 // sure that's what the user wanted.
danielebarchiesi@0 46 // Clear any previous timer we were using.
danielebarchiesi@0 47 if (timerID) {
danielebarchiesi@0 48 clearTimeout(timerID);
danielebarchiesi@0 49 }
danielebarchiesi@0 50 timerID = setTimeout(function() {
danielebarchiesi@0 51 if (!hovering) {
danielebarchiesi@0 52 open = false;
danielebarchiesi@0 53 $("div.ctools-dropdown-container", $dropdown).slideUp(100);
danielebarchiesi@0 54 }
danielebarchiesi@0 55 }, 500);
danielebarchiesi@0 56 }
danielebarchiesi@0 57 }
danielebarchiesi@0 58 else {
danielebarchiesi@0 59 // open it.
danielebarchiesi@0 60 open = true;
danielebarchiesi@0 61 $("div.ctools-dropdown-container", $dropdown)
danielebarchiesi@0 62 .animate({height: "show", opacity: "show"}, 100);
danielebarchiesi@0 63 }
danielebarchiesi@0 64 }
danielebarchiesi@0 65 $("a.ctools-dropdown-link", $dropdown).click(function() {
danielebarchiesi@0 66 toggle();
danielebarchiesi@0 67 return false;
danielebarchiesi@0 68 });
danielebarchiesi@0 69
danielebarchiesi@0 70 $dropdown.hover(
danielebarchiesi@0 71 function() {
danielebarchiesi@0 72 hovering = true;
danielebarchiesi@0 73 }, // hover in
danielebarchiesi@0 74 function() { // hover out
danielebarchiesi@0 75 hovering = false;
danielebarchiesi@0 76 toggle(true);
danielebarchiesi@0 77 return false;
danielebarchiesi@0 78 });
danielebarchiesi@0 79 // @todo -- just use CSS for this noise.
danielebarchiesi@0 80 $("div.ctools-dropdown-container a").hover(
danielebarchiesi@0 81 function() { $(this).addClass('ctools-dropdown-hover'); },
danielebarchiesi@0 82 function() { $(this).removeClass('ctools-dropdown-hover'); }
danielebarchiesi@0 83 );
danielebarchiesi@0 84 });
danielebarchiesi@0 85 }
danielebarchiesi@0 86 }
danielebarchiesi@0 87 })(jQuery);