Small enhancement in table(). Changed tabMenu() to work with other params than "id"
[Packages/TYPO3.CMS.git] / typo3 / alt_main.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2004 Kasper Skaarhoj (kasper@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 * 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.
30 *
31 * $Id$
32 * Revised for TYPO3 3.6 2/2003 by Kasper Skaarhoj
33 * XHTML Compliant (almost)
34 *
35 * @author Kasper Skaarhoj <kasper@typo3.com>
36 */
37 /**
38 * [CLASS/FUNCTION INDEX of SCRIPT]
39 *
40 *
41 *
42 * 67: class SC_alt_main
43 * 86: function init()
44 * 108: function generateJScode()
45 * 305: function main()
46 * 379: function printContent()
47 *
48 * TOTAL FUNCTIONS: 4
49 * (This index is automatically created/updated by the extension "extdeveval")
50 *
51 */
52
53 require ('init.php');
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');
59
60
61
62
63 /**
64 * Script Class for rendering of the main frameset for the TYPO3 backend.
65 *
66 * @author Kasper Skaarhoj <kasper@typo3.com>
67 * @package TYPO3
68 * @subpackage core
69 */
70 class SC_alt_main {
71
72 // Internal, dynamic:
73 var $content;
74 var $mainJScode;
75 var $loadModules; // Load modules-object
76 var $alt_menuObj; // Menu functions object.
77
78 // Internal, static:
79 var $leftMenuFrameW = 130;
80 var $selMenuFrame = 130;
81 var $topFrameH = 32;
82 var $shortcutFrameH = 30;
83
84 /**
85 * Initialization of the script class
86 *
87 * @return void
88 */
89 function init() {
90 global $TBE_MODULES,$TBE_STYLES;
91
92 // Initializes the backend modules structure for use later.
93 $this->loadModules = t3lib_div::makeInstance('t3lib_loadModules');
94 $this->loadModules->load($TBE_MODULES);
95
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');
98
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'];
104 }
105
106 /**
107 * Generates the JavaScript code for the frameset.
108 *
109 * @return void
110 */
111 function generateJScode() {
112 global $BE_USER,$LANG;
113
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);
117
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';
121
122 $this->mainJScode='
123 /**
124 * Function similar to PHPs rawurlencode();
125 */
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);
132 return output;
133 }
134
135 /**
136 * String-replace function
137 */
138 function str_replace(match,replace,string) { //
139 var input = ""+string;
140 var matchStr = ""+match;
141 if (!matchStr) {return string;}
142 var output = "";
143 var pointer=0;
144 var pos = input.indexOf(matchStr);
145 while (pos!=-1) {
146 output+=""+input.substr(pointer, pos-pointer)+replace;
147 pointer=pos+matchStr.length;
148 pos = input.indexOf(match,pos+1);
149 }
150 output+=""+input.substr(pointer);
151 return output;
152 }
153
154 /**
155 * TypoSetup object.
156 */
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;
162 }
163 var TS = new typoSetup();
164
165 /**
166 * Functions for session-expiry detection:
167 */
168 function busy() { //
169 this.loginRefreshed = busy_loginRefreshed;
170 this.checkLoginTimeout = busy_checkLoginTimeout;
171 this.openRefreshWindow = busy_OpenRefreshWindow;
172 this.busyloadTime=0;
173 this.openRefreshW=0;
174 }
175 function busy_loginRefreshed() { //
176 var date = new Date();
177 this.busyloadTime = Math.floor(date.getTime()/1000);
178 this.openRefreshW=0;
179 }
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) {
184 return true;
185 }
186 }
187 function busy_OpenRefreshWindow() { //
188 vHWin=window.open("login_frameset.php","relogin","height=350,width=700,status=0,menubar=0");
189 vHWin.focus();
190 this.openRefreshW=1;
191 }
192 function busy_checkLoginTimeout_timer() { //
193
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();
197 }
198 }
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())
200
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;
204 }
205 }
206
207 /**
208 * Launcing information window for records/files (fileref as "table" argument)
209 */
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();
216 }
217 }
218
219 /**
220 * Opens plain window with url
221 */
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();
225 return false;
226 }
227
228 /**
229 * Loads a URL in the topmenuFrame
230 */
231 function loadTopMenu(url) { //
232 top.topmenuFrame.location = url;
233 }
234
235 /**
236 * Loads a page id for editing in the page edit module:
237 */
238 function loadEditId(id) { //
239 top.fsMod.recentIds["web"]=id;
240 top.fsMod.navFrameHighlightedID["web"]="pages"+id+"_0"; // For highlighting
241
242 if (top.content && top.content.nav_frame && top.content.nav_frame.refresh_nav) {
243 top.content.nav_frame.refresh_nav();
244 }
245
246 top.goToModule("'.$pageModule.'");
247 }
248
249 /**
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"
252 */
253 var nextLoadModuleUrl="";
254 function getModuleUrl(inUrl) { //
255 var nMU;
256 if (top.nextLoadModuleUrl) {
257 nMU=top.nextLoadModuleUrl;
258 top.nextLoadModuleUrl="";
259 return nMU;
260 } else {
261 return inUrl;
262 }
263 }
264
265 /**
266 * Print properties of an object
267 */
268 function debugObj(obj,name) { //
269 var acc;
270 for (i in obj) {
271 if (obj[i]) {
272 acc+=i+": "+obj[i]+"\n";
273 }
274 }
275 alert("Object: "+name+"\n\n"+acc);
276 }
277
278 /**
279 * Initialize login expiration warning object
280 */
281 var busy = new busy();
282 busy.loginRefreshed();
283 busy_checkLoginTimeout_timer();
284
285
286 /**
287 * Highlight module:
288 */
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";
299 }
300
301 if (docObj) {
302 // Reset old:
303 if (currentlyHighLightedId && docObj.getElementById(currentlyHighLightedId)) {
304 docObj.getElementById(currentlyHighLightedId).attributes.getNamedItem("class").nodeValue = currentlyHighLighted_restoreValue;
305 }
306 // Set new:
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;
312 }
313 }
314 }
315
316 /**
317 * Function used to switch switch module.
318 */
319 var currentModuleLoaded = "";
320 function goToModule(modName,cMR_flag) { //
321 var cMR = 0;
322 if (cMR_flag) cMR = 1;
323
324 currentModuleLoaded = modName;
325
326 switch(modName) {'.$goToModule_switch.'
327 }
328 }
329
330 /**
331 * Frameset Module object
332 *
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)...";
337 */
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="";
342 }
343 var fsMod = new fsModules();
344 '.$fsMod.'
345
346 // Used by Frameset Modules
347 var condensedMode = '.($BE_USER->uc['condensedMode']?1:0).';
348 var currentSubScript = "";
349 var currentSubNavScript = "";
350 ';
351
352 // Check editing of page:
353 $this->editPageHandling();
354 }
355
356 /**
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"
359 *
360 * @return void
361 */
362 function editPageHandling() {
363 global $BE_USER;
364
365 if (!t3lib_extMgm::isLoaded('cms')) return;
366
367 // EDIT page:
368 $editId = ereg_replace('[^[:alnum:]_]','',t3lib_div::_GET('edit'));
369 $theEditRec = '';
370
371 if ($editId) {
372
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);
377 } else {
378 $records = t3lib_BEfunc::getRecordsByField('pages','alias',$editId,$where);
379 if (is_array($records)) {
380 reset($records);
381 $theEditRec = current($records);
382 }
383 }
384
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:
388 $this->mainJScode.='
389 // Load page to edit:
390 window.setTimeout("top.loadEditId('.intval($theEditRec['uid']).');",500);
391 ';
392 // Checking page edit parameter:
393 if(!$BE_USER->getTSConfigVal('options.shortcut_onEditId_dontSetPageTree')) {
394
395 // Expanding page tree:
396 t3lib_BEfunc::openPageTree(intval($theEditRec['pid']),!$BE_USER->getTSConfigVal('options.shortcut_onEditId_keepExistingExpanded'));
397 }
398 } else {
399 $this->mainJScode.='
400 // Warning about page editing:
401 alert('.$GLOBALS['LANG']->JScharCode(sprintf($GLOBALS['LANG']->getLL('noEditPage'),$editId)).');
402 ';
403 }
404 }
405 }
406
407 /**
408 * Creates the header and frameset of the backend interface
409 *
410 * @return void
411 */
412 function main() {
413 global $BE_USER,$TYPO3_CONF_VARS,$TYPO_VERSION;
414
415 // Set doktype:
416 $GLOBALS['TBE_TEMPLATE']->docType='xhtml_frames';
417
418 // Make JS:
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>
423 ';
424 $GLOBALS['TBE_TEMPLATE']->JScode.=$GLOBALS['TBE_TEMPLATE']->wrapScriptTags($this->mainJScode);
425
426 // Title:
427 $title = $TYPO3_CONF_VARS['SYS']['sitename'] ? $TYPO3_CONF_VARS['SYS']['sitename'].' [TYPO3 '.$TYPO_VERSION.']' : 'TYPO3 '.$TYPO_VERSION;
428
429 // Start page header:
430 $this->content.=$GLOBALS['TBE_TEMPLATE']->startPage($title);
431
432 // Creates frameset
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" />';
436
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" />';
441 }
442
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']) {
445 $this->content.= '
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">
449 '.$fr_toplogo.'
450 '.$fr_topmenu.'
451 </frameset>' : '
452 <frameset cols="'.$this->leftMenuFrameW.','.$this->selMenuFrame.',*" framespacing="0" frameborder="0" border="0">
453 '.$fr_toplogo.'
454 <frame name="menu" src="alt_menu_sel.php" scrolling="no" noresize="noresize" />
455 '.$fr_topmenu.'
456 </frameset>').'
457 '.$fr_content.'
458 '.$shortcutFrame['frameDef'].'
459 </frameset>
460 ';
461 } else {
462 $this->content.='
463 <frameset rows="'.$this->topFrameH.',*'.$shortcutFrame['rowH'].'" framespacing="0" frameborder="0" border="0">
464 <frameset cols="'.$this->leftMenuFrameW.',*" framespacing="0" frameborder="0" border="0">
465 '.$fr_toplogo.'
466 '.$fr_topmenu.'
467 </frameset>
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" />
470 '.$fr_content.'
471 </frameset>
472 '.$shortcutFrame['frameDef'].'
473 </frameset>
474 ';
475 }
476 $this->content.='
477
478 </html>';
479 }
480
481 /**
482 * Outputting the accumulated content to screen
483 *
484 * @return void
485 */
486 function printContent() {
487 echo $this->content;
488 }
489 }
490
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']);
494 }
495
496
497
498
499
500
501
502
503 // ******************************
504 // Starting document output
505 // ******************************
506
507 // Make instance:
508 $SOBE = t3lib_div::makeInstance('SC_alt_main');
509 $SOBE->init();
510 $SOBE->main();
511 $SOBE->printContent();
512 ?>