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);
|