diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/all/modules/ctools/js/dropdown.js	Wed Aug 21 18:51:11 2013 +0100
@@ -0,0 +1,87 @@
+/**
+ * @file
+ * Implement a simple, clickable dropdown menu.
+ *
+ * See dropdown.theme.inc for primary documentation.
+ *
+ * The javascript relies on four classes:
+ * - The dropdown must be fully contained in a div with the class
+ *   ctools-dropdown. It must also contain the class ctools-dropdown-no-js
+ *   which will be immediately removed by the javascript; this allows for
+ *   graceful degradation.
+ * - The trigger that opens the dropdown must be an a tag wit hthe class
+ *   ctools-dropdown-link. The href should just be '#' as this will never
+ *   be allowed to complete.
+ * - The part of the dropdown that will appear when the link is clicked must
+ *   be a div with class ctools-dropdown-container.
+ * - Finally, ctools-dropdown-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.CToolsDropdown = {
+    attach: function() {
+      $('div.ctools-dropdown').once('ctools-dropdown', function() {
+        var $dropdown = $(this);
+        var open = false;
+        var hovering = false;
+        var timerID = 0;
+
+        $dropdown.removeClass('ctools-dropdown-no-js');
+
+        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;
+              $("div.ctools-dropdown-container", $dropdown).slideUp(100);
+            }
+            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;
+                  $("div.ctools-dropdown-container", $dropdown).slideUp(100);
+                }
+              }, 500);
+            }
+          }
+          else {
+            // open it.
+            open = true;
+            $("div.ctools-dropdown-container", $dropdown)
+              .animate({height: "show", opacity: "show"}, 100);
+          }
+        }
+        $("a.ctools-dropdown-link", $dropdown).click(function() {
+          toggle();
+          return false;
+        });
+
+        $dropdown.hover(
+            function() {
+              hovering = true;
+            }, // hover in
+            function() { // hover out
+              hovering = false;
+              toggle(true);
+              return false;
+            });
+        // @todo -- just use CSS for this noise.
+        $("div.ctools-dropdown-container a").hover(
+          function() { $(this).addClass('ctools-dropdown-hover'); },
+          function() { $(this).removeClass('ctools-dropdown-hover'); }
+        );
+      });
+    }
+  }
+})(jQuery);