Project

General

Profile

Bug #16576 ยป template.php

Administrator Admin, 2006-09-18 21:27

 
<?php
/***************************************************************
* Copyright notice
*
* (c) 1999-2004 Kasper Skaarhoj (kasper@typo3.com)
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
* A copy is found in the textfile GPL.txt and important notices to the license
* from the author is found in LICENSE.txt distributed with these scripts.
*
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/**
* Contains class with layout/output function for TYPO3 Backend Scripts
*
* $Id: template.php,v 1.22 2004/04/19 10:37:05 typo3 Exp $
* Revised for TYPO3 3.6 2/2003 by Kasper Skaarhoj
* XHTML-trans compliant
*
* @author Kasper Skaarhoj <kasper@typo3.com>
*/
/**
* [CLASS/FUNCTION INDEX of SCRIPT]
*
* 133: function fw($str)
*
*
* 157: class template
* 212: function template()
*
* SECTION: EVALUATION FUNCTIONS
* 284: function wrapClickMenuOnIcon($str,$table,$uid='',$listFr=1,$addParams='')
* 301: function viewPageIcon($id,$backPath,$addParams='hspace="3"')
* 326: function issueCommand($params,$rUrl='')
* 341: function isCMlayers()
* 351: function thisBlur()
* 361: function helpStyle()
* 378: function getHeader($table,$row,$path,$noViewPageIcon=0,$tWrap=array('',''))
* 404: function getFileheader($title,$path,$iconfile)
* 419: function makeShortcutIcon($gvList,$setList,$modName,$motherModName="")
* 452: function makeShortcutUrl($gvList,$setList)
* 473: function formWidth($size=48,$textarea=0,$styleOverride='')
* 498: function formWidthText($size=48,$styleOverride='',$wrap='')
* 515: function redirectUrls($thisLocation='')
* 539: function formatTime($tstamp,$type)
* 552: function parseTime()
*
* SECTION: PAGE BUILDING FUNCTIONS.
* 585: function startPage($title)
* 660: function endPage()
* 689: function header($text)
* 710: function section($label,$text,$nostrtoupper=FALSE,$sH=FALSE,$type=0,$allowHTMLinHeader=FALSE)
* 734: function divider($dist)
* 750: function spacer($dist)
* 769: function sectionHeader($label,$sH=FALSE,$addAttrib='')
* 786: function sectionBegin()
* 807: function sectionEnd()
* 827: function middle()
* 836: function endPageJS()
* 853: function docBodyTagBegin()
* 863: function docStyle()
* 904: function insertStylesAndJS($content)
* 924: function initCharset()
* 936: function generator()
*
* SECTION: OTHER ELEMENTS
* 968: function icons($type)
* 997: function t3Button($onClick,$label)
* 1008: function dfw($string)
* 1018: function rfw($string)
* 1028: function wrapInCData($string)
* 1045: function wrapScriptTags($string, $linebreak=TRUE)
* 1082: function table($arr)
* 1122: function menuTable($arr1,$arr2=array(), $arr3=array())
* 1155: function funcMenu($content,$menu)
* 1173: function clearCacheMenu($id,$addSaveOptions=0)
* 1209: function getContextMenuCode()
* 1385: function getTabMenu($id,$elementName,$currentValue,$menuItems,$script='',$addparams='')
*
*
* 1497: class bigDoc extends template
*
*
* 1506: class noDoc extends template
*
*
* 1515: class smallDoc extends template
*
*
* 1524: class mediumDoc extends template
*
* TOTAL FUNCTIONS: 45
* (This index is automatically created/updated by the extension "extdeveval")
*
*/



if (!defined('TYPO3_MODE')) die("Can't include this file directly.");












/**
* Depreciated fontwrap function. Is just transparent now.
*
* @param string Input string
* @return string Output string (in the old days this was wrapped in <font> tags)
* @depreciated
*/
function fw($str) {
return $str;
}


