diff -uP dynamic_persistent_menu.orig/dynamic_persistent_menu.js dynamic_persistent_menu/dynamic_persistent_menu.js --- dynamic_persistent_menu.orig/dynamic_persistent_menu.js 2009-12-08 02:15:57.000000000 +0530 +++ dynamic_persistent_menu/dynamic_persistent_menu.js 2010-03-01 13:25:24.000000000 +0530 @@ -1,60 +1,111 @@ -var overMenu; -var overStatus = 1; +// $Id: dynamic_persistent_menu.js,v 1.2 2010-03-01 06:17:41 dileep Exp $ + +/** + * @file dynamic_persistent_menu.js + * The Javascript code for Dynamic Persistent Menu + */ +var overMenu=new Array(); +var settings_id; +var overStatus = 1; +//TODO Single overStatus for multiple menus supported by the module? Probably needs array. -$(document).ready(function() -{ +/** + * Initialize the module's JS functions + */ +Drupal.behaviors.dynamic_persistent_menu = function() { + // Set the default overMenu + //alert(DynamicPersistentMenu['menus']); + //settings_id = dynamic_persistent_menu_menu_settings_index(overMenu); + //overMenu = DynamicPersistentMenu.menus[settings_id]['over']; + var boolStatus=new Array(); + for (var i in DynamicPersistentMenu.menus) { + boolStatus[i]=0; + } + //overMenu= 'dynamic-persistent-menu-menu'+DynamicPersistentMenu.menus[1]['over']; + // alert(overMenu); + // Set mouseover function to show current submenu, hide previous submenu, if any. $(".dynamic-persistent-menu-menu-item").mouseover( - function () - { - overStatus = 1 ; - subMenu = dynamic_persistent_menu_get_sub_menu(overMenu); - - if (overMenu) - { - $('#' + subMenu).hide(); - $('#' + overMenu).removeClass('dynamic-persistent-menu-children-active'); - } - - overMenu = this.id; - subMenu = dynamic_persistent_menu_get_sub_menu(overMenu); - $('#' + subMenu).show(); - $('#' + this.id).addClass('dynamic-persistent-menu-children-active') + function () { + overStatus = 1 ; + //var parentId=$(this).parent().attr("id"); + settings_id = dynamic_persistent_menu_menu_settings_index($(this)); + + if(boolStatus[settings_id]==0) { + overMenu[settings_id]= 'dynamic-persistent-menu-menu'+DynamicPersistentMenu.menus[settings_id]['over']; + //alert(overMenu); + boolStatus[settings_id]=1; + } + // If there was a previous menu which received a mouseover, hide the submenu. + if (overMenu[settings_id]) { + subMenu = dynamic_persistent_menu_get_sub_menu(overMenu[settings_id]); + $('#' + subMenu).hide(); + $('#' + overMenu[settings_id]).removeClass('dynamic-persistent-menu-children-active'); + } + // Show the submenu of the current menu. + overMenu[settings_id] = this.id; + subMenu = dynamic_persistent_menu_get_sub_menu(overMenu[settings_id]); + $('#' + subMenu).show(); + $('#' + this.id).addClass('dynamic-persistent-menu-children-active'); } - ).mouseout( - dynamic_persistent_menu_set_timeout - ); + ).mouseout( + function() { + // Set timeout for the hide function + dynamic_persistent_menu_set_timeout(settings_id); + } + ); - $(".dynamic-persistent-menu-sub-menu").mouseover( - function() - { - if (dynamic_persistent_menu_get_sub_menu(overMenu) == this.id) - { - overStatus = 1; - } - } - ).mouseout( -dynamic_persistent_menu_set_timeout - ) -}); + // Set mouseover function to keep overStatus as long as mouse is over the current menu. + $(".dynamic-persistent-menu-sub-menu").mouseover( + function() { + if (dynamic_persistent_menu_get_sub_menu(overMenu[settings_id]) == this.id) { + overStatus = 1; + } + } + ).mouseout( + function() { + dynamic_persistent_menu_set_timeout(settings_id); + } + ); +}; -function dynamic_persistent_menu_get_sub_menu(menu_id) -{ +/** + * Get the id of the submenu of a menu, given its id. + */ +function dynamic_persistent_menu_get_sub_menu(menu_id) { return menu_id.replace('dynamic-persistent-menu-menu','dynamic-persistent-menu-sub-menu'); } -function dynamic_persistent_menu_reset() -{ - if (!overStatus) - { - $('#' + dynamic_persistent_menu_get_sub_menu(overMenu)).hide(); - $('#' + overMenu).removeClass('dynamic-persistent-menu-children-active'); - overMenu = overMenuDefault; - $('#' + dynamic_persistent_menu_get_sub_menu(overMenu)).show(); +/** + * Get the index of the settings array for a given menu. + */ +function dynamic_persistent_menu_menu_settings_index(menu_id) { + id = menu_id.parent().attr('id').replace('dynamic-persistent-menu-', ''); + return Number(id); +} + +/** + * Reset all submenus and the corresponding statuses. + */ +function dynamic_persistent_menu_reset() { + // Hide menu's only if the mouse is not over one of the submenus + if (!overStatus) { + // This can be avoided if the menus array index is the actual menu id itself. + // settings_id = dynamic_persistent_menu_menu_settings_index(overMenu); + $('#' + dynamic_persistent_menu_get_sub_menu(overMenu[settings_id])).hide(); + $('#' + overMenu[settings_id]).removeClass('dynamic-persistent-menu-children-active'); + //TODO - Use drupal settings array instead of custom settings. + overMenu[settings_id] = DynamicPersistentMenu.menus[settings_id]['default']; + $('#' + dynamic_persistent_menu_get_sub_menu(overMenu[settings_id])).show(); } } -function dynamic_persistent_menu_set_timeout() -{ +/** + * Call timeout function. + */ +function dynamic_persistent_menu_set_timeout(settings_id) { + //settings_id = dynamic_persistent_menu_menu_settings_index(overMenu); + //TODO - Use drupal settings array instead of custom settings. + subMenuTimeout = DynamicPersistentMenu.menus[settings_id]['timeout']; overStatus = 0 ; - setTimeout( 'dynamic_persistent_menu_reset()' , subMenuTimeout ); -} \ No newline at end of file + setTimeout('dynamic_persistent_menu_reset()', subMenuTimeout); +} diff -uP dynamic_persistent_menu.orig/dynamic_persistent_menu.module dynamic_persistent_menu/dynamic_persistent_menu.module --- dynamic_persistent_menu.orig/dynamic_persistent_menu.module 2009-12-08 02:15:57.000000000 +0530 +++ dynamic_persistent_menu/dynamic_persistent_menu.module 2010-03-01 13:25:24.000000000 +0530 @@ -1,5 +1,5 @@ root); $block['content'] = theme('dynamic_persistent_menu', $delta, $params[0], $params[1], $dpm->timeout); return $block; @@ -129,7 +128,7 @@ */ function dynamic_persistent_menu_setting_base_form($dpm = NULL) { - $options = menu_parent_options(menu_get_menus(), 0); + $options = menu_parent_options(menu_get_menus(), 0); $form['dpmid'] = array( '#type' => 'hidden', '#value' => $dpm->dpmid @@ -150,7 +149,7 @@ return $form; } -function dynamic_persistent_menu_load($dpmid) { +function dynamic_persistent_menu_load($dpmid) { $result = db_query('SELECT dpmid, root, timeout FROM {dynamic_persistent_menu} WHERE dpmid=%d', $dpmid); return db_fetch_object($result); @@ -164,10 +163,9 @@ * Theme functions */ -function theme_dynamic_persistent_menu($id, $menu_name, $mlid, $timeout) { - static $settings; - - if (!isset($settings)) { +function theme_dynamic_persistent_menu($id, $menu_name, $mlid, $timeout) { + static $settings; + if (!isset($settings)) { $settings = array( "menus" => array() ); @@ -181,9 +179,8 @@ // Find menu item in the menu tree $menu_tree = menu_tree_all_data($menu_name); - $menu_link = menu_link_load($mlid); - - if ($mlid != 0) { + $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) { @@ -207,37 +204,105 @@ if (!$menu) { return; - } - + } + $menu_active=menu_set_active_trail(); + /*foreach ($menu_active [1] as $key => $value) { + print "Key: $key; Value: $value
\n"; + }*/ + if(count ($menu_active) > 1) { + $result = db_query("SELECT * FROM {menu_links} WHERE menu_name='%s' AND link_path='%s'",$menu_name,$menu_active[1]['href']); + if($row=db_fetch_object($result)) { + if($row->plid !=0) { + $trail[] = $row->plid; + } + else { + $trail[] = $row->mlid; + } + //$active_menu=$row->menu_name; + //print $active_menu; + } + } + /*foreach ($a[1] as $key => $value) { + print "Key: $key; Value: $value
\n"; + }*/ // 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']) { + $active_menu_name = menu_get_active_menu_name(); + menu_set_active_menu_name($menu_name); + /*$a=menu_set_active_trail(); + foreach ($a[1] as $key => $value) { + print "Key: $key; Value: $value
\n"; + }*/ + /*$result = db_query('SELECT dpmid, root, timeout FROM {dynamic_persistent_menu}'); + while ($row=db_fetch_object($result)) { + $arrroot=explode(":",$row->root); + print $arrroot[0]."=====".$menu_name."
"; + if($arrroot[0]==$menu_name) { + + } + }*/ + + + //print $arrroot[0]; + + + + // Build table of mlid in the active trail + + //print $a; + /* foreach ($menu as $key => $value) { + print "Key: $key; Value: $value
\n"; + }*/ + //print count (menu_set_active_trail())."
"; + + /*$bool_active_trail=TRUE; + if (count (menu_set_active_trail()) == 1) { + //print ("dileep"); + $a=menu_tree_all_data($menu_name); + foreach ($a as $b) { + $first_mid = $b['link']['mlid']; + break; + } + $bool_active_trail=FALSE; + } + else if (count (menu_set_active_trail()) >1) { + $control_menu=menu_set_active_trail(); + if (!$control_menu[1]['mlid']) { + $a=menu_tree_all_data($menu_name); + foreach ($a as $b) { + $first_mid = $b['link']['mlid']; + break; + } + $bool_active_trail=FALSE; + } + + }*/ + // print count (menu_set_active_trail()); + /* foreach (menu_set_active_trail() as $value) { + if ($value['mlid']) { $trail[] = $value['mlid']; - } - } - - // Restore active menu trail + } + }*/ + // Restore active menu trail menu_set_active_menu_name($active_menu_name); // Build the menus - $output = '