aboutsummaryrefslogtreecommitdiff
path: root/jquery_drawer.module
diff options
context:
space:
mode:
Diffstat (limited to 'jquery_drawer.module')
-rw-r--r--jquery_drawer.module232
1 files changed, 232 insertions, 0 deletions
diff --git a/jquery_drawer.module b/jquery_drawer.module
new file mode 100644
index 0000000..2dcb707
--- /dev/null
+++ b/jquery_drawer.module
@@ -0,0 +1,232 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Implementation of a Finder Dropdown Menu.
+ *
+ * This module implements the Finder Dropdown menu described
+ * at http://www.alistapart.com/articles/complexdynamiclists.
+ */
+
+/**
+ * Implementation of hook_uninstall();
+ */
+function jquery_drawer_uninstall() {
+ variable_del('jquery_drawer');
+}
+
+/**
+ * Implementation of hook_init();
+ */
+function jquery_drawer_init() {
+ theme('jquery_drawer_css');
+ theme('jquery_drawer_javascript');
+}
+
+/**
+ * Implementation of hook_block();
+ */
+function jquery_drawer_block($op = 'list', $delta = 0, $edit = array()) {
+ switch ($op) {
+ case 'list':
+ $blocks[0]['info'] = t('jQuery Drawer');
+ $blocks[0]['cache'] = BLOCK_NO_CACHE;
+ return $blocks;
+
+ case 'configure':
+ $form['jquery_drawer'] = array(
+ '#type' => 'select',
+ '#title' => t('Select the menu to list'),
+ '#default_value' => variable_get('jquery_drawer', 'navigation:0'),
+ '#options' => menu_parent_options(menu_get_menus(), 0),
+ );
+ return $form;
+
+ case 'save':
+ variable_set('jquery_drawer', $edit['jquery_drawer']);
+ break;
+
+ case 'view':
+ $menu = explode(':', variable_get('jquery_drawer', 'navigation:0'));
+ $block['content'] = theme('jquery_drawer', $menu[0], $menu[1]);
+ return $block;
+ }
+}
+
+/**
+ * Implementation of hook_theme();
+ */
+function jquery_drawer_theme() {
+ return array(
+ 'jquery_drawer' => array(
+ 'arguments' => array(
+ 'menu' => NULL,
+ 'parent' => NULL,
+ ),
+ ),
+ 'jquery_drawer_javascript' => array(
+ 'arguments' => array(),
+ ),
+ 'jquery_drawer_css' => array(
+ 'arguments' => array(),
+ ),
+ 'jquery_drawer_link' => array(
+ 'arguments' => array(),
+ ),
+ );
+}
+
+/**
+ * Generate the menu.
+ */
+function theme_jquery_drawer($menu_name, $mlid) {
+ $item_class = "jquery-drawer-menu-item";
+ $sub_item_class = "jquery-drawer-sub-menu-item";
+
+ // Find menu item in the menu tree
+
+ $menu_tree = menu_tree_all_data($menu_name);
+ $menu_link = menu_link_load($mlid);
+
+ if ($mlid != 0) {
+ for ($i=1; $i<10; $i++) {
+ foreach ($menu_tree as $menu_item) {
+ if ($menu_item["link"]['mlid'] == $mlid) {
+ $menu = $menu_item['below'];
+ break 2;
+ }
+ else {
+ if ($menu_item["link"]['mlid'] == $menu_link['p'. $i]) {
+ $menu_tree = $menu_item['below'];
+ break;
+ }
+ }
+ }
+ }
+ }
+ else {
+ $menu = $menu_tree;
+ }
+
+ // Don't display anything if the selected menu has no children
+
+ if (!$menu) {
+ return;
+ }
+
+ // Backup active menu trail and set a new one
+
+ $active_menu_name = menu_get_active_menu_name();
+ menu_set_active_menu_name($menu_name);
+
+ // Build table of mlid in the active trail
+
+ foreach (menu_set_active_trail() as $value) {
+ if ($value['mlid']) {
+ $trail[] = $value['mlid'];
+ }
+ }
+
+ // Restore active menu trail
+
+ menu_set_active_menu_name($active_menu_name);
+
+ // Build the menus
+
+ $output = jquery_drawer_build($menu);
+ $output .= '</ul>'; // TODO: remove this
+ $output .= '<div id="drw">';
+ $output .= '</div>';
+
+ return $output;
+}
+
+/**
+ * Recursively build the menu.
+ *
+ * @ingroup themeable
+ */
+function jquery_drawer_build($menu) {
+
+ global $_jquery_drawer_id;
+
+ if ($_jquery_drawer_id == NULL) {
+ $output = '<ul id="drw_tabs">';
+ $output .= implode((array) module_invoke_all('jquery_drawer_build'));
+ $_jquery_drawer_id = 0;
+ }
+ else {
+ //$output = '<ul id="drw[ul]['. $_jquery_drawer_id .']" class="hidden">';
+ }
+
+ foreach ($menu as $menu_item) {
+ if ($menu_item['link']['hidden'] == 0) {
+ $output .= '<li>';
+ if ($menu_item['below'] !== FALSE && jquery_drawer_has_unhidden_submenu($menu_item['below'])) {
+ $output .= $menu_item['link']['title'];
+ $_jquery_drawer_id++;
+ $output .= jquery_drawer_build($menu_item['below']);
+ }
+ else {
+ $output .= theme('jquery_drawer_link', $menu_item['link']);
+ }
+ $output .= '</li>';
+ }
+ }
+
+ //$output .= '</ul>';
+ return $output;
+
+}
+
+/**
+ * Check whether a menu has at least one unhidden submenu.
+ */
+function jquery_drawer_has_unhidden_submenu($menu = FALSE) {
+
+ if ($menu == FALSE) {
+ return FALSE;
+ }
+
+ foreach ($menu as $menu_item) {
+ if ($menu_item['link']['hidden'] == 0) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+/**
+ * jQuery Drawer Javascript theme function.
+ *
+ * @ingroup themeable
+ */
+function theme_jquery_drawer_javascript() {
+ drupal_add_js(drupal_get_path('module', 'jquery_drawer') .'/jquery_drawer/drw/scripts.js');
+}
+
+/**
+ * jQuery Drawer CSS theme function.
+ *
+ * @ingroup themeable
+ */
+function theme_jquery_drawer_css() {
+ drupal_add_css(drupal_get_path('module', 'jquery_drawer') .'/style.css');
+ drupal_add_css(drupal_get_path('module', 'jquery_drawer') .'/jquery_drawer/drw/styles.css');
+}
+
+/**
+ * jQuery Drawer Link theme function.
+ *
+ * @ingroup themeable
+ */
+function theme_jquery_drawer_link($link) {
+ if (empty($link['localized_options'])) {
+ $link['localized_options'] = array();
+ }
+
+ $link['attributes']['rel'] = 'drw';
+ return l($link['title'], $link['href'], array('attributes' => array('rel' => 'drw')));
+}