/**
* TYPO3 Backend Template Class
*
* This class contains functions for starting and ending the HTML of backend modules
* It also contains methods for outputting sections of content.
* Further there are functions for making icons, links, setting form-field widths etc.
* Color scheme and stylesheet definitions are also available here.
* Finally this file includes the language class for TYPO3's backend.
*
* After this file $LANG and $TBE_TEMPLATE are global variables / instances of their respective classes.
* This file is typically included right after the init.php file,
* if language and layout is needed.
*
* Please refer to Inside TYPO3 for a discussion of how to use this API.
*
* @author Kasper Skaarhoj <kasper@typo3.com>
* @package TYPO3
* @subpackage core
*/
class template {

// Vars you typically might want to/should set from outside after making instance of this class:
var $backPath = ''; // 'backPath' pointing back to the PATH_typo3
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.
var $JScode = ''; // Additional header code (eg. a JavaScript section) could be accommulated in this var. It will be directly outputted in the header.
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.
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.
var $docType = ''; // Doc-type used in the header. Default is HTML 4. You can also set it to 'strict', 'xhtml_trans', or 'xhtml_frames'.

// Other vars you can change, but less frequently used:
var $scriptID = ''; // Script ID.
var $bodyTagId = ''; // Id which can be set for the body tag. Default value is based on script ID
var $bodyTagAdditions = ''; // You can add additional attributes to the body-tag through this variable.
var $inDocStyles = ''; // Additional CSS styles which will be added to the <style> section in the header
var $inDocStylesArray = array(); // Like $inDocStyles but for use as array with associative keys to prevent double inclusion of css code
var $form_rowsToStylewidth = 9.58; // Multiplication factor for formWidth() input size (default is 48* this value).
var $form_largeComp = 1.33; // Compensation for large documents (used in class.t3lib_tceforms.php)
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.

// TYPO3 Colorscheme.
// If you want to change this, please do so through a skin using the global var $TBE_STYLES
var $bgColor = '#F7F3EF'; // Light background color
var $bgColor2 = '#9BA1A8'; // Steel-blue
var $bgColor3 = '#F6F2E6'; // dok.color
var $bgColor4 = '#D9D5C9'; // light tablerow background, brownish
var $bgColor5 = '#ABBBB4'; // light tablerow background, greenish
var $bgColor6 = '#E7DBA8'; // light tablerow background, yellowish, for section headers. Light.
var $hoverColor = '#254D7B';
var $styleSheetFile = 'stylesheet.css'; // Filename of stylesheet (relative to PATH_typo3)
var $styleSheetFile2 = ''; // Filename of stylesheet #2 - linked to right after the $this->styleSheetFile script (relative to PATH_typo3)
var $styleSheetFile_post = ''; // Filename of a post-stylesheet - included right after all inline styles.
var $backGroundImage = ''; // Background image of page (relative to PATH_typo3)
var $inDocStyles_TBEstyle = ''; // Inline css styling set from TBE_STYLES array

// DEV:
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.

// INTERNAL
var $charset = 'utf-8'; // Default charset. see function initCharset()

var $sectionFlag = 0; // Internal: Indicates if a <div>-output section is open
var $divClass = ''; // (Default) Class for wrapping <DIV>-tag of page. Is set in class extensions.






/**
* Constructor
* Imports relevant parts from global $TBE_STYLES (colorscheme)
*
* @return void
*/
function template() {
global $TBE_STYLES;

// Setting default scriptID:
$this->scriptID = ereg_replace('^.*\/(sysext|ext)\/','ext/',substr(PATH_thisScript,strlen(PATH_site)));
if (TYPO3_mainDir!='typo3/' && substr($this->scriptID,0,strlen(TYPO3_mainDir)) == TYPO3_mainDir) {
$this->scriptID = 'typo3/'.substr($this->scriptID,strlen(TYPO3_mainDir)); // This fixes if TYPO3_mainDir has been changed so the script ids are STILL "typo3/..."
}

$this->bodyTagId = ereg_replace('[^[:alnum:]-]','-',$this->scriptID);

// Individual configuration per script? If so, make a recursive merge of the arrays:
if (is_array($TBE_STYLES['scriptIDindex'][$this->scriptID])) {
$ovr = $TBE_STYLES['scriptIDindex'][$this->scriptID]; // Make copy
$TBE_STYLES = t3lib_div::array_merge_recursive_overrule($TBE_STYLES,$ovr); // merge styles.
unset($TBE_STYLES['scriptIDindex'][$this->scriptID]); // Have to unset - otherwise the second instantiation will do it again!
}

// Color scheme:
if ($TBE_STYLES['mainColors']['bgColor']) $this->bgColor=$TBE_STYLES['mainColors']['bgColor'];
if ($TBE_STYLES['mainColors']['bgColor1']) $this->bgColor1=$TBE_STYLES['mainColors']['bgColor1'];
if ($TBE_STYLES['mainColors']['bgColor2']) $this->bgColor2=$TBE_STYLES['mainColors']['bgColor2'];
if ($TBE_STYLES['mainColors']['bgColor3']) $this->bgColor3=$TBE_STYLES['mainColors']['bgColor3'];
if ($TBE_STYLES['mainColors']['bgColor4']) $this->bgColor4=$TBE_STYLES['mainColors']['bgColor4'];
if ($TBE_STYLES['mainColors']['bgColor5']) $this->bgColor5=$TBE_STYLES['mainColors']['bgColor5'];
if ($TBE_STYLES['mainColors']['bgColor6']) $this->bgColor6=$TBE_STYLES['mainColors']['bgColor6'];
if ($TBE_STYLES['mainColors']['hoverColor']) $this->hoverColor=$TBE_STYLES['mainColors']['hoverColor'];

// Main Stylesheets:
if ($TBE_STYLES['stylesheet']) $this->styleSheetFile = $TBE_STYLES['stylesheet'];
if ($TBE_STYLES['stylesheet2']) $this->styleSheetFile2 = $TBE_STYLES['stylesheet2'];
if ($TBE_STYLES['styleSheetFile_post']) $this->styleSheetFile_post = $TBE_STYLES['styleSheetFile_post'];
if ($TBE_STYLES['inDocStyles_TBEstyle']) $this->inDocStyles_TBEstyle = $TBE_STYLES['inDocStyles_TBEstyle'];

// Background image
if ($TBE_STYLES['background']) $this->backGroundImage = $TBE_STYLES['background'];
}
















/*****************************************
*
* EVALUATION FUNCTIONS
* Various centralized processing
*
*****************************************/

/**
* Makes click menu link (context sensitive menu)
* 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)
* 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)
*
* @param string String to be wrapped in link, typ. image tag.
* @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
* @param integer If icon is for database record this is the UID for the record from $table
* @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.
* @param string Additional GET parameters for the link to alt_clickmenu.php
* @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.
* @param boolean If set, will return only the onclick JavaScript, not the whole link.
* @return string The link-wrapped input string.
*/
function wrapClickMenuOnIcon($str,$table,$uid='',$listFr=1,$addParams='',$enDisItems='', $returnOnClick=FALSE) {
$backPath = '&backPath='.rawurlencode($this->backPath).'|'.t3lib_div::shortMD5($this->backPath.'|'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']);
$onClick = 'top.loadTopMenu(\''.$this->backPath.'alt_clickmenu.php?item='.rawurlencode($table.'|'.$uid.'|'.$listFr.'|'.$enDisItems).$backPath.$addParams.'\');'.$this->thisBlur().'return false;';
return $returnOnClick ? $onClick : '<a href="#" onclick="'.htmlspecialchars($onClick).'">'.$str.'</a>';
}

/**
* Makes link to page $id in frontend (view page)
* Returns an magnifier-glass icon which links to the frontend index.php document for viewing the page with id $id
* $id must be a page-uid
* If the BE_USER has access to Web>List then a link to that module is shown as well (with return-url)
*
* @param integer The page id
* @param string The current "BACK_PATH" (the back relative to the typo3/ directory)
* @param string Additional parameters for the image tag(s)
* @return string HTML string with linked icon(s)
*/
function viewPageIcon($id,$backPath,$addParams='hspace="3"') {
global $BE_USER;
$str = '';
// If access to Web>List for user, then link to that module.
if ($BE_USER->check('modules','web_list')) {
$href=$backPath.'db_list.php?id='.$id.'&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'));
$str.= '<a href="'.htmlspecialchars($href).'">'.
'<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="" />'.
'</a>';
}
// Make link to view page
$str.= '<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::viewOnClick($id,$backPath,t3lib_BEfunc::BEgetRootLine($id))).'">'.
'<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="" />'.
'</a>';
return $str;
}

/**
* Returns a URL with a command to TYPO3 Core Engine (tce_db.php)
* See description of the API elsewhere.
*
* @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"
* @param string Redirect URL if any other that t3lib_div::getIndpEnv('REQUEST_URI') is wished
* @return string URL to tce_db.php + parameters (backpath is taken from $this->backPath)
*/
function issueCommand($params,$rUrl='') {
$rUrl = $rUrl ? $rUrl : t3lib_div::getIndpEnv('REQUEST_URI');
return $this->backPath.'tce_db.php?'.
$params.
'&redirect='.($rUrl==-1?"'+T3_THIS_LOCATION+'":rawurlencode($rUrl)).
'&vC='.rawurlencode($GLOBALS['BE_USER']->veriCode()).
'&prErr=1&uPT=1';
}

/**
* Returns true if click-menu layers can be displayed for the current user/browser
* Use this to test if click-menus (context sensitive menus) can and should be displayed in the backend.
*
* @return boolean
*/
function isCMlayers() {
return !$GLOBALS['BE_USER']->uc['disableCMlayers'] && $GLOBALS['CLIENT']['FORMSTYLE'] && $GLOBALS['CLIENT']['SYSTEM']!='mac';
}

/**
* Returns 'this.blur();' if the client supports CSS styles
* Use this in links to remove the underlining after being clicked
*
* @return string
*/
function thisBlur() {
return ($GLOBALS['CLIENT']['FORMSTYLE']?'this.blur();':'');
}

