[evolvis-commits] r17630: [#2030] theme-evolvis pending merges:↵ Thorsten Glaser 2011-10-24 display, for development, the areas of the four navigation levels↵ Thorsten Glaser 2011-10-24 fix for “third-level navigation is not displayed”↵ Thorsten Glaser 2011-10-24 switch to theme ported from 4.8↵ Thorsten Glaser 2011-10-24 first attempt at merging the 4.8 theme here↵ Thorsten Glaser 2011-10-24 add theme from 4.8 (as a separate file, for diffing)↵ Thorsten Glaser 2011-10-24 merge from svn+ssh://mirabilos at svn.evolvis.org/svnroot/evolvis/trunk/...↵ Thorsten Glaser 2011-10-24 rebase on svn+ssh://mirabilos at svn.evolvis.org/svnroot/evolvis/trunk/g...

mirabilos at evolvis.org mirabilos at evolvis.org
Mon Oct 24 14:08:55 CEST 2011


Author: mirabilos
Date: 2011-10-24 14:08:55 +0200 (Mon, 24 Oct 2011)
New Revision: 17630

Added:
   trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/Theme.class.php
   trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/images/CC-BY-NC-SA-3_0-de.png
Removed:
   trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/README
   trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/Theme.class.php
   trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/template.class
   trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/templates/
Modified:
   trunk/gforge_base/evolvisforge-5.1/src/common/include/Group.class.php
   trunk/gforge_base/evolvisforge-5.1/src/common/include/Navigation.class.php
   trunk/gforge_base/evolvisforge-5.1/src/common/include/utils.php
   trunk/gforge_base/evolvisforge-5.1/src/etc/config.ini.d/defaults.ini
   trunk/gforge_base/evolvisforge-5.1/src/www/include/Layout.class.php
   trunk/gforge_base/evolvisforge-5.1/src/www/themes/css/evolvis.css
   trunk/gforge_base/evolvisforge-5.1/src/www/tracker/ind.php
Log:
[#2030] theme-evolvis pending merges:
  Thorsten Glaser 2011-10-24 display, for development, the areas of the four navigation levels
    Thorsten Glaser 2011-10-24 fix for “third-level navigation is not displayed”
    Thorsten Glaser 2011-10-24 switch to theme ported from 4.8
    Thorsten Glaser 2011-10-24 first attempt at merging the 4.8 theme here
    Thorsten Glaser 2011-10-24 add theme from 4.8 (as a separate file, for diffing)
    Thorsten Glaser 2011-10-24 merge from svn+ssh://mirabilos@svn.evolvis.org/svnroot/evolvis/trunk/...
    Thorsten Glaser 2011-10-24 rebase on svn+ssh://mirabilos@svn.evolvis.org/svnroot/evolvis/trunk/g...


Modified: trunk/gforge_base/evolvisforge-5.1/src/common/include/Group.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/common/include/Group.class.php	2011-10-24 12:08:51 UTC (rev 17629)
+++ trunk/gforge_base/evolvisforge-5.1/src/common/include/Group.class.php	2011-10-24 12:08:55 UTC (rev 17630)
@@ -1578,6 +1578,11 @@
 	 *	@return	string	homepage URL.
 	 */
 	function getHomePage() {
+		if (!ereg("^[a-zA-Z][a-zA-Z0-9+.-]*:",
+		    $this->data_array['homepage'])) {
+			$this->data_array['homepage'] = util_url_prefix() .
+			    $this->data_array['homepage'];
+		}
 		return $this->data_array['homepage'];
 	}
 

Modified: trunk/gforge_base/evolvisforge-5.1/src/common/include/Navigation.class.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/common/include/Navigation.class.php	2011-10-24 12:08:51 UTC (rev 17629)
+++ trunk/gforge_base/evolvisforge-5.1/src/common/include/Navigation.class.php	2011-10-24 12:08:55 UTC (rev 17630)
@@ -3,6 +3,7 @@
  * FusionForge navigation
  *
  * Copyright 2009 - 2010, Olaf Lenz
+ * Copyright © 2011 Thorsten Glaser
  *
  * This file is part of FusionForge. FusionForge is free software;
  * you can redistribute it and/or modify it under the terms of the
@@ -217,15 +218,18 @@
                 $menu = array();
                 $menu['titles'] = array();
                 $menu['urls'] = array();
+		$menu['tooltips'] = array();
                 $selected = 0;
                 
                 // Home
                 $menu['titles'][] = _('Home');
                 $menu['urls'][] = util_make_uri('/'); 
+		$menu['tooltips'][] = _('Forge Main Page');
                 
                 // My Page
                 $menu['titles'][] = _('My Page');
                 $menu['urls'][] = util_make_uri('/my/'); 
+		$menu['tooltips'][] = _('Account settings; Register new projects');
                 if (strstr($request_uri, util_make_uri('/my/'))
                     || strstr($request_uri, util_make_uri('/account/'))
                     || strstr($request_uri, util_make_uri('/register/'))
@@ -238,6 +242,7 @@
 		if (forge_get_config('use_trove') || forge_get_config('use_project_tags') || forge_get_config('use_project_full_list')) {
 			$menu['titles'][] = _('Projects');
 			$menu['urls'][] = util_make_uri('/softwaremap/') ;
+			$menu['tooltips'][] = _('List of all publicly accessible projects');
 			if (strstr($request_uri, util_make_uri('/softwaremap/'))) {
 				$selected=count($menu['urls'])-1;
 			}
@@ -246,6 +251,7 @@
 		if (forge_get_config('use_snippet')) {
 			$menu['titles'][] = _('Code Snippets');
 			$menu['urls'][] = util_make_uri('/snippet/') ;
+			$menu['tooltips'][] = _('-tooltip:Snippets');
 			if (strstr($request_uri, util_make_uri('/snippet/'))) {
 				$selected=count($menu['urls'])-1;
 			}
@@ -254,32 +260,18 @@
 		if (forge_get_config('use_people')) {
 			$menu['titles'][] = _('Project Openings');
 			$menu['urls'][] = util_make_uri('/people/') ;
+			$menu['tooltips'][] = _('-tooltip:People');
 			if (strstr($request_uri, util_make_uri('/people/'))) {
 				$selected=count($menu['urls'])-1;
 			}
 		}
 
-		// Outermenu hook
-		$before = count($menu['urls']);
-		$plugin_urls = array();
-		$hookParams['DIRS'] = &$menu['urls'];
-		$hookParams['TITLES'] = &$menu['titles'];
-		plugin_hook ("outermenu", $hookParams) ;
-                 
-		// try to find selected entry
-		for ($j = $before; $j < count($plugin_urls); $j++) {
-			$url = $menu['urls'][$j];
-			if (strstr($request_uri, parse_url ($url, PHP_URL_PATH))) {
-				$selected = $j;
-				break;
-			}
-		}
-                 
 		// Admin and Reporting 
 		if (forge_check_global_perm ('forge_admin')) {
 			$user_is_super = true;
 			$menu['titles'][] = _('Site Admin');
 			$menu['urls'][] = util_make_uri('/admin/') ;
+			$menu['tooltips'][] = _('Global Forge Administration');
 			if (strstr($request_uri, util_make_uri('/admin/'))) {
 				$selected=count($menu['urls'])-1;
 			}
@@ -287,6 +279,7 @@
 		if (forge_check_global_perm ('forge_stats', 'read')) {
 			$menu['titles'][] = _('Reporting');
 			$menu['urls'][] = util_make_uri('/reporting/') ;
+			$menu['tooltips'][] = _('-tooltip:Reporting');
 			if (strstr($request_uri, util_make_uri('/reporting/'))) {
 				$selected=count($menu['urls'])-1;
 			}
@@ -306,14 +299,23 @@
 					} else {
 						$menu['urls'][]=util_make_uri('/projects/') .$project->getUnixName().'/';
 					}
+					$menu['titles'][] = _('Project Summary/Home Page');
 					$selected=count($menu['urls'])-1;
 				}
 			}
 		}
-                 
 
                 $menu['selected'] = $selected;
-                          
+
+		// Outermenu hook
+		$before = count($menu['urls']);
+		$plugin_urls = array();
+		$hookParams['DIRS'] = &$menu['urls'];
+		$hookParams['TITLES'] = &$menu['titles'];
+		$hookParams['TOOLTIPS'] = &$menu['tooltips'];
+		$hookParams['selected'] = &$menu['selected'];
+		plugin_hook ("outermenu", $hookParams) ;
+
                 return $menu;
         }
 
@@ -353,6 +355,7 @@
                         $menu =& $this->project_menu_data[$group_id];
                         $menu['titles'] = array();
                         $menu['urls'] = array();
+			$menu['tooltips'] = array();
                         $menu['adminurls'] = array();
 
 			$menu['name'] = $group->getPublicName();
@@ -365,6 +368,7 @@
                                 $url = util_make_uri('/projects/' . $group->getUnixName() .'/');
                         }
                         $menu['urls'][] = $url;
+			$menu['tooltips'][] = _('Project Main Page');
                         $menu['adminurls'][] = false;
                         if ($toptab == "home") {
                                 $selected = (count($menu['urls'])-1);
@@ -377,6 +381,7 @@
                         if (forge_check_perm ('project_admin', $group_id)) {
                                 $menu['titles'][] = _('Admin');
                                 $menu['urls'][] = util_make_uri('/project/admin/?group_id=' . $group_id);
+				$menu['tooltips'][] = _('Project Features & Users Administration');
                                 $menu['adminurls'][] = false;
                                 if ($toptab == "admin") {
                                         $selected = (count($menu['urls'])-1);
@@ -392,6 +397,7 @@
                         // Project Activity tab 
                         $menu['titles'][] = _('Activity');
                         $menu['urls'][] = util_make_uri('/activity/?group_id=' . $group_id);
+			$menu['tooltips'][] = _('-tooltip:Activity');
                         $menu['adminurls'][] = false;
                         if ($toptab == "activity") {
                                 $selected = (count($menu['urls'])-1);
@@ -401,6 +407,7 @@
                         if ($group->usesForum()) {
                                 $menu['titles'][] = _('Forums');
                                 $menu['urls'][] = util_make_uri('/forum/?group_id=' . $group_id);
+				$menu['tooltips'][] = _('-tooltip:Forums');
                                 if (forge_check_perm ('forum_admin', $group_id)) {
                                         $menu['adminurls'][] = util_make_uri('/forum/admin/?group_id='.$group_id);
                                 } else {
@@ -415,6 +422,7 @@
                         if ($group->usesTracker()) {
                                 $menu['titles'][] = _('Tracker');
                                 $menu['urls'][] = util_make_uri('/tracker/?group_id=' . $group_id);
+				$menu['tooltips'][] = _('Bugtracker, Feature Requests, etc.');
                                 if (forge_check_perm ('tracker_admin', $group_id)) {
                                         $menu['adminurls'][] = util_make_uri('/tracker/admin/?group_id='.$group_id);
                                 } else {
@@ -432,6 +440,7 @@
                         if ($group->usesMail()) {
                                 $menu['titles'][] = _('Lists');
                                 $menu['urls'][] = util_make_uri('/mail/?group_id=' . $group_id);
+				$menu['tooltips'][] = _('Project Mailing Lists');
                                 if (forge_check_perm ('project_admin', $group_id)) {
                                         $menu['adminurls'][] = util_make_uri('/mail/admin/?group_id='.$group_id);
                                 } else {
@@ -446,6 +455,7 @@
                         if ($group->usesPm()) {
                                 $menu['titles'][] = _('Tasks');
                                 $menu['urls'][] = util_make_uri('/pm/?group_id=' . $group_id);
+				$menu['tooltips'][] = _('Task and Time Tracking');
                                 if (forge_check_perm ('pm_admin', $group_id)) {
                                         $menu['adminurls'][] = util_make_uri('/pm/admin/?group_id='.$group_id);
                                 } else {
@@ -460,6 +470,7 @@
                         if ($group->usesDocman()) {
                                 $menu['titles'][] = _('Docs');
                                 $menu['urls'][] = util_make_uri('/docman/?group_id=' . $group_id);
+				$menu['tooltips'][] = _('Document Manager');
                                 if (forge_check_perm ('docman', $group_id, 'approve')) {
                                         $menu['adminurls'][] = util_make_uri('/docman/?group_id='.$group_id.'&view=admin');
                                 } else {
@@ -474,6 +485,7 @@
                         if ($group->usesSurvey()) {
                                 $menu['titles'][] = _('Surveys');
                                 $menu['urls'][] = util_make_uri('/survey/?group_id=' . $group_id);
+				$menu['tooltips'][] = _('-tooltip:Surveys');
                                 if (forge_check_perm ('project_admin', $group_id)) {
                                         $menu['adminurls'][] = util_make_uri('/survey/admin/?group_id='.$group_id);
                                 } else {
@@ -488,6 +500,7 @@
                         if ($group->usesNews()) {
                                 $menu['titles'][] = _('News');
                                 $menu['urls'][] = util_make_uri('/news/?group_id=' . $group_id);
+				$menu['tooltips'][] = _('-tooltip:News');
                                 if (forge_check_perm ('project_admin', $group_id)) {
                                         $menu['adminurls'][] = util_make_uri('/news/admin/?group_id='.$group_id);
                                 } else {
@@ -502,6 +515,7 @@
                         if ($group->usesSCM()) {
                                 $menu['titles'][] = _('SCM');
                                 $menu['urls'][] = util_make_uri('/scm/?group_id=' . $group_id);
+				$menu['tooltips'][] = _('Source Code Management');
                                 // eval cvs_flags?
                                 if (forge_check_perm ('project_admin', $group_id)) {
                                         $menu['adminurls'][] = util_make_uri('/scm/admin/?group_id='.$group_id);
@@ -518,6 +532,7 @@
                         $hookParams['group_id'] = $group_id ;
                         $hookParams['DIRS'] =& $menu['urls'];
                         $hookParams['TITLES'] =& $menu['titles'];
+			$hookParams['TOOLTIPS'] =& $menu['tooltips'];
                         $hookParams['toptab'] =& $toptab;
                         $hookParams['selected'] =& $selected;
                         plugin_hook ("groupmenu_scm", $hookParams) ; 
@@ -531,6 +546,7 @@
                         if ($group->usesFRS()) {
                                 $menu['titles'][] = _('Files');
                                 $menu['urls'][] = util_make_uri('/frs/?group_id=' . $group_id);
+				$menu['tooltips'][] = _('File Release System');
                                 if (forge_check_perm ('frs', $group_id, 'write')) {
                                         $menu['adminurls'][] = util_make_uri('/frs/admin/?group_id='.$group_id);
                                 } else {
@@ -546,6 +562,7 @@
                         $hookParams['group'] = $group_id ;
                         $hookParams['DIRS'] =& $menu['urls'];
                         $hookParams['TITLES'] =& $menu['titles'];
+			$hookParams['TOOLTIPS'] =& $menu['tooltips'];
                         $hookParams['toptab'] =& $toptab;
                         $hookParams['selected'] =& $selected;
                         plugin_hook ("groupmenu", $hookParams) ;

Modified: trunk/gforge_base/evolvisforge-5.1/src/common/include/utils.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/common/include/utils.php	2011-10-24 12:08:51 UTC (rev 17629)
+++ trunk/gforge_base/evolvisforge-5.1/src/common/include/utils.php	2011-10-24 12:08:55 UTC (rev 17630)
@@ -1073,21 +1073,32 @@
 }
 
 /**
+ * Return URL prefix (http:// or https://)
+ *
+ * @return	string	URL prefix
+ */
+function util_url_prefix() {
+	if (forge_get_config('use_ssl')) {
+		return "https://";
+	} else {
+		return "http://";
+	}
+}
+
+/**
  * Construct full URL from a relative path
  * 
  * @param string $path
  * @return string URL
  */
 function util_make_url ($path) {
+	$url = util_url_prefix();
+	$url .= forge_get_config('web_host') ;
         if (forge_get_config('use_ssl')) {
-                $url = "https://" ;
-                $url .= forge_get_config('web_host') ;
                 if (forge_get_config('https_port') != 443) {
                         $url .= ":".forge_get_config('https_port') ;
                 }
         } else {
-                $url = "http://" ;
-                $url .= forge_get_config('web_host') ;
                 if (forge_get_config('http_port') != 80) {
                         $url .= ":".forge_get_config('http_port') ;
                 }

Modified: trunk/gforge_base/evolvisforge-5.1/src/etc/config.ini.d/defaults.ini
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/etc/config.ini.d/defaults.ini	2011-10-24 12:08:51 UTC (rev 17629)
+++ trunk/gforge_base/evolvisforge-5.1/src/etc/config.ini.d/defaults.ini	2011-10-24 12:08:55 UTC (rev 17630)
@@ -77,5 +77,9 @@
 use_tracker = yes
 use_trove = yes
 use_webdav = no
+use_captcha = yes
 
-use_captcha = yes
+[theme]
+evolvis_portal_name = "Portal"
+evolvis_portal_href = "http://info.evolvis.org/"
+evolvis_portal_ttip = "-"

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-24 12:08:51 UTC (rev 17629)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/include/Layout.class.php	2011-10-24 12:08:55 UTC (rev 17630)
@@ -6,7 +6,7 @@
  * Copyright 2010 - Alain Peyrat
  * Copyright 2010 - Franck Villaume - Capgemini
  * Copyright (C) 2010 Alain Peyrat - Alcatel-Lucent
- * Copyright © 2011 Thorsten Glaser – tarent GmbH
+ * Copyright © 2011 Thorsten Glaser – tarent solutions GmbH
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -110,6 +110,7 @@
 	var $css = array();
 	var $css_min = array();
 	var $stylesheets = array();
+	var $footer_hooks = array();
 
 	/**
 	 * Layout() - Constructor
@@ -1317,6 +1318,10 @@
 		echo $this->subMenu($subMenuTitle, $subMenuUrl);
 	}
 
+	function disableForgebar() {
+		/* nothing */
+	}
+
 }
 
 // Local Variables:

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/themes/css/evolvis.css
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/themes/css/evolvis.css	2011-10-24 12:08:51 UTC (rev 17629)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/themes/css/evolvis.css	2011-10-24 12:08:55 UTC (rev 17630)
@@ -2,14 +2,14 @@
  * Evolvis Theme main CSS file
  *
  * Copyright © 2010, 2011
- *     Thorsten “mirabilos” Glaser <t.glaser at tarent.de>
+ *	Thorsten “mirabilos” Glaser <t.glaser at tarent.de>
  * (and numerous others; README.Evolvis contains a list)
  * All rights reserved.
  *
  * This file is part of FusionForge. FusionForge is free software;
  * you can redistribute it and/or modify it under the terms of the
  * GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option)
+ * Foundation; either version 2 of the Licence, or (at your option)
  * any later version.
  *
  * FusionForge is distributed in the hope that it will be useful,
@@ -116,6 +116,10 @@
 	font-family:sans-serif;
 }
 
+.mod_task_reset td {
+	background-color:inherit;
+}
+
 .list_table_top {
 	font-size:11pt;
 	font-weight:bold;
@@ -130,6 +134,15 @@
 	font-family:sans-serif;
 }
 
+/* same as .content except top := 0px; */
+.contentnoforgebar {
+	position:absolute;
+	left:2%;
+	top:0px;
+	width:96%;
+	font-family:sans-serif;
+}
+
 .titlebar td {
 	background-image:url(/themes/evolvis/images/bg-head.png);
 	background-repeat:repeat-x;
@@ -207,6 +220,10 @@
 	font-family:sans-serif;
 }
 
+.myPageArtifactGroupHeader {
+	background-color:#d5d5d5;
+}
+
 .projectTab {
 	float:right;
 	font-family:sans-serif;
@@ -409,6 +426,37 @@
 	font-family:sans-serif;
 }
 
+.myPageArtifactTaskDiv {
+	border:2px solid #D5D5D5;
+}
+
+.forgeglobalmenu {
+	float:right;
+	margin-right:1em;
+	/*XXX development */
+	border:1px solid green;
+}
+
+.forgeoutertabs {
+	margin-bottom:1ex;
+	/*XXX development */
+	margin-right:6px;
+	border:1px solid yellow;
+}
+
+.forgeprojecttabs {
+	/*XXX development */
+	margin-right:6px;
+	border:1px solid blue;
+}
+
+.forgesubmenu {
+	font-weight:bold;
+	/*XXX development */
+	border: 5px inset blue;
+	padding:12px;
+}
+
 #bd-col1 {
 	vertical-align:top;
 	width:65%;
@@ -442,6 +490,24 @@
 	color:red;
 }
 
+#ffErrors .warning {
+	border-width:0px;
+	padding:0px;
+	color:black;
+}
+
+#ffErrors .notice {
+	border-width:0px;
+	padding:0px;
+	color:#999999;
+}
+
+#ffErrors .strict {
+	border-width:0px;
+	padding:0px;
+	color:green;
+}
+
 /* the following style are for displaying items in different states */
 
 .active {
@@ -476,6 +542,14 @@
 	background-color:pink;
 }
 
+.today {
+	background-color:pink;
+}
+
+.day {
+	background-color:red;
+}
+
 /* style for required fields */
 .requiredfield {
 	color:red;
@@ -514,13 +588,25 @@
 	background-color:#da8a8a;
 }
 
+.boxed_wgLogo {
+	width:135px;
+	height:135px;
+	border:1px solid #CCCCCC;
+	margin:1px;
+	padding:1px;
+}
+
 .copyAndClosed {
 	color:#A9A9A9;
 	background-color:#ffffff;
 }
 
-/* styles for the Hudson plugin */
+.itemFocus {
+	background-color:#9999FF;
+}
 
+/* BEGIN: Styles for the Jenkins plugin */
+
 .submitStandardInformation {
 	color:#000000;
 	font-weight:bold;
@@ -535,6 +621,7 @@
 	color:#FFFC00;
 	font-weight:bold;
 	border:1px solid #000000;
+	background-color:#6B6B6B;
 }
 
 .submitSuccessInformation {
@@ -561,15 +648,19 @@
 .mainContentBoxes {
 	/* commented out because it's too wide */
 	/*width:910px;*/
-	float:left;
+	/* comment out because this breaks the layout */
+	/*float:left;*/
 }
 
 .smallContentBoxes {
-	float:left;
+	/* comment out because this breaks the layout */
+	/*float:left;*/
 }
 
-/* tag cloud */
+/* END: Styles for the Jenkins plugin */
 
+/* BEGIN: tag cloud */
+
 .tag1 {
 	font-size:small;
 }
@@ -589,3 +680,5 @@
 .tag5 {
 	font-size:xx-large;
 }
+
+/* END: tag cloud */

Added: 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	                        (rev 0)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/Theme.class.php	2011-10-24 12:08:55 UTC (rev 17630)
@@ -0,0 +1,840 @@
+<?php
+/*-
+ * Evolvis theme for tarent solutions GmbH
+ * heavily modified version of the Mac OS X like theme.
+ *
+ * Copyright (c) 2009, 2010, 2011
+ *	Thorsten Glaser <t.glaser at tarent.de>
+ * Copyright (c) 2007 Thorsten Glaser <t.glaser at aurisp.de>
+ *	on behalf of tarent GmbH
+ * Copyright (c) 2007 Waldemar Brodkorb <w.brodkorb at tarent.de>
+ *
+ * Copyright (c) 2002-2003 Richard Offer. All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the author shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from the author.
+ *
+ * Based on the "debian" theme, which is apparantly
+ * Copyright 1999-2001 (c) VA Linux Systems
+ */
+
+class Theme extends Layout {
+
+	/**
+	 * Theme() - Constructor
+	 */
+	function Theme() {
+		// Parent constructor
+		$this->Layout();
+
+		forge_define_config_item('evolvis_portal_name', 'theme', 'Portal');
+		forge_define_config_item('evolvis_portal_href', 'theme', 'http://info.evolvis.org/');
+		forge_define_config_item('evolvis_portal_ttip', 'theme', '-');
+
+		// The root location for images
+		$this->imgroot = '/themes/evolvis/images/';
+		$this->imgproj = '/themes/evolvis/images/proj/';
+
+		// The HTML box background color
+		$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->rightnav = false;
+
+		$this->addStylesheet('/themes/css/evolvis.css', 'all');
+		// $this->addStylesheet('/themes/css/screen.css', 'screen');
+		$this->addStylesheet('/themes/css/print.css', 'print');
+		$this->addJavascript('common.js');
+		$this->addJavascript('css.js');
+		$this->addJavascript('standardista-table-sorting.js');
+		$this->emit_forgebar = true;
+	}
+
+	function header($params) {
+		$this->emit_html_head = true;
+		return $this->internal_header($params);
+	}
+
+	function bodyHeader($params) {
+		$this->emit_html_head = false;
+		return $this->internal_header($params);
+	}
+
+	function disableForgebar() {
+		$this->emit_forgebar = false;
+	}
+
+	function emit_headlink($inblock,$tooltip,$redslash,$redtext,$target,$text) {
+		$tooltip = util_html_secure(util_ifsetor($tooltip,""));
+		if ($tooltip && $tooltip[0] == '-') {
+			$tooltip = "";
+		}
+
+		if ($inblock || $tooltip) {
+			$rv = '<span';
+			if ($inblock) {
+				$rv .= ' class="headblock"';
+			}
+			if ($tooltip) {
+				$rv .= ' title="' . $tooltip . '"';
+			}
+			$rv .= ">";
+			$rq = "</span>";
+		} else {
+			$rv = "";
+			$rq = "";
+		}
+		$rv .= '<span class="headlink' .
+		    ($redslash ? "s" : "") . "\">//</span>" .
+		    '<a class="headlink" href="' . $target . '">' .
+		    '<span class="headlink' .
+		    ($redtext ? "s" : "") . '">' .
+		    util_html_secure($text) . "</span></a>" . $rq;
+		return $rv;
+	}
+
+	function internal_header($params) {
+		global $_SERVER, $group_id, $sysDTDs, $sysXMLNSs;
+
+		$has_group = false;
+		if (array_key_exists('group', $params)) {
+			$this->project = group_get_object($params['group']);
+			if (isset($this->project) && is_object($this->project) &&
+			    !$this->project->isError() && $this->project->isProject()) {
+				$group_id = $this->project->getID();
+				$has_group = true;
+			}
+		}
+
+		$params['title'] = isset($params['title']) && $params['title'] ?
+		    forge_get_config('forge_name') . ': ' . $params['title'] :
+		    forge_get_config('forge_name');
+
+		if ($this->emit_html_head) {
+			echo '<' .
+			    '?xml version="1.0" encoding="utf-8" ?' . ">\n";
+			echo $sysDTDs['transitional']['doctype'];
+?>
+<html <?php echo $sysXMLNSs; ?> xml:lang="en" lang="<?php echo _('en'); ?>">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title><?php echo util_html_secure($params['title']); ?></title>
+<script language="JavaScript" type="text/javascript">/* <![CDATA[ */
+	function admin_window(adminurl) {
+		AdminWin = window.open(adminurl, 'AdminWindow', 'scrollbars=yes,resizable=yes, toolbar=yes, height=400, width=400, top=2, left=2');
+		AdminWin.focus();
+	}
+	function help_window(helpurl) {
+		HelpWin = window.open(helpurl, 'HelpWindow', 'scrollbars=yes, resizable=yes, toolbar=no, height=400, width=400');
+	}
+/* ]]> */</script>
+<?php
+			$this->headerCSS();
+			$this->headerJS();
+			$this->headerForgepluckerMeta();
+			if (strpos(util_ifsetor($_SERVER['HTTP_USER_AGENT'],
+			    ""), "Gecko")) {
+				/*
+				 * Work around a bug in Mozilla™ related
+				 * browsers which display a selected option
+				 * as black-on-white always, no matter the
+				 * style, when leaving the select’s focus.
+				 */
+?>
+<style type="text/css">
+	option { background-color:black; color:white; }
+</style><!-- https://bugzilla.mozilla.org/show_bug.cgi?id=554620 --><?php
+			}
+			echo "\n</head><body>\n";
+		}
+		if ($this->emit_forgebar) {
+			$pagetop = 'page_top';
+			if (eregi("(msie) ([0-9]{1,2}.[0-9]{1,3})",
+			    util_ifsetor($_SERVER['HTTP_USER_AGENT'], ""), $regs)) {
+				$pagetop .= '_ie';
+			}
+?><div id="ev_forgebar">
+<div id="red_headbar"></div>
+<div id="<?php echo $pagetop; ?>" class="hidePartForPrinting">
+	<div id="logo">
+		<div style="height:48px; padding-top:3px;">
+			<span style="overflow:hidden;"><a href="/"><img
+			 src="/themes/evolvis/images/logo_internal_repo.png"
+			 name="logo" border="0" style="height:44px;"
+			 alt="evolvis" /></a></span>
+			<div class="forgeglobalmenu"><table style="white-space:nowrap;">
+			<tr><td style="padding-left:1em;"><?php
+	if (session_loggedin()) {
+		echo "\n" . $this->emit_headlink(false,
+		    _('Log out of the session with the Forge system'),
+		    true, false, "/account/logout.php?return_to=" .
+		    urlencode(getStringFromServer('REQUEST_URI')),
+		    _('Log Out'));
+	} else {
+		echo "\n" . $this->emit_headlink(false,
+		    _('Log into a new session with the Forge system'),
+		    true, false, "/account/login.php?return_to=" .
+		    urlencode(getStringFromServer('REQUEST_URI')),
+		    _('Log In'));
+	}
+	echo "\n\t\t\t" . '</td><td style="padding-left:1em;">';
+	echo "\n" . $this->emit_headlink(false,
+	    forge_get_config('evolvis_portal_ttip', 'theme'),
+	    true, false, forge_get_config('evolvis_portal_href', 'theme'),
+	    forge_get_config('evolvis_portal_name', 'theme'));
+	echo "\n\t\t\t" . '</td></tr><tr>';
+	if (session_loggedin()) {
+		echo "\n\t\t\t\t" . '<td style="padding-left:1em;">';
+		echo "\n" . $this->emit_headlink(false,
+		    _('Configure Account settings, Password & SSH keys'),
+		    true, false, "/account/",
+		    _('My Account'));
+		echo "\n\t\t\t" . '</td><td style="padding-left:1em;">';
+		echo "\n" . $this->emit_headlink(false,
+		    _('Manage projects, assigned tasks, bugs, etc.'),
+		    true, false, "/my/",
+		    _('My Page'));
+	} else {
+		echo "\n\t\t\t\t" . '<td style="padding-left:1em;" colspan="2">';
+		echo "\n" . $this->emit_headlink(false,
+		    _('Register a user account with the Forge system'),
+		    true, false, "/account/register.php",
+		    _('New Account'));
+	}
+?>
+			</td></tr></table></div>
+		</div><div class="forgeoutertabs"><?php
+			echo $this->outerTabs($params, 0);
+		?></div>
+<?php
+		if ($has_group) {
+			echo '<div class="forgeprojecttabs">' .
+			    $this->projectTabs(util_ifsetor($params['toptab']),
+			    $group_id) . '</div>';
+		}
+?>
+	</div>
+	<div id="backimg"></div>
+	<br clear="all" />
+</div><!-- page top -->
+</div><!-- ev_forgebar -->
+<div id="ev_content" class="content"><?php
+		} else {
+			echo '<div id="ev_content" class="contentnoforgebar">';
+		}
+
+		if ($has_group) {
+			echo "\n<div id=\"project_name\">Project: " .
+			    $this->project->getPublicName() .
+			    "<hr class=\"hidePartForPrinting\" /></div>\n\n";
+		}
+
+		if (isset($params['submenu'])) {
+			echo $params['submenu'];
+		}
+
+		if ($has_group) {
+			if (preg_match('!^/(forum|tracker|mail|pm|docman|news|scm|frs|project/admin|projects)!',
+			    $_SERVER['REQUEST_URI']) ||
+			    util_ifsetor($params['rightnav'])) {
+				$this->rightnav = true;
+?>
+<table class="project_papa"><tr class="ff"><td class="project_content">
+<?php
+			}
+		}
+		echo "<!-- ]internal_header -->\n";
+	}
+
+	function footer($params) {
+		global $group_id;
+
+		echo "\n<!-- footer[ -->\n";
+		if ($this->rightnav) {
+			echo '</td><td class="project_info"><div class="hidePartForPrinting">';
+			$this->write_rightnav($group_id);
+			echo "\n</div></td></tr></table>";
+		}
+?><div id="fffooter" class="hidePartForPrinting">
+<span id="imprint"><a href="/impress/">Impressum / imprint</a></span>
+<span id="powerd_by">powered by <a
+ href="https://evolvis.org/">Evolvis</a> by <a
+ href="https://www.tarent.de/">tarent solutions GmbH</a>, based on <a
+ href="https://fusionforge.org/">FusionForge</a></span>
+</div>
+
+<script language="javascript" type="text/javascript" src="/js/awstats_misc_tracker.js"></script>
+<noscript><img src="/js/awstats_misc_tracker.js?nojs=y" height="0" width="0" border="0" style="display:none" alt="stats" /></noscript>
+<div id="red_bottombar"></div>
+</div><!-- content -->
+<?php
+		foreach ($this->footer_hooks as $h) {
+			call_user_func($h, $params);
+		}
+?>
+</body>
+</html>
+<?php
+	}
+
+	function write_rightnav($group_id) {
+		global $gfcommon;
+
+		echo "\n<!-- write_rightnav[ -->\n";
+		require_once('www/news/news_utils.php');
+		require_once('www/include/trove.php');
+		require_once('www/include/project_summary.php');
+		require_once($gfcommon.'/pm/ProjectTaskSqlQueries.php');
+
+		$project = $this->project;
+		$this->searchBox();
+		echo '<br />';
+
+		// ############################## PUBLIC AREAS
+
+		echo $this->boxTop(_('Public Areas'));
+
+		// ################# Homepage and Wiki Link
+
+		print '<a href="' . $project->getHomePage() . '">';
+		print html_image('ic/home16b.png','20','20',array('alt'=>_('Home Page')));
+		print ' '._('Project Home Page')."</a>\n";
+
+		if ($project->usesPlugin('mediawiki')) {
+			echo '<br /><a href="' .
+			    '/plugins/mediawiki/wiki/' . $project->getUnixName() .
+			    '/index.php">' .
+			    html_image('ic/wiki.png','20','20',array('alt'=>'wiki')) .
+			    " Wiki</a>\n";
+		}
+
+		// ################## ArtifactTypes
+
+		if ($project->usesTracker()) {
+			print '<hr size="1" />' . "\n" .
+			    '<a href="'.util_make_url ('/tracker/?group_id='.$group_id).'">';
+			print html_image('ic/tracker20g.png','20','20',array('alt'=>_('Tracker')));
+			print ' '._('Tracker')."</a>\n";
+
+			$result = db_query_params("SELECT agl.*,aca.count,aca.open_count
+			FROM artifact_group_list agl
+			LEFT JOIN artifact_counts_agg aca USING (group_artifact_id)
+			WHERE agl.group_id=$1
+			AND agl.is_public=1
+			ORDER BY group_artifact_id ASC", array($group_id));
+			$rows = db_numrows($result);
+
+			if (!$result || $rows < 1) {
+				echo "<br />\n<em>"._('No trackers found').'</em>';
+			} else {
+				for ($j = 0; $j < $rows; $j++) {
+					echo "\n<p>- ";
+					print util_make_link ('/tracker/?atid='. db_result($result, $j, 'group_artifact_id') . '&group_id='.$group_id.'&func=browse',db_result($result, $j, 'name')) . ' ' ;
+					printf(ngettext('(<strong>%1$s</strong> open / <strong>%2$s</strong> total)', '(<strong>%1$s</strong> open / <strong>%2$s</strong> total)', (int) db_result($result, $j, 'open_count')), (int) db_result($result, $j, 'open_count'), (int) db_result($result, $j, 'count'));
+					echo '<br />'.db_result($result, $j, 'description').'</p>';
+				}
+				echo "\n";
+			}
+		}
+
+		// ################## forums
+
+		if ($project->usesForum()) {
+			print '<hr size="1" />' . "\n" .
+			    '<a href="'.util_make_url ('/forum/?group_id='.$group_id).'">';
+			print html_image('ic/forum20g.png','20','20',array('alt'=>_('Forums')));
+			print ' '._('Public Forums')."</a>\n<br />(";
+			$messages_count = project_get_public_forum_message_count($group_id);
+			$forums_count = project_get_public_forum_count($group_id);
+			printf(ngettext("<strong>%d</strong> message","<strong>%d</strong> messages",$messages_count),$messages_count);
+			print ' in ';
+			printf(ngettext("<strong>%d</strong> forum","<strong>%d</strong> forums",$forums_count),$forums_count);
+			print ")\n";
+		}
+
+		// ##################### Doc Manager
+
+		if ($project->usesDocman()) {
+			print '
+			<hr size="1" />
+			<a href="'.util_make_url ('/docman/?group_id='.$group_id).'">';
+			print html_image('ic/docman16b.png','20','20',array('alt'=>_('Docs')));
+			print ' '._('Document Manager')."</a>\n";
+		}
+
+		// ##################### Mailing lists
+
+		if ($project->usesMail()) {
+			print '<hr size="1" />' . "\n" .
+			    '<a href="'.util_make_url ('/mail/?group_id='.$group_id).'">';
+			print html_image('ic/mail16b.png','20','20',array('alt'=>_('Lists')));
+			print ' '._('Mailing Lists')."</a><br />\n";
+			$n = project_get_mail_list_count($group_id);
+			printf(ngettext('(<strong>%1$s</strong> public mailing list)', '(<strong>%1$s</strong> public mailing lists)', $n), $n)."\n";
+		}
+
+		// ##################### Task Manager
+
+		if ($project->usesPm()) {
+			print '<hr size="1" />' . "\n" .
+			    '<a href="'.util_make_url ('/pm/?group_id='.$group_id).'">';
+			print html_image('ic/taskman20g.png','20','20',array('alt'=>_('Tasks')));
+			print ' '._('Task Manager')."</a>\n";
+			$result = db_query_params ("SELECT * FROM project_group_list WHERE group_id=$1 AND is_public=1",array($group_id));
+			$rows = db_numrows($result);
+			if (!$result || $rows < 1) {
+				echo "<br />\n<em>"._('No tasks found').'</em>';
+			} else {
+				for ($j = 0; $j < $rows; $j++) {
+					echo "\n<br />- ";
+					print util_make_link ('/pm/task.php?group_project_id='.db_result($result, $j, 'group_project_id').'&group_id='.$group_id.'&func=browse',db_result($result, $j, 'project_name'));
+				}
+				echo "\n";
+			}
+		}
+
+		// ######################### SCM
+
+		if ($project->usesSCM()) {
+			print '<hr size="1" />' . "\n" .
+			    '<a href="'.util_make_url ('/scm/?group_id='.$group_id).'">';
+			print html_image('ic/cvs16b.png','20','20',array('alt'=>_('SCM')));
+			print ' '._('SCM Repository')."</a><br />";
+
+			$hook_params = array () ;
+			$hook_params['group_id'] = $group_id ;
+			plugin_hook ("scm_stats", $hook_params) ;
+			echo "\n";
+		}
+
+		// ######################## AnonFTP
+
+		if ($project->usesFTP()) {
+			if ($project->isActive()) {
+				print '<hr size="1" />'."\n";
+				print '<a href="ftp://' . $project->getUnixName() . '.' . forge_get_config('web_host') . '/pub/'. $project->getUnixName() .'/">';
+				print html_image('ic/ftp16b.png','20','20',array('alt'=>_('Anonymous FTP Space')));
+				print ' '._('Anonymous FTP Space')."</a>\n";
+			}
+		}
+
+		// ######################## minimum unique ID
+
+		print "\n<hr size=\"1\" />\n";
+		printf(_('Minimum Unique Task/Tracker Item ID: %d') . "\n",
+		    tasktracker_getminid());
+
+		// ######################## (end)
+
+		echo $this->boxBottom();
+		echo "<!-- ]write_rightnav -->\n";
+	}
+
+	/**
+	 * boxTop() - Top HTML box
+	 *
+	 * @param	string	Box title
+	 */
+	function boxTop($title) {
+		return '
+		<!-- boxTop[ -->
+		<table cellspacing="2" cellpadding="0" width="100%" border="0" class="hidePartForPrinting">
+		<tr class="ff">
+		<td class="ff">
+			<table cellspacing="2" cellpadding="0" width="100%" border="0" >
+				<tr class="titlebar">
+					<td class="ff" colspan="2">'.$title.'</td>
+				</tr>
+				<tr class="ff" align="left" bgcolor="'. $this->COLOR_HTMLBOX_BACK .'">
+					<td class="ff" colspan="2" height="1"></td>
+				</tr>
+				<tr class="ff" align="left"><td class="ff" colspan="2"><!-- ]boxTop -->';
+	}
+
+	/**
+	 * boxMiddle() - Middle HTML box
+	 *
+	 * @param	string	Box title
+	 */
+	function boxMiddle($title) {
+		return '
+				<!-- boxMiddle[ -->
+				</td>
+				</tr>
+				<tr class="titlebar">
+					<td class="ff" colspan="2"><span>'.$title.'</span></td>
+				</tr>
+				<tr class="ff" align="left" bgcolor="'. $this->COLOR_HTMLBOX_BACK .'">
+					<td class="ff" colspan="2" height="1"></td>
+				</tr>
+				<tr class="ff"><td class="ff" colspan="2"><!-- ]boxMiddle -->';
+	}
+
+	/**
+	 * boxGetAltRowStyle() - Get an alternating row style for tables
+	 *
+	 * @param	int	Row number
+	 */
+	function boxGetAltRowStyle($i) {
+		switch ($i % 3 ) {
+		case 0:
+			return 'bgcolor="#F4F4F4"';
+		case 1:
+			return 'bgcolor="#EAEAEA"';
+		case 2:
+			return 'bgcolor="#E0E0E0"';
+		}
+	}
+
+	/**
+	 * boxBottom() - Bottom HTML box
+	 */
+	function boxBottom() {
+		return '<!-- boxBottom[ -->
+					</td>
+				</tr>
+			</table>
+		</td>
+		</tr>
+		</table><!-- ]boxBottom -->'."\n";
+	}
+
+	/**
+	 * listTableTop() - Takes an array of titles and builds the first row of a new table.
+	 *
+	 * @param	array	The array of titles
+	 * @param	array	The array of title links
+	 * @param	int	(ignored?!)
+	 * @param	bool	Show a table border (default: false)
+	 */
+	function listTableTop($title_arr,$links_arr=false,$cnt=0,$useborder=false) {
+		$rv = '
+		<!-- listTableTop[ -->
+		<table cellspacing="0" cellpadding="1" width="100%" ' .
+		($useborder ? $useborder : 'border="0"') . '>
+		<tr class="ff"><td class="ff">
+		<table width="100%" border="0" cellspacing="2" cellpadding="0">
+		<thead>
+		<tr class="ff">';
+
+		$count = count($title_arr);
+		if (!$count) {
+			$rv .= '<td style="color:red;">No $title_arr:' .
+			    "<pre>\n" . htmlentities(debug_string_backtrace()) .
+			    "</pre></td>\n";
+		} else if ($links_arr) {
+			for ($i=0; $i<$count; $i++) {
+				$rv .= '
+		<td class="ff" align="left"><a class="titlebar" href="'.$links_arr[$i].'">'.$title_arr[$i].'</a></td>';
+			}
+		} else {
+			for ($i=0; $i<$count; $i++) {
+				$rv .= '
+		<td align="left" class="list_table_top">'.$title_arr[$i].'</td>';
+			}
+		}
+		$rv .= '
+		</tr>
+		</thead><tfoot>
+		<tr class="ff" align="left" bgcolor="'. $this->COLOR_HTMLBOX_BACK .'">
+		<td class="ff" colspan="'.$count.'" height="1"><img src="'.$this->imgroot.'clear.png" height="1" width="1" alt="" /></td>
+		</tr>
+		</tfoot><tbody><!-- ]listTableTop -->'."\n";
+		return $rv;
+	}
+
+	/**
+	 * listTableTopSortable() - Takes an array of titles and builds the first row of a new table and table is sortable.
+	 *
+	 * @param	array	The array of titles
+	 * @param	array	The array of title links
+	 */
+	function listTableTopSortable($title_arr,$links_arr=false) {
+		$rv= '
+		<!-- listTableTopSortable[ -->
+		<table cellspacing="0" cellpadding="1" width="100%" border="0">
+		<tr class="ff"><td class="ff">
+		<table class="sortable" width="100%" border="0" cellspacing="2" cellpadding="0">
+		<thead>
+		<tr class="ff">';
+
+		$count = count($title_arr);
+		if ($links_arr) {
+			for ($i=0; $i<$count; $i++) {
+				$rv.= '
+				<th class="ff" align="left"><a class="titlebar" href="'.$links_arr[$i].'">'.$title_arr[$i].'</a></th>';
+			}
+		} else {
+			for ($i=0; $i<$count; $i++) {
+				$rv.= '
+				<th align="left" class="list_table_top">'.$title_arr[$i].'</th>';
+			}
+		}
+		$rv.= '
+		</tr>
+		</thead>
+		<tfoot><tr class="ff" align="left" bgcolor="'. $this->COLOR_HTMLBOX_BACK .'">
+		<td class="ff" colspan="'.$count.'" height="1"><img src="'.$this->imgroot.'clear.png" height="1" width="1" alt="" /></td>
+		</tr></tfoot>
+		<tbody><!-- ]listTableTopSortable -->'."\n";
+		return $rv;
+	}
+
+	function listTableBottom() {
+		return "<!-- listTableBottom[ --></tbody></table></td></tr></table><!-- ]listTableBottom -->\n";
+	}
+
+
+	function tabGenerator($TABS_DIRS,$TABS_TITLES,$nested=false,$selected=false,$sel_tab_bgcolor='BLACK',$total_width='100%',$TAB_TYPE,$TABS_TOOLTIPS=array()) {
+		$rv = "";
+		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;
+	}
+
+	function outerTabs($params,$write=1) {
+		$menu = $this->navigation->getSiteMenu();
+
+		if (!isset($this->COLOR_SELECTED_TAB)) {
+			$this->COLOR_SELECTED_TAB= '#e0e0e0';
+		}
+
+		$rv = $this->tabGenerator($menu['urls'], $menu['titles'], false,
+		    $menu['selected'], $this->COLOR_SELECTED_TAB, '100%',
+		    "outerTab", util_ifsetor($menu['tooltips'], array()));
+		if (!$write) {
+			return $rv;
+		} else {
+			echo $rv;
+			return "<div>bogus call <pre>{".debug_string_backtrace()."}</pre> & ERROR</div>\n";
+		}
+	}
+
+	/**
+	 *	projectTabs() - Prints out the project tabs, contained here in case
+	 *		we want to allow it to be overriden
+	 *
+	 *	@param	string	Is the tab currently selected
+	 *	@param	string	Is the group we should look up get title info
+	 */
+	function projectTabs($toptab,$group) {
+		$menu = $this->navigation->getProjectMenu($group, $toptab);
+
+		return $this->tabGenerator($menu['urls'], $menu['titles'], true,
+		    $menu['selected'], 'white', '100%', 'projectTab',
+		    util_ifsetor($menu['tooltips'], array()));
+	}
+
+	/**
+	 * multiTableRow() - create a mutlilevel row in a table
+	 *
+	 * @param	string	the row attributes
+	 * @param	array	the array of cell data, each element is an array,
+	 *			the first item being the text,
+	 *			the subsequent items are attributes
+	 * @param	boolean is this row part of the title ?
+	 *
+	 */
+	function multiTableRow($row_attr, $cell_data, $istitle) {
+		$rv = '
+		<!-- multiTableRow -->
+		<tr class="multi_table_row" '.$row_attr;
+		if ( $istitle ) {
+			$rv .=' align="center" ';
+		}
+		$rv .= '>';
+		for ($c = 0; $c < count($cell_data); $c++) {
+			$rv .='<td class="ff" ';
+			for ($a=1; $a < count($cell_data[$c]); $a++) {
+				$rv .= $cell_data[$c][$a].' ';
+			}
+			$rv .= '>';
+			if ($istitle) {
+				$rv .='<span class="titlebar">';
+			}
+			$rv .= $cell_data[$c][0];
+			if ($istitle) {
+				$rv .='</span>';
+			}
+			$rv .= '</td>';
+
+		}
+		$rv .= '</tr>
+		<!-- end multiTableRow -->
+		';
+
+		return $rv;
+	}
+
+	function emit_search_box() {
+		/* backwards compat */
+		searchBox();
+	}
+	function searchBox($print=1) {
+		global $words, $forum_id, $group_id, $group_project_id,
+		    $atid, $exact, $type_of_search;
+
+		if (get_magic_quotes_gpc()) {
+			$defaultWords = stripslashes($words);
+		} else {
+			$defaultWords = $words;
+		}
+
+		// if there is no search currently, set the default
+		if (!isset($type_of_search)) {
+			$exact = 1;
+		}
+
+		$rv = '<div class="hidePartForPrinting">
+		<form action="/search/" method="get">';
+		$parameters = array(
+			SEARCH__PARAMETER_GROUP_ID => $group_id,
+			SEARCH__PARAMETER_ARTIFACT_ID => $atid,
+			SEARCH__PARAMETER_FORUM_ID => $forum_id,
+			SEARCH__PARAMETER_GROUP_PROJECT_ID => $group_project_id
+		);
+
+		$searchManager =& getSearchManager();
+		$searchManager->setParametersValues($parameters);
+		$searchEngines =& $searchManager->getAvailableSearchEngines();
+
+		$rv .= '<select name="type_of_search">';
+		for ($i = 0, $max = count($searchEngines); $i < $max; $i++) {
+			$searchEngine =& $searchEngines[$i];
+			$rv .= '<option value="'.$searchEngine->getType().'"'.( $type_of_search == $searchEngine->getType() ? ' selected="selected"' : '' ).'>'.$searchEngine->getLabel($parameters).'</option>'."\n";
+		}
+		$rv .= '</select>';
+
+		$parameters = $searchManager->getParameters();
+		foreach ($parameters AS $name => $value) {
+			$rv .= '<input type="hidden" value="'.$value.'" name="'.$name.'" />';
+		}
+		$rv .= '<input type="text" size="12" name="words" value="'.$defaultWords.'" />';
+
+		$rv .= '<input type="submit" name="Search" value="'._('Search').'" />';
+
+		if (isset($group_id) && $group_id) {
+			$rv .= '
+				<br />
+				<span id="advanced_search">
+				› <a href="/search/advanced_search.php?group_id='.$group_id.'">'
+				._('Advanced search').'</a>
+				</span>';
+		}
+		$rv .= '</form>
+<hr />
+<form action="' . util_make_url('/pm/t_follow.php') . '" method="get">
+	' . _('Jump to Task:') . '<br /><input type="text" size="8"
+	name="tid" /><input type="submit" name="j" value="' . _('OK') . '" />
+</form></div>';
+
+		if ($print) {
+			echo $rv;
+			return "<div>bogus call <pre>{".debug_string_backtrace()."}</pre> & ERROR</div>\n";
+		} else {
+			return $rv;
+		}
+	}
+
+	/**
+	 * feedback() - returns the htmlized feedback string when an action is performed.
+	 *
+	 * @param string feedback string
+	 * @return string htmlized feedback
+	 */
+	function feedback($feedback) {
+		if (!$feedback) {
+			return '';
+		} else {
+			return '
+			<h3 style="color:red">'.strip_tags($feedback, '<br>').'</h3>';
+		}
+	}
+
+	/**
+	 * beginSubMenu() - Opening a submenu.
+	 *
+	 * @return	string	HTML to start a submenu
+	 */
+	function beginSubMenu() {
+		return '
+<div class="forgesubmenu">';
+	}
+
+	/**
+	 * endSubMenu() - Closing a submenu.
+	 *
+	 * @return	string	HTML to start a submenu
+	 */
+	function endSubMenu() {
+		return "\n<!-- ]forgesubmenu --></div>\n";
+	}
+}
+
+// Local Variables:
+// mode: php
+// c-file-style: "bsd"
+// End:
+
+?>

Added: trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/images/CC-BY-NC-SA-3_0-de.png
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/images/CC-BY-NC-SA-3_0-de.png	                        (rev 0)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/themes/evolvis/images/CC-BY-NC-SA-3_0-de.png	2011-10-24 12:08:55 UTC (rev 17630)
@@ -0,0 +1,46 @@
+‰PNG
+
+   
+IHDR   X      cÈ
+à   	pHYs     šœ  
+OiCCPPhotoshop ICC profile  xڝSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*!	Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ,Š
+Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ–H3Q5€©BàƒÇÄÆáä.@
+$p ³d!sý# ø~<<+"À¾ xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€ @zŽB¦ @F€˜&S   `Ëcbã P- `'æÓ €ø™{ [”! ‘  eˆD h; ¬ÏVŠE X0 fKÄ9 Ø- 0IWfH °· Àβ  0Qˆ…) { `È##x „™ FòW<ñ+®ç*  x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ   ‘àƒóýxήÎÎ6Ž¶_-ê¿ÿ"bbãþåÏ«p@  át~Ñþ,/³€;€mþ¢%îh^ u÷‹f²@µ  éÚWópø~<<E¡¹ÙÙåääØJÄB[aÊW}þgÂ_ÀWýlù~<ü÷õà¾â$2]GøàÂÌôL¥Ï’	„bÜæGü·ÿüÓ"ÄIb¹X*ãQqŽDšŒó2¥"‰B’)Å%Òÿdâß,û>ß5 °j>{‘-¨]cöK'XtÀâ÷  ò»oÁÔ(€hƒáÏwÿï?ýG % €fI’q  ^D$.Tʳ?Ç  D *°AôÁ,ÀÁÜÁü`6„B$ÄÂBB
+d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼	AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È 2‚ü†¼G1”²Q=ÔµC¹¨7„F¢Ðdt1š ›Ðr´=Œ6¡çЫhڏ>CÇ0Àè3Äl0.ÆÃB±8,	“c˱"¬«Æ°V¬»‰õcϱwEÀ	6wB aAHXLXNØH¨ $4Ú	7	„QÂ'"“¨K´&ºùÄb21‡XH,#֏/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[
+b at q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw
+†ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê
+•J•&•*/T©ª¦ªÞªUóUËT©^S}®FU3Sã©	Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k
+«†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN	ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ
+§M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õGX³$ÛÎ<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yn…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý=
+‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ?Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿÑ §€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈ쐭!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~'…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž
+yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L
+LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y-
+¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳Êې7œïŸÿíÂá’¶¥†KW-X潬j9²<qyÛ
+ã+†V¬<¸Š¶*mÕO«íW—®~½&zMk^ÁÊ‚ÁµkëU
+å…}ëÜ×í]OX/Yßµaú†>‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n
+ÙÚ´
+ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw-
+6
+UœÆâ#pDyäé÷	ß÷
+:ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ4<YyJóTÉiÚé‚Ó“gòÏŒ•}~.ùÜ`Û¢¶{çcÎßjoïºtáÒEÿ‹ç;¼;Î\ò¸tò²ÛåW¸Wš¯:_mêtê<þ“ÓOÇ»œ»š®¹\k¹îz½µ{f÷éž7ÎÝô½yñÿÖÕž9=ݽózo÷Å÷õßÝ~r'ýÎË»Ùw'î­¼O¼_ô@íAÙC݇Õ?[þÜØïÜjÀw óÑÜG÷…ƒÏþ‘õC™Ë†
+†ëž8>99â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û   gAMA  ±Ž|ûQ“    cHRM  z%  €ƒ  ùÿ  €é  u0  ê`  :˜  o’_ÅF  
+ÃIDATxÚìZolçÿÝÙ Ñïúi­Ü‰³øÐ8ŸL)Hhs[¥•Òœýëtáú‘UNº’m)!6%¬¨“±Â6Ø´“˜ U.„´´Ø	´ùã€
+´s¾%Ñi6†J%þóìƒ}o|±?¤Õ4ÚWzs—{ïýù¹ß=ïóþÞç=Žˆ,Ç]Çwåk/DÄq  úOÏóày&“	<o‚‰çÁ›
+GžÇñà9ǧ£€@ !G9ärùšÍfóÇ\Ùl¹\–µå(Çî'"Ýv~'”'ëž p H'×d2å+oš:7™òm¼©@2Žã‹ù-S 6—'3›-Ôâó¬‘ä\.Lj-&úN"ÙÀH®É³á˜¯}½'1::Š© ¥–¥X½z5œ?rbý#›3ç3ù’åÁ+¼Ë¢á“£üH at aqyr/„#PßV‹Å÷ÛívÈd<°jÅœ.ôAý}ï ®Å
+×E›ˆu냴VšÎBíá пμ³ÙÌH5›Íùj2c 4ˆŽW;0111'ƒ¬V+šÿÐŒÚÚGÉf‘ÍfÉj6ƒL&Ë<¼Ø“¯N\ŁÎ?c<6 $	‡ F
+…  Õöj4¸pϽß/ûûq-Ž×»2b+áˆ6
+î­mbYœÏ®~Ž×»^_=OÖ=•'øýÓ0›ÌSÄša‘ÙŒ¶VÔ•u²,CEÔÖÖ Ç¡ª*’É$»WvÉx©ù·Xr×d2¤3d2id2cÈ ®'®ã7¿z©T
+²,ÃçóAÇÑÔÔUUa±XÐÞÑ^òP×¾¸†mÍøòË/KpB¡$I2àTUUÁÓÞVBòÍÔM¸l‡éÌÙ3tvh†ÂC4
+Óŏ£$»d*^<%	š©øý~õ«¶WÓ¹¡³4£á±!:;4HÁ³gètè½÷Á»Ôê$x·—ìv; EQx:Îôßб÷3TÑ&p‰)ŠÂpôªiÃmb	Nµ½ºÄž+W®ÐðÐ
+
+Ñ•+Wæd âÀTˆÁf“	f“Ñs"‘ÚÚÚ ÂŒáAQhšÆ†Òxlû:öb9ÏI^„‡ÃˆÅbeÍ۶͂E,ˏãB8bˆ¹q-QÑÖÖ p¹\%¢(2œ¸G胐!æŽÇÆ
+öüã7 ­y›Ÿy›ŸyÒš‡qúÔ©íÑ ¼.ËL&„
+äƒÁ’á1SÁ`‘¬ö¨„Éd.Kò[Çß ø|>Økj¦ëȲªÂçóå±ßž
+_ý}ï°¡k³Ùàt:YœìééAÓ4ƒÁ½o1¦nÏÈð0<;Úpß=÷B’œØ°q# à׿|êì¬hà¼罸ãÕF”ßïŸÕkg"YïÛñÇŽ‚–.Ë45Ï#öï$I*y‰õõõÌËëëëK<P’$ÃÌ×âp8P‚ 0rAÀ±cÇ°iÓ&´´´@’¤œb¥‹MÙ“J¥‹\ ÔÉ?ÃßÝسo/^ÞÑ
+ tû+ÚcôàÂÃ÷õždj¡±±‘yáíAØ›˜˜@߉“lÁ’'™c2­Üïírü\I’à÷ûÑØ؈•+W ’É$Ž=Š£GâêÕ«†‰¸Nñµö×ò÷·#‡ÙµŸ<ú(  •JáóÏ>«ˆÃÖ½I>‚ ÀívOÅ·P.—N§N§^¯·b[gaØèñI÷âà™`‘÷ràø)‚¿îréÒ%œ?¾T‡B°Ùlðz½ˆÇã³âX,tuuá.ËR:t¨ì=_}ukFŒüBƒãÀsFGGóK–1¡PN§³ÄÐP(·Û
+—ËUÒvñâEøý~†0::š_ˆÍ“Ë1]Yn2Ó=WQ”’ör}ôkË—/‡,ËPU‡>ŸÉdGŽªªðx<ðx<PeF Xd6£ù¥—p×’%ìÚÈð0;_&.«h›KÆ"aºôÉE&c|>“!‡#/gD‘4M£`0H¢(’ßïgm‡ƒ4M£žžÖ6]Æ  KŸ\¢±H˜>ý>Ñû§©¦¦†I§é¥œL#"Ò4 Ýn/‘h:NñïF"&Û|>µ´´äd±TÓ%£ŽÓ}ø0-_&Òòe"íòî¤]ޝTsÿý´|™H9x¨¢=™†áZOô7£(
+暦Þ¾¾øe™µO$lÙȱ?Sbüéü¬ÜÔÔ4ç ß+oÙµuë3´)ŠÂžcÅŠp:¸ûî»áõzÑÞÞMÓ˜mzßbL§~ËÔoÙ ðwwÃßݍ[_ݺõãÙÍ›*ÚcˆÁÿËòК‡`¯±CUÕµP‰\UUQm¯6䤵D›hÀ	ƒL5èªB/zm¢!/ñÀª¨¶Wp^ÞÑŠ?Ž=ûöbϾ½è{§]Àb±T´ÇH0³XÅñD÷‚@ €d2‰h4Ê&
+¦uËäâ¶â%å”®eF´zZa±Xàr¹XŸbÇár¹ÐÙÙ	‹Å‚wCÉÃ4·lCUUÃI&“ƒH$ì‰DNUUÜ[Kp~×Ò\bσ«ƍ±aãFØkjædKö„/ŒbñâÅXóÇq#uŠ¢°IJUÕ’‰L‚uuuÛôþMMMèììÄRËRœûè,&''1™žD:“F:É'ƒ²$þ“Änïn¦%Ó´úKŸ-Ùsí‹kèؽ—iÛJ8³%{n¦nbÏî–ì¹{X²gäü/^ï/Ô‚  ‘H”AWWӐ’$±å¨ªªèêê2hQ½
+ l6âñ8Öþx-öûöáÖä$ÒÓÖóƹlá‘0zÞº3Ò•Œàá±!,Z´çÏÁý‚›-ÿ_ ‹c»vïÂcë~ŠÉô$&ÓidÒi¤3Ó.“€ÿO¸ó Ø–Žä¬…Õj5L·[’É$›]­Vk!_ØÅÈå+Äb*l9Ý©…€åÍæ÷Ñ^ißÉÒ'ŠÛ!×ét²¾Í¿o.$سS$m±I–î¬-#6¹ ímÛ)|a”¢—#ôÜ/žc"Üáp0¡>—¢i[€  Ù%Sôr„ÂFigûÎ’Üì· NýÓø¢›Æ"aŠÞFÂ=‘HÇã1¬V­^E?ŽÒX4LÛÛ¶É%nº(mmÛŽ:—³ÙŒýûñæoÞö–‘÷2™FFF±õù­sùŽ hÕDZkÅ«ÌéÿW©ÔGÿ¹&š*Ù4/Œéµµm{Þ“/G¨;p˜¬Vëœß˜Õj¥®]½¡±h˜þõàœûNÏ?L?/¾6Îlýç‚Uîžùb”x°^_tcóÏ7³]ˆPp 'zO̸mÿ„ü$©–mhööžÀ.ï®ù|	Sâ-óñÜé÷V:Îó뜲Þ[Éβ+¹J¬\Ö¶¸ï֢݈ât#ºUÿðdâÓOñÚ>çý0	
+³…„™ðçûÒæŠ1#Ázy¤ö¬[¿+\‰ïY,…O§¦áz*…ócçÑß×?ob¿)^hžmNøÚþ®,`¡ADUßÑð
+-0ˆ¸ÿ Æ7â§][Î    IEND®B`‚
\ No newline at end of file

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-24 12:08:51 UTC (rev 17629)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/tracker/ind.php	2011-10-24 12:08:55 UTC (rev 17630)
@@ -64,7 +64,7 @@
 	*/
 	$tablearr = array(_('Tracker'),_('Description'),_('Open'),_('Total'));
 
-	echo $HTML->listTableTop($tablearr, false, 'sortable_table_tracker', 'sortable_table_tracker');
+	echo $HTML->listTableTop($tablearr, false);
 
 	for ($j = 0; $j < count($at_arr); $j++) {
 		if (!is_object($at_arr[$j])) {



More information about the evolvis-commits mailing list