PageRenderTime 154ms CodeModel.GetById 46ms app.highlight 65ms RepoModel.GetById 13ms app.codeStats 2ms

/typo3/template.php

https://bitbucket.org/linxpinx/mercurial
PHP | 2314 lines | 1230 code | 262 blank | 822 comment | 173 complexity | 404c7af5a79b74610f6c8cc7a3562f11 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

   1<?php
   2/***************************************************************
   3*  Copyright notice
   4*
   5*  (c) 1999-2010 Kasper Skaarhoj (kasperYYYY@typo3.com)
   6*  All rights reserved
   7*
   8*  This script is part of the TYPO3 project. The TYPO3 project is
   9*  free software; you can redistribute it and/or modify
  10*  it under the terms of the GNU General Public License as published by
  11*  the Free Software Foundation; either version 2 of the License, or
  12*  (at your option) any later version.
  13*
  14*  The GNU General Public License can be found at
  15*  http://www.gnu.org/copyleft/gpl.html.
  16*  A copy is found in the textfile GPL.txt and important notices to the license
  17*  from the author is found in LICENSE.txt distributed with these scripts.
  18*
  19*
  20*  This script is distributed in the hope that it will be useful,
  21*  but WITHOUT ANY WARRANTY; without even the implied warranty of
  22*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23*  GNU General Public License for more details.
  24*
  25*  This copyright notice MUST APPEAR in all copies of the script!
  26***************************************************************/
  27/**
  28 * Contains class with layout/output function for TYPO3 Backend Scripts
  29 *
  30 * $Id: template.php 8429 2010-07-28 09:19:00Z ohader $
  31 * Revised for TYPO3 3.6 2/2003 by Kasper Skaarhoj
  32 * XHTML-trans compliant
  33 *
  34 * @author	Kasper Skaarhoj <kasperYYYY@typo3.com>
  35 */
  36/**
  37 * [CLASS/FUNCTION INDEX of SCRIPT]
  38 *
  39 *  145: function fw($str)
  40 *
  41 *
  42 *  169: class template
  43 *  224:     function template()
  44 *
  45 *              SECTION: EVALUATION FUNCTIONS
  46 *  298:     function wrapClickMenuOnIcon($str,$table,$uid='',$listFr=1,$addParams='',$enDisItems='', $returnOnClick=FALSE)
  47 *  315:     function viewPageIcon($id,$backPath,$addParams='hspace="3"')
  48 *  341:     function issueCommand($params,$rUrl='')
  49 *  356:     function isCMlayers()
  50 *  366:     function thisBlur()
  51 *  376:     function helpStyle()
  52 *  393:     function getHeader($table,$row,$path,$noViewPageIcon=0,$tWrap=array('',''))
  53 *  419:     function getFileheader($title,$path,$iconfile)
  54 *  434:     function makeShortcutIcon($gvList,$setList,$modName,$motherModName="")
  55 *  467:     function makeShortcutUrl($gvList,$setList)
  56 *  488:     function formWidth($size=48,$textarea=0,$styleOverride='')
  57 *  513:     function formWidthText($size=48,$styleOverride='',$wrap='')
  58 *  530:     function redirectUrls($thisLocation='')
  59 *  554:     function formatTime($tstamp,$type)
  60 *  571:     function parseTime()
  61 *
  62 *              SECTION: PAGE BUILDING FUNCTIONS.
  63 *  604:     function startPage($title)
  64 *  686:     function endPage()
  65 *  720:     function header($text)
  66 *  741:     function section($label,$text,$nostrtoupper=FALSE,$sH=FALSE,$type=0,$allowHTMLinHeader=FALSE)
  67 *  765:     function divider($dist)
  68 *  781:     function spacer($dist)
  69 *  800:     function sectionHeader($label,$sH=FALSE,$addAttrib='')
  70 *  817:     function sectionBegin()
  71 *  838:     function sectionEnd()
  72 *  858:     function middle()
  73 *  867:     function endPageJS()
  74 *  884:     function docBodyTagBegin()
  75 *  894:     function docStyle()
  76 *  936:     function insertStylesAndJS($content)
  77 *  956:     function initCharset()
  78 *  968:     function generator()
  79 *
  80 *              SECTION: OTHER ELEMENTS
  81 * 1001:     function icons($type, $styleAttribValue='')
  82 * 1030:     function t3Button($onClick,$label)
  83 * 1041:     function dfw($string)
  84 * 1051:     function rfw($string)
  85 * 1061:     function wrapInCData($string)
  86 * 1078:     function wrapScriptTags($string, $linebreak=TRUE)
  87 * 1117:     function table($arr, $layout='')
  88 * 1159:     function menuTable($arr1,$arr2=array(), $arr3=array())
  89 * 1192:     function funcMenu($content,$menu)
  90 * 1210:     function clearCacheMenu($id,$addSaveOptions=0)
  91 * 1246:     function getContextMenuCode()
  92 * 1251:     function showClickmenu(table, uid, listFr, enDisItems, backPath, addParams)
  93 * 1280:     function showClickmenu_noajax(url)
  94 * 1287:     function showClickmenu_ajax(t3ajax)
  95 * 1472:     function getDragDropCode($table)
  96 * 1483:     function cancelDragEvent(event)
  97 * 1496:     function mouseMoveEvent (event)
  98 * 1509:     function dragElement(id,elementID)
  99 * 1528:     function dropElement(id)
 100 * 1577:     function getTabMenu($mainParams,$elementName,$currentValue,$menuItems,$script='',$addparams='')
 101 * 1607:     function getTabMenuRaw($menuItems)
 102 * 1676:     function getDynTabMenu($menuItems,$identString,$toggle=0,$foldout=FALSE,$newRowCharLimit=50,$noWrap=1,$fullWidth=FALSE,$defaultTabIndex=1)
 103 * 1801:     function getDynTabMenuJScode()
 104 * 1892:     function getVersionSelector($id,$noAction=FALSE)
 105 *
 106 *
 107 * 2060: class bigDoc extends template
 108 *
 109 *
 110 * 2069: class noDoc extends template
 111 *
 112 *
 113 * 2078: class smallDoc extends template
 114 *
 115 *
 116 * 2087: class mediumDoc extends template
 117 *
 118 * TOTAL FUNCTIONS: 57
 119 * (This index is automatically created/updated by the extension "extdeveval")
 120 *
 121 */
 122
 123
 124
 125if (!defined('TYPO3_MODE'))	die("Can't include this file directly.");
 126
 127
 128/**
 129 * Deprecated fontwrap function. Is just transparent now.
 130 *
 131 * @param	string		Input string
 132 * @return	string		Output string (in the old days this was wrapped in <font> tags)
 133 * @deprecated since TYPO3 3.6
 134 */
 135function fw($str) {
 136	t3lib_div::logDeprecatedFunction();
 137	return $str;
 138}
 139
 140
 141/**
 142 * TYPO3 Backend Template Class
 143 *
 144 * This class contains functions for starting and ending the HTML of backend modules
 145 * It also contains methods for outputting sections of content.
 146 * Further there are functions for making icons, links, setting form-field widths etc.
 147 * Color scheme and stylesheet definitions are also available here.
 148 * Finally this file includes the language class for TYPO3's backend.
 149 *
 150 * After this file $LANG and $TBE_TEMPLATE are global variables / instances of their respective classes.
 151 * This file is typically included right after the init.php file,
 152 * if language and layout is needed.
 153 *
 154 * Please refer to Inside TYPO3 for a discussion of how to use this API.
 155 *
 156 * @author	Kasper Skaarhoj <kasperYYYY@typo3.com>
 157 * @package TYPO3
 158 * @subpackage core
 159 */
 160class template {
 161
 162		// Vars you typically might want to/should set from outside after making instance of this class:
 163	var $backPath = '';				// 'backPath' pointing back to the PATH_typo3
 164	var $form='';					// This can be set to the HTML-code for a formtag. Useful when you need a form to span the whole page; Inserted exactly after the body-tag.
 165	var $JScodeLibArray = array();		// Similar to $JScode (see below) but used as an associative array to prevent double inclusion of JS code. This is used to include certain external Javascript libraries before the inline JS code. <script>-Tags are not wrapped around automatically
 166	var $JScode='';					// Additional header code (eg. a JavaScript section) could be accommulated in this var. It will be directly outputted in the header.
 167	var $extJScode = '';				// Additional header code for ExtJS. It will be included in document header and inserted in a Ext.onReady(function()
 168	var $JScodeArray = array();		// Similar to $JScode but for use as array with associative keys to prevent double inclusion of JS code. a <script> tag is automatically wrapped around.
 169	var $postCode='';				// Additional 'page-end' code could be accommulated in this var. It will be outputted at the end of page before </body> and some other internal page-end code.
 170	var $docType = '';				// Doc-type used in the header. Default is xhtml_trans. You can also set it to 'html_3', 'xhtml_strict' or 'xhtml_frames'.
 171	var $moduleTemplate = '';		// HTML template with markers for module
 172
 173		// Other vars you can change, but less frequently used:
 174	var $scriptID='';				// Script ID.
 175	var $bodyTagId='';				// Id which can be set for the body tag. Default value is based on script ID
 176	var $bodyTagAdditions='';		// You can add additional attributes to the body-tag through this variable.
 177	var $inDocStyles='';			// Additional CSS styles which will be added to the <style> section in the header
 178	var $inDocStylesArray=array();		// Like $inDocStyles but for use as array with associative keys to prevent double inclusion of css code
 179	var $form_rowsToStylewidth = 9.58;	// Multiplication factor for formWidth() input size (default is 48* this value).
 180	var $form_largeComp = 1.33;		// Compensation for large documents (used in class.t3lib_tceforms.php)
 181	var $endJS=1;					// If set, then a JavaScript section will be outputted in the bottom of page which will try and update the top.busy session expiry object.
 182
 183		// TYPO3 Colorscheme.
 184		// If you want to change this, please do so through a skin using the global var $TBE_STYLES
 185	var $bgColor = '#F7F3EF';		// Light background color
 186	var $bgColor2 = '#9BA1A8';		// Steel-blue
 187	var $bgColor3 = '#F6F2E6';		// dok.color
 188	var $bgColor4 = '#D9D5C9';		// light tablerow background, brownish
 189	var $bgColor5 = '#ABBBB4';		// light tablerow background, greenish
 190	var $bgColor6 = '#E7DBA8';		// light tablerow background, yellowish, for section headers. Light.
 191	var $hoverColor = '#254D7B';
 192	var $styleSheetFile = '';	// Filename of stylesheet (relative to PATH_typo3)
 193	var $styleSheetFile2 = '';		// Filename of stylesheet #2 - linked to right after the $this->styleSheetFile script (relative to PATH_typo3)
 194	var $styleSheetFile_post = '';	// Filename of a post-stylesheet - included right after all inline styles.
 195	var $backGroundImage = '';		// Background image of page (relative to PATH_typo3)
 196	var $inDocStyles_TBEstyle = '';	// Inline css styling set from TBE_STYLES array
 197
 198	/**
 199	 * Whether to use the X-UA-Compatible meta tag
 200	 * @var boolean
 201	 */
 202	protected $useCompatibilityTag = TRUE;
 203
 204		// Skinning
 205		// stylesheets from core
 206	protected $stylesheetsCore = array(
 207		'structure' => 'stylesheets/structure/',
 208		'visual' => 'stylesheets/visual/',
 209		'generatedSprites' => '../typo3temp/sprites/',
 210	);
 211
 212		// include these CSS directories from skins by default
 213	protected $stylesheetsSkins = array(
 214		'structure' => 'stylesheets/structure/',
 215		'visual' => 'stylesheets/visual/',
 216	);
 217
 218		// DEV:
 219	var $parseTimeFlag = 0;			// Will output the parsetime of the scripts in milliseconds (for admin-users). Set this to false when releasing TYPO3. Only for dev.
 220
 221		// INTERNAL
 222	var $charset = 'iso-8859-1';	// Default charset. see function initCharset()
 223
 224	var $sectionFlag=0;				// Internal: Indicates if a <div>-output section is open
 225	var $divClass = '';				// (Default) Class for wrapping <DIV>-tag of page. Is set in class extensions.
 226
 227	var $pageHeaderBlock = '';
 228	var $endOfPageJsBlock = '';
 229
 230	var $hasDocheader = true;
 231
 232	/**
 233	 * @var t3lib_PageRenderer
 234	 */
 235	protected $pageRenderer;
 236	protected $pageHeaderFooterTemplateFile = '';	// alternative template file
 237
 238	/**
 239	 * Whether flashmessages should be rendered or not
 240	 *
 241	 * @var $showFlashMessages
 242	 */
 243	public $showFlashMessages = TRUE;
 244
 245	/**
 246	 * Constructor
 247	 * Imports relevant parts from global $TBE_STYLES (colorscheme)
 248	 *
 249	 * @return	void
 250	 */
 251	function template()	{
 252		global $TBE_STYLES;
 253
 254			// Initializes the page rendering object:
 255		$this->getPageRenderer();
 256
 257			// Setting default scriptID:
 258		if (($temp_M = (string) t3lib_div::_GET('M')) && $GLOBALS['TBE_MODULES']['_PATHS'][$temp_M]) {
 259			$this->scriptID = preg_replace('/^.*\/(sysext|ext)\//', 'ext/', $GLOBALS['TBE_MODULES']['_PATHS'][$temp_M] . 'index.php');
 260		} else {
 261			$this->scriptID = preg_replace('/^.*\/(sysext|ext)\//', 'ext/', substr(PATH_thisScript, strlen(PATH_site)));
 262		}
 263		if (TYPO3_mainDir!='typo3/' && substr($this->scriptID,0,strlen(TYPO3_mainDir)) == TYPO3_mainDir)	{
 264			$this->scriptID = 'typo3/'.substr($this->scriptID,strlen(TYPO3_mainDir));	// This fixes if TYPO3_mainDir has been changed so the script ids are STILL "typo3/..."
 265		}
 266
 267		$this->bodyTagId = preg_replace('/[^A-Za-z0-9-]/','-',$this->scriptID);
 268
 269			// Individual configuration per script? If so, make a recursive merge of the arrays:
 270		if (is_array($TBE_STYLES['scriptIDindex'][$this->scriptID]))	{
 271			$ovr = $TBE_STYLES['scriptIDindex'][$this->scriptID];		// Make copy
 272			$TBE_STYLES = t3lib_div::array_merge_recursive_overrule($TBE_STYLES,$ovr);		// merge styles.
 273			unset($TBE_STYLES['scriptIDindex'][$this->scriptID]);	// Have to unset - otherwise the second instantiation will do it again!
 274		}
 275
 276			// Color scheme:
 277		if ($TBE_STYLES['mainColors']['bgColor'])	$this->bgColor=$TBE_STYLES['mainColors']['bgColor'];
 278		if ($TBE_STYLES['mainColors']['bgColor1'])	$this->bgColor1=$TBE_STYLES['mainColors']['bgColor1'];
 279		if ($TBE_STYLES['mainColors']['bgColor2'])	$this->bgColor2=$TBE_STYLES['mainColors']['bgColor2'];
 280		if ($TBE_STYLES['mainColors']['bgColor3'])	$this->bgColor3=$TBE_STYLES['mainColors']['bgColor3'];
 281		if ($TBE_STYLES['mainColors']['bgColor4'])	$this->bgColor4=$TBE_STYLES['mainColors']['bgColor4'];
 282		if ($TBE_STYLES['mainColors']['bgColor5'])	$this->bgColor5=$TBE_STYLES['mainColors']['bgColor5'];
 283		if ($TBE_STYLES['mainColors']['bgColor6'])	$this->bgColor6=$TBE_STYLES['mainColors']['bgColor6'];
 284		if ($TBE_STYLES['mainColors']['hoverColor'])	$this->hoverColor=$TBE_STYLES['mainColors']['hoverColor'];
 285
 286			// Main Stylesheets:
 287		if ($TBE_STYLES['stylesheet'])	$this->styleSheetFile = $TBE_STYLES['stylesheet'];
 288		if ($TBE_STYLES['stylesheet2'])	$this->styleSheetFile2 = $TBE_STYLES['stylesheet2'];
 289		if ($TBE_STYLES['styleSheetFile_post'])	$this->styleSheetFile_post = $TBE_STYLES['styleSheetFile_post'];
 290		if ($TBE_STYLES['inDocStyles_TBEstyle'])	$this->inDocStyles_TBEstyle = $TBE_STYLES['inDocStyles_TBEstyle'];
 291
 292			// include all stylesheets
 293		foreach ($this->getSkinStylesheetDirectories() as $stylesheetDirectory) {
 294			$this->addStylesheetDirectory($stylesheetDirectory);
 295		}
 296
 297			// Background image
 298		if ($TBE_STYLES['background'])	$this->backGroundImage = $TBE_STYLES['background'];
 299	}
 300
 301
 302	/**
 303	 * Gets instance of PageRenderer
 304	 *
 305	 * @return	t3lib_PageRenderer
 306	 */
 307	public function getPageRenderer() {
 308		if (!isset($this->pageRenderer)) {
 309			$this->pageRenderer = t3lib_div::makeInstance('t3lib_PageRenderer');
 310			$this->pageRenderer->setTemplateFile(
 311				TYPO3_mainDir . 'templates/template_page_backend.html'
 312			);
 313			$this->pageRenderer->setLanguage($GLOBALS['LANG']->lang);
 314			$this->pageRenderer->enableConcatenateFiles();
 315			$this->pageRenderer->enableCompressCss();
 316			$this->pageRenderer->enableCompressJavascript();
 317		}
 318		return $this->pageRenderer;
 319	}
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333	/*****************************************
 334	 *
 335	 * EVALUATION FUNCTIONS
 336	 * Various centralized processing
 337	 *
 338	 *****************************************/
 339
 340	/**
 341	 * Makes click menu link (context sensitive menu)
 342	 * Returns $str (possibly an <|img> tag/icon) wrapped in a link which will activate the context sensitive menu for the record ($table/$uid) or file ($table = file)
 343	 * The link will load the top frame with the parameter "&item" which is the table,uid and listFr arguments imploded by "|": rawurlencode($table.'|'.$uid.'|'.$listFr)
 344	 *
 345	 * @param	string		String to be wrapped in link, typ. image tag.
 346	 * @param	string		Table name/File path. If the icon is for a database record, enter the tablename from $TCA. If a file then enter the absolute filepath
 347	 * @param	integer		If icon is for database record this is the UID for the record from $table
 348	 * @param	boolean		Tells the top frame script that the link is coming from a "list" frame which means a frame from within the backend content frame.
 349	 * @param	string		Additional GET parameters for the link to alt_clickmenu.php
 350	 * @param	string		Enable / Disable click menu items. Example: "+new,view" will display ONLY these two items (and any spacers in between), "new,view" will display all BUT these two items.
 351	 * @param	boolean		If set, will return only the onclick JavaScript, not the whole link.
 352	 * @return	string		The link-wrapped input string.
 353	 */
 354	function wrapClickMenuOnIcon($str,$table,$uid='',$listFr=1,$addParams='',$enDisItems='', $returnOnClick=FALSE)	{
 355		$backPath = rawurlencode($this->backPath).'|'.t3lib_div::shortMD5($this->backPath.'|'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']);
 356		$onClick = 'showClickmenu("'.$table.'","'.$uid.'","'.$listFr.'","'.str_replace('+','%2B',$enDisItems).'","'.str_replace('&','&amp;',addcslashes($backPath,'"')).'","'.str_replace('&','&amp;',addcslashes($addParams,'"')).'");return false;';
 357		return $returnOnClick ? $onClick : '<a href="#" onclick="'.htmlspecialchars($onClick).'"'.($GLOBALS['TYPO3_CONF_VARS']['BE']['useOnContextMenuHandler'] ? ' oncontextmenu="'.htmlspecialchars($onClick).'"' : '').'>'.$str.'</a>';
 358	}
 359
 360	/**
 361	 * Makes link to page $id in frontend (view page)
 362	 * Returns an magnifier-glass icon which links to the frontend index.php document for viewing the page with id $id
 363	 * $id must be a page-uid
 364	 * If the BE_USER has access to Web>List then a link to that module is shown as well (with return-url)
 365	 *
 366	 * @param	integer		The page id
 367	 * @param	string		The current "BACK_PATH" (the back relative to the typo3/ directory)
 368	 * @param	string		Additional parameters for the image tag(s)
 369	 * @return	string		HTML string with linked icon(s)
 370	 */
 371	function viewPageIcon($id,$backPath,$addParams='hspace="3"')	{
 372		global $BE_USER;
 373		$str = '';
 374			// If access to Web>List for user, then link to that module.
 375		if ($BE_USER->check('modules','web_list'))	{
 376			$href=$backPath.'db_list.php?id='.$id.'&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'));
 377			$str.= '<a href="'.htmlspecialchars($href).'">'.
 378					'<img'.t3lib_iconWorks::skinImg($backPath,'gfx/list.gif','width="11" height="11"').' title="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.showList',1).'"'.($addParams?' '.trim($addParams):'').' alt="" />'.
 379					'</a>';
 380		}
 381			// Make link to view page
 382		$str.= '<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::viewOnClick($id,$backPath,t3lib_BEfunc::BEgetRootLine($id))).'">'.
 383				'<img'.t3lib_iconWorks::skinImg($backPath,'gfx/zoom.gif','width="12" height="12"').' title="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.showPage',1).'"'.($addParams?' '.trim($addParams):"").' hspace="3" alt="" />'.
 384				'</a>';
 385		return $str;
 386	}
 387
 388	/**
 389	 * Returns a URL with a command to TYPO3 Core Engine (tce_db.php)
 390	 * See description of the API elsewhere.
 391	 *
 392	 * @param	string		$params is a set of GET params to send to tce_db.php. Example: "&cmd[tt_content][123][move]=456" or "&data[tt_content][123][hidden]=1&data[tt_content][123][title]=Hello%20World"
 393	 * @param	string		Redirect URL if any other that t3lib_div::getIndpEnv('REQUEST_URI') is wished
 394	 * @return	string		URL to tce_db.php + parameters (backpath is taken from $this->backPath)
 395	 * @see t3lib_BEfunc::editOnClick()
 396	 */
 397	function issueCommand($params,$rUrl='')	{
 398		$rUrl = $rUrl ? $rUrl : t3lib_div::getIndpEnv('REQUEST_URI');
 399		return $this->backPath.'tce_db.php?'.
 400				$params.
 401				'&redirect='.($rUrl==-1?"'+T3_THIS_LOCATION+'":rawurlencode($rUrl)).
 402				'&vC='.rawurlencode($GLOBALS['BE_USER']->veriCode()).
 403				'&prErr=1&uPT=1';
 404	}
 405
 406	/**
 407	 * Returns true if click-menu layers can be displayed for the current user/browser
 408	 * Use this to test if click-menus (context sensitive menus) can and should be displayed in the backend.
 409	 *
 410	 * @return	boolean
 411	 */
 412	function isCMlayers()	{
 413		return !$GLOBALS['BE_USER']->uc['disableCMlayers'] && $GLOBALS['CLIENT']['FORMSTYLE'] && !($GLOBALS['CLIENT']['SYSTEM']=='mac' && $GLOBALS['CLIENT']['BROWSER']=='Opera');
 414	}
 415
 416	/**
 417	 * Returns 'this.blur();' if the client supports CSS styles
 418	 * Use this in links to remove the underlining after being clicked
 419	 *
 420	 * @return	string
 421	 */
 422	function thisBlur()	{
 423		return ($GLOBALS['CLIENT']['FORMSTYLE']?'this.blur();':'');
 424	}
 425
 426	/**
 427	 * Returns ' style='cursor:help;'' if the client supports CSS styles
 428	 * Use for <a>-links to help texts
 429	 *
 430	 * @return	string
 431	 */
 432	function helpStyle()	{
 433		return $GLOBALS['CLIENT']['FORMSTYLE'] ? ' style="cursor:help;"':'';
 434	}
 435
 436	/**
 437	 * Makes the header (icon+title) for a page (or other record). Used in most modules under Web>*
 438	 * $table and $row must be a tablename/record from that table
 439	 * $path will be shown as alt-text for the icon.
 440	 * The title will be truncated to 45 chars.
 441	 *
 442	 * @param	string		Table name
 443	 * @param	array		Record row
 444	 * @param	string		Alt text
 445	 * @param	boolean		Set $noViewPageIcon true if you don't want a magnifier-icon for viewing the page in the frontend
 446	 * @param	array		$tWrap is an array with indexes 0 and 1 each representing HTML-tags (start/end) which will wrap the title
 447	 * @return	string		HTML content
 448	 */
 449	function getHeader($table,$row,$path,$noViewPageIcon=0,$tWrap=array('',''))	{
 450		global $TCA;
 451		if (is_array($row) && $row['uid'])	{
 452			$iconImgTag=t3lib_iconWorks::getSpriteIconForRecord($table, $row , array('title' => htmlspecialchars($path)));
 453			$title= strip_tags($row[$TCA[$table]['ctrl']['label']]);
 454			$viewPage = $noViewPageIcon ? '' : $this->viewPageIcon($row['uid'],$this->backPath,'');
 455			if ($table=='pages')	$path.=' - '.t3lib_BEfunc::titleAttribForPages($row,'',0);
 456		} else {
 457			$iconImgTag = t3lib_iconWorks::getSpriteIcon('apps-pagetree-page-domain', array('title' => htmlspecialchars($path)));
 458			$title=$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'];
 459		}
 460
 461		return '<span class="typo3-moduleHeader">'.$this->wrapClickMenuOnIcon($iconImgTag,$table,$row['uid']).
 462				$viewPage.
 463				$tWrap[0].htmlspecialchars(t3lib_div::fixed_lgd_cs($title,45)).$tWrap[1].'</span>';
 464	}
 465
 466	/**
 467	 * Like ->getHeader() but for files in the File>* main module/submodules
 468	 * Returns the file-icon with the path of the file set in the alt/title attribute. Shows the file-name after the icon.
 469	 *
 470	 * @param	string		Title string, expected to be the filepath
 471	 * @param	string		Alt text
 472	 * @param	string		The icon file (relative to TYPO3 dir)
 473	 * @return	string		HTML content
 474	 */
 475	function getFileheader($title,$path,$iconfile)	{
 476		$fileInfo = t3lib_div::split_fileref($title);
 477		$title = htmlspecialchars(t3lib_div::fixed_lgd_cs($fileInfo['path'],-35)).'<strong>'.htmlspecialchars($fileInfo['file']).'</strong>';
 478		return '<span class="typo3-moduleHeader"><img'.t3lib_iconWorks::skinImg($this->backPath,$iconfile,'width="18" height="16"').' title="'.htmlspecialchars($path).'" alt="" />'.$title.'</span>';
 479	}
 480
 481	/**
 482	 * Returns a linked shortcut-icon which will call the shortcut frame and set a shortcut there back to the calling page/module
 483	 *
 484	 * @param	string		Is the list of GET variables to store (if any)
 485	 * @param	string		Is the list of SET[] variables to store (if any) - SET[] variables a stored in $GLOBALS["SOBE"]->MOD_SETTINGS for backend modules
 486	 * @param	string		Module name string
 487	 * @param	string		Is used to enter the "parent module name" if the module is a submodule under eg. Web>* or File>*. You can also set this value to "1" in which case the currentLoadedModule is sent to the shortcut script (so - not a fixed value!) - that is used in file_edit.php and wizard_rte.php scripts where those scripts are really running as a part of another module.
 488	 * @return	string		HTML content
 489	 */
 490	function makeShortcutIcon($gvList,$setList,$modName,$motherModName="")	{
 491		$backPath=$this->backPath;
 492		$storeUrl=$this->makeShortcutUrl($gvList,$setList);
 493		$pathInfo = parse_url(t3lib_div::getIndpEnv('REQUEST_URI'));
 494
 495			// Add the module identifier automatically if typo3/mod.php is used:
 496		if (preg_match('/typo3\/mod\.php$/', $pathInfo['path']) && isset($GLOBALS['TBE_MODULES']['_PATHS'][$modName])) {
 497			$storeUrl = '&M='.$modName.$storeUrl;
 498		}
 499
 500		if (!strcmp($motherModName,'1'))	{
 501			$mMN="&motherModName='+top.currentModuleLoaded+'";
 502		} elseif ($motherModName)	{
 503			$mMN='&motherModName='.rawurlencode($motherModName);
 504		} else $mMN='';
 505
 506		$onClick = 'top.ShortcutManager.createShortcut('
 507			.$GLOBALS['LANG']->JScharCode($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.makeShortcut')).', '
 508			.'\''.$backPath.'\', '
 509			.'\''.rawurlencode($modName).'\', '
 510			.'\''.rawurlencode($pathInfo['path']."?".$storeUrl).$mMN.'\''
 511		.');return false;';
 512
 513		$sIcon = '<a href="#" onclick="' . htmlspecialchars($onClick).'" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.makeShortcut', TRUE) . '">'
 514			. t3lib_iconworks::getSpriteIcon('actions-system-shortcut-new') . '</a>';
 515		return $sIcon;
 516	}
 517
 518	/**
 519	 * MAKE url for storing
 520	 * Internal func
 521	 *
 522	 * @param	string		Is the list of GET variables to store (if any)
 523	 * @param	string		Is the list of SET[] variables to store (if any) - SET[] variables a stored in $GLOBALS["SOBE"]->MOD_SETTINGS for backend modules
 524	 * @return	string
 525	 * @access private
 526	 * @see makeShortcutIcon()
 527	 */
 528	function makeShortcutUrl($gvList,$setList)	{
 529		$GET = t3lib_div::_GET();
 530		$storeArray = array_merge(
 531			t3lib_div::compileSelectedGetVarsFromArray($gvList,$GET),
 532			array('SET'=>t3lib_div::compileSelectedGetVarsFromArray($setList, (array)$GLOBALS['SOBE']->MOD_SETTINGS))
 533		);
 534		$storeUrl = t3lib_div::implodeArrayForUrl('',$storeArray);
 535		return $storeUrl;
 536	}
 537
 538	/**
 539	 * Returns <input> attributes to set the width of an text-type input field.
 540	 * For client browsers with no CSS support the cols/size attribute is returned.
 541	 * For CSS compliant browsers (recommended) a ' style="width: ...px;"' is returned.
 542	 *
 543	 * @param	integer		A relative number which multiplied with approx. 10 will lead to the width in pixels
 544	 * @param	boolean		A flag you can set for textareas - DEPRECATED, use ->formWidthText() for textareas!!!
 545	 * @param	string		A string which will be returned as attribute-value for style="" instead of the calculated width (if CSS is enabled)
 546	 * @return	string		Tag attributes for an <input> tag (regarding width)
 547	 * @see formWidthText()
 548	 */
 549	function formWidth($size=48,$textarea=0,$styleOverride='') {
 550		$wAttrib = $textarea?'cols':'size';
 551		if (!$GLOBALS['CLIENT']['FORMSTYLE'])	{	// If not setting the width by style-attribute
 552			$size = $size;
 553			$retVal = ' '.$wAttrib.'="'.$size.'"';
 554		} else {	// Setting width by style-attribute. 'cols' MUST be avoided with NN6+
 555			$pixels = ceil($size*$this->form_rowsToStylewidth);
 556			$retVal = $styleOverride ? ' style="'.$styleOverride.'"' : ' style="width:'.$pixels.'px;"';
 557		}
 558		return $retVal;
 559	}
 560
 561	/**
 562	 * This function is dedicated to textareas, which has the wrapping on/off option to observe.
 563	 * EXAMPLE:
 564	 * 		<textarea rows="10" wrap="off" '.$GLOBALS["TBE_TEMPLATE"]->formWidthText(48,"","off").'>
 565	 *   or
 566	 * 		<textarea rows="10" wrap="virtual" '.$GLOBALS["TBE_TEMPLATE"]->formWidthText(48,"","virtual").'>
 567	 *
 568	 * @param	integer		A relative number which multiplied with approx. 10 will lead to the width in pixels
 569	 * @param	string		A string which will be returned as attribute-value for style="" instead of the calculated width (if CSS is enabled)
 570	 * @param	string		Pass on the wrap-attribute value you use in your <textarea>! This will be used to make sure that some browsers will detect wrapping alright.
 571	 * @return	string		Tag attributes for an <input> tag (regarding width)
 572	 * @see formWidth()
 573	 */
 574	function formWidthText($size=48,$styleOverride='',$wrap='') {
 575		$wTags = $this->formWidth($size,1,$styleOverride);
 576			// Netscape 6+/Mozilla seems to have this ODD problem where there WILL ALWAYS be wrapping with the cols-attribute set and NEVER without the col-attribute...
 577		if (strtolower(trim($wrap))!='off' && $GLOBALS['CLIENT']['BROWSER']=='net' && $GLOBALS['CLIENT']['VERSION']>=5)	{
 578			$wTags.=' cols="'.$size.'"';
 579		}
 580		return $wTags;
 581	}
 582
 583	/**
 584	 * Returns JavaScript variables setting the returnUrl and thisScript location for use by JavaScript on the page.
 585	 * Used in fx. db_list.php (Web>List)
 586	 *
 587	 * @param	string		URL to "this location" / current script
 588	 * @return	string
 589	 * @see typo3/db_list.php
 590	 */
 591	function redirectUrls($thisLocation='')	{
 592		$thisLocation = $thisLocation?$thisLocation:t3lib_div::linkThisScript(
 593		array(
 594			'CB'=>'',
 595			'SET'=>'',
 596			'cmd' => '',
 597			'popViewId'=>''
 598		));
 599
 600		$out ="
 601	var T3_RETURN_URL = '".str_replace('%20','',rawurlencode(t3lib_div::sanitizeLocalUrl(t3lib_div::_GP('returnUrl'))))."';
 602	var T3_THIS_LOCATION = '".str_replace('%20','',rawurlencode($thisLocation))."';
 603		";
 604		return $out;
 605	}
 606
 607	/**
 608	 * Returns a formatted string of $tstamp
 609	 * Uses $GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'] and $GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'] to format date and time
 610	 *
 611	 * @param	integer		UNIX timestamp, seconds since 1970
 612	 * @param	integer		How much data to show: $type = 1: hhmm, $type = 10:	ddmmmyy
 613	 * @return	string		Formatted timestamp
 614	 */
 615	function formatTime($tstamp,$type)	{
 616		$dateStr = '';
 617		switch($type)	{
 618			case 1: $dateStr = date($GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'],$tstamp);
 619			break;
 620			case 10: $dateStr = date($GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'],$tstamp);
 621			break;
 622		}
 623		return $dateStr;
 624	}
 625
 626	/**
 627	 * Returns script parsetime IF ->parseTimeFlag is set and user is "admin"
 628	 * Automatically outputted in page end
 629	 *
 630	 * @return	string
 631	 */
 632	function parseTime()	{
 633		if ($this->parseTimeFlag && $GLOBALS['BE_USER']->isAdmin()) {
 634			return '<p>(ParseTime: '.(t3lib_div::milliseconds()-$GLOBALS['PARSETIME_START']).' ms</p>
 635					<p>REQUEST_URI-length: '.strlen(t3lib_div::getIndpEnv('REQUEST_URI')).')</p>';
 636		}
 637	}
 638
 639	/**
 640	 * Defines whether to use the X-UA-Compatible meta tag.
 641	 *
 642	 * @param boolean $useCompatibilityTag Whether to use the tag
 643	 * @return void
 644	 */
 645	public function useCompatibilityTag($useCompatibilityTag = TRUE) {
 646		$this->useCompatibilityTag = (bool) $useCompatibilityTag;
 647	}
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660	/*****************************************
 661	 *
 662	 *	PAGE BUILDING FUNCTIONS.
 663	 *	Use this to build the HTML of your backend modules
 664	 *
 665	 *****************************************/
 666
 667	/**
 668	 * Returns page start
 669	 * This includes the proper header with charset, title, meta tag and beginning body-tag.
 670	 *
 671	 * @param	string		HTML Page title for the header
 672	 * @return	string		Returns the whole header section of a HTML-document based on settings in internal variables (like styles, javascript code, charset, generator and docType)
 673	 * @see endPage()
 674	 */
 675	function startPage($title)	{
 676			// hook	pre start page
 677		if (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/template.php']['preStartPageHook']))	{
 678			$preStartPageHook =& $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/template.php']['preStartPageHook'];
 679			if (is_array($preStartPageHook)) {
 680				$hookParameters = array(
 681					'title' => &$title,
 682				);
 683				foreach ($preStartPageHook as $hookFunction)	{
 684					t3lib_div::callUserFunction($hookFunction, $hookParameters, $this);
 685				}
 686			}
 687		}
 688
 689		$this->pageRenderer->backPath = $this->backPath;
 690
 691			// alternative template for Header and Footer
 692		if ($this->pageHeaderFooterTemplateFile) {
 693			$file =  t3lib_div::getFileAbsFileName($this->pageHeaderFooterTemplateFile, TRUE);
 694			if ($file) {
 695				$this->pageRenderer->setTemplateFile($file);
 696			}
 697		}
 698			// For debugging: If this outputs "QuirksMode"/"BackCompat" (IE) the browser runs in quirks-mode. Otherwise the value is "CSS1Compat"
 699#		$this->JScodeArray[]='alert(document.compatMode);';
 700
 701			// Send HTTP header for selected charset. Added by Robert Lemke 23.10.2003
 702		$this->initCharset();
 703		header ('Content-Type:text/html;charset='.$this->charset);
 704
 705			// Standard HTML tag
 706		$htmlTag = '<html xmlns="http://www.w3.org/1999/xhtml">';
 707
 708		switch($this->docType)	{
 709			case 'html_3':
 710				$headerStart = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">';
 711				$htmlTag = '<html>';
 712				// disable rendering of XHTML tags
 713				$this->getPageRenderer()->setRenderXhtml(FALSE);
 714				break;
 715			case 'xhtml_strict':
 716				$headerStart = '<!DOCTYPE html
 717	PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 718	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
 719				break;
 720			case 'xhtml_frames':
 721				$headerStart = '<!DOCTYPE html
 722	PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
 723	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">';
 724				break;
 725			case 'html_5':
 726				$headerStart = '<!DOCTYPE html>' . LF;
 727				$htmlTag = '<html>';
 728				// disable rendering of XHTML tags
 729				$this->getPageRenderer()->setRenderXhtml(FALSE);
 730				break;
 731				// The fallthrough is intended as XHTML 1.0 transitional is the default for the BE.
 732			case 'xhtml_trans':
 733			default:
 734				$headerStart = '<!DOCTYPE html
 735     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 736     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
 737		}
 738
 739		$this->pageRenderer->setHtmlTag($htmlTag);
 740
 741		// This loads the tabulator-in-textarea feature. It automatically modifies
 742		// every textarea which is found.
 743		if (!$GLOBALS['BE_USER']->uc['disableTabInTextarea']) {
 744			$this->loadJavascriptLib('tab.js');
 745		}
 746
 747			// Get the browser info
 748		$browserInfo = t3lib_utility_Client::getBrowserInfo(t3lib_div::getIndpEnv('HTTP_USER_AGENT'));
 749
 750			// Set the XML prologue
 751		$xmlPrologue = '<?xml version="1.0" encoding="' . $this->charset . '"?>';
 752
 753			// Set the XML stylesheet
 754		$xmlStylesheet = '<?xml-stylesheet href="#internalStyle" type="text/css"?>';
 755
 756			// Add the XML prologue for XHTML doctypes
 757		if ($this->docType !== 'html_3' && $this->docType !== 'html_5') {
 758				// Put the XML prologue before or after the doctype declaration according to browser
 759			if ($browserInfo['browser'] === 'msie' && $browserInfo['version'] < 7) {
 760				$headerStart = $headerStart . LF . $xmlPrologue;
 761			} else {
 762				$headerStart = $xmlPrologue . LF . $headerStart;
 763			}
 764
 765				// Add the xml stylesheet according to doctype
 766			if ($this->docType !== 'xhtml_frames') {
 767				$headerStart = $headerStart . LF . $xmlStylesheet;
 768			}
 769		}
 770
 771		$this->pageRenderer->setXmlPrologAndDocType($headerStart);
 772		$this->pageRenderer->setHeadTag('<head>' . LF. '<!-- TYPO3 Script ID: '.htmlspecialchars($this->scriptID).' -->');
 773		$this->pageRenderer->setCharSet($this->charset);
 774		$this->pageRenderer->addMetaTag($this->generator());
 775		if ($this->useCompatibilityTag) {
 776			$this->pageRenderer->addMetaTag($this->xUaCompatible());
 777		}
 778		$this->pageRenderer->setTitle($title);
 779
 780		// add docstyles
 781		$this->docStyle();
 782
 783
 784		// add jsCode - has to go to headerData as it may contain the script tags already
 785		$this->pageRenderer->addHeaderData($this->JScode);
 786
 787		foreach ($this->JScodeArray as $name => $code) {
 788			$this->pageRenderer->addJsInlineCode($name, $code);
 789		}
 790
 791		if (count($this->JScodeLibArray)) {
 792			foreach($this->JScodeLibArray as $library) {
 793				$this->pageRenderer->addHeaderData($library);
 794			}
 795		}
 796
 797		if ($this->extJScode) {
 798			$this->pageRenderer->addExtOnReadyCode($this->extJScode);
 799		}
 800
 801			// hook for additional headerData
 802		if (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/template.php']['preHeaderRenderHook'])) {
 803			$preHeaderRenderHook =& $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/template.php']['preHeaderRenderHook'];
 804			if (is_array($preHeaderRenderHook)) {
 805				$hookParameters = array(
 806					'pageRenderer' => &$this->pageRenderer,
 807				);
 808				foreach ($preHeaderRenderHook as $hookFunction) {
 809					t3lib_div::callUserFunction($hookFunction, $hookParameters, $this);
 810				}
 811			}
 812		}
 813
 814			// Construct page header.
 815		$str = $this->pageRenderer->render(t3lib_PageRenderer::PART_HEADER);
 816
 817		$this->JScodeLibArray = array();
 818		$this->JScode = $this->extJScode = '';
 819		$this->JScodeArray = array();
 820
 821		$this->endOfPageJsBlock = $this->pageRenderer->render(t3lib_PageRenderer::PART_FOOTER);
 822
 823		if ($this->docType=='xhtml_frames')	{
 824			return $str;
 825		} else
 826$str.=$this->docBodyTagBegin().
 827($this->divClass?'
 828
 829<!-- Wrapping DIV-section for whole page BEGIN -->
 830<div class="' . $this->divClass . '">
 831' : '' ) . trim($this->form);
 832		return $str;
 833	}
 834
 835	/**
 836	 * Returns page end; This includes finishing form, div, body and html tags.
 837	 *
 838	 * @return	string		The HTML end of a page
 839	 * @see startPage()
 840	 */
 841	function endPage()	{
 842		$str = $this->sectionEnd().
 843				$this->postCode.
 844				$this->endPageJS().
 845				$this->wrapScriptTags(t3lib_BEfunc::getUpdateSignalCode()).
 846				$this->parseTime().
 847				($this->form?'
 848</form>':'');
 849			// if something is in buffer like debug, put it to end of page
 850		if (ob_get_contents()) {
 851			$str .= ob_get_clean();
 852			header('Content-Encoding: None');
 853		}
 854
 855		if ($this->docType !== 'xhtml_frames') {
 856
 857			$str .= ($this->divClass?'
 858
 859<!-- Wrapping DIV-section for whole page END -->
 860</div>':'') . $this->endOfPageJsBlock ;
 861
 862		}
 863
 864
 865			// Logging: Can't find better place to put it:
 866		if (TYPO3_DLOG)	t3lib_div::devLog('END of BACKEND session', 'template', 0, array('_FLUSH' => true));
 867
 868		return $str;
 869	}
 870
 871	/**
 872	 * Returns the header-bar in the top of most backend modules
 873	 * Closes section if open.
 874	 *
 875	 * @param	string		The text string for the header
 876	 * @return	string		HTML content
 877	 */
 878	function header($text)	{
 879		$str='
 880
 881	<!-- MAIN Header in page top -->
 882	<h2>'.htmlspecialchars($text).'</h2>
 883';
 884		return $this->sectionEnd().$str;
 885	}
 886
 887	/**
 888	 * Begins an output section and sets header and content
 889	 *
 890	 * @param	string		The header
 891	 * @param	string		The HTML-content
 892	 * @param	boolean		A flag that will prevent the header from being converted to uppercase
 893	 * @param	boolean		Defines the type of header (if set, "<h3>" rather than the default "h4")
 894	 * @param	integer		The number of an icon to show with the header (see the icon-function). -1,1,2,3
 895	 * @param	boolean		If set, HTML tags are allowed in $label (otherwise this value is by default htmlspecialchars()'ed)
 896	 * @return	string		HTML content
 897	 * @see icons(), sectionHeader()
 898	 */
 899	function section($label,$text,$nostrtoupper=FALSE,$sH=FALSE,$type=0,$allowHTMLinHeader=FALSE)	{
 900		$str='';
 901
 902			// Setting header
 903		if ($label)	{
 904			if (!$allowHTMLinHeader)	$label = htmlspecialchars($label);
 905			$str.=$this->sectionHeader($this->icons($type).$label, $sH, $nostrtoupper ? '' : ' class="uppercase"');
 906		}
 907			// Setting content
 908		$str.='
 909
 910	<!-- Section content -->
 911'.$text;
 912
 913		return $this->sectionBegin().$str;
 914	}
 915
 916	/**
 917	 * Inserts a divider image
 918	 * Ends a section (if open) before inserting the image
 919	 *
 920	 * @param	integer		The margin-top/-bottom of the <hr> ruler.
 921	 * @return	string		HTML content
 922	 */
 923	function divider($dist)	{
 924		$dist = intval($dist);
 925		$str='
 926
 927	<!-- DIVIDER -->
 928	<hr style="margin-top: '.$dist.'px; margin-bottom: '.$dist.'px;" />
 929';
 930		return $this->sectionEnd().$str;
 931	}
 932
 933	/**
 934	 * Returns a blank <div>-section with a height
 935	 *
 936	 * @param	integer		Padding-top for the div-section (should be margin-top but konqueror (3.1) doesn't like it :-(
 937	 * @return	string		HTML content
 938	 */
 939	function spacer($dist)	{
 940		if ($dist>0)	{
 941			return '
 942
 943	<!-- Spacer element -->
 944	<div style="padding-top: '.intval($dist).'px;"></div>
 945';
 946		}
 947	}
 948
 949	/**
 950	 * Make a section header.
 951	 * Begins a section if not already open.
 952	 *
 953	 * @param	string		The label between the <h3> or <h4> tags. (Allows HTML)
 954	 * @param	boolean		If set, <h3> is used, otherwise <h4>
 955	 * @param	string		Additional attributes to h-tag, eg. ' class=""'
 956	 * @return	string		HTML content
 957	 */
 958	function sectionHeader($label, $sH=FALSE, $addAttrib='') {
 959		$tag = ($sH ? 'h3' : 'h4');
 960		if ($addAttrib && substr($addAttrib, 0, 1) !== ' ') {
 961			$addAttrib = ' ' . $addAttrib;
 962		}
 963		$str='
 964
 965	<!-- Section header -->
 966	<' . $tag . $addAttrib . '>' . $label . '</' . $tag . '>
 967';
 968		return $this->sectionBegin() . $str;
 969	}
 970
 971	/**
 972	 * Begins an output section.
 973	 * Returns the <div>-begin tag AND sets the ->sectionFlag true (if the ->sectionFlag is not already set!)
 974	 * You can call this function even if a section is already begun since the function will only return something if the sectionFlag is not already set!
 975	 *
 976	 * @return	string		HTML content
 977	 */
 978	function sectionBegin()	{
 979		if (!$this->sectionFlag)	{
 980			$this->sectionFlag=1;
 981			$str='
 982
 983	<!-- ***********************
 984	      Begin output section.
 985	     *********************** -->
 986	<div>
 987';
 988			return $str;
 989		} else return '';
 990	}
 991
 992	/**
 993	 * Ends and output section
 994	 * Returns the </div>-end tag AND clears the ->sectionFlag (but does so only IF the sectionFlag is set - that is a section is 'open')
 995	 * See sectionBegin() also.
 996	 *
 997	 * @return	string		HTML content
 998	 */
 999	function sectionEnd()	{
1000		if ($this->sectionFlag)	{
1001			$this->sectionFlag=0;
1002			return '
1003	</div>
1004	<!-- *********************
1005	      End output section.
1006	     ********************* -->
1007';
1008		} else return '';
1009	}
1010
1011	/**
1012	 * Originally it printed a kind of divider.
1013	 * Deprecated. Just remove function calls to it or call the divider() function instead.
1014	 *
1015	 * @return	void
1016	 * @internal
1017	 * @deprecated since TYPO3 3.6
1018	 */
1019	function middle()	{
1020	}
1021
1022	/**
1023	 * If a form-tag is defined in ->form then and end-tag for that <form> element is outputted
1024	 * Further a JavaScript section is outputted which will update the top.busy session-expiry object (unless $this->endJS is set to false)
1025	 *
1026	 * @return	string		HTML content (<script> tag section)
1027	 */
1028	function endPageJS()	{
1029		return ($this->endJS?'
1030	<script type="text/javascript">
1031		  /*<![CDATA[*/
1032		if (top.busy && top.busy.loginRefreshed) {
1033			top.busy.loginRefreshed();
1034		}
1035		 /*]]>*/
1036	</script>':'');
1037	}
1038
1039	/**
1040	 * Creates the bodyTag.
1041	 * You can add to the bodyTag by $this->bodyTagAdditions
1042	 *
1043	 * @return	string		HTML body tag
1044	 */
1045	function docBodyTagBegin()	{
1046		$bodyContent = 'body onclick="if (top.menuReset) top.menuReset();" '.trim($this->bodyTagAdditions.($this->bodyTagId ? ' id="'.$this->bodyTagId.'"' : ''));
1047		return '<'.trim($bodyContent).'>';
1048	}
1049
1050	/**
1051	 * Outputting document style
1052	 *
1053	 * @return	string		HTML style section/link tags
1054	 */
1055	function docStyle()	{
1056
1057			// Request background image:
1058		if ($this->backGroundImage)	{
1059			$this->inDocStylesArray[]=' BODY { background-image: url('.$this->backPath.$this->backGroundImage.'); }';
1060		}
1061
1062			// Add inDoc styles variables as well:
1063		$this->inDocStylesArray[] = $this->inDocStyles;
1064		$this->inDocStylesArray[] = $this->inDocStyles_TBEstyle;
1065
1066			// Implode it all:
1067		$inDocStyles = implode(LF, $this->inDocStylesArray);
1068
1069		if ($this->styleSheetFile) {
1070			$this->pageRenderer->addCssFile($this->backPath . $this->styleSheetFile);
1071		}
1072		if ($this->styleSheetFile2) {
1073			$this->pageRenderer->addCssFile($this->backPath . $this->styleSheetFile2);
1074		}
1075
1076		$this->pageRenderer->addCssInlineBlock('inDocStyles', $inDocStyles . LF . '/*###POSTCSSMARKER###*/');
1077		if ($this->styleSheetFile_post) {
1078			$this->pageRenderer->addCssFile($this->backPath . $this->styleSheetFile_post);
1079		}
1080
1081	}
1082
1083	/**
1084	 * Insert additional style sheet link
1085	 *
1086	 * @param	string		$key: some key identifying the style sheet
1087	 * @param	string		$href: uri to the style sheet file
1088	 * @param	string		$title: value for the title attribute of the link element
1089	 * @return	string		$relation: value for the rel attribute of the link element
1090	 * @return	void
1091	 */
1092	function addStyleSheet($key, $href, $title='', $relation='stylesheet') {
1093		if (strpos($href, '://') !== FALSE || substr($href, 0, 1) === '/') {
1094			$file = $href;
1095		} else {
1096			$file = $this->backPath . $href;
1097		}
1098		$this->pageRenderer->addCssFile($file, $relation, 'screen', $title);
1099	}
1100
1101	/**
1102	 * Add all *.css files of the directory $path to the stylesheets
1103	 *
1104	 * @param	string		directory to add
1105	 * @return	void
1106	 */
1107	function addStyleSheetDirectory($path) {
1108			// calculation needed, when TYPO3 source is used via a symlink
1109			// absolute path to the stylesheets
1110		$filePath = dirname(t3lib_div::getIndpEnv('SCRIPT_FILENAME')) . '/' . $GLOBALS['BACK_PATH'] . $path;
1111			// clean the path
1112		$resolvedPath = t3lib_div::resolveBackPath($filePath);
1113			// read all files in directory and sort them alphabetically
1114		$files = t3lib_div::getFilesInDir($resolvedPath, 'css', FALSE, 1);
1115		foreach ($files as $file) {
1116			$this->pageRenderer->addCssFile($GLOBALS['BACK_PATH'] . $path . $file, 'stylesheet', 'all');
1117		}
1118	}
1119
1120	/**
1121	 * Insert post rendering document style into already rendered content
1122	 * This is needed for extobjbase
1123	 *
1124	 * @param	string		style-content to insert.
1125	 * @return	string		content with inserted styles
1126	 */
1127	function insertStylesAndJS($content)	{
1128			// insert accumulated CSS
1129		$this->inDocStylesArray[] = $this->inDocStyles;
1130		$styles = LF.implode(LF, $this->inDocStylesArray);
1131		$content = str_replace('/*###POSTCSSMARKER###*/',$styles,$content);
1132
1133			// insert accumulated JS
1134		$jscode = $this->JScode.LF.$this->wrapScriptTags(implode(LF, $this->JScodeArray));
1135		$content = str_replace('<!--###POSTJSMARKER###-->',$jscode,$content);
1136
1137		return $content;
1138	}
1139
1140	/**
1141	 * Returns an array of all stylesheet directories belonging to core and skins
1142	 *
1143	 * @return	array	Stylesheet directories
1144	 */
1145	public function getSkinStylesheetDirectories() {
1146		$stylesheetDirectories = array();
1147
1148			// add default core stylesheets
1149		foreach ($this->stylesheetsCore as $stylesheetDir) {
1150			$stylesheetDirectories[] = $stylesheetDir;
1151		}
1152
1153			// Stylesheets from skins
1154			// merge default css directories ($this->stylesheetsSkin) with additional ones and include them
1155		if (is_array($GLOBALS['TBE_STYLES']['skins'])) {
1156				// loop over all registered skins
1157			foreach ($GLOBALS['TBE_STYLES']['skins'] as $skinExtKey => $skin) {
1158				$skinStylesheetDirs = $this->stylesheetsSkins;
1159
1160					// skins can add custom stylesheetDirectories using
1161					// $TBE_STYLES['skins'][$_EXTKEY]['stylesheetDirectories']
1162				if (is_array($skin['stylesheetDirectories'])) {
1163					$skinStylesheetDirs = array_merge($skinStylesheetDirs, $skin['stylesheetDirectories']);
1164				}
1165
1166					// add all registered directories
1167				foreach ($skinStylesheetDirs as $stylesheetDir) {
1168						// for EXT:myskin/stylesheets/ syntax
1169					if (substr($stylesheetDir, 0, 4) === 'EXT:') {
1170						list($extKey, $path) = explode('/', substr($stylesheetDir, 4), 2);
1171						if (strcmp($extKey, '') && t3lib_extMgm::isLoaded($extKey) && strcmp($path, '')) {
1172							$stylesheetDirectories[] = t3lib_extMgm::extRelPath($extKey) . $path;
1173						}
1174					} else {
1175						// for relative paths
1176						$stylesheetDirectories[] = t3lib_extMgm::extRelPath($skinExtKey) . $stylesheetDir;
1177					}
1178				}
1179			}
1180		}
1181		return $stylesheetDirectories;
1182	}
1183
1184	/**
1185	 * Initialize the charset.
1186	 * Sets the internal $this->charset variable to the charset defined in $GLOBALS["LANG"] (or the default as set in this class)
1187	 * Returns the meta-tag for the document header
1188	 *
1189	 * @return	string		<meta> tag with charset from $this->charset or $GLOBALS['LANG']->charSet
1190	 */
1191	function initCharset()	{
1192			// Set charset to the charset provided by the current backend users language selection:
1193		$this->charset = $GLOBALS['LANG']->charSet ? $GLOBALS['LANG']->charSet : $this->charset;
1194			// Return meta tag:
1195		return '<meta http-equiv="Content-Type" content="text/html; charset='.$this->charset.'" />';
1196	}
1197
1198	/**
1199	 * Returns generator meta tag
1200	 *
1201	 * @return	string		<meta> tag with name "generator"
1202	 */
1203	function generator()	{
1204		$str = 'TYPO3 '.TYPO3_branch.', http://typo3.com, &#169; Kasper Sk&#229;rh&#248;j 1998-2009, extensions are copyright of their respective owners.';
1205		return '<meta name="generator" content="'.$str .'" />';
1206	}
1207
1208	/**
1209	 * Returns X-UA-Compatible meta tag
1210	 *
1211	 * @param	string		$content Content of the compatible tag (default: IE-8)
1212	 * @return	string		<meta http-equiv="X-UA-Compatible" content="???" />
1213	 */
1214	public function xUaCompatible($content = 'IE=8') {
1215		return '<meta http-equiv="X-UA-Compatible" content="' . $content . '" />';
1216	}
1217
1218
1219
1220
1221
1222
1223
1224	/*****************************************
1225	 *
1226	 * OTHER ELEMENTS
1227	 * Tables, buttons, formatting dimmed/red strings
1228	 *
1229	 ******************************************/
1230
1231
1232	/**
1233	 * Returns an image-tag with an 18x16 icon of the following types:
1234	 *
1235	 * $type:
1236	 * -1:	OK icon (Check-mark)
1237	 * 1:	Notice (Speach-bubble)
1238	 * 2:	Warning (Yellow triangle)
1239	 * 3:	Fatal error (Red stop sign)
1240	 *
1241	 * @param	integer		See description
1242	 * @param	string		Value for style attribute
1243	 * @return	string		HTML image tag (if applicable)
1244	 */
1245	function icons($type, $styleAttribValue='')	{
1246		switch($type)	{
1247			case '3':
1248				$icon = 'status-dialog-error';
1249			break;
1250			case '2':
1251				$icon = 'status-dialog-warning';
1252			break;
1253			case '1':
1254				$icon = 'status-dialog-notification';
1255			break;
1256			case '-1':
1257				$icon = 'status-dialog-ok';
1258			break;
1259			default:
1260			break;
1261		}
1262		if ($icon)	{
1263			return t3lib_iconWorks::getSpriteIcon($icon);
1264		}
1265	}
1266
1267	/**
1268	 * Returns an <input> button with the $onClick action and $label
1269	 *
1270	 * @param	string		The value of the onclick attribute of the input tag (submit type)
1271	 * @param	string		The label for the button (which will be htmlspecialchar'ed)
1272	 * @return	string		A <input> tag of the type "submit"
1273	 */
1274	function t3Button($onClick,$label)	{
1275		$button = '<input type="submit" onclick="'.htmlspecialchars($onClick).'; return false;" value="'.htmlspecialchars($label).'" />';
1276		return $button;
1277	}
1278
1279	/**
1280	 * dimmed-fontwrap. Returns the string wrapped in a <span>-tag defining the color to be gray/dimmed
1281	 *
1282	 * @param	string		Input string
1283	 * @return	string		Output string
1284	 */
1285	function dfw($string)	{
1286		return '<span class="typo3-dimmed">'.$string.'</span>';
1287	}
1288
1289	/**
1290	 * red-fontwrap. Returns the string wrapped in a <span>-tag defining the color to be red
1291	 *
1292	 * @param	string		Input string
1293	 * @return	string		Output string
1294	 */
1295	function rfw($string)	{
1296		return '<span class="typo3-red">'.$string.'</span>';
1297	}
1298
1299	/**
1300	 * Returns string wrapped in CDATA "tags" for XML / XHTML (wrap content of <script> and <style> sections in those!)
1301	 *
1302	 * @param	string		Input string
1303	 * @return	string		Output string
1304	 */
1305	function wrapInCData($string)	{
1306		$string = '/*<![CDATA[*/'.
1307			$string.
1308			'/*]]>*/';
1309
1310		return $string;
1311	}
1312
1313	/**
1314	 * Wraps the input string in script tags.
1315	 * Automatic re-identing of the JS code is done by using the first line as ident reference.
1316	 * This is nice for identing JS code with PHP code on the same level.
1317	 *
1318	 * @param	string		Input string
1319	 * @param	boolean		Wrap script element in linebreaks? Default is TRUE.
1320	 * @return	string		Output string
1321	 */
1322	function wrapScriptTags($string, $linebreak=TRUE)	{
1323		if(trim($string)) {
1324				// <script wrapped in nl?
1325			$cr = $linebreak? LF : '';
1326
1327				// remove nl from the beginning
1328			$string = preg_r…

Large files files are truncated, but you can click here to view the full file