/**
* Returns ' style='cursor:help;'' if the client supports CSS styles
* Use for <a>-links to help texts
*
* @return string
*/
function helpStyle() {
return $GLOBALS['CLIENT']['FORMSTYLE'] ? ' style="cursor:help;"':'';
}

/**
* Makes the header (icon+title) for a page (or other record). Used in most modules under Web>*
* $table and $row must be a tablename/record from that table
* $path will be shown as alt-text for the icon.
* The title will be truncated to 45 chars.
*
* @param string Table name
* @param array Record row
* @param string Alt text
* @param boolean Set $noViewPageIcon true if you don't want a magnifier-icon for viewing the page in the frontend
* @param array $tWrap is an array with indexes 0 and 1 each representing HTML-tags (start/end) which will wrap the title
* @return string HTML content
*/
function getHeader($table,$row,$path,$noViewPageIcon=0,$tWrap=array('','')) {
global $TCA;
if (is_array($row) && $row['uid']) {
$iconImgTag = t3lib_iconWorks::getIconImage($table,$row,$this->backPath,'title="'.htmlspecialchars($path).'"');
$title = strip_tags($row[$TCA[$table]['ctrl']['label']]);
$viewPage = $noViewPageIcon ? '' : $this->viewPageIcon($row['uid'],$this->backPath,'');
if ($table=='pages') $path.=' - '.t3lib_BEfunc::titleAttribForPages($row,'',0);
} else {
$iconImgTag='<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/i/_icon_website.gif',$wHattribs='width="18" height="16"').' title="'.htmlspecialchars($path).'" alt="" />';
$title=$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'];
}

return '<span class="typo3-moduleHeader">'.$this->wrapClickMenuOnIcon($iconImgTag,$table,$row['uid']).
$viewPage.
$tWrap[0].htmlspecialchars(t3lib_div::fixed_lgd($title,45)).$tWrap[1].'</span>';
}

/**
* Like ->getHeader() but for files in the File>* main module/submodules
* Returns the file-icon with the path of the file set in the alt/title attribute. Shows the file-name after the icon.
*
* @param string Title string, expected to be the filepath
* @param string Alt text
* @param string The icon file (relative to TYPO3 dir)
* @return string HTML content
*/
function getFileheader($title,$path,$iconfile) {
$fileInfo = t3lib_div::split_fileref($title);
$title = htmlspecialchars(t3lib_div::fixed_lgd_pre($fileInfo['path'],35)).'<b>'.htmlspecialchars($fileInfo['file']).'</b>';
return '<span class="typo3-moduleHeader"><img'.t3lib_iconWorks::skinImg($this->backPath,$iconfile,'width="18" height="16"').' title="'.htmlspecialchars($path).'" alt="" />'.$title.'</span>';
}

