2 /***************************************************************
5 * (c) 1999-2004 Kasper Skaarhoj (kasper@typo3.com)
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.
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.
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.
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
28 * Main frameset of the TYPO3 backend
29 * Sending the GET var "alt_main.php?edit=[page id]" will load the page id in the editing module configured.
32 * Revised for TYPO3 3.6 2/2003 by Kasper Skaarhoj
33 * XHTML Compliant (almost)
35 * @author Kasper Skaarhoj <kasper@typo3.com>
38 * [CLASS/FUNCTION INDEX of SCRIPT]
42 * 67: class SC_alt_main
44 * 108: function generateJScode()
45 * 305: function main()
46 * 379: function printContent()
49 * (This index is automatically created/updated by the extension "extdeveval")
54 require ('template.php');
55 require_once (PATH_t3lib
.'class.t3lib_loadmodules.php');
56 require_once (PATH_t3lib
.'class.t3lib_basicfilefunc.php');
57 require_once ('class.alt_menu_functions.inc');
58 $LANG->includeLLFile('EXT:lang/locallang_misc.xml');
64 * Script Class for rendering of the main frameset for the TYPO3 backend.
66 * @author Kasper Skaarhoj <kasper@typo3.com>
75 var $loadModules; // Load modules-object
76 var $alt_menuObj; // Menu functions object.
79 var $leftMenuFrameW = 130;
80 var $selMenuFrame = 130;
82 var $shortcutFrameH = 30;
85 * Initialization of the script class
90 global $TBE_MODULES,$TBE_STYLES;
92 // Initializes the backend modules structure for use later.
93 $this->loadModules
= t3lib_div
::makeInstance('t3lib_loadModules');
94 $this->loadModules
->load($TBE_MODULES);
96 // Instantiates thee menu object which will generate some JavaScript for the goToModule() JS function in this frameset.
97 $this->alt_menuObj
= t3lib_div
::makeInstance('alt_menu_functions');
99 // Check for distances defined in the styles array:
100 if ($TBE_STYLES['dims']['leftMenuFrameW']) $this->leftMenuFrameW
= $TBE_STYLES['dims']['leftMenuFrameW'];
101 if ($TBE_STYLES['dims']['topFrameH']) $this->topFrameH
= $TBE_STYLES['dims']['topFrameH'];
102 if ($TBE_STYLES['dims']['shortcutFrameH']) $this->shortcutFrameH
= $TBE_STYLES['dims']['shortcutFrameH'];
103 if ($TBE_STYLES['dims']['selMenuFrame']) $this->selMenuFrame
= $TBE_STYLES['dims']['selMenuFrame'];
107 * Generates the JavaScript code for the frameset.
111 function generateJScode() {
112 global $BE_USER,$LANG;
114 $pt3=t3lib_div
::dirname(t3lib_div
::getIndpEnv('SCRIPT_NAME')).'/';
115 $goToModule_switch = $this->alt_menuObj
->topMenu($this->loadModules
->modules
,0,"",4);
116 $fsMod = implode(chr(10),$this->alt_menuObj
->fsMod
);
118 // If another page module was specified, replace the default Page module with the new one
119 $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule'));
120 $pageModule = t3lib_BEfunc
::isModuleSetInTBE_MODULES($newPageModule) ?
$newPageModule : 'web_layout';
124 * Function similar to PHPs rawurlencode();
126 function rawurlencode(str) { //
127 var output = escape(str);
128 output = str_replace("*","%2A", output);
129 output = str_replace("+","%2B", output);
130 output = str_replace("/","%2F", output);
131 output = str_replace("@","%40", output);
136 * String-replace function
138 function str_replace(match,replace,string) { //
139 var input = ""+string;
140 var matchStr = ""+match;
141 if (!matchStr) {return string;}
144 var pos = input.indexOf(matchStr);
146 output+=""+input.substr(pointer, pos-pointer)+replace;
147 pointer=pos+matchStr.length;
148 pos = input.indexOf(match,pos+1);
150 output+=""+input.substr(pointer);
157 function typoSetup() { //
158 this.PATH_typo3 = "'.$pt3.'";
159 this.username = "'.$BE_USER->user
['username'].'";
160 this.uniqueID = "'.t3lib_div
::shortMD5(uniqid('')).'";
161 this.navFrameWidth = 0;
163 var TS = new typoSetup();
166 * Functions for session-expiry detection:
169 this.loginRefreshed = busy_loginRefreshed;
170 this.checkLoginTimeout = busy_checkLoginTimeout;
171 this.openRefreshWindow = busy_OpenRefreshWindow;
175 function busy_loginRefreshed() { //
176 var date = new Date();
177 this.busyloadTime = Math.floor(date.getTime()/1000);
180 function busy_checkLoginTimeout() { //
181 var date = new Date();
182 var theTime = Math.floor(date.getTime()/1000);
183 if (theTime > this.busyloadTime+'.intval($BE_USER->auth_timeout_field
).'-10) {
187 function busy_OpenRefreshWindow() { //
188 vHWin=window.open("login_frameset.php","relogin","height=350,width=700,status=0,menubar=0");
192 function busy_checkLoginTimeout_timer() { //
194 if (busy.checkLoginTimeout()) {
195 if (!busy.openRefreshW && confirm('.$GLOBALS['LANG']->JScharCode($LANG->sL('LLL:EXT:lang/locallang_core.php:mess.refresh_login')).')) {
196 busy.openRefreshWindow();
199 window.setTimeout("busy_checkLoginTimeout_timer();",2*1000); // Each 2nd second is enough for checking. The popup will be triggered 10 seconds before the login expires (see above, busy_checkLoginTimeout())
201 // Detecting the frameset module navigation frame widths (do this AFTER setting new timeout so that any errors in the code below does not prevent another time to be set!)
202 if (top && top.content && top.content.nav_frame && top.content.nav_frame.document && top.content.nav_frame.document.body) {
203 TS.navFrameWidth = (top.content.nav_frame.document.documentElement && top.content.nav_frame.document.documentElement.clientWidth) ? top.content.nav_frame.document.documentElement.clientWidth : top.content.nav_frame.document.body.clientWidth;
208 * Launcing information window for records/files (fileref as "table" argument)
210 function launchView(table,uid,bP) { //
211 var backPath= bP ? bP : "";
212 var thePreviewWindow="";
213 thePreviewWindow = window.open(TS.PATH_typo3+"show_item.php?table="+escape(table)+"&uid="+escape(uid),"ShowItem"+TS.uniqueID,"height=300,width=410,status=0,menubar=0,resizable=0,location=0,directories=0,scrollbars=1,toolbar=0");
214 if (thePreviewWindow && thePreviewWindow.focus) {
215 thePreviewWindow.focus();
220 * Opens plain window with url
222 function openUrlInWindow(url,windowName) { //
223 regularWindow = window.open(url,windowName,"status=1,menubar=1,resizable=1,location=1,directories=0,scrollbars=1,toolbar=1");
224 regularWindow.focus();
229 * Loads a URL in the topmenuFrame
231 function loadTopMenu(url) { //
232 top.topmenuFrame.location = url;
236 * Loads a page id for editing in the page edit module:
238 function loadEditId(id) { //
239 top.fsMod.recentIds["web"]=id;
240 top.fsMod.navFrameHighlightedID["web"]="pages"+id+"_0"; // For highlighting
242 if (top.content && top.content.nav_frame && top.content.nav_frame.refresh_nav) {
243 top.content.nav_frame.refresh_nav();
246 top.goToModule("'.$pageModule.'");
250 * Returns incoming URL (to a module) unless nextLoadModuleUrl is set. If that is the case nextLoadModuleUrl is returned (and cleared)
251 * Used by the shortcut frame to set a "intermediate URL"
253 var nextLoadModuleUrl="";
254 function getModuleUrl(inUrl) { //
256 if (top.nextLoadModuleUrl) {
257 nMU=top.nextLoadModuleUrl;
258 top.nextLoadModuleUrl="";
266 * Print properties of an object
268 function debugObj(obj,name) { //
272 acc+=i+": "+obj[i]+"\n";
275 alert("Object: "+name+"\n\n"+acc);
279 * Initialize login expiration warning object
281 var busy = new busy();
282 busy.loginRefreshed();
283 busy_checkLoginTimeout_timer();
289 var currentlyHighLightedId = "";
290 var currentlyHighLighted_restoreValue = "";
291 function highlightModuleMenuItem(trId, mainModule) {
292 // Get document object:
293 if (top.menu && top.menu.document) {
294 var docObj = top.menu.document;
295 var HLclass = mainModule ? "c-mainitem-HL" : "c-subitem-row-HL";
296 } else if (top.topmenuFrame && top.topmenuFrame.document) {
297 var docObj = top.topmenuFrame.document;
298 var HLclass = mainModule ? "c-mainitem-HL" : "c-subitem-HL";
303 if (currentlyHighLightedId && docObj.getElementById(currentlyHighLightedId)) {
304 docObj.getElementById(currentlyHighLightedId).attributes.getNamedItem("class").nodeValue = currentlyHighLighted_restoreValue;
307 currentlyHighLightedId = trId;
308 if (currentlyHighLightedId && docObj.getElementById(currentlyHighLightedId)) {
309 var classAttribObject = docObj.getElementById(currentlyHighLightedId).attributes.getNamedItem("class");
310 currentlyHighLighted_restoreValue = classAttribObject.nodeValue;
311 classAttribObject.nodeValue = HLclass;
317 * Function used to switch switch module.
319 var currentModuleLoaded = "";
320 function goToModule(modName,cMR_flag) { //
322 if (cMR_flag) cMR = 1;
324 currentModuleLoaded = modName;
326 switch(modName) {'.$goToModule_switch.'
331 * Frameset Module object
333 * Used in main modules with a frameset for submodules to keep the ID between modules
334 * Typically that is set by something like this in a Web>* sub module:
335 * if (top.fsMod) top.fsMod.recentIds["web"] = "\'.intval($this->id).\'";
336 * if (top.fsMod) top.fsMod.recentIds["file"] = "...(file reference/string)...";
338 function fsModules() { //
339 this.recentIds=new Array(); // used by frameset modules to track the most recent used id for list frame.
340 this.navFrameHighlightedID=new Array(); // used by navigation frames to track which row id was highlighted last time
341 this.currentMainLoaded="";
343 var fsMod = new fsModules();
346 // Used by Frameset Modules
347 var condensedMode = '.($BE_USER->uc
['condensedMode']?
1:0).';
348 var currentSubScript = "";
349 var currentSubNavScript = "";
352 // Check editing of page:
353 $this->editPageHandling();
357 * Checking if the "&edit" variable was sent so we can open for editing the page.
358 * Code based on code from "alt_shortcut.php"
362 function editPageHandling() {
365 if (!t3lib_extMgm
::isLoaded('cms')) return;
368 $editId = ereg_replace('[^[:alnum:]_]','',t3lib_div
::_GET('edit'));
373 // Looking up the page to edit, checking permissions:
374 $where = ' AND ('.$BE_USER->getPagePermsClause(2).' OR '.$BE_USER->getPagePermsClause(16).')';
375 if (t3lib_div
::testInt($editId)) {
376 $theEditRec = t3lib_BEfunc
::getRecord('pages',$editId,'*',$where);
378 $records = t3lib_BEfunc
::getRecordsByField('pages','alias',$editId,$where);
379 if (is_array($records)) {
381 $theEditRec = current($records);
385 // If the page was accessible, then let the user edit it.
386 if (is_array($theEditRec) && $BE_USER->isInWebMount($theEditRec['uid'])) {
387 // Setting JS code to open editing:
389 // Load page to edit:
390 window.setTimeout("top.loadEditId('.intval($theEditRec['uid']).');",500);
392 // Checking page edit parameter:
393 if(!$BE_USER->getTSConfigVal('options.shortcut_onEditId_dontSetPageTree')) {
395 // Expanding page tree:
396 t3lib_BEfunc
::openPageTree(intval($theEditRec['pid']),!$BE_USER->getTSConfigVal('options.shortcut_onEditId_keepExistingExpanded'));
400 // Warning about page editing:
401 alert('.$GLOBALS['LANG']->JScharCode(sprintf($GLOBALS['LANG']->getLL('noEditPage'),$editId)).');
408 * Creates the header and frameset of the backend interface
413 global $BE_USER,$TYPO3_CONF_VARS,$TYPO_VERSION;
416 $GLOBALS['TBE_TEMPLATE']->docType
='xhtml_frames';
419 $this->generateJScode();
420 $GLOBALS['TBE_TEMPLATE']->JScode
= '
421 <script type="text/javascript" src="md5.js"></script>
422 <script type="text/javascript" src="t3lib/jsfunc.evalfield.js"></script>
424 $GLOBALS['TBE_TEMPLATE']->JScode
.=$GLOBALS['TBE_TEMPLATE']->wrapScriptTags($this->mainJScode
);
427 $title = $TYPO3_CONF_VARS['SYS']['sitename'] ?
$TYPO3_CONF_VARS['SYS']['sitename'].' [TYPO3 '.$TYPO_VERSION.']' : 'TYPO3 '.$TYPO_VERSION;
429 // Start page header:
430 $this->content
.=$GLOBALS['TBE_TEMPLATE']->startPage($title);
433 $fr_content = '<frame name="content" src="'.($BE_USER->uc
['startInTaskCenter']&&t3lib_extMgm
::isLoaded('taskcenter')?t3lib_extMgm
::extRelPath('taskcenter').'task/frameset.php':'alt_intro.php').'" marginwidth="0" marginheight="0" frameborder="0" scrolling="auto" noresize="noresize" />';
434 $fr_toplogo = '<frame name="toplogo" src="alt_toplogo.php" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" noresize="noresize" />';
435 $fr_topmenu = '<frame name="topmenuFrame" src="alt_topmenu_dummy.php" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" noresize="noresize" />';
437 $shortcutFrame=array();
438 if ($BE_USER->getTSConfigVal('options.shortcutFrame')) {
439 $shortcutFrame['rowH']=','.$this->shortcutFrameH
;
440 $shortcutFrame['frameDef']='<frame name="shortcutFrame" src="alt_shortcut.php" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" noresize="noresize" />';
443 // XHTML notice: ' framespacing="0" frameborder="0" border="0"' in FRAMESET elements breaks compatibility with XHTML-frames, but HOW ELSE can I control the visual appearance?
444 if ($GLOBALS['BE_USER']->uc
['noMenuMode']) {
446 <frameset rows="'.$this->topFrameH
.',*'.$shortcutFrame['rowH'].'" framespacing="0" frameborder="0" border="0">
447 '.(!strcmp($BE_USER->uc
['noMenuMode'],'icons') ?
'
448 <frameset cols="'.$this->leftMenuFrameW
.',*" framespacing="0" frameborder="0" border="0">
452 <frameset cols="'.$this->leftMenuFrameW
.','.$this->selMenuFrame
.',*" framespacing="0" frameborder="0" border="0">
454 <frame name="menu" src="alt_menu_sel.php" scrolling="no" noresize="noresize" />
458 '.$shortcutFrame['frameDef'].'
463 <frameset rows="'.$this->topFrameH
.',*'.$shortcutFrame['rowH'].'" framespacing="0" frameborder="0" border="0">
464 <frameset cols="'.$this->leftMenuFrameW
.',*" framespacing="0" frameborder="0" border="0">
468 <frameset cols="'.$this->leftMenuFrameW
.',*" framespacing="0" frameborder="0" border="0">
469 <frame name="menu" src="alt_menu.php" marginwidth="0" marginheight="0" scrolling="auto" noresize="noresize" />
472 '.$shortcutFrame['frameDef'].'
482 * Outputting the accumulated content to screen
486 function printContent() {
491 // Include extension?
492 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE
]['XCLASS']['typo3/alt_main.php']) {
493 include_once($TYPO3_CONF_VARS[TYPO3_MODE
]['XCLASS']['typo3/alt_main.php']);
503 // ******************************
504 // Starting document output
505 // ******************************
508 $SOBE = t3lib_div
::makeInstance('SC_alt_main');
511 $SOBE->printContent();