[evolvis-commits] r17642: [#2030] theme-evolvis pending merges:↵ Thorsten Glaser 2011-10-26 in headlinks, make all double-slashes red (by khapke)↵ Thorsten Glaser 2011-10-26 drop unused attributes (speedup)↵ Thorsten Glaser 2011-10-26 imgproj is no longer used↵ Thorsten Glaser 2011-10-26 use groupadminmenu hook; drop quota_{label,link}_project_admin↵ Thorsten Glaser 2011-10-26 deprecate $HTML->subMenu() which now throws an error↵ Thorsten Glaser 2011-10-26 make $params['submenu'] a three-member indexed array (but handle stri...↵ Thorsten Glaser 2011-10-26 correct all $HTML->subMenu uses and add tooltips↵ Thorsten Glaser 2011-10-26 transition tracker to use only one submenu instead of WTF? two…↵ Thorsten Glaser 2011-10-26 pass submenu in params↵ Thorsten Glaser 2011-10-26 make usermenuEx hook use tooltips↵ Thorsten Glaser 2011-10-26 make submenus tooltip-able↵ Thorsten Glaser 2011-10-26 drop usermenu hook, add new usermenuEx hook↵ Thorsten Glaser 2011-10-26 do not manually echo the submenu, pass it to site_header($params) ins...

mirabilos at evolvis.org mirabilos at evolvis.org
Wed Oct 26 15:36:00 CEST 2011


Author: mirabilos
Date: 2011-10-26 15:36:00 +0200 (Wed, 26 Oct 2011)
New Revision: 17642

Modified:
   trunk/gforge_base/evolvisforge-5.1/src/common/docman/views/menu.php
   trunk/gforge_base/evolvisforge-5.1/src/common/forum/ForumHTML.class.php
   trunk/gforge_base/evolvisforge-5.1/src/docs/README.Plugins
   trunk/gforge_base/evolvisforge-5.1/src/docs/README.Themes
   trunk/gforge_base/evolvisforge-5.1/src/plugins/forumml/include/forummlPlugin.class.php
   trunk/gforge_base/evolvisforge-5.1/src/plugins/hudson/include/hudsonPlugin.class.php
   trunk/gforge_base/evolvisforge-5.1/src/plugins/mailman/include/mailmanPlugin.class.php
   trunk/gforge_base/evolvisforge-5.1/src/plugins/mantis/include/MantisPlugin.class.php
   trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/common/MantisBTPlugin.class.php
   trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/www/admin/index.php
   trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/www/group/index.php
   trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/www/index.php
   trunk/gforge_base/evolvisforge-5.1/src/plugins/oslc/include/oslcPlugin.class.php
   trunk/gforge_base/evolvisforge-5.1/src/plugins/projects_hierarchy/common/projects_hierarchyPlugin.class.php
   trunk/gforge_base/evolvisforge-5.1/src/plugins/quota_management/common/quota_managementPlugin.class.php
   trunk/gforge_base/evolvisforge-5.1/src/www/docman/index.php
   trunk/gforge_base/evolvisforge-5.1/src/www/forum/index.php
   trunk/gforge_base/evolvisforge-5.1/src/www/frs/include/frs_utils.php
   trunk/gforge_base/evolvisforge-5.1/src/www/include/Layout.class.php
   trunk/gforge_base/evolvisforge-5.1/src/www/include/html.php
   trunk/gforge_base/evolvisforge-5.1/src/www/include/project_home.php
   trunk/gforge_base/evolvisforge-5.1/src/www/mail/mail_utils.php
   trunk/gforge_base/evolvisforge-5.1/src/www/news/news_utils.php
   trunk/gforge_base/evolvisforge-5.1/src/www/pm/include/ProjectGroupHTML.class.php
   trunk/gforge_base/evolvisforge-5.1/src/www/project/admin/project_admin_utils.php
   trunk/gforge_base/evolvisforge-5.1/src/www/project/stats/index.php
   trunk/gforge_base/evolvisforge-5.1/src/www/scm/include/scm_utils.php
   trunk/gforge_base/evolvisforge-5.1/src/www/softwaremap/full_list.php
   trunk/gforge_base/evolvisforge-5.1/src/www/softwaremap/tag_cloud.php
   trunk/gforge_base/evolvisforge-5.1/src/www/softwaremap/trove_list.php
   trunk/gforge_base/evolvisforge-5.1/src/www/survey/include/SurveyHTML.class.php
   trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/Theme.class.php
   trunk/gforge_base/evolvisforge-5.1/src/www/themes/funky/Theme.class.php
   trunk/gforge_base/evolvisforge-5.1/src/www/themes/gforge/Theme.class.php
   trunk/gforge_base/evolvisforge-5.1/src/www/tracker/admin/ind.php
   trunk/gforge_base/evolvisforge-5.1/src/www/tracker/include/ArtifactTypeHtml.class.php
   trunk/gforge_base/evolvisforge-5.1/src/www/tracker/ind.php
Log:
[#2030] theme-evolvis pending merges:
  Thorsten Glaser 2011-10-26 in headlinks, make all double-slashes red (by khapke)
    Thorsten Glaser 2011-10-26 drop unused attributes (speedup)
    Thorsten Glaser 2011-10-26 imgproj is no longer used
    Thorsten Glaser 2011-10-26 use groupadminmenu hook; drop quota_{label,link}_project_admin
    Thorsten Glaser 2011-10-26 deprecate $HTML->subMenu() which now throws an error
    Thorsten Glaser 2011-10-26 make $params['submenu'] a three-member indexed array (but handle stri...
    Thorsten Glaser 2011-10-26 correct all $HTML->subMenu uses and add tooltips
    Thorsten Glaser 2011-10-26 transition tracker to use only one submenu instead of WTF? two…
    Thorsten Glaser 2011-10-26 pass submenu in params
    Thorsten Glaser 2011-10-26 make usermenuEx hook use tooltips
    Thorsten Glaser 2011-10-26 make submenus tooltip-able
    Thorsten Glaser 2011-10-26 drop usermenu hook, add new usermenuEx hook
    Thorsten Glaser 2011-10-26 do not manually echo the submenu, pass it to site_header($params) ins...


Modified: trunk/gforge_base/evolvisforge-5.1/src/common/docman/views/menu.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/common/docman/views/menu.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/common/docman/views/menu.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -27,23 +27,26 @@
 
 /* please do not add require here : use www/docman/index.php to add require */
 /* global variables used */
-global $HTML; // html object
+global $docman_submenu; // return value
 global $d_arr; // document array
 global $group_id; // id of group
 
 /* create the submenu following role, rules and content */
 $menu_text = array();
 $menu_links = array();
+$menu_tips = array();
 
 if (forge_check_perm('docman', $group_id, 'submit')) {
 	$menu_text[] = _('Submit new documentation');
 	$menu_links[] = '/docman/?group_id='.$group_id.'&view=addfile';
+	$menu_tips[] = _('-tooltip:docman:submit');
 }
 
 if (session_loggedin()) {
 	if (forge_check_perm('docman', $group_id, 'approve')) {
 		$menu_text[] = _('Add new documentation directory');
 		$menu_links[] = '/docman/?group_id='.$group_id.'&view=addsubdocgroup';
+		$menu_tips[] = _('-tooltip:docman:newdir');
 	}
 }
 
@@ -51,19 +54,21 @@
 	if ($d_arr || count($d_arr) > 1) {
 		$menu_text[] = _('Search in documents');
 		$menu_links[] = '/docman/?group_id='.$group_id.'&view=search';
+		$menu_tips[] = _('-tooltip:docman:searchdocs');
 	}
 }
 
 if (session_loggedin()) {
 	if (forge_check_perm('docman', $group_id, 'approve')) {
-		$menu_text[] = _('Administration');
+		$menu_text[] = _('Admin');
 		$menu_links[] = '/docman/?group_id='.$group_id.'&view=admin';
+		$menu_tips[] = _('-tooltip:docman:admin');
 	}
 }
 
 if (count($menu_text)) {
-	echo $HTML->subMenu($menu_text, $menu_links);
+	$docman_submenu = array($menu_text, $menu_links, $menu_tips);
+} else {
+	$docman_submenu = false;
 }
-
-plugin_hook("blocks", "doc index");
 ?>

Modified: trunk/gforge_base/evolvisforge-5.1/src/common/forum/ForumHTML.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/common/forum/ForumHTML.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/common/forum/ForumHTML.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -47,15 +47,14 @@
 		// Check if this is a news item, to display it at the top of the page
 		$result = db_query_params ('SELECT submitted_by, post_date, group_id, forum_id, summary, details FROM news_bytes WHERE forum_id=$1',
 					   array ($forum_id));
-		
-		if (db_numrows($result) == 1) {
-			
+
+		if ($result && db_numrows($result) == 1) {
 			// checks which group the news item belongs to
 			$params['group']=db_result($result,0,'group_id');
 			$params['toptab']='news';
 			$params['title']= _('Forum: ') . db_result($result,0,'summary');
 			$HTML->header($params);
-		
+
 			echo '<table><tr><td valign="top">';
 			$user = user_get_object(db_result($result,0,'submitted_by'));
 			$group = group_get_object($params['group']);
@@ -63,15 +62,15 @@
 				exit_no_group();
 			}
 			echo '<p>
-				<strong>'._('Posted by').':</strong> '.$user->getRealName().'<br />
-				<strong>'._('Date').':</strong> '. date(_('Y-m-d H:i'),db_result($result,0,'post_date')).'<br />
-				<strong>'._('Summary').':</strong>'.
+			<strong>'._('Posted by').':</strong> '.$user->getRealName().'<br />
+			<strong>'._('Date').':</strong> '. date(_('Y-m-d H:i'),db_result($result,0,'post_date')).'<br />
+			<strong>'._('Summary').':</strong>'.
 				util_make_link ('/forum/forum.php?forum_id='.db_result($result,0,'forum_id').'&group_id='.$group_id,
 						db_result($result,0,'summary')).'<br/>
-				<strong>'._('Project').':</strong>'.
+			<strong>'._('Project').':</strong>'.
 				util_make_link_g ($group->getUnixName(),db_result($result,0,'group_id'),$group->getPublicName()).'<br />
-				</p>
-				';
+			</p>
+			';
 			$body = db_result($result,0,'details');
 			$body = TextSanitizer::purify($body);
 			if (!strstr($body,'<')) {
@@ -80,12 +79,12 @@
 			} else {
 				echo util_make_links($body);
 			}
-			
+
 			// display classification
 			if ($params['group'] == forge_get_config('news_group')) { 
-				print stripslashes(trove_news_getcatlisting(db_result($result,0,'forum_id'),0,1));
+			   print stripslashes(trove_news_getcatlisting(db_result($result,0,'forum_id'),0,1));
 			} elseif (forge_get_config('use_trove')) {
-				print stripslashes(trove_getcatlisting($params['group'],0,1));
+			   print stripslashes(trove_getcatlisting($params['group'],0,1));
 			}
 			echo '</td><td valign="top" width="35%">';
 			echo $HTML->boxTop(_('Latest News'));
@@ -96,32 +95,36 @@
 			$HTML->header($params);
 		}
 	} else {
+
 		$menu_text=array();
 		$menu_links=array();
-		
+		$menu_tips=array();
+
 		$menu_text[]=_('View Forums');
 		$menu_links[]='/forum/?group_id='.$group_id;
-		
+		$menu_tips[]=_('-tooltip:forum:view');
+
 		if ($f){
 			if ($forum_id) {
 				$menu_text[]=_('Discussion Forums:') .' '. $f->getName();
 				$menu_links[]='/forum/forum.php?forum_id='.$forum_id;
+				$menu_tips[]=_('-tooltip:forum:show');
 			}
 			if (forge_check_perm ('forum_admin', $f->Group->getID())) {
 				$menu_text[]=_('Administration');
 				$menu_links[]='/forum/admin/?group_id='.$group_id;
+				$menu_tips[]=_('-tooltip:forum:admin');
 			} 
 		} else {
 			$gg=group_get_object($group_id);
 			if (forge_check_perm ('forum_admin', $group_id)) {
 				$menu_text[]=_('Administration');
 				$menu_links[]='/forum/admin/?group_id='.$group_id;
+				$menu_tips[]=_('-tooltip:forum:admin');
 			}
 		}
-		if (count($menu_text) > 0) {
-			$params['submenu'] =$HTML->subMenu($menu_text,$menu_links);
-		}
-		
+		$params['submenu'] = array($menu_text,$menu_links,$menu_tips);
+
 		site_project_header($params);
 	}
 
@@ -133,17 +136,17 @@
 		if ($f) {
 			if ($f->isMonitoring()) {
 				echo util_make_link ('/forum/monitor.php?forum_id='.$forum_id.'&group_id='.$group_id.'&stop=1',
-							     html_image('ic/xmail16w.png').' '._('Stop Monitoring')).' | ';
+						     html_image('ic/xmail16w.png','20','20').' '._('Stop Monitoring')).' | ';
 			} else {
 				echo util_make_link ('/forum/monitor.php?forum_id='.$forum_id.'&group_id='.$group_id.'&start=1',
-						     html_image('ic/mail16w.png').' '._('Monitor Forum')).' | ';
+						     html_image('ic/mail16w.png','20','20').' '._('Monitor Forum')).' | ';
 			}
 			echo util_make_link ('/forum/save.php?forum_id='.$forum_id.'&group_id='.$group_id,
-					     html_image('ic/save.png') .' '._('Save Place')).' | ';
+					     html_image('ic/save.png','24','24') .' '._('Save Place')).' | ';
 		}
 	} elseif ($f) {
 		echo '<a href="/forum/monitor.php?forum_id='.$forum_id.'&group_id='.$group_id.'&start=1">' .
-			html_image('ic/mail16w.png').' '._('Monitor Forum').'</a> | ';		
+			html_image('ic/mail16w.png','20','20').' '._('Monitor Forum').'</a> | ';		
 	}
 
 	if ($f && $forum_id) {
@@ -321,16 +324,14 @@
 						<td class="warning">' . _('Warning: Uploaded file will replace current file') . '</td>
 					</tr>
 			</table>
-				<input type="submit" name="go" value="'._('Update').'" />
+			<input type="submit" name="go" value="'._('Update').'"/>
 			<input type="hidden" name="doedit" value="1"/>
 			<input type="hidden" name="edit" value="yes"/>
 			<input type="hidden" name="forum_id" value="'.$forum_id.'"/>
 			<input type="hidden" name="group_id" value="'.$group_id.'"/>
 			<input type="hidden" name="attachid" value="'.$attachid.'"/>
 			<input type="hidden" name="msg_id" value="'.$msg_id.'"/>
-			</fieldset>
-			</form>
-			<p/>';
+			</fieldset></form>';
 		return $return_val;
 	}
 