/**
* Returns a linked shortcut-icon which will call the shortcut frame and set a shortcut there back to the calling page/module
*
* @param string Is the list of GET variables to store (if any)
* @param string Is the list of SET[] variables to store (if any) - SET[] variables a stored in $GLOBALS["SOBE"]->MOD_SETTINGS for backend modules
* @param string Module name string
* @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.
* @return string HTML content
*/
function makeShortcutIcon($gvList,$setList,$modName,$motherModName="") {
$backPath=$this->backPath;
$storeUrl=$this->makeShortcutUrl($gvList,$setList);
$pathInfo = parse_url(t3lib_div::getIndpEnv('REQUEST_URI'));

if (!strcmp($motherModName,'1')) {
$mMN="&motherModName='+top.currentModuleLoaded+'";
} elseif ($motherModName) {
$mMN='&motherModName='.rawurlencode($motherModName);
} else $mMN="";

$onClick = 'if (top.shortcutFrame && confirm('.
$GLOBALS['LANG']->JScharCode($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.makeShortcut')).
')){top.shortcutFrame.document.location=\''.$backPath.'alt_shortcut.php?modName='.rawurlencode($modName).
'&URL='.rawurlencode($pathInfo['path']."?".$storeUrl).
$mMN.
'\';}return false;';

$sIcon = '<a href="#" onclick="'.htmlspecialchars($onClick).'">
<img'.t3lib_iconWorks::skinImg($backPath,'gfx/shortcut.gif','width="14" height="14"').' title="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.makeShortcut',1).'" alt="" /></a>';
return $sIcon;
}

/**
* MAKE url for storing
* Internal func
*
* @param string Is the list of GET variables to store (if any)
* @param string Is the list of SET[] variables to store (if any) - SET[] variables a stored in $GLOBALS["SOBE"]->MOD_SETTINGS for backend modules
* @return string
* @access private
* @see makeShortcutIcon()
*/
function makeShortcutUrl($gvList,$setList) {
$GET = t3lib_div::_GET();
$storeArray = array_merge(
t3lib_div::compileSelectedGetVarsFromArray($gvList,$GET),
array('SET'=>t3lib_div::compileSelectedGetVarsFromArray($setList,$GLOBALS['SOBE']->MOD_SETTINGS))
);
$storeUrl = t3lib_div::implodeArrayForUrl('',$storeArray);
return $storeUrl;
}

/**
* Returns <input> attributes to set the width of an text-type input field.
* For client browsers with no CSS support the cols/size attribute is returned.
* For CSS compliant browsers (recommended) a ' style="width: ...px;"' is returned.
*
* @param integer A relative number which multiplied with approx. 10 will lead to the width in pixels
* @param boolean A flag you can set for textareas - DEPRECIATED, use ->formWidthText() for textareas!!!
* @param string A string which will be returned as attribute-value for style="" instead of the calculated width (if CSS is enabled)
* @return string Tag attributes for an <input> tag (regarding width)
* @see formWidthText()
*/
function formWidth($size=48,$textarea=0,$styleOverride='') {
$wAttrib = $textarea?'cols':'size';
if (!$GLOBALS['CLIENT']['FORMSTYLE']) { // If not setting the width by style-attribute
$size = $size;
$retVal = ' '.$wAttrib.'="'.$size.'"';
} else { // Setting width by style-attribute. 'cols' MUST be avoided with NN6+
$pixels = ceil($size*$this->form_rowsToStylewidth);
$retVal = $styleOverride ? ' style="'.$styleOverride.'"' : ' style="width:'.$pixels.'px;"';
}
return $retVal;
}

/**
* This function is dedicated to textareas, which has the wrapping on/off option to observe.
* EXAMPLE:
* <textarea rows="10" wrap="off" '.$GLOBALS["TBE_TEMPLATE"]->formWidthText(48,"","off").'>
* or
* <textarea rows="10" wrap="virtual" '.$GLOBALS["TBE_TEMPLATE"]->formWidthText(48,"","virtual").'>
*
* @param integer A relative number which multiplied with approx. 10 will lead to the width in pixels
* @param string A string which will be returned as attribute-value for style="" instead of the calculated width (if CSS is enabled)
* @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.
* @return string Tag attributes for an <input> tag (regarding width)
* @see formWidth()
*/
function formWidthText($size=48,$styleOverride='',$wrap='') {
$wTags = $this->formWidth($size,1,$styleOverride);
// 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...
if (strtolower(trim($wrap))!='off' && $GLOBALS['CLIENT']['BROWSER']=='net' && $GLOBALS['CLIENT']['VERSION']>=5) {
$wTags.=' cols="'.$size.'"';
}
return $wTags;
}

/**
* Returns JavaScript variables setting the returnUrl and thisScript location for use by JavaScript on the page.
* Used in fx. db_list.php (Web>List)
*
* @param string URL to "this location" / current script
* @return string
* @see typo3/db_list.php
*/
function redirectUrls($thisLocation='') {
$thisLocation = $thisLocation?$thisLocation:t3lib_div::linkThisScript(
array(
'CB'=>'',
'SET'=>'',
'cmd' => '',
'popViewId'=>''
));

$out ="
var T3_RETURN_URL = '".str_replace('%20','',rawurlencode(t3lib_div::_GP('returnUrl')))."';
var T3_THIS_LOCATION = '".str_replace('%20','',rawurlencode($thisLocation))."';
";
return $out;
}

/**
* Returns a formatted string of $tstamp
* Uses $GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'] and $GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'] to format date and time
*
* @param integer UNIX timestamp, seconds since 1970
* @param integer How much data to show: $type = 1: hhmm, $type = 10: ddmmmyy
* @return string Formatted timestamp
*/
function formatTime($tstamp,$type) {
switch($type) {
case 1: return date($GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'],$tstamp); break;
case 10: return date($GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'],$tstamp); break;
}
}

/**
* Returns script parsetime IF ->parseTimeFlag is set and user is "admin"
* Automatically outputted in page end
*
* @return string
*/
function parseTime() {
if ($this->parseTimeFlag && $GLOBALS['BE_USER']->isAdmin()) {
return '<p>(ParseTime: '.(t3lib_div::milliseconds()-$GLOBALS['PARSETIME_START']).' ms</p>
<p>REQUEST_URI-length: '.strlen(t3lib_div::getIndpEnv('REQUEST_URI')).')</p>';
}
}












/*****************************************
*
* PAGE BUILDING FUNCTIONS.
* Use this to build the HTML of your backend modules
*
*****************************************/

/**
* Returns page start
* This includes the proper header with charset, title, meta tag and beginning body-tag.
*
* @param string HTML Page title for the header
* @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)
* @see endPage()
*/
function startPage($title) {
// Get META tag containing the currently selected charset for backend output. The function sets $this->charSet.
$charSet = $this->initCharset();
$generator = $this->generator();

// For debugging: If this outputs "QuirksMode"/"BackCompat" (IE) the browser runs in quirks-mode. Otherwise the value is "CSS1Compat"
# $this->JScodeArray[]='alert(document.compatMode);';

// Send HTTP header for selected charset. Added by Robert Lemke 23.10.2003
header ('Content-Type:text/html;charset='.$this->charset);

switch($this->docType) {
case 'xhtml_strict':
$headerStart= '<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<?xml version="1.0" encoding="'.$this->charset.'"?>
<?xml-stylesheet href="#internalStyle" type="text/css"?>
';
break;
case 'xhtml_trans':
$headerStart= '<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?xml version="1.0" encoding="'.$this->charset.'"?>
<?xml-stylesheet href="#internalStyle" type="text/css"?>
';
break;
case 'xhtml_frames':
$headerStart= '<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<?xml version="1.0" encoding="'.$this->charset.'"?>
';
break;
default:
$headerStart='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">';
break;
}

// Construct page header.
$str = $headerStart.'
<html>
<head>
<!-- TYPO3 Script ID: '.htmlspecialchars($this->scriptID).' -->
'.$charSet.'
'.$generator.'
<title>'.htmlspecialchars($title).'</title>
'.$this->docStyle().'
'.$this->JScode.'
'.$this->wrapScriptTags(implode("\n", $this->JScodeArray)).'
<!--###POSTJSMARKER###-->
</head>
';
$this->JScode='';
$this->JScodeArray=array();

if ($this->docType=='xhtml_frames') {
return $str;
} else
$str.=$this->docBodyTagBegin().
($this->divClass?'

<!-- Wrapping DIV-section for whole page BEGIN -->
<div class="'.$this->divClass.'">
':'').trim($this->form);
return $str;
}

/**
* Returns page end; This includes finishing form, div, body and html tags.
*
* @return string The HTML end of a page
* @see startPage()
*/
function endPage() {
$str = $this->sectionEnd().
$this->postCode.
$this->endPageJS().
t3lib_BEfunc::getSetUpdateSignal().
$this->parseTime().
($this->form?'
</form>':'').
($this->divClass?'

<!-- Wrapping DIV-section for whole page END -->
</div>':'').
'
</body>
</html> ';

// Logging: Can't find better place to put it:
if (TYPO3_DLOG) t3lib_div::devLog('END of BACKEND session','',0,array('_FLUSH'=>TRUE));

return $str;
}

/**
* Returns the header-bar in the top of most backend modules
* Closes section if open.
*
* @param string The text string for the header
* @return string HTML content
*/
function header($text) {
$str='

<!-- MAIN Header in page top -->
<h2>'.htmlspecialchars($text).'</h2>
';
return $this->sectionEnd().$str;
}

/**
* Begins an output section and sets header and content
*
* @param string The header
* @param string The HTML-content
* @param boolean A flag that will prevent the header from being converted to uppercase
* @param boolean Defines the type of header (if set, "<h3>" rather than the default "h4")
* @param integer The number of an icon to show with the header (see the icon-function). -1,1,2,3
* @param boolean If set, HTML tags are allowed in $label (otherwise this value is by default htmlspecialchars()'ed)
* @return string HTML content
* @see icons(), sectionHeader()
*/
function section($label,$text,$nostrtoupper=FALSE,$sH=FALSE,$type=0,$allowHTMLinHeader=FALSE) {
$str='';

// Setting header
if ($label) {
if (!$allowHTMLinHeader) $label = htmlspecialchars($label);
$str.=$this->sectionHeader($this->icons($type).$label, $sH, $nostrtoupper ? '' : ' class="uppercase"');
}
// Setting content
$str.='

<!-- Section content -->
'.$text;

return $this->sectionBegin().$str;
}

/**
* Inserts a divider image
* Ends a section (if open) before inserting the image
*
* @param integer The margin-top/-bottom of the <hr> ruler.
* @return string HTML content
*/
function divider($dist) {
$dist = intval($dist);
$str='

<!-- DIVIDER -->
<hr style="margin-top: '.$dist.'px; margin-bottom: '.$dist.'px;" />
';
return $this->sectionEnd().$str;
}

/**
* Returns a blank <div>-section with a height
*
* @param integer Padding-top for the div-section (should be margin-top but konquorer (3.1) don't like it :-(
* @return string HTML content
*/
function spacer($dist) {
if ($dist>0) {
return '

<!-- Spacer element -->
<div style="padding-top: '.intval($dist).'px;"></div>
';
}
}

/**
* Make a section header.
* Begins a section if not already open.
*
* @param string The label between the <h3> or <h4> tags. (Allows HTML)
* @param boolean If set, <h3> is used, otherwise <h4>
* @param string Additional attributes to h-tag, eg. ' class=""'
* @return string HTML content
*/
function sectionHeader($label,$sH=FALSE,$addAttrib='') {
$tag = ($sH?'h3':'h4');
$str='

<!-- Section header -->
<'.$tag.$addAttrib.'>'.$label.'</'.$tag.'>
';
return $this->sectionBegin().$str;
}

/**
* Begins an output section.
* Returns the <div>-begin tag AND sets the ->sectionFlag true (if the ->sectionFlag is not already set!)
* 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!
*
* @return string HTML content
*/
function sectionBegin() {
if (!$this->sectionFlag) {
$this->sectionFlag=1;
$str='

<!-- ***********************
Begin output section.
*********************** -->
<div>
';
return $str;
} else return '';
}

/**
* Ends and output section
* Returns the </div>-end tag AND clears the ->sectionFlag (but does so only IF the sectionFlag is set - that is a section is 'open')
* See sectionBegin() also.
*
* @return string HTML content
*/
function sectionEnd() {
if ($this->sectionFlag) {
$this->sectionFlag=0;
return '
</div>
<!-- *********************
End output section.
********************* -->
';
} else return '';
}

/**
* Originally it printed a kind of divider.
* Depreciated. Just remove function calls to it or call the divider() function instead.
*
* @return void
* @internal
* @depreciated
*/
function middle() {
}

/**
* If a form-tag is defined in ->form then and end-tag for that <form> element is outputted
* Further a JavaScript section is outputted which will update the top.busy session-expiry object (unless $this->endJS is set to false)
*
* @return string HTML content (<script> tag section)
*/
function endPageJS() {
return ($this->endJS?'
<script type="text/javascript">
/*<![CDATA[*/
if (top.busy && top.busy.loginRefreshed) {
top.busy.loginRefreshed();
}
/*]]>*/
</script>':'');
}

/**
* Creates the bodyTag.
* You can add to the bodyTag by $this->bodyTagAdditions
*
* @return string HTML body tag
*/
function docBodyTagBegin() {
$bodyContent = 'body '.trim($this->bodyTagAdditions.($this->bodyTagId ? ' id="'.$this->bodyTagId.'"' : ''));
return '<'.trim($bodyContent).'>';
}

/**
* Outputting document style
*
* @return string HTML style section/link tags
*/
function docStyle() {

// Request background image:
if ($this->backGroundImage) {
$this->inDocStylesArray[]=' BODY { background-image: url('.$this->backPath.$this->backGroundImage.'); }';
}

// Add inDoc styles variables as well:
$this->inDocStylesArray[] = $this->inDocStyles;
$this->inDocStylesArray[] = $this->inDocStyles_TBEstyle;

// Implode it all:
$inDocStyles = implode('
',$this->inDocStylesArray);

// The default color scheme should also in full be represented in the stylesheet.
$style=trim('
'.($this->styleSheetFile?'<link rel="stylesheet" type="text/css" href="'.$this->backPath.$this->styleSheetFile.'" />':'').'
'.($this->styleSheetFile2?'<link rel="stylesheet" type="text/css" href="'.$this->backPath.$this->styleSheetFile2.'" />':'').'
'.(trim($inDocStyles) ? '
<style type="text/css" id="internalStyle">
/*<![CDATA[*/
'.trim($inDocStyles).'
/*]]>*/
</style>' : '').'
'.($this->styleSheetFile_post?'<link rel="stylesheet" type="text/css" href="'.$this->backPath.$this->styleSheetFile_post.'" />':'')
)
;
$this->inDocStyles='';
$this->inDocStylesArray=array();

return '
'.$style;
}

/**
* Insert post rendering document style into already rendered content
*
* @param string style-content to insert.
* @return string content with inserted styles
*/
function insertStylesAndJS($content) {
// insert accumulated CSS
$this->inDocStylesArray[] = $this->inDocStyles;
$styles = "\n".implode("\n", $this->inDocStylesArray);
$content = str_replace('/*###POSTCSSMARKER###*/',$styles,$content);

// insert accumulated JS
$jscode = $this->JScode."\n".$this->wrapScriptTags(implode("\n", $this->JScodeArray));
$content = str_replace('<!--###POSTJSMARKER###-->',$jscode,$content);

return $content;
}

/**
* Initialize the charset.
* Sets the internal $this->charset variable to the charset defined in $GLOBALS["LANG"] (or the default as set in this class)
* Returns the meta-tag for the document header
*
* @return string <meta> tag with charset from $this->charset or $GLOBALS['LANG']->charSet
*/
function initCharset() {
// Set charset to the charset provided by the current backend users language selection:
$this->charset = $GLOBALS['LANG']->charSet ? $GLOBALS['LANG']->charSet : $this->charset;
// Return meta tag:
return '<meta http-equiv="Content-Type" content="text/html; charset='.$this->charset.'" />';
}

/**
* Returns generator meta tag
*
* @return string <meta> tag with name "GENERATOR"
*/
function generator() {
$str = 'TYPO3 '.$GLOBALS['TYPO_VERSION'].', http://typo3.com, &#169; Kasper Sk&#229;rh&#248;j 1998-2004, extensions are copyright of their respective owners.';
return '<meta name="GENERATOR" content="'.$str .'" />';
}








/*****************************************
*
* OTHER ELEMENTS
* Tables, buttons, formatting dimmed/red strings
*
******************************************/


/**
* Returns an image-tag with an 18x16 icon of the following types:
*
* $type:
* -1: OK icon (Check-mark)
* 1: Notice (Speach-bubble)
* 2: Warning (Yellow triangle)
* 3: Fatal error (Red stop sign)
*
* @param integer See description
* @return string HTML image tag (if applicable)
*/
function icons($type) {
switch($type) {
case '3':
$icon = 'gfx/icon_fatalerror.gif';
break;
case '2':
$icon = 'gfx/icon_warning.gif';
break;
case '1':
$icon = 'gfx/icon_note.gif';
break;
case '-1':
$icon = 'gfx/icon_ok.gif';
break;
default:
break;
}
if ($icon) {
return '<img'.t3lib_iconWorks::skinImg($this->backPath,$icon,'width="18" height="16"').' class="absmiddle" alt="" />';
}
}

/**
* Returns an <input> button with the $onClick action and $label
*
* @param string The value of the onclick attribute of the input tag (submit type)
* @param string The label for the button (which will be htmlspecialchar'ed)
* @return string A <input> tag of the type "submit"
*/
function t3Button($onClick,$label) {
$button = '<input type="submit" onclick="'.htmlspecialchars($onClick).'; return false;" value="'.htmlspecialchars($label).'" />';
return $button;
}

/**
* dimmed-fontwrap. Returns the string wrapped in a <span>-tag defining the color to be gray/dimmed
*
* @param string Input string
* @return string Output string
*/
function dfw($string) {
return '<span class="typo3-dimmed">'.$string.'</span>';
}

/**
* red-fontwrap. Returns the string wrapped in a <span>-tag defining the color to be red
*
* @param string Input string
* @return string Output string
*/
function rfw($string) {
return '<span class="typo3-red">'.$string.'</span>';
}

/**
* Returns string wrapped in CDATA "tags" for XML / XHTML (wrap content of <script> and <style> sections in those!)
*
* @param string Input string
* @return string Output string
*/
function wrapInCData($string) {
$string = '/*<![CDATA[*/'.
$string.
'/*]]>*/';

return $string;
}

/**
* Wraps the input string in script tags.
* Automatic re-identing of the JS code is done by using the first line as ident reference.
* This is nice for identing JS code with PHP code on the same level.
*
* @param string Input string
* @param boolean Wrap script element in linebreaks? Default is TRUE.
* @return string Output string
*/
function wrapScriptTags($string, $linebreak=TRUE) {
if(trim($string)) {
// <script wrapped in nl?
$cr = $linebreak? "\n" : '';

// remove nl from the beginning
$string = preg_replace ('/^\n+/', '', $string);
// re-ident to one tab using the first line as reference
if(preg_match('/^(\t+)/',$string,$match)) {
$string = str_replace($match[1],"\t", $string);
}
$string = $cr.'<script type="text/javascript">
/*<![CDATA[*/
'.$string.'
/*]]>*/
</script>'.$cr;
}
return trim($string);
}

// These vars defines the layout for the table produced by the table() function.
// You can override these values from outside if you like.
var $tableLayout = Array (
'defRow' => Array (
'defCol' => Array('<td valign="top">','</td>')
)
);
var $table_TR = '<tr>';
var $table_TABLE = '<table border="0" cellspacing="0" cellpadding="0" id="typo3-tmpltable">';

/**
* Returns a table based on the input $arr
*
* @param array Multidim array with first levels = rows, second levels = cells
* @return string The HTML table.
* @internal
*/
function table($arr) {
if (is_array($arr)) {
reset($arr);
$code='';
$rc=0;
while(list(,$val)=each($arr)) {
if ($rc % 2) {
$layout = is_array($this->tableLayout['defRowOdd']) ? $this->tableLayout['defRowOdd'] : $this->tableLayout['defRow'];
} else {
$layout = is_array($this->tableLayout['defRowEven']) ? $this->tableLayout['defRowEven'] : $this->tableLayout['defRow'];
}
$layout = is_array($this->tableLayout[$rc]) ? $this->tableLayout[$rc] : $layout;
$code_td='';
if (is_array($val)) {
$cc=0;
while(list(,$content)=each($val)) {
$wrap= is_array($layout[$cc]) ? $layout[$cc] : $layout['defCol'];
$code_td.=$wrap[0].$content.$wrap[1];
$cc++;
}
}
$trWrap = is_array($layout['tr']) ? $layout['tr'] : array($this->table_TR, '</tr>');
$code.=$trWrap[0].$code_td.$trWrap[1];
$rc++;
}
$tableWrap = is_array($this->tableLayout['table']) ? $this->tableLayout['table'] : array($this->table_TABLE, '</table>');
$code=$tableWrap[0].$code.$tableWrap[1];
}
return $code;
}

/**
* Constructs a table with content from the $arr1, $arr2 and $arr3.
* Used in eg. ext/belog/mod/index.php - refer to that for examples
*
* @param array Menu elements on first level
* @param array Secondary items
* @param array Third-level items
* @return string HTML content, <table>...</table>
*/
function menuTable($arr1,$arr2=array(), $arr3=array()) {
$rows = max(array(count($arr1),count($arr2),count($arr3)));

$menu='
<table border="0" cellpadding="0" cellspacing="0" id="typo3-tablemenu">';
for($a=0;$a<$rows;$a++) {
$menu.='<tr>';
$cls=array();
$valign='middle';
$cls[]='<td valign="'.$valign.'">'.$arr1[$a][0].'</td><td>'.$arr1[$a][1].'</td>';
if (count($arr2)) {
$cls[]='<td valign="'.$valign.'">'.$arr2[$a][0].'</td><td>'.$arr2[$a][1].'</td>';
if (count($arr3)) {
$cls[]='<td valign="'.$valign.'">'.$arr3[$a][0].'</td><td>'.$arr3[$a][1].'</td>';
}
}
$menu.=implode($cls,'<td>&nbsp;&nbsp;</td>');
$menu.='</tr>';
}
$menu.='
</table>
';
return $menu;
}

/**
* Returns a one-row/two-celled table with $content and $menu side by side.
* The table is a 100% width table and each cell is aligned left / right
*
* @param string Content cell content (left)
* @param string Menu cell content (right)
* @return string HTML output
*/
function funcMenu($content,$menu) {
return '
<table border="0" cellpadding="0" cellspacing="0" width="100%" id="typo3-funcmenu">
<tr>
<td valign="top" nowrap="nowrap">'.$content.'</td>
<td valign="top" align="right" nowrap="nowrap">'.$menu.'</td>
</tr>
</table>';
}

/**
* Creates a selector box with clear-cache items.
* Rather specialized functions - at least don't use it with $addSaveOptions unless you know what you do...
*
* @param integer The page uid of the "current page" - the one that will be cleared as "clear cache for this page".
* @param boolean If $addSaveOptions is set, then also the array of save-options for TCE_FORMS will appear.
* @return string <select> tag with content - a selector box for clearing the cache
*/
function clearCacheMenu($id,$addSaveOptions=0) {
global $BE_USER;
$opt=$addOptions;
if ($addSaveOptions) {
$opt[]='<option value="">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.menu',1).'</option>';
$opt[]='<option value="TBE_EDITOR_checkAndDoSubmit(1);">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.saveDoc',1).'</option>';
$opt[]='<option value="document.editform.closeDoc.value=-2; TBE_EDITOR_checkAndDoSubmit(1);">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.saveCloseDoc',1).'</option>';
if ($BE_USER->uc['allSaveFunctions']) $opt[]='<option value="document.editform.closeDoc.value=-3; TBE_EDITOR_checkAndDoSubmit(1);">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.saveCloseAllDocs',1).'</option>';
$opt[]='<option value="document.editform.closeDoc.value=2; document.editform.submit();">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.closeDoc',1).'</option>';
$opt[]='<option value="document.editform.closeDoc.value=3; document.editform.submit();">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.closeAllDocs',1).'</option>';
$opt[]='<option value=""></option>';
}
$opt[]='<option value="">[ '.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.clearCache_clearCache',1).' ]</option>';
if ($id) $opt[]='<option value="'.$id.'">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.clearCache_thisPage',1).'</option>';
if ($BE_USER->isAdmin() || $BE_USER->getTSConfigVal('options.clearCache.pages')) $opt[]='<option value="pages">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.clearCache_pages',1).'</option>';
if ($BE_USER->isAdmin() || $BE_USER->getTSConfigVal('options.clearCache.all')) $opt[]='<option value="all">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.clearCache_all',1).'</option>';

