511 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			511 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| /**
 | |
|  * Page Rendering Functions
 | |
|  *
 | |
|  * @author The phpLDAPadmin development team
 | |
|  * @package phpLDAPadmin
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * This class controls the final output to the browser.
 | |
|  *
 | |
|  * @package phpLDAPadmin
 | |
|  * @subpackage Page
 | |
|  */
 | |
| class page {
 | |
| 	# pre-HTML headers
 | |
| 	protected $_pageheader;
 | |
| 
 | |
| 	# Items to get into the <head>
 | |
| 	protected $_head;
 | |
| 
 | |
| 	# Settings for this application
 | |
| 	protected $_app;
 | |
| 
 | |
| 	# Default values array.
 | |
| 	protected $_default;
 | |
| 
 | |
| 	public function __construct($index=null) {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		# If we done have a configuration, then our IMGDIR and CSS are not defined
 | |
| 		if (! defined('IMGDIR'))
 | |
| 			define('IMGDIR','images/default');
 | |
| 		if (! defined('CSSDIR'))
 | |
| 			define('CSSDIR','css/default');
 | |
| 
 | |
| 		$this->index = $index;
 | |
| 
 | |
| 		# To be defined in a configuration file.
 | |
| 		$this->_app['title'] = app_name();
 | |
| 		$this->_app['logo'] = IMGDIR.'/logo-small.png';
 | |
| 
 | |
| 		if (! is_null($index))
 | |
| 			$this->_app['urlcss'] = sprintf('%s/%s',CSSDIR,$_SESSION[APPCONFIG]->getValue('appearance','stylesheet'));
 | |
| 		else
 | |
| 			$this->_app['urlcss'] = sprintf('%s/%s',CSSDIR,'style.css');
 | |
| 
 | |
| 		# Default Values for configurable items.
 | |
| 		$this->_default['sysmsg']['error'] = IMGDIR.'/error-big.png';
 | |
| 		$this->_default['sysmsg']['warn'] = IMGDIR.'/warn-big.png';
 | |
| 		$this->_default['sysmsg']['info'] = IMGDIR.'/info-big.png';
 | |
| 
 | |
| 		# Capture any output so far (in case we send some headers below) - there shouldnt be any output anyway.
 | |
| 		$preOutput = '';
 | |
| 
 | |
| 		# Try and work around if php compression is on, or the user has set compression in the config.
 | |
| 		# type = 1 for user gzip, 0 for php.ini gzip.
 | |
| 		$obStatus = ob_get_status();
 | |
| 		if (isset($obStatus['type']) && $obStatus['type'] && $obStatus['status']) {
 | |
| 			$preOutput = ob_get_contents();
 | |
| 			ob_end_clean();
 | |
| 		}
 | |
| 
 | |
| 		header('Content-type: text/html; charset="UTF-8"');
 | |
| 		if (isCompress()) {
 | |
| 			header('Content-Encoding: gzip');
 | |
| 
 | |
| 			if (defined('DEBUG_ENABLED') && DEBUG_ENABLED)
 | |
| 				debug_log('Sent COMPRESSED header to browser and discarded (%s)',129,0,__FILE__,__LINE__,__METHOD__,$preOutput);
 | |
| 		}
 | |
| 
 | |
| 		if (isset($_SESSION[APPCONFIG])
 | |
| 			&& $_SESSION[APPCONFIG]->getValue('appearance','compress')
 | |
| 			&& ini_get('zlib.output_compression'))
 | |
| 				$this->setsysmsg(array('title'=>_('Warning'),'body'=>_('WARNING: You cannot have PHP compression and application compression enabled at the same time. Please unset zlib.output_compression or set $config->custom->appearance[\'compress\']=false'),'type'=>'warn'));
 | |
| 
 | |
| 		# Turn back on output buffering.
 | |
| 		ob_start();
 | |
| 
 | |
| 		# Initial Values
 | |
| 		$this->_pageheader[] = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
 | |
| 		$this->_pageheader[] .= '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="auto">'."\n";
 | |
| 	}
 | |
| 
 | |
| 	/* Add to the HTML Header */
 | |
| 	public function head_add($html) {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		$this->_head[] .= $html;
 | |
| 	}
 | |
| 
 | |
| 	/* Print out the HTML header */
 | |
| 	private function pageheader_print() {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		# HTML prepage requirements.
 | |
| 		foreach ($this->_pageheader as $line)
 | |
| 			echo $line."\n";
 | |
| 
 | |
| 		# Page Title
 | |
| 		echo '<head>';
 | |
| 		printf('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />');
 | |
| 
 | |
| 		$DNs = get_request('dn','REQUEST');
 | |
| 		if (is_array($DNs))
 | |
| 			$DNs = '';
 | |
| 
 | |
| 		if (isset($_SESSION[APPCONFIG]))
 | |
| 			printf('<title>%s (%s) - %s%s</title>',
 | |
| 				$this->_app['title'],
 | |
| 				app_version(),
 | |
| 				$DNs ? htmlspecialchars($DNs).' ' : '',
 | |
| 				$_SESSION[APPCONFIG]->getValue('appearance','page_title'));
 | |
| 		else
 | |
| 			printf('<title>%s - %s</title>',$this->_app['title'],app_version());
 | |
| 
 | |
| 		echo '<link rel="shortcut icon" href="images/favicon.ico" type="image/vnd.microsoft.icon" />';
 | |
| 		# Style sheet.
 | |
| 		printf('<link type="text/css" rel="stylesheet" href="%s" />',$this->_app['urlcss']);
 | |
| 
 | |
| 		if (defined('JSDIR')) {
 | |
| 			printf('<link type="text/css" rel="stylesheet" media="all" href="%sjscalendar/calendar-blue.css" title="blue" />',JSDIR);
 | |
| 			echo "\n";
 | |
| 			printf('<script type="text/javascript" src="%sajax_functions.js"></script>',JSDIR);
 | |
| 			printf('<script type="text/javascript" src="%sjscalendar/calendar.js"></script>',JSDIR);
 | |
| 			echo "\n";
 | |
| 		}
 | |
| 
 | |
| 		# HTML head requirements.
 | |
| 		if (is_array($this->_head) && count($this->_head))
 | |
| 			foreach ($this->_head as $line)
 | |
| 				echo $line."\n";
 | |
| 
 | |
| 		echo '</head>';
 | |
| 		echo "\n";
 | |
| 	}
 | |
| 
 | |
| 	private function head_print() {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		if (isset($_SESSION[APPCONFIG]))
 | |
| 			$pagetitle = $_SESSION[APPCONFIG]->getValue('appearance','page_title') ? ' - '.$_SESSION[APPCONFIG]->getValue('appearance','page_title') : '';
 | |
| 		else
 | |
| 			$pagetitle = '';
 | |
| 
 | |
| 		echo '<tr class="pagehead">';
 | |
| 
 | |
| 		echo '<td colspan="3"><div id="ajHEAD"><table width="100%" border="0"><tr>';
 | |
| 		printf('<td style="text-align: left;"><a href="%s" onclick="target=\'_blank\';"><img src="%s" alt="Logo" class="logo" /></a></td>',get_href('sf'),$this->_app['logo']);
 | |
| 
 | |
| 		echo '<td class="imagetop">';
 | |
| 		$empty = true;
 | |
| 		if (function_exists('cmd_control_pane'))
 | |
| 			foreach (cmd_control_pane('top') as $cmddetails)
 | |
| 				if ((isset($cmddetails['enable']) && $cmddetails['enable']) || ! isset($cmddetails['enable'])) {
 | |
| 					if (! $empty)
 | |
| 						echo ' ';
 | |
| 
 | |
| 					printf('<a %s>%s</a>',$cmddetails['link'],$cmddetails['image']);
 | |
| 
 | |
| 					$empty = false;
 | |
| 				}
 | |
| 
 | |
| 		if ($empty)
 | |
| 			echo ' ';
 | |
| 
 | |
| 		echo '</td>';
 | |
| 		echo '</tr></table></div></td>';
 | |
| 		echo '</tr>';
 | |
| 		echo "\n";
 | |
| 	}
 | |
| 
 | |
| 	private function control_print() {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		echo '<table class="control" width="100%" border="0">';
 | |
| 		echo '<tr><td>';
 | |
| 
 | |
| 		$empty = true;
 | |
| 		if (function_exists('cmd_control_pane'))
 | |
| 			foreach (cmd_control_pane('main') as $cmddetails)
 | |
| 				if ((isset($cmddetails['enable']) && trim($cmddetails['enable'])) || ! isset($cmddetails['enable'])) {
 | |
| 					if (! $empty)
 | |
| 						echo ' | ';
 | |
| 
 | |
| 					printf('<a %s>%s</a>',$cmddetails['link'],
 | |
| 						(isset($_SESSION[APPCONFIG]) && $_SESSION[APPCONFIG]->getValue('appearance','control_icons')) ? $cmddetails['image'] : $cmddetails['title']);
 | |
| 
 | |
| 					$empty = false;
 | |
| 				}
 | |
| 
 | |
| 		echo '</td>';
 | |
| 		if ($empty)
 | |
| 			echo '<td> </td>';
 | |
| 
 | |
| 		echo '</tr>';
 | |
| 		echo '</table>';
 | |
| 	}
 | |
| 
 | |
| 	protected function tree() {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		if (! isset($_SESSION[APPCONFIG]))
 | |
| 			return;
 | |
| 
 | |
| 		if (is_null($this->index))
 | |
| 			$this->index = min(array_keys($_SESSION[APPCONFIG]->getServerList()));
 | |
| 
 | |
| 		if (count($_SESSION[APPCONFIG]->getServerList()) > 1) {
 | |
| 			echo '<form id="server_select" action="cmd.php" method="post">';
 | |
| 			echo '<table class="server_select"><tr><td>';
 | |
| 			printf('%s:<br />%s',('Server Select'),
 | |
| 				server_select_list($this->index,false,'index',true,sprintf("onchange=\"tree_unhide('index',%s)\"",$this->index)));
 | |
| 			echo '</td></tr></table>';
 | |
| 			echo '</form>';
 | |
| 			echo "\n\n";
 | |
| 		}
 | |
| 
 | |
| 		foreach ($_SESSION[APPCONFIG]->getServerList() as $index => $server) {
 | |
| 			printf('<div id="ajSID_%s" style="display: %s">',$server->getIndex(),($server->getIndex() == $this->index) ? 'block' : 'none');
 | |
| 			$tree = Tree::getInstance($server->getIndex());
 | |
| 			$tree->draw();
 | |
| 			echo '</div>';
 | |
| 			echo "\n\n";
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public function block_add($side,$object) {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		if (! is_object($object))
 | |
| 			error(sprintf('block_add called with [%s], but it is not an object',serialize($object)));
 | |
| 
 | |
| 		$this->_block[$side][] = $object;
 | |
| 	}
 | |
| 
 | |
| 	private function block_print($side) {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		if (! isset($this->_block[$side]))
 | |
| 			return;
 | |
| 
 | |
| 		printf('<td class="%s" colspan="2">',$side);
 | |
| 		foreach ($this->_block[$side] as $object)
 | |
| 			echo $object->draw($side);
 | |
| 		echo '</td>';
 | |
| 	}
 | |
| 
 | |
| 	private function sysmsg() {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		if (isset($this->sysmsg)) {
 | |
| 			foreach ($this->sysmsg as $index => $details) {
 | |
| 				switch ($details['type']) {
 | |
| 					case 'error':
 | |
| 						$icon = $this->_default['sysmsg']['error'];
 | |
| 						break;
 | |
| 
 | |
| 					case 'warn':
 | |
| 						$icon = $this->_default['sysmsg']['warn'];
 | |
| 						break;
 | |
| 
 | |
| 					case 'info':
 | |
| 					default:
 | |
| 						$icon = $this->_default['sysmsg']['info'];
 | |
| 						break;
 | |
| 				}
 | |
| 
 | |
| 				if (isset($details['title']))
 | |
| 					printf('<tr><td class="icon" rowspan="2"><img src="%s" alt="%s" /></td><td class="head">%s</td></tr>',
 | |
| 						$icon,$details['type'],$details['title']);
 | |
| 
 | |
| 				if (isset($details['body']))
 | |
| 					if (is_array($details['body'])) {
 | |
| 						echo '<tr><td class="body">';
 | |
| 						foreach ($details['body'] as $line)
 | |
| 							printf('%s<br />',$line);
 | |
| 						echo '</td></tr>';
 | |
| 
 | |
| 					} else
 | |
| 						printf('<tr><td class="body">%s</td></tr>',$details['body']);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private function body($raw=false) {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		# Add the Session System Messages
 | |
| 		if (isset($_SESSION['sysmsg']) && is_array($_SESSION['sysmsg'])) {
 | |
| 			foreach ($_SESSION['sysmsg'] as $msg) 
 | |
| 				$this->setsysmsg($msg);
 | |
| 
 | |
| 			unset($_SESSION['sysmsg']);
 | |
| 		}
 | |
| 
 | |
| 		if (isset($this->sysmsg)) {
 | |
| 			echo '<table class="sysmsg">';
 | |
| 			$this->sysmsg();
 | |
| 			echo '</table>';
 | |
| 			echo "\n";
 | |
| 		}
 | |
| 
 | |
| 		if (isset($this->_block['body']))
 | |
| 			foreach ($this->_block['body'] as $object)
 | |
| 				echo $object->draw('body',$raw);
 | |
| 	}
 | |
| 
 | |
| 	private function footer_print() {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		printf('<tr class="foot"><td><small>%s</small></td><td colspan="2"><div id="ajFOOT">%s</div>%s</td></tr>',
 | |
| 			isCompress() ? '[C]' : ' ',
 | |
| 			app_version(),
 | |
| 			get_href('logo') ? sprintf('<a href="%s"><img src="%s" alt="SourceForge.net Logo" style="border: 0px;" /></a>',get_href('sf'),get_href('logo')) : ' ');
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Only show a particular page frame - used by an AJAX call
 | |
| 	 */
 | |
| 	public function show($frame,$compress=false,$raw=false) {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		# If the body is called via AJAX, and compression is enable, we need to compress the output
 | |
| 		if ($compress && ob_get_level() && isCompress()) {
 | |
| 			ob_end_clean();
 | |
| 			ob_start();
 | |
| 		}
 | |
| 
 | |
| 		switch ($frame) {
 | |
| 			case 'BODY':
 | |
| 				$this->body($raw);
 | |
| 				break;
 | |
| 
 | |
| 			case 'TREE':
 | |
| 				$this->tree();
 | |
| 				break;
 | |
| 
 | |
| 			default:
 | |
| 				error(sprintf('show called with unknown frame [%s]',$frame),'error','index.php');
 | |
| 		}
 | |
| 
 | |
| 		if ($compress && ob_get_level() && isCompress()) {
 | |
| 			$output = ob_get_contents();
 | |
| 			ob_end_clean();
 | |
| 
 | |
| 			if (defined('DEBUG_ENABLED') && DEBUG_ENABLED)
 | |
| 				debug_log('Sending COMPRESSED output to browser[(%s),%s]',129,0,__FILE__,__LINE__,__METHOD__,
 | |
| 					strlen($output),$output);
 | |
| 
 | |
| 			print gzencode($output);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public function display($filter=array()) {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		# Control what is displayed.
 | |
| 		$display = array(
 | |
| 			'HEAD'=>false,
 | |
| 			'CONTROL'=>false,
 | |
| 			'TREE'=>true,
 | |
| 			'FOOT'=>false
 | |
| 		);
 | |
| 
 | |
| 		$display = array_merge($display,$filter);
 | |
| 
 | |
| 		# HTML Header
 | |
| 		$this->pageheader_print();
 | |
| 
 | |
| 		# Start of body
 | |
| 		# Page Header
 | |
| 		echo '<body>';
 | |
| 		echo "\n";
 | |
| 		echo '<table class="page" border="0" width="100%">';
 | |
| 
 | |
| 		if ($display['HEAD'])
 | |
| 			$this->head_print();
 | |
| 
 | |
| 		# Control Line
 | |
| 		if ($display['CONTROL']) {
 | |
| 			echo '<tr class="control"><td colspan="3">';
 | |
| 			echo '<div id="ajCONTROL">';
 | |
| 			$this->control_print();
 | |
| 			echo '</div></td></tr>';
 | |
| 			echo "\n";
 | |
| 		}
 | |
| 
 | |
| 		# Left Block
 | |
| 		echo '<tr>';
 | |
| 
 | |
| 		if ($display['TREE']) {
 | |
| 			echo '<td class="tree" colspan="2">';
 | |
| 			printf('<acronym title="%s"><img src="%s/plus.png" alt="" style="float: right;" onclick="if (document.getElementById(\'ajTREE\').style.display == \'none\') { document.getElementById(\'ajTREE\').style.display = \'block\' } else { document.getElementById(\'ajTREE\').style.display = \'none\' };"/></acronym>',_('Hide/Unhide the tree'),IMGDIR);
 | |
| 			echo '<div id="ajTREE">';
 | |
| 			$this->tree();
 | |
| 			echo '</div>';
 | |
| 			echo '</td>';
 | |
| 		}
 | |
| 
 | |
| 		echo '<td class="body" style="width: 80%;">';
 | |
| 		echo '<div id="ajBODY">';
 | |
| 		echo "\n";
 | |
| 		$this->body();
 | |
| 		echo '</div>';
 | |
| 		echo '</td>';
 | |
| 		echo '</tr>';
 | |
| 		echo "\n";
 | |
| 
 | |
| 		# Page Footer
 | |
| 		if ($display['FOOT'])
 | |
| 			$this->footer_print();
 | |
| 
 | |
| 		# Finish HTML
 | |
| 		echo '</table>';
 | |
| 		echo '</body>';
 | |
| 		echo '</html>';
 | |
| 
 | |
| 		# compress output
 | |
| 		if (ob_get_level() && isCompress()) {
 | |
| 			$output = ob_get_contents();
 | |
| 			ob_end_clean();
 | |
| 
 | |
| 			if (defined('DEBUG_ENABLED') && DEBUG_ENABLED)
 | |
| 				debug_log('Sending COMPRESSED output to browser[(%s),%s]',129,0,__FILE__,__LINE__,__METHOD__,
 | |
| 					strlen($output),$output);
 | |
| 
 | |
| 			print gzencode($output);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public function setsysmsg($data) {
 | |
| 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
 | |
| 			debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
 | |
| 
 | |
| 		if (! is_array($data))
 | |
| 			return;
 | |
| 
 | |
| 		if (isset($this->sysmsg))
 | |
| 			$msgnum = count($this->sysmsg) + 1;
 | |
| 		else
 | |
| 			$msgnum = 1;
 | |
| 
 | |
| 		foreach (array('title','body','type') as $index)
 | |
| 			if (isset($data[$index]))
 | |
| 				$this->sysmsg[$msgnum][$index] = $data[$index];
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * This class draws a block.
 | |
|  *
 | |
|  * @package phpLDAPadmin
 | |
|  * @subpackage Page
 | |
|  */
 | |
| class block {
 | |
| 	private $title;
 | |
| 	private $body;
 | |
| 	private $foot;
 | |
| 
 | |
| 	public function setTitle($html) {
 | |
| 		$this->title = $html;
 | |
| 	}
 | |
| 
 | |
| 	public function setBody($html) {
 | |
| 		$this->body = $html;
 | |
| 	}
 | |
| 
 | |
| 	public function setFooter($html) {
 | |
| 		$this->foot = $html;
 | |
| 	}
 | |
| 
 | |
| 	public function draw($side,$raw=false) {
 | |
| 		$output = '';
 | |
| 
 | |
| 		if ($raw)
 | |
| 			$output .= $this->body;
 | |
| 
 | |
| 		else {
 | |
| 			$output .= sprintf('<table class="%s">',$side);
 | |
| 
 | |
| 			if (isset($this->title))
 | |
| 				$output .= sprintf('<tr><td class="head">%s</td></tr>',$this->title);
 | |
| 
 | |
| 			if (isset($this->body))
 | |
| 				$output .= sprintf('<tr><td>%s</td></tr>',$this->body);
 | |
| 
 | |
| 			if (isset($this->footer))
 | |
| 				$output .= sprintf('<tr><td class="foot">%s</td></tr>',$this->foot);
 | |
| 
 | |
| 			$output .= '</table>';
 | |
| 		}
 | |
| 
 | |
| 		return $output;
 | |
| 	}
 | |
| }
 | |
| ?>
 |