@@ -432,8 +433,8 @@
 				/*
 					If it this is the message being displayed, don't show a link to it
 				*/
-				if ($current_message != $msg_arr[$msg_id][$i]->getID()) {
-					$ah_begin='<a href="'.util_make_url ('/forum/message.php?msg_id='. $msg_arr[$msg_id][$i]->getID() .'&group_id='.$group_id).'">';
+				if ($current_message != $msg_arr["$msg_id"][$i]->getID()) {
+					$ah_begin='<a href="'.util_make_url ('/forum/message.php?msg_id='. $msg_arr["$msg_id"][$i]->getID() .'&group_id='.$group_id).'">';
 					$ah_end='</a>';
 				} else {
 					$ah_begin='';
@@ -445,7 +446,7 @@
 				/*
 					See if this message is new or not
 				*/
-				if ($this->Forum->getSavedDate() < $msg_arr[$msg_id][$i]->getPostDate()) {
+				if ($this->Forum->getSavedDate() < $msg_arr["$msg_id"][$i]->getPostDate()) {
 					$bold_begin='<strong>';
 					$bold_end='</strong>';
 				} else {
@@ -453,15 +454,15 @@
 					$bold_end='';
 				}
 
-				$ret_val .= $bold_begin.$msg_arr[$msg_id][$i]->getSubject() .$bold_end.$ah_end.'</td>'.
-					'<td>'.util_display_user($msg_arr[$msg_id][$i]->getPosterName(),$msg_arr[$msg_id][$i]->getPosterID(),$msg_arr[$msg_id][$i]->getPosterRealName()) .'</td>'.
-					'<td>'.date(_('Y-m-d H:i'), $msg_arr[$msg_id][$i]->getPostDate() ).'</td></tr>';
+				$ret_val .= $bold_begin.$msg_arr["$msg_id"][$i]->getSubject() .$bold_end.$ah_end.'</td>'.
+					'<td>'.util_make_link_u ($msg_arr["$msg_id"][$i]->getPosterName(),$msg_arr["$msg_id"][$i]->getPosterID(),$msg_arr["$msg_id"][$i]->getPosterRealName()) .'</td>'.
+				'<td>'.date(_('Y-m-d H:i'), $msg_arr["$msg_id"][$i]->getPostDate() ).'</td></tr>';
 
-				if ($msg_arr[$msg_id][$i]->hasFollowups() > 0) {
+				if ($msg_arr["$msg_id"][$i]->hasFollowups() > 0) {
 					/*
 						Call yourself, incrementing the level
 					*/
-					$ret_val .= $this->showSubmessages($msg_arr,$msg_arr[$msg_id][$i]->getID(),($level+1));
+					$ret_val .= $this->showSubmessages($msg_arr,$msg_arr["$msg_id"][$i]->getID(),($level+1));
 				}
 			}
 		}
@@ -587,7 +588,7 @@
 		plugin_hook("text_editor",$params);
 		if (!$GLOBALS['editor_was_set_up']) {
 			//if we don't have any plugin for text editor, display a simple textarea edit box
-					echo '<textarea name="body"  rows="10" cols="70">' . $body . '</textarea>';
+			echo '<textarea name="body" rows="10" cols="70">' . $body . '</textarea>';
 		}
 		unset($GLOBALS['editor_was_set_up']);
 		?> <?php //$text_support->displayTextField('body'); ?> <br>
@@ -625,7 +626,9 @@
 } else {
 	//do nothing
 }
+
 }
+
 }
 // Local Variables:
 // mode: php