$onChange = 'if (!this.options[this.selectedIndex].value) {
this.selectedIndex=0;
} else if (this.options[this.selectedIndex].value.indexOf(\';\')!=-1) {
eval(this.options[this.selectedIndex].value);
}else{
document.location=\''.$this->backPath.'tce_db.php?vC='.$BE_USER->veriCode().'&redirect='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI')).'&cacheCmd=\'+this.options[this.selectedIndex].value;
}';
$af_content = '<select name="cacheCmd" onchange="'.htmlspecialchars($onChange).'">'.implode('',$opt).'</select>';

if (count($opt)>2) {
return $af_content;
}
}

/**
* Returns an array with parts (JavaScript, init-functions, <div>-layers) for use on pages which displays the clickmenu layers (context sensitive menus)
*
* @return array If values are present: [0] = A <script> section for the HTML page header, [1] = onmousemove/onload handler for HTML tag or alike, [2] = Two empty <div> layers for the context menu
*/
function getContextMenuCode() {
if ($this->isCMlayers()) {
$content='
<script type="text/javascript">
/*<![CDATA[*/
var GLV_gap=10;
var GLV_curLayerX=new Array(0,0);
var GLV_curLayerY=new Array(0,0);
var GLV_curLayerWidth=new Array(0,0);
var GLV_curLayerHeight=new Array(0,0);
var GLV_isVisible=new Array(0,0);
var GLV_x=0;
var GLV_y=0;
var GLV_xRel=0;
var GLV_yRel=0;
var layerObj=new Array();
var layerObjCss=new Array();

//browsercheck...
function GL_checkBrowser(){ //
this.dom= (document.getElementById);
this.op= (navigator.userAgent.indexOf("Opera")>-1);
this.op7= this.op && (navigator.appVersion.indexOf("7")>-1); // check for Opera version 7
this.konq= (navigator.userAgent.indexOf("Konq")>-1);
this.ie4= (document.all && !this.dom && !this.op && !this.konq);
this.ie5= (document.all && this.dom && !this.op && !this.konq);
this.ns4= (document.layers && !this.dom && !this.konq);
this.ns5= (!document.all && this.dom && !this.op && !this.konq);
this.ns6= (this.ns5);
this.bw= (this.ie4 || this.ie5 || this.ns4 || this.ns6 || this.op || this.konq);
return this;
}
bw= new GL_checkBrowser();

// GL_getObj(obj)
function GL_getObj(obj){ //
nest="";
this.el= (bw.ie4||bw.op7)?document.all[obj]:bw.ns4?eval(nest+"document."+obj):document.getElementById(obj);
this.css= bw.ns4?this.el:this.el.style;
this.ref= bw.ns4?this.el.document:document;
this.x= (bw.ns4||bw.op)?this.css.left:this.el.offsetLeft;
this.y= (bw.ns4||bw.op)?this.css.top:this.el.offsetTop;
this.height= (bw.ie4||bw.ie5||bw.ns6||this.konq||bw.op7)?this.el.offsetHeight:bw.ns4?this.ref.height:bw.op?this.css.pixelHeight:0;
this.width= (bw.ie4||bw.ie5||bw.ns6||this.konq||bw.op7)?this.el.offsetWidth:bw.ns4?this.ref.width:bw.op?this.css.pixelWidth:0;
return this;
}
// GL_getObjCss(obj)
function GL_getObjCss(obj){ //
return bw.dom? document.getElementById(obj).style:bw.ie4?document.all[obj].style:bw.ns4?document.layers[obj]:0;
}
// GL_getMouse(event)
function GL_getMouse(event) { //
if (layerObj) {
// GLV_x= (bw.ns4||bw.ns5)?event.pageX:(bw.ie4||bw.op)?event.clientX:(event.clientX-2)+document.body.scrollLeft;
// GLV_y= (bw.ns4||bw.ns5)?event.pageY:(bw.ie4||bw.op)?event.clientY:(event.clientY-2)+document.body.scrollTop;
// 17/12 2003: When documents run in XHTML standard compliance mode, the old scrollLeft/Top properties of document.body is gone - and for Opera/MSIE we have to use document.documentElement:

GLV_xRel = event.clientX-2;
GLV_yRel = event.clientY-2;
GLV_x = GLV_xRel + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
GLV_y = GLV_yRel + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);

// status = (GLV_x+GLV_gap-GLV_curLayerX[0]) + " | " + (GLV_y+GLV_gap-GLV_curLayerY[0]);
if (GLV_isVisible[1]) {
if (outsideLayer(1)) hideSpecific(1);
} else if (GLV_isVisible[0]) {
if (outsideLayer(0)) hideSpecific(0);
}
}
}
// outsideLayer(level)
function outsideLayer(level) { //
return GLV_x+GLV_gap-GLV_curLayerX[level] <0 ||
GLV_y+GLV_gap-GLV_curLayerY[level] <0 ||
GLV_curLayerX[level]+GLV_curLayerWidth[level]+GLV_gap-GLV_x <0 ||
GLV_curLayerY[level]+GLV_curLayerHeight[level]+GLV_gap-GLV_y <0;
}
// setLayerObj(html,level)
function setLayerObj(html,level) { //
var tempLayerObj = GL_getObj("contentMenu"+level);
var tempLayerObjCss = GL_getObjCss("contentMenu"+level);

if (tempLayerObj && (level==0 || GLV_isVisible[level-1])) {
tempLayerObj.el.innerHTML = html;
tempLayerObj.width= (bw.ie4||bw.ie5||bw.ns6||bw.konq||bw.op7)?this.el.offsetWidth:bw.ns4?this.ref.width:bw.op?this.css.pixelWidth:0;
tempLayerObj.height= (bw.ie4||bw.ie5||bw.ns6||bw.konq||bw.op7)?this.el.offsetHeight:bw.ns4?this.ref.height:bw.op?this.css.pixelHeight:0;

// Adjusting the Y-height of the layer to fit it into the window frame if it goes under the window frame in the bottom:
tempLayerObj.winHeight = document.documentElement.clientHeight && !bw.op7 ? document.documentElement.clientHeight : document.body.clientHeight;
if (tempLayerObj.winHeight-tempLayerObj.height < GLV_yRel) {
if (GLV_yRel < tempLayerObj.height) {
GLV_y+= (tempLayerObj.winHeight-tempLayerObj.height-GLV_yRel); // Setting it so bottom is just above window height.
} else {
GLV_y-= tempLayerObj.height-8; // Showing the menu upwards
}
}

GLV_curLayerX[level] = GLV_x;
GLV_curLayerY[level] = GLV_y;
tempLayerObjCss.left = GLV_x+"px";
tempLayerObjCss.top = GLV_y+"px";
tempLayerObjCss.visibility = "visible";
if (bw.ie5) showHideSelectorBoxes("hidden");

GLV_isVisible[level]=1;
GLV_curLayerWidth[level] = tempLayerObj.width;
GLV_curLayerHeight[level] = tempLayerObj.height;
}
}
// hideEmpty()
function hideEmpty() { //
hideSpecific(0);
hideSpecific(1);
return false;
}
// hideSpecific(level)
function hideSpecific(level) { //
GL_getObjCss("contentMenu"+level).visibility = "hidden";
GL_getObj("contentMenu"+level).el.innerHTML = "";
GLV_isVisible[level]=0;

if (bw.ie5 && level==0) showHideSelectorBoxes("visible");
}
// debugObj(obj,name)
function debugObj(obj,name) { //
var acc;
for (i in obj) {if (obj[i]) {acc+=i+": "+obj[i]+"\n";}}
alert("Object: "+name+"\n\n"+acc);
}
// initLayer()
function initLayer(){ //
if (document.all) {
window.onmousemove=GL_getMouse;
}
layerObj = GL_getObj("contentMenu1");
layerObjCss = GL_getObjCss("contentMenu1");
}
function showHideSelectorBoxes(action) { // This function by Michiel van Leening
for (i=0;i<document.forms.length;i++) {
for (j=0;j<document.forms[i].elements.length;j++) {
if(document.forms[i].elements[j].type=="select-one") {
document.forms[i].elements[j].style.visibility=action;
}
}
}
}
/*]]>*/
</script>
';
return array(
$content,
' onmousemove="GL_getMouse(event);" onload="initLayer();"',
'<div id="contentMenu0" style="z-index:1; position:absolute;visibility:hidden"></div><div id="contentMenu1" style="z-index:2; position:absolute;visibility:hidden"></div>'
);
} else return array('','','');
}




