GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Issues (4873)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

src/common/layout/TabbedLayout.class.php (2 issues)

Labels
Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * Copyright (c) Xerox Corporation, Codendi Team, 2001-2009. All rights reserved
4
 *
5
 * This file is a part of Codendi.
6
 *
7
 * Codendi is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 2 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * Codendi is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with Codendi. If not, see <http://www.gnu.org/licenses/>.
19
 */
20
21
require_once('Layout.class.php');
22
class TabbedLayout extends Layout {
23
24
    function getBodyHeader($params) {
25
        $output = '
26
        <table cellpadding="0" cellspacing="0" border="0" width="100%">
27
            <tr>
28
                <td class="header_osdn">'.$this->getOsdnNavBar().'</td>
29
                <td class="header_actions">
30
                    <ul>';
31
        if (user_isloggedin()) {
32
            
33
            $output .= '<li class="header_actions_nolink">'.$GLOBALS['Language']->getText('include_menu','logged_in').': '.user_getname().'</li>';
34
            $output .= '<li><a href="/account/logout.php">'.$GLOBALS['Language']->getText('include_menu','logout').'</a></li>';
35
            if((isset($GLOBALS['sys_use_project_registration']) && $GLOBALS['sys_use_project_registration'] ==1) || !isset($GLOBALS['sys_use_project_registration'])) {
36
                $output .= '<li><a href="/project/register.php">'.$GLOBALS['Language']->getText('include_menu','register_new_proj').'</a></li>';
37
            } 
38
            $request = HTTPRequest::instance();
39
            if (!$request->isPost()) {
40
                $bookmark_title = urlencode( str_replace($GLOBALS['sys_name'].': ', '', $params['title']));
41
                $output .= '<li class="bookmarkpage"><a href="/my/bookmark_add.php?bookmark_url='.urlencode($_SERVER['REQUEST_URI']).'&bookmark_title='.$bookmark_title.'">'.$GLOBALS['Language']->getText('include_menu','bookmark_this_page').'</a></li>';
42
            }
43
        } else {
44
            $output .= '<li class="header_actions_nolink highlight">'.$GLOBALS['Language']->getText('include_menu','not_logged_in').'</li>';
45
            $output .= '<li><a href="/account/login.php">'.$GLOBALS['Language']->getText('include_menu','login').'</a></li>';
46
47
            $em =& EventManager::instance();
48
            $display_new_user = true;
49
            $params = array('allow' => &$display_new_user);
50
            $em->processEvent('display_newaccount', $params);
51
            if ($display_new_user) {
52
                $output .= '<li><a href="/account/register.php">'.$GLOBALS['Language']->getText('include_menu','new_user').'</a></li>';
53
            }
54
        
55
        }
56
        $output .= '</ul>
57
                </td>
58
            </tr>
59
            <tr>
60
                <td class="header_logo">
61
                    <a  class="header_logo" href="/"><img src="'.$this->imgroot.'organization_logo.png" /></a>
62
                </td>
63
                <td class="header_searchbox"><br />'.$this->getSearchBox().'</td>
64
            </tr>
65
        </table>';
66
        return $output;
67
    }
68
	/**
69
	 *	header() - "steel theme" top of page
70
	 *
71
	 * @param	array	Header parameters array
72
	 */
73
	function header($params) {
74
		global $Language;
75
76
		$this->generic_header($params); 
77
		?>
78
79
80
<body class="<?php echo $this->getClassnamesForBodyTag() ?>">
81
<div id="header"><?php echo $this->getBodyHeader($params); ?></div>
82
83
<table border="0" width="100%" cellspacing="0" cellpadding="0">
84
85
	<tr>
86
		<td>&nbsp;</td>
87
		<td colspan="3">
88
89
<?php echo $this->outerTabs($params); ?>
90
91
		</td>
92
		<td>&nbsp;</td>
93
	</tr>
94
95
	<tr class="row_below_outertabs">
96
		<td align="left" width="9"><img src="<?php echo $this->imgroot; ?>tabs/topleft.png" height="9" width="9" alt="" /></td>
97
		<td width="30"><img src="<?php echo $this->imgroot; ?>clear.png" width="30" height="1" alt="" /></td>
98
		<td><img src="<?php echo $this->imgroot; ?>clear.png" width="1" height="1" alt="" /></td>
99
		<td width="30"><img src="<?php echo $this->imgroot; ?>clear.png" width="30" height="1" alt="" /></td>
100
		<td align="right" width="9"><img src="<?php echo $this->imgroot; ?>tabs/topright.png" height="9" width="9" alt="" /></td>
101
	</tr>
102
103
	<tr class="outer_body_row">
104
105
		<!-- Outer body row -->
106
107
		<td ><img src="<?php echo $this->imgroot; ?>clear.png" width="10" height="1" alt="" /></td>
108
		<td valign="top" width="99%" colspan="3">
109
110
			<!-- Inner Tabs / Shell -->
111
112
			<table border="0" width="100%" cellspacing="0" cellpadding="0">
113
<?php
114
115
116
if (isset($params['group']) && $params['group']) {
117
			?>
118
			<tr>
119
				<td>&nbsp;</td>
120
				<td>
121
				<?php
122
123
				echo $this->projectTabs($params['toptab'],$params['group']);
124
125
				?>
126
				</td>
127
				<td>&nbsp;</td>
128
			</tr>
129
			<?php
130
131
} else if ((isset($params['selected_top_tab']) && $params['selected_top_tab'] == '/my/') || 
132
           strstr(getStringFromServer('REQUEST_URI'),'/my/') ||  
133
           strstr(getStringFromServer('REQUEST_URI'),'/account/')) {
134
    ?>
135
    <tr>
136
        <td>&nbsp;</td>
137
        <td>
138
        <?php
139
        echo $this->tabGenerator(array(
140
                '/my/', 
141
                '/account/', 
142
            ), array(
143
                $Language->getText('my_index','my_dashboard'),
144
                $Language->getText('my_index','account_maintenance'),
145
            ),
146
            true,
147
            (isset($params['selected_top_tab']) && $params['selected_top_tab'] == '/my/') ||
148
              strstr(getStringFromServer('REQUEST_URI'),'/my/') ? 0 :
149
                (strstr(getStringFromServer('REQUEST_URI'),'/account') ? 2 : 1)
150
            ,
151
            'WHITE', //deprecated
152
            '');
153
154
155
        ?>
156
        </td>
157
        <td>&nbsp;</td>
158
    </tr>
159
    <?php
160
}
161
$main_body_class = '';
162
if (isset($params['toptab']) && is_string($params['toptab'])) {
163
    $main_body_class = 'service-' . $params['toptab'];
164
}
165
?>
166
			<tr class="start_main_body_row">
167
				<td align="left" width="9"><img src="<?php echo $this->imgroot; ?>tabs/topleft-inner.png" height="9" width="9" alt="" /></td>
168
				<td><img src="<?php echo $this->imgroot; ?>clear.png" width="1" height="1" alt="" /></td>
169
				<td align="right" width="9"><img src="<?php echo $this->imgroot; ?>tabs/topright-inner.png" height="9" width="9" alt="" /></td>
170
			</tr>
171
172
			<tr class="main_body_row">
173
				<td><img src="<?php echo $this->imgroot; ?>clear.png" width="10" height="1" alt="" /></td>
174
                                <td valign="top" width="99%" class="contenttable <?=$main_body_class;?>">
175
176
	<?php
177
        echo $this->getBreadCrumbs();
178
        echo $this->getToolbar();
179
        $this->_feedback->display();
180
        echo $this->getNotificationPlaceholder();
181
	}
182
183
	function footer($params) {
184
185
	?>
186
187
			<!-- end main body row -->
188
189
190
				</td>
191
				<td width="10"><img src="<?php echo $this->imgroot; ?>clear.png" width="2" height="1" alt="" /></td>
192
			</tr>
193
			<tr class="end_main_body_row">
194
				<td align="left"  width="9"><img src="<?php echo $this->imgroot; ?>tabs/bottomleft-inner.png" height="11" width="11" alt="" /></td>
195
				<td ><img src="<?php echo $this->imgroot; ?>clear.png" width="1" height="1" alt="" /></td>
196
				<td align="right" width="9"><img src="<?php echo $this->imgroot; ?>tabs/bottomright-inner.png" height="11" width="11" alt="" /></td>
197
			</tr>
198
            </table>
199
200
		<!-- end inner body row -->
201
202
		</td>
203
		<td width="10"><img src="<?php echo $this->imgroot; ?>clear.png" width="2" height="1" alt="" /></td>
204
	</tr>
205
	<tr class="end_inner_body_row">
206
		<td align="left" width="9"><img src="<?php echo $this->imgroot; ?>tabs/bottomleft.png" height="9" width="9" alt="" /></td>
207
		<td colspan="3"><img src="<?php echo $this->imgroot; ?>clear.png" width="1" height="1" alt="" /></td>
208
		<td align="right" width="9"><img src="<?php echo $this->imgroot; ?>tabs/bottomright.png" height="9" width="9" alt="" /></td>
209
	</tr>
210
    <?php echo $this->getCustomFooter(); ?>
211
</table>
212
213
<?php
214
        $this->generic_footer($params);
215
	}
216
217
    function getCustomFooter() {
218
        return '';
219
    }
220
    
221
222
	/**
223
	 * boxTop() - Top HTML box
224
	 *
225
	 * @param   string  Box title
226
	 * @param   bool	Whether to echo or return the results
227
	 * @param   string  The box background color
228
	 */
229
	function boxTop($title) {
230
        return '
231
		<!-- Box Top Start -->
232
233
		<table cellspacing="0" cellpadding="0" width="100%" border="0" class="boxtop">
234
		<tr align="center" class="boxtop_top">
235
			<td class="boxtop_left" valign="top" align="right" width="10" background="'.$this->imgroot.'box-topleft.png"><img src="'.$this->imgroot.'clear.png" width="10" height="20" /></td>
236
			<td class="boxtop_center" width="100%"><span class="titlebar">'.$title.'</span></td>
237
			<td class="boxtop_right" valign="top" width="10"><img src="'.$this->imgroot.'clear.png" width="10" height="20" /></td>
238
		</tr>
239
		<tr>
240
			<td colspan="3">
241
			<table class="boxtop_inner" cellspacing="0" cellpadding="2" width="100%" border="0">
242
				<tr align="left"">
243
					<td colspan="2" >
244
245
		<!-- Box Top End -->';
246
	}
247
248
	/**
249
	 * boxMiddle() - Middle HTML box
250
	 *
251
	 * @param   string  Box title
252
	 * @param   string  The box background color
253
	 */
254
	function boxMiddle($title) {
255
        return '
256
		<!-- Box Middle Start -->
257
					</td>
258
				</tr>
259
				<tr align="center" class="boxmiddle">
260
					<td colspan="2"><span class="titlebar">'.$title.'</span></td>
261
				</tr>
262
				<tr align="left" class="boxmiddle_inner">
263
					<td colspan="2">
264
		<!-- Box Middle End -->';
265
	}
266
267
	/**
268
	 * boxBottom() - Bottom HTML box
269
	 *
270
	 * @param   bool	Whether to echo or return the results
271
	 */
272
	function boxBottom() {
273
        return '
274
			<!-- Box Bottom Start -->
275
					</td>
276
				</tr>
277
			</table>
278
			</td>
279
		</tr>
280
		</table><br />
281
		<!-- Box Bottom End -->';
282
	}
283
284
	/**
285
	 * boxGetAltRowStyle() - Get an alternating row style for tables
286
	 *
287
	 * @param			   int			 Row number
288
	 */
289
	function boxGetAltRowStyle($i) {
290
		if ($i % 2 == 0) {
291
			return 'background="'.$this->imgroot.'vert-grad.png"';
292
		} else {
293
			return 'background="'.$this->imgroot.'box-grad.png"';
294
		}
295
	}
296
297
	function outerTabs($params) {
298
		global $Language;
299
300
		$TABS_DIRS[]='/';
301
		$TABS_TITLES[]=$Language->getText('menu','home');
302
303
		if (user_isloggedin()) {
304
            $TABS_DIRS[]='/my/';
305
            $TABS_TITLES[]=$Language->getText('menu','my_personal_page');
306
        }
307
        
308
        if ($GLOBALS['sys_use_trove'] != 0) {
309
            $TABS_DIRS[]='/softwaremap/';
310
            $TABS_TITLES[]=$Language->getText('menu','projectree');
311
        }
312
313
        if ($GLOBALS['sys_use_snippet'] != 0) {
314
            $TABS_DIRS[]='/snippet/';
315
            $TABS_TITLES[]=$Language->getText('menu','code_snippet');
316
        }
317
	if (user_ismember(1,'A')) {
318
            $TABS_DIRS[]='/admin/';
319
            $TABS_TITLES[]=$Language->getText('menu','admin');
320
	}
321
322
        $TABS_DIRS[]='/site/';
323
        $TABS_TITLES[]=$Language->getText('include_layout','Help');
324
        
325
        /*
326
		if (user_ismember($GLOBALS['sys_stats_group'])) {
327
			$TABS_DIRS[]='/reporting/';
328
			$TABS_TITLES[]=$Language->getText('menu','reporting');
329
		}
330
        */
331
        $selected_top_tab = isset($params['selected_top_tab']) ? $params['selected_top_tab'] : '';
332
		if(isset($params['group']) && $params['group']) {
333
			// get group info using the common result set
334
			$pm = ProjectManager::instance();
335
            $project = $pm->getProject($params['group']);
336
			if ($project && is_object($project)) {
337
				if ($project->isError()) {
338
339
				} else {
340
					    $selected=array_search("/softwaremap/", $TABS_DIRS);
341
				}
342
			}
343
		} else if (strstr(getStringFromServer('REQUEST_URI'),'/my/')   ||
344
				strstr(getStringFromServer('REQUEST_URI'),'/themes/') ||
345
                strstr(getStringFromServer('REQUEST_URI'),'/account/') ) {
346
			$selected=array_search("/my/", $TABS_DIRS);
347
        } elseif (strstr(getStringFromServer('REQUEST_URI'),'softwaremap')) {
348
			$selected=array_search("/softwaremap/", $TABS_DIRS);
349
		} elseif (strstr(getStringFromServer('REQUEST_URI'),'/snippet/')) {
350
			$selected=array_search("/snippet/", $TABS_DIRS);
351
		} elseif (strstr(getStringFromServer('REQUEST_URI'),'/site/')) {
352
			$selected=array_search("/site/", $TABS_DIRS);
353
		} elseif (strstr(getStringFromServer('REQUEST_URI'),'/reporting/')) {
354
			$selected=array_search('/reporting/',$TABS_DIRS);
355
		} elseif ((strstr(getStringFromServer('REQUEST_URI'),'/admin/') || $selected_top_tab == 'admin') && user_ismember(1,'A')) {
356
			$selected=array_search('/admin/',$TABS_DIRS);;
357
		} elseif ($selected_top_tab && (array_search($selected_top_tab,$TABS_DIRS) !== FALSE)) {
358
            $selected = array_search($selected_top_tab,$TABS_DIRS);
359
        } else {
360
			$selected=0;
361
		}
362
		echo $this->tabGenerator($TABS_DIRS,$TABS_TITLES,false,$selected,null,'100%');
0 ignored issues
show
It seems like $selected can also be of type integer; however, TabbedLayout::tabGenerator() does only seem to accept boolean, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
363
364
	}
365
366
	/**
367
	 *	projectTabs() - Prints out the project tabs, contained here in case
368
	 *		we want to allow it to be overriden
369
	 *
370
	 *	@param	string	Is the tab currently selected
371
	 *	@param	string	Is the group we should look up get title info
372
	 */
373
	function projectTabs($toptab,$group) {
374
        $this->project_tabs($toptab,$group);
375
    }
376
    
377
    function project_tabs($toptab,$group_id) {
378
        $pm = ProjectManager::instance();
379
        $project=$pm->getProject($group_id);
380
        if ($project->isError()) {
381
            //wasn't found or some other problem
382
            return;
383
        }
384
        $output   = '';
385
        $tabs     = $this->_getProjectTabs($toptab, $project);
386
        $nb       = count($tabs);
387
        $selected = false;
388
        $TABS_DIRS   = array();
389
        $TABS_TITLES = array();
390
        for($i = 0; $i < $nb ; $i++) {
391
            $TABS_DIRS[]   = $tabs[$i]['link'];
392
            $TABS_TITLES[] = $tabs[$i]['label'];
393
            if ($tabs[$i]['enabled'] === true) {
394
                $selected = $i;
395
            }
396
        }
397
        $output .= $this->tabGenerator($TABS_DIRS,$TABS_TITLES,true,$selected);
0 ignored issues
show
It seems like $selected defined by $i on line 394 can also be of type integer; however, TabbedLayout::tabGenerator() does only seem to accept boolean, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
398
        echo $output;
399
	}
400
401
    /**
402
    * @param sel_tab_bgcolor DEPRECATED
403
    */
404
	function tabGenerator($TABS_DIRS,$TABS_TITLES,$nested=false,$selected=false,$sel_tab_bgcolor='WHITE',$total_width='100%') {
405
		$count=count($TABS_DIRS);
406
		$width=intval((100/$count));
407
		
408
		$return = '';
409
		
410
		$return .= '
411
412
		<!-- start tabs -->
413
414
		<table border="0" cellpadding="0" cellspacing="0" width="'.$total_width.'">
415
		<tr>';
416
		if ($nested) {
417
			$inner='bottomtab';
418
		} else {
419
			$inner='toptab';
420
		}
421
		$rowspan = '';
422
		for ($i=0; $i<$count; $i++) {
423
			if ($i == 0) {
424
				//
425
				//	this is the first tab, choose an image with end-name
426
				//
427
				$wassel=false;
428
				$issel=($selected==$i);
429
				$bgimg=(($issel)?'theme-'.$inner.'-selected-bg.png':'theme-'.$inner.'-notselected-bg.png');
430
		//		$rowspan=(($issel)?'rowspan="2" ' : '');
431
432
				$return .= '
433
					<td '.$rowspan.'valign="top" width="10" background="'.$this->imgroot . 'theme-'.$inner.'-end-'.(($issel) ? '' : 'not').'selected.png">'.
434
						'<img src="'.$this->imgroot . 'clear.png" height="25" width="10" alt="" /></td>'.
435
						'<td '.$rowspan.'background="'.$this->imgroot . $bgimg.'" width="'.$width.'%" align="center"><a class="'. (($issel)?'tabsellink':'tablink') .'" href="'.$TABS_DIRS[$i].'">'.$TABS_TITLES[$i].'</a></td>';
436
			} elseif ($i==$count-1) {
437
				//
438
				//	this is the last tab, choose an image with name-end
439
				//
440
				$wassel=($selected==$i-1);
441
				$issel=($selected==$i);
442
				$bgimg=(($issel)?'theme-'.$inner.'-selected-bg.png':'theme-'.$inner.'-notselected-bg.png');
443
		//		$rowspan=(($issel)?'rowspan="2" ' : '');
444
				//
445
				//	Build image between current and prior tab
446
				//
447
				$return .= '
448
					<td '.$rowspan.'colspan="2" valign="top" width="20" background="'.$this->imgroot . 'theme-'.$inner.'-'.(($wassel) ? '' : 'not').'selected-'.(($issel) ? '' : 'not').'selected.png">'.
449
						'<img src="'.$this->imgroot . 'clear.png" height="2" width="20" alt="" /></td>'.
450
						'<td '.$rowspan.'background="'.$this->imgroot . $bgimg.'" width="'.$width.'%" align="center" nowrap="nowrap"><a class="'. (($issel)?'tabsellink':'tablink') .'" href="'.$TABS_DIRS[$i].'">'.$TABS_TITLES[$i].'</a></td>';
451
				//
452
				//	Last graphic on right-side
453
				//
454
				$return .= '
455
					<td '.$rowspan.'valign="top" width="10" background="'.$this->imgroot . 'theme-'.$inner.'-'.(($issel) ? '' : 'not').'selected-end.png">'.
456
						'<img src="'.$this->imgroot . 'clear.png" height="2" width="10" alt="" /></td>';
457
458
			} else {
459
				//
460
				//	middle tabs
461
				//
462
				$wassel=($selected==$i-1);
463
				$issel=($selected==$i);
464
				$bgimg=(($issel)?'theme-'.$inner.'-selected-bg.png':'theme-'.$inner.'-notselected-bg.png');
465
		//		$rowspan=(($issel)?'rowspan="2" ' : '');
466
				//
467
				//	Build image between current and prior tab
468
				//
469
				$return .= '
470
					<td '.$rowspan.'colspan="2" valign="top" width="20" background="'.$this->imgroot . 'theme-'.$inner.'-'.(($wassel) ? '' : 'not').'selected-'.(($issel) ? '' : 'not').'selected.png">'.
471
						'<img src="'.$this->imgroot . 'clear.png" height="2" width="20" alt="" /></td>'.
472
						'<td '.$rowspan.'background="'.$this->imgroot . $bgimg.'" width="'.$width.'%" align="center"><a class="'. (($issel)?'tabsellink':'tablink') .'" href="'.$TABS_DIRS[$i].'">'.$TABS_TITLES[$i].'</a></td>';
473
474
			}
475
		}
476
		$return .= '</tr>';
477
478
		//
479
		//	Building a bottom row in this table, which will be darker
480
		//
481
		if ($selected == 0) {
482
			$beg_cols=0;
483
			$end_cols=((count($TABS_DIRS)*3)-3);
484
		} elseif ($selected == (count($TABS_DIRS)-1)) {
485
			$beg_cols=((count($TABS_DIRS)*3)-3);
486
			$end_cols=0;
487
		} else {
488
			$beg_cols=($selected*3);
489
			$end_cols=(((count($TABS_DIRS)*3)-3)-$beg_cols);
490
		}
491
		$return .= '<tr>';
492
		if ($beg_cols > 0) {
493
			$return .= '<td colspan="'.$beg_cols.'" height="1" class="below_tabs"><img src="'.$this->imgroot.'clear.png" height="1" width="10" /></td>';
494
		}
495
		$return .= '<td colspan="3" height="1" class="below_tabs_selected_'.$inner.'"><img src="'.$this->imgroot.'clear.png" height="1" width="10" /></td>';
496
		if ($end_cols > 0) {
497
			$return .= '<td colspan="'.$end_cols.'" height="1" class="below_tabs"><img src="'.$this->imgroot.'clear.png" height="1" width="10" /></td>';
498
		}
499
		$return .= '</tr>';
500
		return $return.'
501
		</table> 
502
503
		<!-- end tabs -->
504
';
505
	}
506
507
	function searchBox() {
508
        print $this->getSearchBox();
509
	}
510
	
511
	//diplaying search box in body
512
    function bodySearchBox() {
513
    	//do nothing
514
    }
515
	
516
	/**
517
	 * feedback() - returns the htmlized feedback string when an action is performed.
518
	 *
519
	 * @param string feedback string
520
	 * @return string htmlized feedback
521
	 */
522
	function feedback($feedback) {
523
        if (!$feedback) {
524
			return '';
525
		} else {
526
			return '
527
				<h3><span class="feedback">'.strip_tags($feedback, '<br>').'</span></h3>';
528
		}
529
	}
530
531
    
532
    function menuhtml_top($title) {
533
        //do nothing, we are tabbed !
534
    }
535
    function menuhtml_bottom() {
536
        //do nothing, we are tabbed !
537
    }
538
	function menu_entry($link, $title) {
539
        //do nothing, we are tabbed !
540
    }
541
542
543
    //For GForge compatibility
544
	function box1_top($title,$echoout=1,$bgcolor='',$cols=2){
545
        if ($echoout) {
546
            print $this->boxTop($title);
547
        } else {
548
            return $this->boxTop($title);
549
        }
550
	}
551
552
	function box1_middle($title,$bgcolor='',$cols=2) {
553
		return $this->boxMiddle($title);
554
	}
555
556
	function box1_bottom($echoout=1) {
557
        if ($echoout) {
558
            print $this->boxBottom();
559
        } else {
560
            return $this->boxBottom();
561
        }
562
	}
563
}
564
565
?>
566