Modified: trunk/gforge_base/evolvisforge-5.1/src/docs/README.Plugins
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/docs/README.Plugins	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/docs/README.Plugins	2011-10-26 13:36:00 UTC (rev 17642)
@@ -397,12 +397,18 @@
   Description: Provides a place to include extra information about a
                task. The hook should return a <tr> row containing 2 cells
                (or colspan'ed to 2).
-  
+
   Hook Name  : usermenu
+  Disabled   : use usermenuEx instead
+
+  Hook Name  : usermenuEx
+  Parameters : title_arr - Array of submenu titles
+               links_arr - Array of submenu links
+               tooltip_arr - Array of submenu tooltips
   Locations  : www/include/html.php
-  Description: Prints out a tab to show when displaying user pages.
-               Unlike the groupmenu hook, this hook should use the PrintSubMenu
-               method to display the tab itself.
+  Description: Adds information to the third-level order navigation (submenu)
+               when displaying user pages. Do not echo anything, append to
+               the arrays passed instead.
 
   Hook Name  : role_get
   Locations  : common/include/Role.class.php

Modified: trunk/gforge_base/evolvisforge-5.1/src/docs/README.Themes
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/docs/README.Themes	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/docs/README.Themes	2011-10-26 13:36:00 UTC (rev 17642)
@@ -43,6 +43,8 @@
 A simple theme is the Savannah one, that just changes some colors.
 The big work is to make new icons found in www/themes/savannah/images/
 
+Note: the information below is out of date, the attributes are unused.
+
 ,----
 | class Theme extends Layout {
 | 
@@ -124,32 +126,6 @@
 `----
 
 
-I WANT TO CUSTOMIZE ICONS
--------------------------
-
-Icons are not customizable by default.  I started to enable this like
-this in a non regressive way for icons in the project page (code is at
-www/include/project_home.php).  I added the variable $imgproj =
-'images/ic/'; in Layout.class.php and changed html_image function calls
-like this:
-,----
-| html_image($imgproj. "manual16c.png", '15','15',array('alt'=>'Release Notes'));
-`----
-
-By default images are searched in the original place, but you can now
-change this place.  It's just a matter of doing e.g. like it's done in
-debian theme:
-,----
-| $this->imgproj = 'themes/debian/images/proj/'; 
-`----
-in the class constructor.
-
-All other themes will continue to work.
-
-Just proceed in the same way for other places in the code where you
-want to customize icons, and send us the appropriate patch :)
-
-
 HOW TO NAME MY THEME
 --------------------
 

Modified: trunk/gforge_base/evolvisforge-5.1/src/plugins/forumml/include/forummlPlugin.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/plugins/forumml/include/forummlPlugin.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/plugins/forumml/include/forummlPlugin.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -27,7 +27,7 @@
 		$this->name = "forumml" ;
 		$this->text = "ForumML" ; // To show in the tabs, use...
 		$this->_addHook("user_personal_links");//to make a link to the user�s personal part of the plugin
-		$this->_addHook("usermenu") ;
+		$this->_addHook("usermenuEx") ;
 		$this->_addHook("groupisactivecheckbox") ; // The "use ..." checkbox in editgroupinfo
 		$this->_addHook("groupisactivecheckboxpost") ; //
 		$this->_addHook("userisactivecheckbox") ; // The "use ..." checkbox in user account
@@ -50,12 +50,13 @@
 
 	function CallHook ($hookname, &$params) {
 		global $use_mailmanplugin,$G_SESSION,$HTML,$gfcommon,$gfwww,$gfplugins;
-		if ($hookname == "usermenu") {
+		if ($hookname == "usermenuEx") {
 			$text = $this->text; // this is what shows in the tab
 			if ($G_SESSION->usesPlugin("mailman")) {
-				$param = '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we�re calling is the user one
-				echo ' | ' . $HTML->PrintSubMenu (array ($text),
-						array ('/plugins/mailman/index.php' . $param ));				
+				$param['title_arr'][] = $text;
+				$param['links_arr'][] = '/plugins/mailman/index.php' .
+				    '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we�re calling is the user one
+				$param['tooltip_arr'][] = _('-tooltip:plugin:forumml');
 			}
 		} elseif ($hookname =='cssfile') {
 			echo '<link rel="stylesheet" type="text/css" href="/plugins/forumml/themes/default/css/style.css" />';

Modified: trunk/gforge_base/evolvisforge-5.1/src/plugins/hudson/include/hudsonPlugin.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/plugins/hudson/include/hudsonPlugin.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/plugins/hudson/include/hudsonPlugin.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -19,7 +19,7 @@
 		$this->name = "hudson" ;
 		$this->text = _('Hudson'); // To show in the tabs, use...
 		$this->_addHook("user_personal_links"); //to make a link to the user's personal part of the plugin
-		$this->_addHook("usermenu") ;
+		$this->_addHook("usermenuEx") ;
 		$this->_addHook("groupmenu");	// To put into the project tabs
 		$this->_addHook("groupisactivecheckbox") ; // The "use ..." checkbox in editgroupinfo
 		$this->_addHook("groupisactivecheckboxpost") ; //
@@ -39,12 +39,13 @@
 	}
 	function CallHook ($hookname, &$params) {
 		global $G_SESSION,$HTML;
-		if ($hookname == "usermenu") {
+		if ($hookname == "usermenuEx") {
 			$text = $this->text; // this is what shows in the tab
 			if ($G_SESSION->usesPlugin("hudson")) {
-				$param = '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
-				echo ' | ' . $HTML->PrintSubMenu (array ($text),
-						array ('/plugins/hudson/index.php' . $param ));				
+				$param['title_arr'][] = $text;
+				$param['links_arr'][] = '/plugins/hudson/index.php' .
+				    '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
+				$param['tooltip_arr'][] = _('-tooltip:plugin:hudson');
 			}
 		} elseif ($hookname == "groupmenu") {
 			$group_id=$params['group'];

Modified: trunk/gforge_base/evolvisforge-5.1/src/plugins/mailman/include/mailmanPlugin.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/plugins/mailman/include/mailmanPlugin.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/plugins/mailman/include/mailmanPlugin.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -42,7 +42,7 @@
 		$this->name = "mailman" ;
 		$this->text = "Mailman" ; // To show in the tabs, use...
 		$this->_addHook("user_personal_links");//to make a link to the user�s personal part of the plugin
-		$this->_addHook("usermenu") ;
+		$this->_addHook("usermenuEx") ;
 		$this->_addHook("groupmenu");	// To put into the project tabs
 		$this->_addHook("groupisactivecheckbox") ; // The "use ..." checkbox in editgroupinfo
 		$this->_addHook("groupisactivecheckboxpost") ; //
@@ -72,12 +72,13 @@
 	
 	function CallHook ($hookname, &$params) {
 		global $use_mailmanplugin,$G_SESSION,$HTML,$gfcommon,$gfwww,$gfplugins;
-		if ($hookname == "usermenu") {
+		if ($hookname == "usermenuEx") {
 			$text = $this->text; // this is what shows in the tab
 			if ($G_SESSION->usesPlugin("mailman")) {
-				$param = '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we�re calling is the user one
-				echo ' | ' . $HTML->PrintSubMenu (array ($text),
-					array ('/plugins/mailman/index.php' . $param ));				
+				$param['title_arr'][] = $text;
+				$param['links_arr'][] = '/plugins/mailman/index.php' .
+				    '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we�re calling is the user one
+				$param['tooltip_arr'][] = _('-tooltip:plugin:mailman');
 			}
 		} elseif ($hookname == "groupmenu") {
 			$group_id=$params['group'];

Modified: trunk/gforge_base/evolvisforge-5.1/src/plugins/mantis/include/MantisPlugin.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/plugins/mantis/include/MantisPlugin.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/plugins/mantis/include/MantisPlugin.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -33,7 +33,7 @@
 		$this->name = "mantis" ;
 		$this->text = "Mantis" ; // To show in the tabs, use...
 		$this->hooks[] = "user_personal_links";//to make a link to the user's personal part of the plugin
-		$this->hooks[] = "usermenu" ;
+		$this->hooks[] = "usermenuEx" ;
 		$this->hooks[] = "groupmenu" ;	// To put into the project tabs
 		$this->hooks[] = "groupisactivecheckbox" ; // The "use ..." checkbox in editgroupinfo
 		$this->hooks[] = "groupisactivecheckboxpost" ; //
@@ -44,12 +44,13 @@
 
 	function CallHook ($hookname, &$params) {
 		global $use_mantisplugin,$G_SESSION,$HTML;
-		if ($hookname == "usermenu") {
+		if ($hookname == "usermenuEx") {
 			$text = $this->text; // this is what shows in the tab
 			if ($G_SESSION->usesPlugin("mantis")) {
-				$param = '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
-				echo ' | ' . $HTML->PrintSubMenu (array ($text),
-						  array ('/plugins/mantis/index.php' . $param ));				
+				$param['title_arr'][] = $text;
+				$param['links_arr'][] = '/plugins/mantis/index.php' .
+				    '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
+				$param['tooltip_arr'][] = _('-tooltip:plugin:mantis');
 			}
 		} elseif ($hookname == "groupmenu") {
 			$group_id=$params['group'];

Modified: trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/common/MantisBTPlugin.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/common/MantisBTPlugin.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/common/MantisBTPlugin.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -30,7 +30,7 @@
 		$this->name = "mantisbt" ;
 		$this->text = "MantisBT" ; // To show in the tabs, use...
 		$this->hooks[] = "user_personal_links";//to make a link to the user's personal part of the plugin
-		$this->hooks[] = "usermenu" ;
+		$this->hooks[] = "usermenuEx" ;
 		$this->hooks[] = "groupmenu" ;	// To put into the project tabs
 		$this->hooks[] = "groupisactivecheckbox" ; // The "use ..." checkbox in editgroupinfo
 		$this->hooks[] = "groupisactivecheckboxpost" ; //
@@ -49,12 +49,13 @@
 	function CallHook ($hookname, &$params) {
 		global $use_mantisbtplugin,$G_SESSION,$HTML;
 		switch ($hookname) {
-			case "usermenu":
+			case "usermenuEx":
 				$text = $this->text; // this is what shows in the tab
 				if ($G_SESSION->usesPlugin($this->name)) {
-					$param = '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
-					echo ' | ' . $HTML->PrintSubMenu (array ($text),
-					array ('/plugins/mantisbt/index.php' . $param ));
+					$param['title_arr'][] = $text;
+					$param['links_arr'][] = '/plugins/mantisbt/index.php' .
+					    '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
+					$param['tooltip_arr'][] = _('-tooltip:plugin:mantisbt');
 				}
 				break;
 

Modified: trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/www/admin/index.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/www/admin/index.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/www/admin/index.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -35,23 +35,6 @@
 		break;
 }
 
-// submenu
-$labelTitle = array ();
-$labelTitle[] = _('Roadmap');
-$labelTitle[] = _('Tickets');
-$labelPage = array();
-$labelPage[] = "/plugins/mantisbt/?type=group&id=".$id."&pluginname=".$pluginname."&view=roadmap";
-$labelPage[] = "/plugins/mantisbt/?type=group&id=".$id."&pluginname=".$pluginname;
-$userperm = $group->getPermission($user);
-if ( $userperm->isAdmin() ) {
-        $labelTitle[] = _('Admin');
-        $labelPage[] = "/plugins/mantisbt/?type=admin&id=".$id."&pluginname=".$pluginname;
-        $labelTitle[] = _('Stats');
-        $labelPage[] = "/plugins/mantisbt/?type=admin&id=".$id."&pluginname=".$pluginname."&view=stat";
-}
-
-echo $HTML->subMenu( $labelTitle, $labelPage );
-
 switch($view) {
 	case "editVersion":
 	case "stat":

Modified: trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/www/group/index.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/www/group/index.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/www/group/index.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -39,24 +39,7 @@
 		include ("mantisbt/action/updateNote.php");
 		break;
 }
-				
-// submenu
-$labelTitle = array ();
-$labelTitle[] = _('Roadmap');
-$labelTitle[] = _('Tickets');
-$labelPage = array();
-$labelPage[] = "/plugins/mantisbt/?type=group&id=".$id."&pluginname=".$pluginname."&view=roadmap";
-$labelPage[] = "/plugins/mantisbt/?type=group&id=".$id."&pluginname=".$pluginname;
-$userperm = $group->getPermission($user);
-if ( $userperm->isAdmin() ) {
-	$labelTitle[] = _('Admin');
-	$labelPage[] = "/plugins/mantisbt/?type=admin&id=".$id."&pluginname=".$pluginname;
-	$labelTitle[] = _('Stats');
-	$labelPage[] = "/plugins/mantisbt/?type=admin&id=".$id."&pluginname=".$pluginname."&view=stat";
-}
 
-echo $HTML->subMenu( $labelTitle, $labelPage );
-
 // page a afficher
 switch ($view) {
 	case "editIssue":

Modified: trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/www/index.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/www/index.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/plugins/mantisbt/www/index.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -33,9 +33,28 @@
 	global $DOCUMENT_ROOT,$HTML,$id;
 	$params['toptab']='mantisbt';
 	$params['group']=$id;
-	/*
-		Show horizontal links
-		*/
+
+	// submenu
+	$labelTitle = array();
+	$labelTitle[] = _('Roadmap');
+	$labelTitle[] = _('Tickets');
+	$labelPage = array();
+	$labelPage[] = "/plugins/mantisbt/?type=group&id=".$id."&pluginname=".$pluginname."&view=roadmap";
+	$labelPage[] = "/plugins/mantisbt/?type=group&id=".$id."&pluginname=".$pluginname;
+	$labelTips = array();
+	$labelTips[] = _('-tooltip:plugin:mantisbt:roadmap');
+	$labelTips[] = _('-tooltip:plugin:mantisbt:tickets');
+	$userperm = $group->getPermission($user);
+	if ($userperm->isAdmin()) {
+		$labelTitle[] = _('Admin');
+		$labelPage[] = "/plugins/mantisbt/?type=admin&id=".$id."&pluginname=".$pluginname;
+		$labelTips[] = _('-tooltip:plugin:mantisbt:admin');
+		$labelTitle[] = _('Stats');
+		$labelPage[] = "/plugins/mantisbt/?type=admin&id=".$id."&pluginname=".$pluginname."&view=stat";
+		$labelTips[] = _('-tooltip:plugin:mantisbt:stats');
+	}
+	$params['submenu'] = array($labelTitle, $labelPage, $labelTips);
+
 	site_project_header($params);
 }
 

Modified: trunk/gforge_base/evolvisforge-5.1/src/plugins/oslc/include/oslcPlugin.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/plugins/oslc/include/oslcPlugin.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/plugins/oslc/include/oslcPlugin.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -27,7 +27,7 @@
 		$this->name = "oslc";
 		$this->text = "oslc"; // To show in the tabs, use...
 		$this->_addHook("user_personal_links");//to make a link to the user's personal part of the plugin
-		$this->_addHook("usermenu");
+		$this->_addHook("usermenuEx");
 		$this->_addHook("groupmenu");	// To put into the project tabs
 		$this->_addHook("groupisactivecheckbox"); // The "use ..." checkbox in editgroupinfo
 		$this->_addHook("groupisactivecheckboxpost"); //
@@ -40,12 +40,13 @@
 
 	function CallHook ($hookname, &$params) {
 		global $use_oslcplugin,$G_SESSION,$HTML;
-		if ($hookname == "usermenu") {
+		if ($hookname == "usermenuEx") {
 			$text = $this->text; // this is what shows in the tab
 			if ($G_SESSION->usesPlugin("oslc")) {
-				$param = '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
-				echo ' | ' . $HTML->PrintSubMenu (array ($text),
-						  array ('/plugins/oslc/index.php' . $param ));				
+				$param['title_arr'][] = $text;
+				$param['links_arr'][] = '/plugins/oslc/index.php' .
+				    '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
+				$param['tooltip_arr'][] = _('-tooltip:plugin:oslc');
 			}
 		} elseif ($hookname == "groupmenu") {
 			$group_id=$params['group'];

Modified: trunk/gforge_base/evolvisforge-5.1/src/plugins/projects_hierarchy/common/projects_hierarchyPlugin.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/plugins/projects_hierarchy/common/projects_hierarchyPlugin.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/plugins/projects_hierarchy/common/projects_hierarchyPlugin.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -29,7 +29,7 @@
 		$this->name = "projects_hierarchy" ;
 		$this->text = "projects_hierarchy!" ; // To show in the tabs, use...
 		$this->hooks[] = "user_personal_links";//to make a link to the user's personal part of the plugin
-		$this->hooks[] = "usermenu" ;
+		$this->hooks[] = "usermenuEx" ;
 		$this->hooks[] = "groupmenu" ;	// To put into the project tabs
 		$this->hooks[] = "groupisactivecheckbox" ; // The "use ..." checkbox in editgroupinfo
 		$this->hooks[] = "groupisactivecheckboxpost" ; //
@@ -44,12 +44,13 @@
 
 	function CallHook ($hookname, &$params) {
 		global $use_projects_hierarchyplugin,$G_SESSION,$HTML;
-		if ($hookname == "usermenu") {
+		if ($hookname == "usermenuEx") {
 			$text = $this->text; // this is what shows in the tab
 			if ($G_SESSION->usesPlugin("projects_hierarchy")) {
-				$param = '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
-				echo ' | ' . $HTML->PrintSubMenu (array ($text),
-						  array ('/plugins/projects_hierarchy/index.php' . $param ));				
+				$param['title_arr'][] = $text;
+				$param['links_arr'][] = '/plugins/projects_hierarchy/index.php' .
+				    '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
+				$param['tooltip_arr'][] = _('-tooltip:plugin:projects_hierarchy');
 			}
 		} elseif ($hookname == "groupmenu") {
 			$group_id=$params['group'];

Modified: trunk/gforge_base/evolvisforge-5.1/src/plugins/quota_management/common/quota_managementPlugin.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/plugins/quota_management/common/quota_managementPlugin.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/plugins/quota_management/common/quota_managementPlugin.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -27,7 +27,7 @@
 		$this->name = "quota_management" ;
 		$this->text = "quota_management!" ; // To show in the tabs, use...
 		$this->hooks[] = "user_personal_links";//to make a link to the user's personal part of the plugin
-		$this->hooks[] = "usermenu" ;
+		$this->hooks[] = "usermenuEx" ;
 		$this->hooks[] = "groupmenu" ;	// To put into the project tabs
 		$this->hooks[] = "groupisactivecheckbox" ; // The "use ..." checkbox in editgroupinfo
 		$this->hooks[] = "groupisactivecheckboxpost" ; //
@@ -35,18 +35,18 @@
 		$this->hooks[] = "userisactivecheckboxpost" ; //
 		$this->hooks[] = "project_admin_plugins"; // to show up in the admin page fro group
 		$this->hooks[] = "site_admin_option_hook"; // to show in admin
-		$this->hooks[] = "quota_label_project_admin"; // to show in admin project
-		$this->hooks[] = "quota_link_project_admin"; // to show in admin project
+		$this->hooks[] = "groupadminmenu"; // to show in admin project
 	}
 
 	function CallHook ($hookname, &$params) {
 		global $use_quota_managementplugin,$G_SESSION,$HTML;
-		if ($hookname == "usermenu") {
+		if ($hookname == "usermenuEx") {
 			$text = $this->text; // this is what shows in the tab
 			if ($G_SESSION->usesPlugin("quota_management")) {
-				$param = '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
-				echo ' | ' . $HTML->PrintSubMenu (array ($text),
-						  array ('/plugins/quota_management/index.php' . $param ));				
+				$param['title_arr'][] = $text;
+				$param['links_arr'][] = '/plugins/quota_management/index.php' .
+				    '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we're calling is the user one
+				$param['tooltip_arr'][] = _('-tooltip:plugin:quota_management');
 			}
 		} elseif ($hookname == "groupmenu") {
 			$group_id=$params['group'];
@@ -148,14 +148,10 @@
 				); ?></li>
 			<?php
 		} 
-		elseif ($hookname == "quota_label_project_admin") {
-			// www/project/admin/project_admin_utils.php line 80
-			$labels[] = _('Quota');
-		} 
-		elseif ($hookname == "quota_link_project_admin") {
-			// www/project/admin/project_admin_utils.php line 99
-			$group_id=$params['group'];
-			 $links[] = '/plugins/quota_management/quota.php?group_id='.$group_id;
+		elseif ($hookname == "groupadminmenu") {
+			$params['submenu'][0][] = _('Quota');
+			$params['submenu'][1][] = '/plugins/quota_management/quota.php?group_id=' . $params['group'];
+			$params['submenu'][2][] = _('-tooltip:plugin:quota_management:groupadminmenu');
 		}
 	}
 }

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/docman/index.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/docman/index.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/docman/index.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -108,14 +108,21 @@
 
 $title = _('Documents for ').$g->getPublicName();
 
-site_project_header(array('title'=>$title,'group'=>$group_id,'toptab'=>'docman'));
+include ($gfcommon.'docman/views/menu.php');
 
+site_project_header(array(
+	'title' => $title,
+	'group' => $group_id,
+	'toptab' => 'docman',
+	'submenu' => $docman_submenu,
+    ));
+
 echo '<div id="docman_tree" style="float:left;">';
 include ($gfcommon.'docman/views/tree.php');
 echo '</div>';
 
 echo '<table><tr><td>';
-include ($gfcommon.'docman/views/menu.php');
+plugin_hook("blocks", "doc index");
 include ($gfcommon.'docman/views/views.php');
 echo '</td></tr></table>';
 

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/forum/index.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/forum/index.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/forum/index.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -47,7 +47,13 @@
         session_redirect('/forum/forum.php?forum_id='.$farr[0]->getID());
 	}
 
-	forum_header(array('title'=>sprintf(_('Forums for %1$s'), $g->getPublicName()) ));
+	forum_header(array(
+		'title' => sprintf(_('Forums for %1$s'), $g->getPublicName()),
+		'submenu' => array(
+		    array(_("My Monitored Forums")),
+		    array("/forum/myforums.php?group_id=$group_id"),
+		    array(_("-tooltip:forum:myforums"))),
+	    ));
 
 	if ($ff->isError()) {
         echo '<div class="error">'. $ff->getErrorMessage().'</div>';
@@ -61,8 +67,6 @@
 
 //	echo _('<p>Choose a forum and you can browse, search, and post messages.<p>');
 
-	echo $HTML->printsubMenu(array(_("My Monitored Forums")),array("/forum/myforums.php?group_id=$group_id"));
-
 	plugin_hook ("blocks", "forum index");
 
 	$tablearr=array(_('Forum'),_('Description'),_('Threads'),_('Posts'), _('Last Post'),_('Moderation Level'));

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/frs/include/frs_utils.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/frs/include/frs_utils.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/frs/include/frs_utils.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -70,7 +70,7 @@
 	$params['group']=$group_id;
 
 	if (forge_check_perm ('frs', $group_id, 'write')) {
-		$params['submenu'] = $HTML->subMenu(
+		$params['submenu'] = array(
 			array(
 				_('View File Releases'),
 				_('Reporting'),
@@ -80,7 +80,12 @@
 				'/frs/?group_id='.$group_id,
 				'/frs/reporting/downloads.php?group_id='.$group_id,
 				'/frs/admin/?group_id='.$group_id
-				)
+				),
+			array(
+				_('-tooltip:frs:view'),
+				_('-tooltip:frs:reporting'),
+				_('-tooltip:frs:admin'),
+				),
 			);
 	}
 	site_project_header($params);

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/include/Layout.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/include/Layout.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/include/Layout.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -820,9 +820,10 @@
 	 *
 	 * @param	array	The array of titles.
 	 * @param	array	The array of title links.
+	 * @param	array	The array of tooltips (optional)
 	 * @return	string	Html to build a submenu.
 	 */
-	function printSubMenu ($title_arr,$links_arr) {
+	function printSubMenu ($title_arr,$links_arr,$tooltip_arr=array()) {
 		$count=count($title_arr);
 		$count--;
 
@@ -834,18 +835,11 @@
 		return $return;
 	}
 
-	/**
-	 * subMenu() - Takes two array of titles and links and build a menu.
-	 *
-	 * @param	array	The array of titles.
-	 * @param	array	The array of title links.
-	 * @return	string	Html to build a submenu.
-	 */
-	function subMenu ($title_arr,$links_arr) {
-		$return  = $this->beginSubMenu() ;
-		$return .= $this->printSubMenu($title_arr,$links_arr) ;
-		$return .= $this->endSubMenu() ;
-		return $return;
+	/* deprecated, pass $params['submenu'] as array instead */
+	function subMenu($title_arr,$links_arr,$tooltip_arr=array()) {
+		ffDebug('error', 'deprecated Layout.subMenu call ignored:\n',
+		    debug_string_backtrace());
+		return "{ERROR}";
 	}
 
 	/**
@@ -1298,32 +1292,52 @@
 	/* Get the navigation links for the software map pages (trove,
 	 * tag cloud, full project list) according to what's enabled
 	 */
-	function printSoftwareMapLinks() {
+	function getSoftwareMapLinks() {
 		$subMenuTitle = array();
 		$subMenuUrl = array();
+		$subMenuTip = array();
 		
 		if (forge_get_config('use_project_tags')) {
 			$subMenuTitle[] = _('Tag cloud');
 			$subMenuUrl[] = '/softwaremap/tag_cloud.php';
+			$subMenuTip[] = _('Display all public projects by their tags');
 		}
 		
 		if (forge_get_config('use_trove')) {
 			$subMenuTitle[] = _('Project Tree');
 			$subMenuUrl[] = '/softwaremap/trove_list.php';
+			$subMenuTip[] = _('Display all public projects as trove tree');
 		}
 		
 		if (forge_get_config('use_project_full_list')) {
 			$subMenuTitle[] = _('Project List');
 			$subMenuUrl[] = '/softwaremap/full_list.php';
+			$subMenuTip[] = _('Display an alphabetically sorted list of all public projects');
 		}
 		
-		echo $this->subMenu($subMenuTitle, $subMenuUrl);
+		return array($subMenuTitle, $subMenuUrl, $subMenuTip);
 	}
 
 	function disableForgebar() {
 		/* nothing */
 	}
 
+	/* display the submenu, if it was passed */
+	function handleSubmenu($params) {
+		if (!isset($params['submenu'])) {
+			return;
+		}
+		if (is_array($params['submenu'])) {
+			$params['submenu'] = $this->beginSubMenu() .
+			    $this->printSubMenu($params['submenu'][0],
+			    $params['submenu'][1], $params['submenu'][2]) .
+			    $this->endSubMenu();
+		}
+		if ($params['submenu']) {
+			echo $params['submenu'];
+		}
+	}
+
 }
 
 // Local Variables:

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/include/html.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/include/html.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/include/html.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -774,34 +774,45 @@
 		Check to see if active user
 		Check to see if logged in
 	*/
-	site_header($params);
-	echo ($HTML->beginSubMenu());
 	$arr_t = array() ;
-	$all_l = array() ;
+	$arr_l = array() ;
+	$arr_p = array() ;
 
 	$arr_t[] = _('My Personal Page') ;
 	$arr_l[] = '/my/' ;
+	$arr_p[] = _('Manage projects, assigned tasks, bugs, etc.') ;
 
 	$arr_t[] = _('Trackers dashboard') ;
 	$arr_l[] = '/my/dashboard.php' ;
+	$arr_p[] = _('Have an overview about all tracker items related to you') ;
 
 	if (forge_get_config('use_diary')) {
 		$arr_t[] = _('Diary & Notes') ;
 		$arr_l[] = '/my/diary.php' ;
+		$arr_p[] = _('-tooltip:diary-and-notes') ;
 	}
 
 	$arr_t[] = _('Account Maintenance') ;
 	$arr_l[] = '/account/' ;
+	$arr_p[] = _('Change the password, SSH keys; configure account settings') ;
 
 	if (!forge_get_config ('project_registration_restricted')
 			|| forge_check_global_perm ('approve_projects', '')) {
 		$arr_t[] = _('Register Project') ;
 		$arr_l[] = '/register/' ;
+		$arr_p[] = _('Register a new Project on the forge') ;
 	}
 
-	echo ($HTML->printSubMenu($arr_t, $arr_l)) ;
-	plugin_hook ("usermenu", false) ;
-	echo ($HTML->endSubMenu());
+	$smp = array(
+		'title_arr' => $arr_t,
+		'links_arr' => $arr_l,
+		'tooltip_arr' => $arr_p,
+	    );
+	plugin_hook("usermenuEx", $smp);
+
+	$params['submenu'] = array($smp['title_arr'],
+	    $smp['links_arr'], $smp['tooltip_arr']);
+	site_header($params);
 }
 
 /**

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/include/project_home.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/include/project_home.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/include/project_home.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -68,11 +68,20 @@
 			$res = db_query_params($sql,array('g', $group_id));
 		}
 		$id = db_result($res, 0 , 'id');
-		$params['submenu'] = $HTML->subMenu(
-			array(_("Add widgets"),
-				_("Customize layout")),
-			array('/widgets/widgets.php?owner=g'. $group_id .'&layout_id='. $id,
-				'/widgets/widgets.php?owner=g'. $group_id .'&layout_id='. $id.'&update=layout'));
+		$params['submenu'] = array(
+			array(
+				_("Add widgets"),
+				_("Customise Layout"),
+			),
+			array(
+				'/widgets/widgets.php?owner=g'. $group_id .'&layout_id='. $id,
+				'/widgets/widgets.php?owner=g'. $group_id .'&layout_id='. $id.'&update=layout',
+			),
+			array(
+				_('Select widgets to add to the Project Summary page from a list of available widgets'),
+				_('Customise number and sizes of columns to use for widgets'),
+			),
+		);
 	}
 }
 

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/mail/mail_utils.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/mail/mail_utils.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/mail/mail_utils.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -39,17 +39,22 @@
 			}
 		}
 
-        $labels = array();
-        $links = array();
-        $labels[] = _('View Lists');
-        $links[]  = '/mail/?group_id='.$group_id;
+		$labels = array();
+		$links = array();
+		$tips = array();
+
+		$labels[] = _('View Lists');
+		$links[]  = '/mail/?group_id='.$group_id;
+		$tips[]   = _('-tooltip:mail:view');
+
 		if (session_loggedin()) {
 			if (forge_check_perm ('project_admin', $project->getID())) {
-		        $labels[] = _('Administration');
-		        $links[]  = '/mail/admin/?group_id='.$group_id;
+				$labels[] = _('Administration');
+				$links[]  = '/mail/admin/?group_id='.$group_id;
+				$tips[]   = _('-tooltip:mail:admin');
 			}
 		}
-		$params['submenu'] = $HTML->subMenu($labels,$links);
+		$params['submenu'] = array($labels,$links,$tips);
 		site_project_header($params);
 	} else {
 		exit_no_group();

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/news/news_utils.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/news/news_utils.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/news/news_utils.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -36,21 +36,27 @@
 	if ($group_id && ($group_id != forge_get_config('news_group'))) {
 		$menu_texts=array();
 		$menu_links=array();
+		$menu_ttips=array();
 
 		$menu_texts[]=_('View News');
 		$menu_links[]='/news/?group_id='.$group_id;
+		$menu_ttips[]=_('-tooltip:news:view');
+
 		$menu_texts[]=_('Submit');
 		$menu_links[]='/news/submit.php?group_id='.$group_id;
+		$menu_ttips[]=_('-tooltip:news:new');
+
 		if (session_loggedin()) {
 			$project = group_get_object($params['group']);
 			if ($project && is_object($project) && !$project->isError()) {
 				if (forge_check_perm ('project_admin', $group_id)) {
 					$menu_texts[]=_('Administration');
 					$menu_links[]='/news/admin/?group_id='.$group_id;
+					$menu_ttips[]=_('-tooltip:news:admin');
 				}
 			}
 		}
-		$params['submenu'] = $HTML->subMenu($menu_texts,$menu_links);
+		$params['submenu'] = array($menu_texts,$menu_links,$menu_ttips);
 	}
 	/*
 		Show horizontal links

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/pm/include/ProjectGroupHTML.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/pm/include/ProjectGroupHTML.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/pm/include/ProjectGroupHTML.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -50,15 +50,21 @@
 
 	$labels = array();
 	$links = array();
+	$tips = array();
+
 	$labels[] = _('View Subprojects');
 	$links[]  = '/pm/?group_id='.$group_id;
+	$tips[]   = _('-tooltip:pm:view');
 
 	if ($group_project_id) {
 		$labels[] = (($pg) ? $pg->getName() : '');
 		$links[]  = '/pm/task.php?group_id='.$group_id.'&group_project_id='.$group_project_id.'&func=browse';
+		$tips[]   = _('Browse the current Subproject');
+
 		if (session_loggedin()) {
 			$labels[] = _('Add Task');
 			$links[]  = '/pm/task.php?group_id='.$group_id.'&group_project_id='.$group_project_id.'&func=addtask';
+			$tips[]   = _('-tooltip:pm:new');
 		}
 		if ($group_project_id) {
 			$gantt_width = 820;
@@ -69,33 +75,41 @@
 			$labels[] = $gantt_title;
 			$links[]  = $gantt_url . '" onclick="window.open(this.href, \'' . preg_replace('/\s/' , '_' , $gantt_title)
 			. '\', \'' . $gantt_winopt . '\'); return false;';
+			$tips[]   = _('-tooltip:pm:gantt');
 		}
+
 		//upload/download as CSV files
 //		$labels[] = _('Download as CSV');
 //		$links[]  = '/pm/task.php?group_id='.$group_id.'&group_project_id='.$group_project_id.'&func=downloadcsv';
+//		$tips[]   = _('-tooltip:pm:downloadcsv');
+
 //		$labels[] = _('Upload CSV');
 //		$links[]  = '/pm/task.php?group_id='.$group_id.'&group_project_id='.$group_project_id.'&func=uploadcsv';
+//		$tips[]   = _('-tooltip:pm:uploadcsv');
 
 		// Import/Export using CSV files.
 		$labels[] = _('Import/Export CSV');
 		$links[]  = '/pm/task.php?group_id='.$group_id.'&group_project_id='.$group_project_id.'&func=csv';
+		$tips[]   = _('-tooltip:pm:imexportcsv');
 	}
 
 	if ($pg && is_object($pg) && forge_check_perm ('pm', $pg->getID(), 'manager')) {
 		$labels[] = _('Reporting');
 		$links[]  = '/pm/reporting/?group_id='.$group_id;
+		$tips[]   = _('-tooltip:pm:reporting');
+
 		$labels[] = _('Administration');
 		$links[]  = '/pm/admin/?group_id='.$group_id.'&group_project_id='.$group_project_id.'&update_pg=1';
+		$tips[]   = _('-tooltip:pm:adminthis');
 	} else if (forge_check_perm ('pm_admin', $group_id)) {
 		$labels[] = _('Reporting');
 		$links[]  = '/pm/reporting/?group_id='.$group_id;
 		$labels[] = _('Administration');
 		$links[]  = '/pm/admin/?group_id='.$group_id;
+		$tips[]   = _('-tooltip:pm:adminpm');
 	}
 
-	if(!empty($labels)) {
-		$params['submenu'] = $HTML->subMenu($labels,$links);
-	}
+	$params['submenu'] = array($labels,$links,$tips);
 
 	site_project_header($params);
 

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/project/admin/project_admin_utils.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/project/admin/project_admin_utils.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/project/admin/project_admin_utils.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -43,51 +43,51 @@
 
 	$labels = array();
 	$links = array();
-	
+	$tips = array();
+
 	$labels[] = _('Project Information');
 	$labels[] = _('Users and permissions');
 	$labels[] = _('Tools');
 	$labels[] = _('Project History');
-	if(forge_get_config('use_people')) {
-		$labels[] = _('Post Jobs');
-		$labels[] = _('Edit Jobs');
-	}
-	if(forge_get_config('use_project_multimedia')) {
-		$labels[] = _('Edit Multimedia Data');
-	}
-	if(forge_get_config('use_project_vhost')) {
-		$labels[] = _('VHOSTs');
-	}
-	if(forge_get_config('use_project_database')) {
-		$labels[] = _('Database Admin');
-	}
-	if ($project->usesStats()) {
-		$labels[] = _('Stats');
-	}
-	plugin_hook("quota_label_project_admin");
-	
 	$links[] = '/project/admin/?group_id='.$group_id;
 	$links[] = '/project/admin/users.php?group_id='.$group_id;
 	$links[] = '/project/admin/tools.php?group_id='.$group_id;
 	$links[] = '/project/admin/history.php?group_id='.$group_id;
+	$tips[] = _('Edit project name, description, homepage, tags, …');
+	$tips[] = _('Add/Remove users; assign roles to members; import global roles');
+	$tips[] = _('Enable/Disable features and plugins; administrate those');
+	$tips[] = _('Show log of project info changes');
 	if(forge_get_config('use_people')) {
+		$labels[] = _('Post Jobs');
+		$labels[] = _('Edit Jobs');
 		$links[] = '/people/createjob.php?group_id='.$group_id;
 		$links[] = '/people/?group_id='.$group_id;
+		$tips[] = _('-tooltip:projadm:postjobs');
+		$tips[] = _('-tooltip:projadm:editjobs');
 	}
 	if(forge_get_config('use_project_multimedia')) {
+		$labels[] = _('Edit Multimedia Data');
 		$links[] = '/project/admin/editimages.php?group_id='.$group_id;
+		$tips[] = _('-tooltip:projadm:multimedia');
 	}
 	if(forge_get_config('use_project_vhost')) {
+		$labels[] = _('VHOSTs');
 		$links[] = '/project/admin/vhost.php?group_id='.$group_id;
+		$tips[] = _('-tooltip:projadm:vhosts');
 	}
 	if(forge_get_config('use_project_database')) {
+		$labels[] = _('Database Admin');
 		$links[] = '/project/admin/database.php?group_id='.$group_id;
+		$tips[] = _('-tooltip:projadm:database');
 	}
-	$links[] = '/project/stats/?group_id='.$group_id;
-	plugin_hook("quota_link_project_admin");
-	
-	$params['submenu'] = $HTML->subMenu($labels, $links);
+	if ($project->usesStats()) {
+		$labels[] = _('Stats');
+		$links[] = '/project/stats/?group_id='.$group_id;
+		$tips[] = _('-tooltip:projadm:stats');
+	}
 
+	$params['submenu'] = array($labels, $links, $tips);
+
 	plugin_hook ("groupadminmenu", $params) ;
 
 	site_project_header($params);

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/project/stats/index.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/project/stats/index.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/project/stats/index.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -83,7 +83,11 @@
 $params['title'] = _('Project Statistics');
 $params['group'] = $group_id;
 $params['toptab'] = 'activity';
-$params['submenu'] = $HTML->subMenu(array(_('Statistics')), array('/project/stats/?group_id='.$group_id));
+$params['submenu'] = array(
+    array(_('Statistics')),
+    array('/project/stats/?group_id='.$group_id),
+    array(_('-tooltip:stats'))
+    );
 
 site_project_header($params);
 

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/scm/include/scm_utils.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/scm/include/scm_utils.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/scm/include/scm_utils.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -44,7 +44,7 @@
 	*/
 	if (session_loggedin()) {
 		if (forge_check_perm ('project_admin', $project->getID())) {
-			$params['submenu'] = $HTML->subMenu(
+			$params['submenu'] = array(
 				array(
 					_('View Source Code'),
 					_('Reporting'),
@@ -54,6 +54,11 @@
 					'/scm/?group_id='.$params['group'],
 					'/scm/reporting/?group_id='.$params['group'],
 					'/scm/admin/?group_id='.$params['group']
+					),
+				array(
+					_('-tooltip:scm:view'),
+					_('-tooltip:scm:reporting'),
+					_('-tooltip:scm:admin'),
 					)
 				);
 		}

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/softwaremap/full_list.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/softwaremap/full_list.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/softwaremap/full_list.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -50,8 +50,12 @@
 	exit_disabled();
 }
 
-$HTML->header(array('title'=>_('Software Map'),'pagename'=>'softwaremap'));
-$HTML->printSoftwareMapLinks();
+$params = array(
+	'title' => _('Software Map'),
+	'pagename' => 'softwaremap',
+	'submenu' => $HTML->getSoftwareMapLinks(),
+    );
+site_header($params);
 
 $res_grp = db_query_params ('
 	SELECT group_id, group_name, unix_group_name, short_description, register_purpose, register_time

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/softwaremap/tag_cloud.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/softwaremap/tag_cloud.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/softwaremap/tag_cloud.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -49,8 +49,12 @@
 	exit_disabled();
 }
 
-$HTML->header(array('title'=>_('Software Map'),'pagename'=>'softwaremap'));
-$HTML->printSoftwareMapLinks();
+$params = array(
+	'title' => _('Software Map'),
+	'pagename' => 'softwaremap',
+	'submenu' => $HTML->getSoftwareMapLinks(),
+    );
+site_header($params);
 
 $selected_tag = getStringFromRequest('tag');
 $page = getIntFromRequest('page', 1);

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/softwaremap/trove_list.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/softwaremap/trove_list.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/softwaremap/trove_list.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -34,8 +34,12 @@
 	exit_disabled('home');
 }
 
-$HTML->header(array('title'=>_('Software Map'),'pagename'=>'softwaremap'));
-$HTML->printSoftwareMapLinks();
+$params = array(
+	'title' => _('Software Map'),
+	'pagename' => 'softwaremap',
+	'submenu' => $HTML->getSoftwareMapLinks(),
+    );
+site_header($params);
 
 $form_cat = getIntFromRequest('form_cat');
 $page = getIntFromRequest('page',1);

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/survey/include/SurveyHTML.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/survey/include/SurveyHTML.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/survey/include/SurveyHTML.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -58,7 +58,7 @@
 			}
 			
 			if ($is_admin_page && $group_id) {
-				$params['submenu'] = $HTML->subMenu(
+				$params['submenu'] = array(
 					array(
 						_('Add Survey'),
 						_('Add Question'),
@@ -70,16 +70,29 @@
 						'/survey/admin/question.php?group_id='.$group_id,
 						'/survey/admin/show_results.php?group_id='.$group_id,
 						'/survey/admin/?group_id='.$group_id
+					),
+					array(
+						_('-tooltip:survey:new'),
+						_('-tooltip:survey:addq'),
+						_('-tooltip:survey:show'),
+						_('-tooltip:survey:admin'),
 					)
 				);
 			} else {
+				$labels = array();
+				$links = array();
+				$tips = array();
+
 				$labels[] = _('Views Surveys');
 				$links[]  = '/survey/?group_id='.$group_id;
+				$tips[]   = _('-tooltip:survey:browse');
+
 				if (forge_check_perm ('project_admin', $group_id)) {
-						$labels[] = _('Administration');
-						$links[]  = '/survey/admin/?group_id='.$group_id;
+					$labels[] = _('Administration');
+					$links[]  = '/survey/admin/?group_id='.$group_id;
+					$tips[]   = _('-tooltip:survey:admin');
 				}
-				$params['submenu'] = $HTML->subMenu($labels,$links); 
+				$params['submenu'] = array($labels,$links,$tips); 
 			}
 			site_project_header($params);
 		}// end if (valid group id)

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/Theme.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/Theme.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/Theme.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -46,59 +46,16 @@
 
 		// The root location for images
 		$this->imgroot = '/themes/evolvis/images/';
-		$this->imgproj = '/themes/evolvis/images/proj/';
 
-		// The HTML box background color
 		//XXX same as in evolvis.css
 		$this->COLOR_HTMLBOX_BACK = '#FFFFFF';
 
-		// The color to separate HTML boxes
-		$this->COLOR_HTMLBOX_SEP = '#000000';
-
-		// Font Face Constants
-		// The content font
-		$this->FONT_CONTENT = 'sans-serif';
-		// The HTML box title font
-		$this->FONT_HTMLBOX_TITLE = 'sans-serif';
-		// The HTML box title font color
-		$this->FONTCOLOR_HTMLBOX_TITLE = '#72A5D8';
-		// The content font color
-		$this->FONTCOLOR_CONTENT = '#202020';
-		// The smaller font size
-		$this->FONTSIZE_SMALLER = 'small';
-		// The smallest font size
-		$this->FONTSIZE_SMALLEST = 'x-small';
-		// The HTML box title font size
-		$this->FONTSIZE_HTMLBOX_TITLE = 'x-small';
-
-		// background image
-		//$this->BACKGROUND = 'background.png';
-
-		// height of a tab (ie the size of the background image), 23 is specified in the
-		// style guide and so the background images were drawn for that size, changing
-		// this will lead to the images being cropped or tiled, either will look bad.
-		$this->TAB_HEIGHT = 23;
-
-		// the following are not used in this theme, but have been set to obnoxious
-		// colors to help debug any new pages that make assumptions about a theme...
-		// The content background color
-		$this->COLOR_CONTENT_BACK = '#0000FF';
-		// The background color
-		$this->COLOR_BACK = '#00FF00';
-		// The HTML box title color
-		$this->COLOR_HTMLBOX_TITLE = '#FF0000';
-
-		// standard evolvis color
-		$this->EVOLVIS_COLOR = '#CC0E08';
-		$this->EVOLVIS_BG_COLOR = '#bebebe';
-
-		$this->project = false;
-
 		$this->addStylesheet('/themes/css/evolvis.css', 'all');
 		// $this->addStylesheet('/themes/css/screen.css', 'screen');
 		$this->addStylesheet('/themes/css/print.css', 'print');
 		$this->addJavascript('/js/common.js');
 		$this->addJavascript('/js/css.js');
+		$this->project = false;
 		$this->emit_forgebar = true;
 		$this->collapsible_counter = 0;
 		$this->collapsible_ids = array();
@@ -118,7 +75,7 @@
 		$this->emit_forgebar = false;
 	}
 
-	function emit_headlink($inblock,$tooltip,$redslash,$redtext,$target,$text) {
+	function emit_headlink($inblock,$tooltip,$redtext,$target,$text) {
 		$tooltip = util_html_secure(util_ifsetor($tooltip,""));
 		if ($tooltip && $tooltip[0] == '-') {
 			$tooltip = "";
@@ -138,8 +95,7 @@
 			$rv = "";
 			$rq = "";
 		}
-		$rv .= '<span class="headlink' .
-		    ($redslash ? "s" : "") . "\">//</span>" .
+		$rv .= '<span class="headlinks">//</span>' .
 		    '<a class="headlink" href="' . $target . '">' .
 		    '<span class="headlink' .
 		    ($redtext ? "s" : "") . '">' .
@@ -213,18 +169,18 @@
 		echo "\t\t\t<td style=\"padding-left:1em;\">" .
 		    $this->emit_headlink(false,
 		    _('Log out of the session with the Forge system'),
-		    true, false, "/account/logout.php?return_to=" .
+		    false, "/account/logout.php?return_to=" .
 		    urlencode(getStringFromServer('REQUEST_URI')),
 		    _('Log Out')) . "</td>\n";
 		echo "\t\t\t<td style=\"padding-left:1em;\">" .
 		    $this->emit_headlink(false,
 		    _('Configure Account settings, Password & SSH keys'),
-		    true, false, "/account/",
+		    false, "/account/",
 		    _('My Account')) . "</td>\n";
 		echo "\t\t\t<td style=\"padding-left:1em;\">" .
 		    $this->emit_headlink(false,
 		    _('Manage projects, assigned tasks, bugs, etc.'),
-		    true, false, "/my/",
+		    false, "/my/",
 		    _('My Page')) . "</td>\n";
 		echo "\t\t\t</tr><tr>\n\t\t\t" .
 		    "<td colspan=\"3\" style=\"padding-left:1em;\">\n";
@@ -232,13 +188,13 @@
 		echo "\t\t\t<td style=\"padding-left:1em;\">" .
 		    $this->emit_headlink(false,
 		    _('Log into a new session with the Forge system'),
-		    true, false, "/account/login.php?return_to=" .
+		    false, "/account/login.php?return_to=" .
 		    urlencode(getStringFromServer('REQUEST_URI')),
 		    _('Log In')) . "</td>\n";
 		echo "\t\t\t<td style=\"padding-left:1em;\">" .
 		    $this->emit_headlink(false,
 		    _('Register a user account with the Forge system'),
-		    true, false, "/account/register.php",
+		    false, "/account/register.php",
 		    _('New Account')) . "</td>\n";
 		echo "\t\t\t</tr><tr>\n\t\t\t" .
 		    "<td colspan=\"2\" style=\"padding-left:1em;\">\n";
@@ -277,9 +233,8 @@
 		    $this->navigation->getSearchBox();
 		echo "</div></div>\n\n";
 
-		if (isset($params['submenu'])) {
-			echo $params['submenu'];
-		}
+		$this->handleSubmenu($params);
+
 		echo "<!-- ]internal_header -->\n";
 	}
 
@@ -521,7 +476,6 @@
 		for ($i = 0; $i < count($TABS_DIRS); $i++) {
 			$rv .= "\n" . $this->emit_headlink(true,
 			    util_ifsetor($TABS_TOOLTIPS[$i], ""),
-			    ($TAB_TYPE == 'outerTab' || $selected == $i),
 			    ($selected == $i), $TABS_DIRS[$i], $TABS_TITLES[$i]);
 		}
 		return $rv;
@@ -649,7 +603,7 @@
 		for ($i = 0; $i < count($links_arr); ++$i) {
 			$rv .= $this->emit_headlink(true,
 			    util_ifsetor($tooltip_arr[$i], ""),
-			    true, false, $links_arr[$i],
+			    false, $links_arr[$i],
 			    util_ifsetor($title_arr[$i], "Link ".$i));
 		}
 		return $rv;

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/themes/funky/Theme.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/themes/funky/Theme.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/themes/funky/Theme.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -127,8 +127,7 @@
         } else {
             echo '<h1 class="hide">'.$params['title'].'</h1>';
         }
-        if (isset($params['submenu']))
-            echo $params['submenu'];
+	$this->handleSubmenu($params);
     }
         
     function bodyFooter($params) {
@@ -318,9 +317,10 @@
      *
      * @param       array   The array of titles.
      * @param       array   The array of title links.
+     * @param	    array   The array of tooltips (optional)
      * @return    string    Html to build a submenu.
      */
-    function printSubMenu ($title_arr,$links_arr) 
+    function printSubMenu ($title_arr,$links_arr,$tooltip_arr=array()) 
     {
         $count  = count($title_arr) - 1;
         $return = '';
@@ -334,22 +334,6 @@
     }
 
     /**
-     * subMenu() - Takes two array of titles and links and build a menu.
-     *
-     * @param       array   The array of titles.
-     * @param       array   The array of title links.
-     * @return    string    Html to build a submenu.
-     */
-    function subMenu ($title_arr,$links_arr) 
-    {
-        $return  = $this->beginSubMenu () ;
-        $return .= $this->printSubMenu ($title_arr,$links_arr) ;
-        $return .= $this->endSubMenu () ;
-    
-        return $return;
-    }
-
-    /**
      * multiTableRow() - create a mutlilevel row in a table
      *
      * @param    string    the row attributes

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/themes/gforge/Theme.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/themes/gforge/Theme.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/themes/gforge/Theme.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -118,8 +118,7 @@
 				} else {
 					echo '<h1 class="hide">'.$params['title'].'</h1>';
 				}
-				if (isset($params['submenu']))
-					echo $params['submenu'];
+				$this->handleSubmenu($params);
         }
 
         function bodyFooter($params) {
@@ -354,9 +353,10 @@
 	 *
 	 * @param       array   The array of titles.
 	 * @param       array   The array of title links.
+	 * @param	array	The array of tooltips (optional)
 	 * @return    string    Html to build a submenu.
 	 */
-	function printSubMenu ($title_arr,$links_arr) {
+	function printSubMenu ($title_arr,$links_arr,$tooltip_arr=array()) {
 		$count=count($title_arr);
 		$count--;
 
@@ -370,20 +370,6 @@
 	}
 
 	/**
-	 * subMenu() - Takes two array of titles and links and build a menu.
-	 *
-	 * @param       array   The array of titles.
-	 * @param       array   The array of title links.
-	 * @return    string    Html to build a submenu.
-	 */
-	function subMenu ($title_arr,$links_arr) {
-		$return  = $this->beginSubMenu () ;
-		$return .= $this->printSubMenu ($title_arr,$links_arr) ;
-		$return .= $this->endSubMenu () ;
-		return $return;
-	}
-
-	/**
 	 * multiTableRow() - create a mutlilevel row in a table
 	 *
 	 * @param    string    the row attributes

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/tracker/admin/ind.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/tracker/admin/ind.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/tracker/admin/ind.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -84,8 +84,7 @@
 	$params['title'] = '';
 }
 
-site_project_header($params);
-echo $HTML->subMenu(
+$params['submenu'] = array(
 	array(
 		_('Report'),
 		_('Admin')
@@ -93,8 +92,13 @@
 	array(
 		'/tracker/reporting/?group_id='.$group_id,
 		'/tracker/admin/?group_id='.$group_id
+	),
+	array(
+		_('-tooltip:tracker:admin:report'),
+		_('-tooltip:tracker:admin:admin'),
 	)
 );
+site_project_header($params);
 
 if (!isset($at_arr) || !$at_arr || count($at_arr) < 1) {
 	echo '<div class="warning">'._('No trackers found').'</div>';

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/tracker/include/ArtifactTypeHtml.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/tracker/include/ArtifactTypeHtml.class.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/tracker/include/ArtifactTypeHtml.class.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -42,57 +42,7 @@
 	}
 
 	function header($params) {
-		global $HTML;
-		if (!forge_get_config('use_tracker')) {
-			exit_disabled();
-		}
-		$group_id= $this->Group->getID();
-
-		//required by new site_project_header
-		$params['group']=$group_id;
-		$params['toptab']='tracker';
-		$params['tabtext']=$this->getName();
-
-		$labels = array();
-		$links  = array();
-
-		$labels[] = _("View Trackers");
-		$links[]  = '/tracker/?group_id='.$group_id;
-		$labels[] = $this->getName();
-		$links[]  = '/tracker/?func=browse&group_id='.$group_id.'&atid='. $this->getID();
-		$labels[] = _('Download .csv');
-		$links[]  = '/tracker/?func=downloadcsv&group_id='.$group_id.'&atid='. $this->getID();
-		if ($this->allowsAnon() || session_loggedin()) {
-			$labels[] = _('Submit New');
-			$links[]  = '/tracker/?func=add&group_id='.$group_id.'&atid='. $this->getID();
-		}
-
-		if (session_loggedin()) {
-			$labels[] = _('Reporting');
-			$links[]  = '/tracker/reporting/?group_id='.$group_id.'&atid='. $this->getID();
-  			if ($this->isMonitoring()) {
-				$labels[] = _('Stop Monitor');
-   				$links[]  = '/tracker/?group_id='.$group_id.'&atid='. $this->getID().'&func=monitor&stop=1';
-  			} else {
-				$labels[] = _('Monitor');
- 				$links[]  = '/tracker/?group_id='.$group_id.'&atid='. $this->getID().'&func=monitor&start=1';
-  			}
-
-			if (forge_check_perm ('tracker', $this->getID(), 'manager')) {
-				$labels[] = _('Administration');
-				$links[]  = '/tracker/admin/?group_id='.$group_id.'&atid='.$this->getID();
-			}
-		} else {
-			$labels[] = _('Monitor');
-			$links[]  = '/tracker/?group_id='.$group_id.'&atid='. $this->getID().'&func=monitor&start=1';	
-		}
-
-		$params['submenu'] = $HTML->subMenu($labels,$links);
-		site_project_header($params);
-		
-		if ($this)
-			plugin_hook ("blocks", "tracker_".$this->getName());
-		
+		header_internal(false, $params);
 	}
 
 	function footer($params) {
@@ -100,35 +50,7 @@
 	}
 
 	function adminHeader($params) {
-		global $HTML;
-		$this->header($params);
-		$group_id= $this->Group->getID();
-
-		$links_arr[]='/tracker/admin/?group_id='.$group_id;
-		$title_arr[]=_('New Tracker');
-
-		$links_arr[]='/tracker/admin/?group_id='.$group_id.'&atid='.$this->getID().'&update_type=1';
-		$title_arr[]=_('Update Settings');
-
-		$links_arr[]='/tracker/admin/?group_id='.$group_id.'&atid='.$this->getID().'&add_extrafield=1';
-		$title_arr[]=_('Manage Custom Fields');
-
-		$links_arr[]='/tracker/admin/?group_id='.$group_id.'&atid='.$this->getID().'&workflow=1';
-		$title_arr[]=_('Manage Workflow');
-
-		$links_arr[]='/tracker/admin/?group_id='.$group_id.'&atid='.$this->getID().'&customize_list=1';
-		$title_arr[]=_('Customize List');
-
-		$links_arr[]='/tracker/admin/?group_id='.$group_id.'&atid='.$this->getID().'&add_canned=1';
-		$title_arr[]=_('Add/Update Canned Responses');
-
-		$links_arr[]='/tracker/admin/?group_id='.$group_id.'&atid='.$this->getID().'&clone_tracker=1';
-		$title_arr[]=_('Clone Tracker');
-
-		$links_arr[]='/tracker/admin/?group_id='.$group_id.'&atid='.$this->getID().'&delete=1';
-		$title_arr[]=_('Delete');
-
-		echo $HTML->printSubMenu($title_arr,$links_arr);
+		header_internal(true, $params);
 	}
 
 	function adminFooter($params) {
@@ -728,6 +650,133 @@
 		return html_build_select_box($this->getStatuses(),$name,$checked,$show_100,$text_100);
 	}
 
+	function header_internal($isadmin, $params) {
+		global $HTML;
+
+		if (!forge_get_config('use_tracker')) {
+			exit_disabled();
+		}
+
+		$atid = $this->getID();
+		$group_id = $this->Group->getID();
+		$params['group'] = $group_id;
+		$params['toptab'] = 'tracker';
+		$params['tabtext'] = $this->getName();
+
+		$text = array();
+		$link = array();
+		$ttip = array();
+
+		if ($isadmin) {
+			$text[] = _('New Tracker');
+			$link[] = '/tracker/admin/?group_id=' . $group_id;
+			$ttip[] = _('Create a new Tracker');
+		}
+
+		if (!$isadmin) {
+			$text[] = _("View Trackers");
+			$link[] = '/tracker/?group_id=' . $group_id;
+			$ttip[] = _('-tooltip:tracker:viewtrackers');
+		}
+
+		$text[] = $this->getName();
+		$link[] = '/tracker/?func=browse&group_id=' . $group_id .
+		    '&atid=' . $atid;
+		$ttip[] = _('Browse all items in the current Tracker');
+
+		if (!$isadmin) {
+			$text[] = _('Download .csv');
+			$link[] = '/tracker/?func=downloadcsv&group_id=' .
+			   $group_id . '&atid=' . $atid;
+			$ttip[] = _('Download an overview over the items in the current Tracker as CSV file');
+
+			if ($this->allowsAnon() || session_loggedin()) {
+				$text[] = _('Submit New');
+				$link[] = '/tracker/?func=add&group_id=' .
+				    $group_id . '&atid=' . $atid;
+				$ttip[] = _('Enter a new item into the current Tracker');
+			}
+
+			if (session_loggedin()) {
+				$text[] = _('Reporting');
+				$link[] = '/tracker/reporting/?group_id=' .
+				    $group_id . '&atid=' . $atid;
+				$ttip[] = _('-tooltip:tracker:reporting');
+
+				if ($this->isMonitoring()) {
+					$text[] = _('Stop Monitor');
+					$link[] = '/tracker/?group_id=' .
+					    $group_id . '&atid=' . $atid .
+					    '&func=monitor&stop=1';
+					$ttip[] = _('-tooltip:tracker:stopmonitor');
+				}
+			}
+
+			if (!session_loggedin() || !$this->isMonitoring()) {
+				$text[] = _('Monitor');
+				$link[] = '/tracker/?group_id=' .$group_id .
+				    '&atid=' . $atid .
+				    '&func=monitor&start=1';
+				$ttip[] = _('-tooltip:tracker:startmonitor');
+			}
+		}
+
+		if ($isadmin || (session_loggedin() &&
+		    forge_check_perm('tracker', $atid, 'manager'))) {
+			$text[] = _('Administration');
+			$link[] = '/tracker/admin/?group_id=' . $group_id .
+			    '&atid=' . $atid;
+			if ($isadmin) {
+				$ttip[] = _('Administrating that tracker; click here to return to the Tracker Admin overview page');
+			} else {
+				$ttip[] = _('Administrate the current tracker');
+			}
+		}
+
+		if ($isadmin) {
+			$text[] = _('Update Settings');
+			$link[] = '/tracker/admin/?group_id=' .$group_id .
+			    '&atid=' . $atid . '&update_type=1';
+			$ttip[] = _('-tooltip:tracker:updatesettings');
+
+			$text[] = _('Manage Custom Fields');
+			$link[] = '/tracker/admin/?group_id=' .$group_id .
+			    '&atid=' . $atid . '&add_extrafield=1';
+			$ttip[] = _('-tooltip:tracker:managecustomfields');
+
+			$text[] = _('Manage Workflow');
+			$link[] = '/tracker/admin/?group_id=' .$group_id .
+			    '&atid=' . $atid . '&workflow=1';
+			$ttip[] = _('Assign Role permissions to state transitions');
+
+			$text[] = _('Customize List');
+			$link[] = '/tracker/admin/?group_id=' .$group_id .
+			    '&atid=' . $atid . '&customize_list=1';
+			$ttip[] = _('-tooltip:tracker:customiselist');
+
+			$text[] = _('Add/Update Canned Responses');
+			$link[] = '/tracker/admin/?group_id=' .$group_id .
+			    '&atid=' . $atid . '&add_canned=1';
+			$ttip[] = _('-tooltip:tracker:cannedresp');
+
+			$text[] = _('Clone Tracker');
+			$link[] = '/tracker/admin/?group_id=' .$group_id .
+			    '&atid=' . $atid . '&clone_tracker=1';
+			$ttip[] = _('-tooltip:tracker:clonetracker');
+
+			$text[] = _('Really delete the entire tracker');
+			$link[] = '/tracker/admin/?group_id=' .$group_id .
+			    '&atid=' . $atid . '&delete=1';
+			$ttip[] = _('Irrevocably delete this entire Tracker and all its contents');
+		}
+
+		$params['submenu'] = array($text, $link, $ttip);
+		site_project_header($params);
+
+		/*XXX if ($this) ← WTF? */
+			plugin_hook("blocks", "tracker_" . $this->getName());
+	}
+
 }
 
 // Local Variables:

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/tracker/ind.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/tracker/ind.php	2011-10-25 16:04:53 UTC (rev 17641)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/tracker/ind.php	2011-10-26 13:36:00 UTC (rev 17642)
@@ -39,17 +39,15 @@
 $params['title']=sprintf(_('Trackers for %1$s'), $group->getPublicName());
 $params['toptab']='tracker';
 
+if (forge_check_perm('tracker_admin', $group_id)) {
+	$params['submenu'] = array(
+	    array(_('Administration')),
+	    array('/tracker/admin/?group_id='.$group_id),
+	    array(_('-tooltip:tracker:admin'))
+	);
+}
 site_project_header($params);
 
-if (forge_check_perm ('tracker_admin', $group_id)) {
-	$menu_text=array();
-	$menu_links=array();
-	$menu_text[]=_('Administration');
-	$menu_links[]='/tracker/admin/?group_id='.$group_id;
-	echo $HTML->subMenu($menu_text,$menu_links);
-}
-
-
 if (!$at_arr || count($at_arr) < 1) {
 	echo '<div class="warning">'._('No Accessible Trackers Found').'</div>';
 	printf(_('<p><strong>No trackers have been set up, or you cannot view them.</strong></p><p><span class="important">The Admin for this project will have to set up data types using the %1$s admin page %2$s</span></p>'), '<a href="'.util_make_url ('/tracker/admin/?group_id='.$group_id).'">', '</a>');



More information about the evolvis-commits mailing list