/**
* creates a tab menu from an array definition
*
* Returns a tab menu for a module
* Requires the JS function jumpToUrl() to be available
*
* @param string $id is the "&id=" parameter value to be sent to the module
* @param string $elementName it the form elements name, probably something like "SET[...]"
* @param string $currentValue is the value to be selected currently.
* @param array $menuItems is an array with the menu items for the selector box
* @param string $script is the script to send the &id to, if empty it's automatically found
* @param string $addParams is additional parameters to pass to the script.
* @return string HTML code for tab menu
* @todo Update the HTML code to use the stylesheet.css instead.
* @author Ren? Fritz <r.fritz@colorcube.de>
*/
function getTabMenu($id,$elementName,$currentValue,$menuItems,$script='',$addparams='') {
$content='';

if (is_array($menuItems)) {
if (!$script) {$script=basename(PATH_thisScript);}
$options='';

$count = count($menuItems);
$widthLeft = 1;
$addToAct = 5;

$widthRight = max (1,floor(30-pow($count,1.72)));
$widthTabs = 100 - $widthRight - $widthLeft;
$widthNo = floor(($widthTabs - $addToAct)/$count);
$addToAct = max ($addToAct,$widthTabs-($widthNo*$count));
$widthAct = $widthNo + $addToAct;
$widthRight = 100 - ($widthLeft + ($count*$widthNo) + $addToAct);

$first=true;
foreach($menuItems as $value => $label) {
$isActive = !strcmp($currentValue,$value);
$class = $isActive ? "tabact" : "tab";
$width = $isActive ? $widthAct : $widthNo;

$label = t3lib_div::deHSCentities(htmlspecialchars($label));
$link = htmlspecialchars($script.'?id='.rawurlencode($id).$addparams.'&'.$elementName.'='.$value);
if($first) {
$options.= '
<td width="'.$width.'%" class="'.$class.'" style="border-left: solid #000 1px;"><a href="'.$link.'" class="'.$class.'" style="padding-left:5px;padding-right:2px;">'.$label.'</a></td>';
} else {
$options.='
<td width="'.$width.'%" class="'.$class.'"><a href="'.$link.'" class="'.$class.'">'.$label.'</a></td>';
}
$first=false;
}

if ($options) {
$content .= '
<!-- Tab menu -->
<table cellpadding="0" cellspacing="0" border="0" width="100%" id="typo3-tabmenu">
<tr>
<td width="'.$widthLeft.'%">&nbsp;</td>
'.$options.'
<td width="'.$widthRight.'%">&nbsp;</td>
</tr>
</table>
<div class="hr" style="display:block;margin:0px;padding:0px;"></div>';
}

// include CSS
$actBgColor = t3lib_div::modifyHTMLcolorAll($this->bgColor6,0);
$lgBgColor = t3lib_div::modifyHTMLcolorAll($this->bgColor5,25);
$hoverBgColor = t3lib_div::modifyHTMLcolorAll($this->bgColor6,15);

$this->inDocStylesArray['getTabMenu'] = '
td.tabact {
border: solid black 1px;
background: '.$actBgColor.';
color:#000;
}
td.tabact>a {
color:#000;
}
td.tab {
border: solid #555 1px;
border-left: solid #aaa 3px;
background: '.$lgBgColor.';
color:grey;
}
td.tab, td.tabact {
border-bottom: none;
border-radius: 3px;
-moz-border-radius: 3px;
}
a.tab, a.tabact {
color:grey;
text-decoration:none;
display: block;
width:auto;
padding:2px;
padding-left:3px;
padding-right:5px;
}
a.tabact {
padding-left:10px;
padding-right:10px;
}
a.tab:hover,a.tabact:hover {
color:black;
background: '.$hoverBgColor.';
text-decoration:none;
cursor: pointer;
}';
}
return $content;
}
}



// ******************************
// Extension classes of the template class.
// These are meant to provide backend screens with different widths.
// They still do because of the different class-prefixes used for the <div>-sections
// but obviously the final width is determined by the stylesheet used.
// ******************************

/**
* Extension class for "template" - used for backend pages which are wide. Typically modules taking up all the space in the "content" frame of the backend
* The class were more significant in the past than today.
*
*/
class bigDoc extends template {
var $divClass = 'typo3-bigDoc';
}

/**
* Extension class for "template" - used for backend pages without the "document" background image
* The class were more significant in the past than today.
*
*/
class noDoc extends template {
var $divClass = 'typo3-noDoc';
}

/**
* Extension class for "template" - used for backend pages which were narrow (like the Web>List modules list frame. Or the "Show details" pop up box)
* The class were more significant in the past than today.
*
*/
class smallDoc extends template {
var $divClass = 'typo3-smallDoc';
}

/**
* Extension class for "template" - used for backend pages which were medium wide. Typically submodules to Web or File which were presented in the list-frame when the content frame were divided into a navigation and list frame.
* The class were more significant in the past than today. But probably you should use this one for most modules you make.
*
*/
class mediumDoc extends template {
var $divClass = 'typo3-mediumDoc';
}



// Include extension to the template class?
if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/template.php']) {
include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/template.php']);
}



// ******************************************************
// The backend language engine is started (ext: "lang")
// ******************************************************
require_once(PATH_typo3.'sysext/lang/lang.php');
$LANG = t3lib_div::makeInstance('language');
$LANG->init($BE_USER->uc['lang']);



// ******************************
// The template is loaded
// ******************************
$TBE_TEMPLATE = t3lib_div::makeInstance('template');
?>
    (1-1/1)