[TASK] Remove init code from showpic.php
[Packages/TYPO3.CMS.git] / typo3 / sysext / cms / tslib / class.tslib_pagegen.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2011 Kasper Skårhøj (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 * Libraries for pagegen.php
29 * The script "pagegen.php" is included by "index_ts.php" when a page is not cached but needs to be rendered.
30 *
31 * Revised for TYPO3 3.6 June/2003 by Kasper Skårhøj
32 * XHTML compliant
33 *
34 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
35 */
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 /**
56 * Class for starting TypoScript page generation
57 *
58 * The class is not instantiated as an objects but called directly with the "::" operator.
59 * eg: TSpagegen::pagegenInit()
60 *
61 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
62 * @package TYPO3
63 * @subpackage tslib
64 */
65 class TSpagegen {
66
67 /**
68 * Setting some vars in TSFE, primarily based on TypoScript config settings.
69 *
70 * @return void
71 */
72 public static function pagegenInit() {
73 if ($GLOBALS['TSFE']->page['content_from_pid']>0) {
74 $temp_copy_TSFE = clone($GLOBALS['TSFE']); // make REAL copy of TSFE object - not reference!
75 $temp_copy_TSFE->id = $GLOBALS['TSFE']->page['content_from_pid']; // Set ->id to the content_from_pid value - we are going to evaluate this pid as was it a given id for a page-display!
76 $temp_copy_TSFE->MP = '';
77 $temp_copy_TSFE->getPageAndRootlineWithDomain($GLOBALS['TSFE']->config['config']['content_from_pid_allowOutsideDomain']?0:$GLOBALS['TSFE']->domainStartPage);
78 $GLOBALS['TSFE']->contentPid = intval($temp_copy_TSFE->id);
79 unset($temp_copy_TSFE);
80 }
81 if ($GLOBALS['TSFE']->config['config']['MP_defaults']) {
82 $temp_parts = t3lib_div::trimExplode('|',$GLOBALS['TSFE']->config['config']['MP_defaults'],1);
83 foreach ($temp_parts as $temp_p) {
84 list($temp_idP,$temp_MPp) = explode(':',$temp_p,2);
85 $temp_ids=t3lib_div::intExplode(',',$temp_idP);
86 foreach ($temp_ids as $temp_id) {
87 $GLOBALS['TSFE']->MP_defaults[$temp_id]=$temp_MPp;
88 }
89 }
90 }
91
92 // Global vars...
93 $GLOBALS['TSFE']->indexedDocTitle = $GLOBALS['TSFE']->page['title'];
94 $GLOBALS['TSFE']->debug = ''.$GLOBALS['TSFE']->config['config']['debug'];
95
96 // Base url:
97 if (isset($GLOBALS['TSFE']->config['config']['baseURL'])) {
98 $GLOBALS['TSFE']->baseUrl = $GLOBALS['TSFE']->config['config']['baseURL'];
99 $GLOBALS['TSFE']->anchorPrefix = substr(t3lib_div::getIndpEnv('TYPO3_REQUEST_URL'), strlen(t3lib_div::getIndpEnv('TYPO3_SITE_URL')));
100 }
101
102 // Internal and External target defaults
103 $GLOBALS['TSFE']->intTarget = ''.$GLOBALS['TSFE']->config['config']['intTarget'];
104 $GLOBALS['TSFE']->extTarget = ''.$GLOBALS['TSFE']->config['config']['extTarget'];
105 $GLOBALS['TSFE']->fileTarget = ''.$GLOBALS['TSFE']->config['config']['fileTarget'];
106 if ($GLOBALS['TSFE']->config['config']['spamProtectEmailAddresses'] === 'ascii') {
107 $GLOBALS['TSFE']->spamProtectEmailAddresses = 'ascii';
108 } else {
109 $GLOBALS['TSFE']->spamProtectEmailAddresses = t3lib_utility_Math::forceIntegerInRange($GLOBALS['TSFE']->config['config']['spamProtectEmailAddresses'],-10,10,0);
110 }
111
112 $GLOBALS['TSFE']->absRefPrefix = ($GLOBALS['TSFE']->config['config']['absRefPrefix'] ? trim($GLOBALS['TSFE']->config['config']['absRefPrefix']) : '');
113
114 if ($GLOBALS['TSFE']->type && $GLOBALS['TSFE']->config['config']['frameReloadIfNotInFrameset']) {
115 $tdlLD = $GLOBALS['TSFE']->tmpl->linkData($GLOBALS['TSFE']->page,'_top',$GLOBALS['TSFE']->no_cache,'');
116 $GLOBALS['TSFE']->JSCode = 'if(!parent.'.trim($GLOBALS['TSFE']->sPre).' && !parent.view_frame) top.location.href="'.$GLOBALS['TSFE']->baseUrlWrap($tdlLD['totalURL']).'"';
117 }
118 $GLOBALS['TSFE']->compensateFieldWidth = ''.$GLOBALS['TSFE']->config['config']['compensateFieldWidth'];
119 $GLOBALS['TSFE']->lockFilePath = ''.$GLOBALS['TSFE']->config['config']['lockFilePath'];
120 $GLOBALS['TSFE']->lockFilePath = $GLOBALS['TSFE']->lockFilePath ? $GLOBALS['TSFE']->lockFilePath : $GLOBALS['TYPO3_CONF_VARS']['BE']['fileadminDir'];
121 $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_noScaleUp'] = isset($GLOBALS['TSFE']->config['config']['noScaleUp']) ? ''.$GLOBALS['TSFE']->config['config']['noScaleUp'] : $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_noScaleUp'];
122 $GLOBALS['TSFE']->TYPO3_CONF_VARS['GFX']['im_noScaleUp'] = $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_noScaleUp'];
123
124 $GLOBALS['TSFE']->ATagParams = trim($GLOBALS['TSFE']->config['config']['ATagParams']) ? ' '.trim($GLOBALS['TSFE']->config['config']['ATagParams']) : '';
125 if ($GLOBALS['TSFE']->config['config']['setJS_mouseOver']) $GLOBALS['TSFE']->setJS('mouseOver');
126 if ($GLOBALS['TSFE']->config['config']['setJS_openPic']) $GLOBALS['TSFE']->setJS('openPic');
127
128 $GLOBALS['TSFE']->sWordRegEx='';
129 $GLOBALS['TSFE']->sWordList = t3lib_div::_GP('sword_list');
130 if (is_array($GLOBALS['TSFE']->sWordList)) {
131 $space = (!empty($GLOBALS['TSFE']->config['config']['sword_standAlone'])) ? '[[:space:]]' : '';
132
133 foreach ($GLOBALS['TSFE']->sWordList as $val) {
134 if (strlen(trim($val)) > 0) {
135 $GLOBALS['TSFE']->sWordRegEx.= $space.quotemeta($val).$space.'|';
136 }
137 }
138 $GLOBALS['TSFE']->sWordRegEx = preg_replace('/\|$/','',$GLOBALS['TSFE']->sWordRegEx);
139 }
140
141 // linkVars
142 $GLOBALS['TSFE']->calculateLinkVars();
143
144 // dtdAllowsFrames indicates whether to use the target attribute in links
145 $GLOBALS['TSFE']->dtdAllowsFrames = FALSE;
146 if ($GLOBALS['TSFE']->config['config']['doctype']) {
147 if (in_array(
148 (string) $GLOBALS['TSFE']->config['config']['doctype'],
149 array('xhtml_frames', 'html5')
150 )) {
151 $GLOBALS['TSFE']->dtdAllowsFrames = TRUE;
152 }
153 } else {
154 $GLOBALS['TSFE']->dtdAllowsFrames = TRUE;
155 }
156
157 // Setting XHTML-doctype from doctype
158 if (!$GLOBALS['TSFE']->config['config']['xhtmlDoctype']) {
159 $GLOBALS['TSFE']->config['config']['xhtmlDoctype'] = $GLOBALS['TSFE']->config['config']['doctype'];
160 }
161
162 if ($GLOBALS['TSFE']->config['config']['xhtmlDoctype']) {
163 $GLOBALS['TSFE']->xhtmlDoctype = $GLOBALS['TSFE']->config['config']['xhtmlDoctype'];
164
165 // Checking XHTML-docytpe
166 switch((string)$GLOBALS['TSFE']->config['config']['xhtmlDoctype']) {
167 case 'xhtml_trans':
168 case 'xhtml_strict':
169 case 'xhtml_frames':
170 $GLOBALS['TSFE']->xhtmlVersion = 100;
171 break;
172 case 'xhtml_basic':
173 $GLOBALS['TSFE']->xhtmlVersion = 105;
174 break;
175 case 'xhtml_11':
176 case 'xhtml+rdfa_10':
177 $GLOBALS['TSFE']->xhtmlVersion = 110;
178 break;
179 case 'xhtml_2':
180 $GLOBALS['TSFE']->xhtmlVersion = 200;
181 break;
182 default:
183 $GLOBALS['TSFE']->getPageRenderer()->setRenderXhtml(FALSE);
184 $GLOBALS['TSFE']->xhtmlDoctype = '';
185 $GLOBALS['TSFE']->xhtmlVersion = 0;
186 }
187 } else {
188 $GLOBALS['TSFE']->getPageRenderer()->setRenderXhtml(FALSE);
189 }
190 }
191
192 /**
193 * Returns an array with files to include. These files are the ones set up in TypoScript config.
194 *
195 * @return array Files to include. Paths are relative to PATH_site.
196 */
197 public static function getIncFiles() {
198 $incFilesArray = array();
199 // Get files from config.includeLibrary
200 $includeLibrary = trim(''.$GLOBALS['TSFE']->config['config']['includeLibrary']);
201 if ($includeLibrary) {
202 $incFile=$GLOBALS['TSFE']->tmpl->getFileName($includeLibrary);
203 if ($incFile) {
204 $incFilesArray[] = $incFile;
205 }
206 }
207
208 if (is_array($GLOBALS['TSFE']->pSetup['includeLibs.'])) {
209 $incLibs = $GLOBALS['TSFE']->pSetup['includeLibs.'];
210 } else {
211 $incLibs = array();
212 }
213 if (is_array($GLOBALS['TSFE']->tmpl->setup['includeLibs.'])) {
214 // toplevel 'includeLibs' is added to the PAGE.includeLibs. In that way, PAGE-libs get first priority, because if the key already exist, it's not altered. (Due to investigation by me)
215 $incLibs += $GLOBALS['TSFE']->tmpl->setup['includeLibs.'];
216 }
217 if (count($incLibs)) {
218 foreach ($incLibs as $theLib) {
219 if (!is_array($theLib) && $incFile=$GLOBALS['TSFE']->tmpl->getFileName($theLib)) {
220 $incFilesArray[] = $incFile;
221 }
222 }
223 }
224 return $incFilesArray;
225 }
226
227 /**
228 * Processing JavaScript handlers
229 *
230 * @return array Array with a) a JavaScript section with event handlers and variables set and b) an array with attributes for the body tag.
231 */
232 public static function JSeventFunctions() {
233 $functions = array();
234 $setEvents = array();
235 $setBody = array();
236
237 foreach ($GLOBALS['TSFE']->JSeventFuncCalls as $event => $handlers) {
238 if (count($handlers)) {
239 $functions[] = ' function T3_'.$event.'Wrapper(e) { '.implode(' ',$handlers).' }';
240 $setEvents[] = ' document.'.$event.'=T3_'.$event.'Wrapper;';
241 if ($event == 'onload') {
242 $setBody[]='onload="T3_onloadWrapper();"'; // dubiuos double setting breaks on some browser - do we need it?
243 }
244 }
245 }
246
247 return array(count($functions)? implode(LF, $functions) . LF . implode(LF, $setEvents) : '', $setBody);
248 }
249
250 /**
251 * Rendering the page content
252 *
253 * @return void
254 */
255 public static function renderContent() {
256 // PAGE CONTENT
257 $GLOBALS['TT']->incStackPointer();
258 $GLOBALS['TT']->push($GLOBALS['TSFE']->sPre, 'PAGE');
259 $pageContent = $GLOBALS['TSFE']->cObj->cObjGet($GLOBALS['TSFE']->pSetup);
260
261 if ($GLOBALS['TSFE']->pSetup['wrap']) {$pageContent = $GLOBALS['TSFE']->cObj->wrap($pageContent, $GLOBALS['TSFE']->pSetup['wrap']);}
262 if ($GLOBALS['TSFE']->pSetup['stdWrap.']) {$pageContent = $GLOBALS['TSFE']->cObj->stdWrap($pageContent, $GLOBALS['TSFE']->pSetup['stdWrap.']);}
263
264 // PAGE HEADER (after content - maybe JS is inserted!
265
266 // if 'disableAllHeaderCode' is set, all the header-code is discarded!
267 if ($GLOBALS['TSFE']->config['config']['disableAllHeaderCode']) {
268 $GLOBALS['TSFE']->content = $pageContent;
269 } else {
270 TSpagegen::renderContentWithHeader($pageContent);
271 }
272 $GLOBALS['TT']->pull($GLOBALS['TT']->LR?$GLOBALS['TSFE']->content:'');
273 $GLOBALS['TT']->decStackPointer();
274 }
275
276 /**
277 * Rendering normal HTML-page with header by wrapping the generated content ($pageContent) in body-tags and setting the header accordingly.
278 *
279 * @param string The page content which TypoScript objects has generated
280 * @return void
281 */
282 public static function renderContentWithHeader($pageContent) {
283 // get instance of t3lib_PageRenderer
284 /** @var $pageRenderer t3lib_PageRenderer */
285 $pageRenderer = $GLOBALS['TSFE']->getPageRenderer();
286
287 $pageRenderer->backPath = TYPO3_mainDir;
288
289 if ($GLOBALS['TSFE']->config['config']['moveJsFromHeaderToFooter']) {
290 $pageRenderer->enableMoveJsFromHeaderToFooter();
291 }
292
293 if ($GLOBALS['TSFE']->config['config']['pageRendererTemplateFile']) {
294 $file = $GLOBALS['TSFE']->tmpl->getFileName($GLOBALS['TSFE']->config['config']['pageRendererTemplateFile']);
295 if ($file) {
296 $pageRenderer->setTemplateFile($file);
297 }
298 }
299
300 $headerComment = $GLOBALS['TSFE']->config['config']['headerComment'];
301 if (trim($headerComment)) {
302 $pageRenderer->addInlineComment(TAB . str_replace(LF, LF . TAB, trim($headerComment)) . LF);
303 }
304
305 // Setting charset:
306 $theCharset = $GLOBALS['TSFE']->metaCharset;
307
308 // Reset the content variables:
309 $GLOBALS['TSFE']->content = '';
310 $htmlTagAttributes = array ();
311 $htmlLang = $GLOBALS['TSFE']->config['config']['htmlTag_langKey'] ? $GLOBALS['TSFE']->config['config']['htmlTag_langKey'] : 'en';
312
313 // Set content direction: (More info: http://www.tau.ac.il/~danon/Hebrew/HTML_and_Hebrew.html)
314 if ($GLOBALS['TSFE']->config['config']['htmlTag_dir']) {
315 $htmlTagAttributes['dir'] = htmlspecialchars($GLOBALS['TSFE']->config['config']['htmlTag_dir']);
316 }
317
318 // Setting document type:
319 $docTypeParts = array ();
320 $xmlDocument = TRUE;
321 // Part 1: XML prologue
322 switch ((string) $GLOBALS['TSFE']->config['config']['xmlprologue']) {
323 case 'none' :
324 $xmlDocument = FALSE;
325 $GLOBALS['TSFE']->config['config']['xhtml_cleaning'] = 'none';
326 break;
327 case 'xml_10' :
328 $docTypeParts[] = '<?xml version="1.0" encoding="' . $theCharset . '"?>';
329 break;
330 case 'xml_11' :
331 $docTypeParts[] = '<?xml version="1.1" encoding="' . $theCharset . '"?>';
332 break;
333 case '' :
334 if ($GLOBALS['TSFE']->xhtmlVersion)
335 $docTypeParts[] = '<?xml version="1.0" encoding="' . $theCharset . '"?>';
336 break;
337 default :
338 $docTypeParts[] = $GLOBALS['TSFE']->config['config']['xmlprologue'];
339 }
340 // Part 2: DTD
341 $doctype = $GLOBALS['TSFE']->config['config']['doctype'];
342 if ($doctype) {
343 switch ($doctype) {
344 case 'xhtml_trans' :
345 $docTypeParts[] = '<!DOCTYPE html
346 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
347 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
348 break;
349 case 'xhtml_strict' :
350 $docTypeParts[] = '<!DOCTYPE html
351 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
352 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
353 break;
354 case 'xhtml_frames' :
355 $docTypeParts[] = '<!DOCTYPE html
356 PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
357 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">';
358 break;
359 case 'xhtml_basic' :
360 $docTypeParts[] = '<!DOCTYPE html
361 PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
362 "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">';
363 break;
364 case 'xhtml_11' :
365 $docTypeParts[] = '<!DOCTYPE html
366 PUBLIC "-//W3C//DTD XHTML 1.1//EN"
367 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">';
368 break;
369 case 'xhtml_2' :
370 $docTypeParts[] = '<!DOCTYPE html
371 PUBLIC "-//W3C//DTD XHTML 2.0//EN"
372 "http://www.w3.org/TR/xhtml2/DTD/xhtml2.dtd">';
373 break;
374 case 'xhtml+rdfa_10' :
375 $docTypeParts[] = '<!DOCTYPE html
376 PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
377 "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">';
378 break;
379 case 'html5' :
380 $docTypeParts[] = '<!DOCTYPE html>';
381 if ($xmlDocument){
382 $pageRenderer->setMetaCharsetTag('<meta charset="|" />');
383 } else {
384 $pageRenderer->setMetaCharsetTag('<meta charset="|">');
385 }
386 break;
387 case 'none' :
388 break;
389 default :
390 $docTypeParts[] = $doctype;
391 }
392 } else {
393 $docTypeParts[] = '<!DOCTYPE html
394 PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';
395 }
396
397 if ($GLOBALS['TSFE']->xhtmlVersion) {
398 $htmlTagAttributes['xml:lang'] = $htmlLang;
399 }
400 if ($GLOBALS['TSFE']->xhtmlVersion < 110 || $doctype === 'html5') {
401 $htmlTagAttributes['lang'] = $htmlLang;
402 }
403
404 if ($GLOBALS['TSFE']->xhtmlVersion || ($doctype === 'html5' && $xmlDocument)) {
405 $htmlTagAttributes['xmlns'] = 'http://www.w3.org/1999/xhtml'; // We add this to HTML5 to achieve a slightly better backwards compatibility
406 if (is_array($GLOBALS['TSFE']->config['config']['namespaces.'])) {
407 foreach ($GLOBALS['TSFE']->config['config']['namespaces.'] as $prefix => $uri) {
408 $htmlTagAttributes['xmlns:' . htmlspecialchars($prefix)] = $uri; // $uri gets htmlspecialchared later
409 }
410 }
411 }
412
413 // Swap XML and doctype order around (for MSIE / Opera standards compliance)
414 if ($GLOBALS['TSFE']->config['config']['doctypeSwitch']) {
415 $docTypeParts = array_reverse($docTypeParts);
416 }
417
418 // Adding doctype parts:
419 if (count($docTypeParts)) {
420 $pageRenderer->setXmlPrologAndDocType(implode(LF, $docTypeParts));
421 }
422
423 // Begin header section:
424 if (strcmp($GLOBALS['TSFE']->config['config']['htmlTag_setParams'], 'none')) {
425 $_attr = $GLOBALS['TSFE']->config['config']['htmlTag_setParams'] ? $GLOBALS['TSFE']->config['config']['htmlTag_setParams'] : t3lib_div::implodeAttributes($htmlTagAttributes);
426 } else {
427 $_attr = '';
428 }
429
430 $htmlTag = '<html' . ($_attr ? ' ' . $_attr : '') . '>';
431 if (isset($GLOBALS['TSFE']->config['config']['htmlTag_stdWrap.'])) {
432 $htmlTag = $GLOBALS['TSFE']->cObj->stdWrap(
433 $htmlTag,
434 $GLOBALS['TSFE']->config['config']['htmlTag_stdWrap.']
435 );
436 }
437 $pageRenderer->setHtmlTag($htmlTag);
438
439 // Head tag:
440 $headTag = $GLOBALS['TSFE']->pSetup['headTag'] ? $GLOBALS['TSFE']->pSetup['headTag'] : '<head>';
441 $pageRenderer->setHeadTag($headTag);
442
443 // Setting charset meta tag:
444 $pageRenderer->setCharSet($theCharset);
445
446 $pageRenderer->addInlineComment(' This website is powered by TYPO3 - inspiring people to share!
447 TYPO3 is a free open source Content Management Framework initially created by Kasper Skaarhoj and licensed under GNU/GPL.
448 TYPO3 is copyright ' . TYPO3_copyright_year . ' of Kasper Skaarhoj. Extensions are copyright of their respective owners.
449 Information and contribution at ' . TYPO3_URL_ORG . '
450 ');
451
452 if ($GLOBALS['TSFE']->baseUrl) {
453 $pageRenderer->setBaseUrl($GLOBALS['TSFE']->baseUrl);
454 }
455
456 if ($GLOBALS['TSFE']->pSetup['shortcutIcon']) {
457 $favIcon = $GLOBALS['TSFE']->tmpl->getFileName($GLOBALS['TSFE']->pSetup['shortcutIcon']);
458 $iconMimeType = '';
459 if (function_exists('finfo_open')) {
460 if (($finfo = @finfo_open(FILEINFO_MIME))) {
461 $iconMimeType = ' type="' . finfo_file($finfo, PATH_site . $favIcon) . '"';
462 finfo_close($finfo);
463 $pageRenderer->setIconMimeType($iconMimeType);
464 }
465 }
466 $pageRenderer->setFavIcon(t3lib_div::getIndpEnv('TYPO3_SITE_URL') . $favIcon);
467
468 }
469
470 // Including CSS files
471 if (is_array($GLOBALS['TSFE']->tmpl->setup['plugin.'])) {
472 $temp_styleLines = array ();
473 foreach ($GLOBALS['TSFE']->tmpl->setup['plugin.'] as $key => $iCSScode) {
474 if (is_array($iCSScode)) {
475 if ($iCSScode['_CSS_DEFAULT_STYLE'] && empty($GLOBALS['TSFE']->config['config']['removeDefaultCss'])) {
476 $temp_styleLines[] = '/* default styles for extension "' . substr($key, 0, - 1) . '" */' . LF . $iCSScode['_CSS_DEFAULT_STYLE'];
477 }
478 if ($iCSScode['_CSS_PAGE_STYLE']) {
479 $temp_styleLines[] = '/* specific page styles for extension "' . substr($key, 0, - 1) . '" */' .
480 LF . implode(LF, $iCSScode['_CSS_PAGE_STYLE']);
481 }
482 }
483 }
484 if (count($temp_styleLines)) {
485 if ($GLOBALS['TSFE']->config['config']['inlineStyle2TempFile']) {
486 $pageRenderer->addCssFile(TSpagegen::inline2TempFile(implode(LF, $temp_styleLines), 'css'));
487 } else {
488 $pageRenderer->addCssInlineBlock('TSFEinlineStyle', implode(LF, $temp_styleLines));
489 }
490 }
491 }
492
493 if ($GLOBALS['TSFE']->pSetup['stylesheet']) {
494 $ss = $GLOBALS['TSFE']->tmpl->getFileName($GLOBALS['TSFE']->pSetup['stylesheet']);
495 if ($ss) {
496 $pageRenderer->addCssFile($ss);
497 }
498 }
499
500 /**********************************************************************/
501 /* includeCSS
502 /* config.includeCSS {
503 /*
504 /* }
505 /**********************************************************************/
506
507 if (is_array($GLOBALS['TSFE']->pSetup['includeCSS.'])) {
508 foreach ($GLOBALS['TSFE']->pSetup['includeCSS.'] as $key => $CSSfile) {
509 if (!is_array($CSSfile)) {
510 $ss = $GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['external'] ? $CSSfile : $GLOBALS['TSFE']->tmpl->getFileName($CSSfile);
511 if (isset($GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['if.'])
512 && !$GLOBALS['TSFE']->cObj->checkIf($GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['if.'])) {
513 continue;
514 }
515 if ($ss) {
516 if ($GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['import']) {
517 if (! $GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['external'] && substr($ss, 0, 1) != '/') { // To fix MSIE 6 that cannot handle these as relative paths (according to Ben v Ende)
518 $ss = t3lib_div::dirname(t3lib_div::getIndpEnv('SCRIPT_NAME')) . '/' . $ss;
519 }
520 $pageRenderer->addCssInlineBlock(
521 'import_' . $key,
522 '@import url("' . htmlspecialchars($ss) . '") ' . htmlspecialchars($GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['media']) . ';',
523 empty($GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['disableCompression']),
524 $GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['forceOnTop'] ? TRUE : FALSE,
525 ''
526 );
527 } else {
528 $pageRenderer->addCssFile(
529 $ss,
530 $GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['alternate'] ? 'alternate stylesheet' : 'stylesheet',
531 $GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['media'] ? $GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['media'] : 'all',
532 $GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['title'] ? $GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['title'] : '',
533 empty($GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['disableCompression']),
534 $GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['forceOnTop'] ? TRUE : FALSE,
535 $GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['allWrap'],
536 $GLOBALS['TSFE']->pSetup['includeCSS.'][$key . '.']['excludeFromConcatenation'] ? TRUE : FALSE
537 );
538 }
539 }
540 }
541 }
542 }
543
544 // Stylesheets
545 $style = '';
546 if ($GLOBALS['TSFE']->pSetup['insertClassesFromRTE']) {
547 $pageTSConfig = $GLOBALS['TSFE']->getPagesTSconfig();
548 $RTEclasses = $pageTSConfig['RTE.']['classes.'];
549 if (is_array($RTEclasses)) {
550 foreach ($RTEclasses as $RTEclassName => $RTEvalueArray) {
551 if ($RTEvalueArray['value']) {
552 $style .= '
553 .' . substr($RTEclassName, 0, - 1) . ' {' . $RTEvalueArray['value'] . '}';
554 }
555 }
556 }
557
558 if ($GLOBALS['TSFE']->pSetup['insertClassesFromRTE.']['add_mainStyleOverrideDefs'] && is_array($pageTSConfig['RTE.']['default.']['mainStyleOverride_add.'])) {
559 $mSOa_tList = t3lib_div::trimExplode(',', strtoupper($GLOBALS['TSFE']->pSetup['insertClassesFromRTE.']['add_mainStyleOverrideDefs']), 1);
560 foreach ($pageTSConfig['RTE.']['default.']['mainStyleOverride_add.'] as $mSOa_key => $mSOa_value) {
561 if (! is_array($mSOa_value) && (in_array('*', $mSOa_tList) || in_array($mSOa_key, $mSOa_tList))) {
562 $style .= '
563 ' . $mSOa_key . ' {' . $mSOa_value . '}';
564 }
565 }
566 }
567 }
568
569 // Setting body tag margins in CSS:
570 if (isset($GLOBALS['TSFE']->pSetup['bodyTagMargins']) && $GLOBALS['TSFE']->pSetup['bodyTagMargins.']['useCSS']) {
571 $margins = intval($GLOBALS['TSFE']->pSetup['bodyTagMargins']);
572 $style .= '
573 BODY {margin: ' . $margins . 'px ' . $margins . 'px ' . $margins . 'px ' . $margins . 'px;}';
574 }
575
576 if ($GLOBALS['TSFE']->pSetup['adminPanelStyles']) {
577 $style .= '
578
579 /* Default styles for the Admin Panel */
580 TABLE.typo3-adminPanel { border: 1px solid black; background-color: #F6F2E6; }
581 TABLE.typo3-adminPanel TR.typo3-adminPanel-hRow TD { background-color: #9BA1A8; }
582 TABLE.typo3-adminPanel TR.typo3-adminPanel-itemHRow TD { background-color: #ABBBB4; }
583 TABLE.typo3-adminPanel TABLE, TABLE.typo3-adminPanel TD { border: 0px; }
584 TABLE.typo3-adminPanel TD FONT { font-family: verdana; font-size: 10px; color: black; }
585 TABLE.typo3-adminPanel TD A FONT { font-family: verdana; font-size: 10px; color: black; }
586 TABLE.typo3-editPanel { border: 1px solid black; background-color: #F6F2E6; }
587 TABLE.typo3-editPanel TD { border: 0px; }
588 ';
589 }
590 // CSS_inlineStyle from TS
591 $style .= trim($GLOBALS['TSFE']->pSetup['CSS_inlineStyle']);
592 $style .= $GLOBALS['TSFE']->cObj->cObjGet($GLOBALS['TSFE']->pSetup['cssInline.'], 'cssInline.');
593
594 if (trim($style)) {
595 if ($GLOBALS['TSFE']->config['config']['inlineStyle2TempFile']) {
596 $pageRenderer->addCssFile(TSpagegen::inline2TempFile($style, 'css'));
597 } else {
598 $pageRenderer->addCssInlineBlock('additionalTSFEInlineStyle', $style);
599 }
600 }
601
602 // Javascript Libraries
603 if (is_array($GLOBALS['TSFE']->pSetup['javascriptLibs.'])) {
604 if ($GLOBALS['TSFE']->pSetup['javascriptLibs.']['SVG']) {
605 $pageRenderer->loadSvg();
606 if ($GLOBALS['TSFE']->pSetup['javascriptLibs.']['SVG.']['debug']) {
607 $pageRenderer->enableSvgDebug();
608 }
609 if ($GLOBALS['TSFE']->pSetup['javascriptLibs.']['SVG.']['forceFlash']) {
610 $pageRenderer->svgForceFlash();
611 }
612 }
613
614 if ($GLOBALS['TSFE']->pSetup['javascriptLibs.']['Prototype']) {
615 $pageRenderer->loadPrototype();
616 }
617 if ($GLOBALS['TSFE']->pSetup['javascriptLibs.']['Scriptaculous']) {
618 $modules = $GLOBALS['TSFE']->pSetup['javascriptLibs.']['Scriptaculous.']['modules'] ? $GLOBALS['TSFE']->pSetup['javascriptLibs.']['Scriptaculous.']['modules'] : '';
619 $pageRenderer->loadScriptaculous($modules);
620 }
621 if ($GLOBALS['TSFE']->pSetup['javascriptLibs.']['ExtCore']) {
622 $pageRenderer->loadExtCore();
623 if ($GLOBALS['TSFE']->pSetup['javascriptLibs.']['ExtCore.']['debug']) {
624 $pageRenderer->enableExtCoreDebug();
625 }
626 }
627 if ($GLOBALS['TSFE']->pSetup['javascriptLibs.']['ExtJs']) {
628 $css = $GLOBALS['TSFE']->pSetup['javascriptLibs.']['ExtJs.']['css'] ? TRUE : FALSE;
629 $theme = $GLOBALS['TSFE']->pSetup['javascriptLibs.']['ExtJs.']['theme'] ? TRUE : FALSE;
630 $adapter = $GLOBALS['TSFE']->pSetup['javascriptLibs.']['ExtJs.']['adapter'] ? $GLOBALS['TSFE']->pSetup['javascriptLibs.']['ExtJs.']['adapter'] : '';
631 $pageRenderer->loadExtJs($css, $theme, $adapter);
632 if ($GLOBALS['TSFE']->pSetup['javascriptLibs.']['ExtJs.']['debug']) {
633 $pageRenderer->enableExtJsDebug();
634 }
635 if ($GLOBALS['TSFE']->pSetup['javascriptLibs.']['ExtJs.']['quickTips']) {
636 $pageRenderer->enableExtJSQuickTips();
637 }
638 }
639 }
640
641 // JavaScript library files
642 if (is_array($GLOBALS['TSFE']->pSetup['includeJSlibs.'])) {
643 foreach ($GLOBALS['TSFE']->pSetup['includeJSlibs.'] as $key => $JSfile) {
644 if (!is_array($JSfile)) {
645 if (isset($GLOBALS['TSFE']->pSetup['includeJSlibs.'][$key . '.']['if.'])
646 && !$GLOBALS['TSFE']->cObj->checkIf($GLOBALS['TSFE']->pSetup['includeJSlibs.'][$key . '.']['if.'])) {
647 continue;
648 }
649 $ss = $GLOBALS['TSFE']->pSetup['includeJSlibs.'][$key . '.']['external'] ? $JSfile : $GLOBALS['TSFE']->tmpl->getFileName($JSfile);
650 if ($ss) {
651 $type = $GLOBALS['TSFE']->pSetup['includeJSlibs.'][$key . '.']['type'];
652 if (! $type) {
653 $type = 'text/javascript';
654 }
655 $pageRenderer->addJsLibrary(
656 $key,
657 $ss,
658 $type,
659 empty($GLOBALS['TSFE']->pSetup['includeJSlibs.'][$key . '.']['disableCompression']),
660 $GLOBALS['TSFE']->pSetup['includeJSlibs.'][$key . '.']['forceOnTop'] ? TRUE : FALSE,
661 $GLOBALS['TSFE']->pSetup['includeJSlibs.'][$key . '.']['allWrap'],
662 $GLOBALS['TSFE']->pSetup['includeJSlibs.'][$key . '.']['excludeFromConcatenation'] ? TRUE : FALSE
663 );
664 }
665 }
666 }
667 }
668
669 if (is_array($GLOBALS['TSFE']->pSetup['includeJSFooterlibs.'])) {
670 foreach ($GLOBALS['TSFE']->pSetup['includeJSFooterlibs.'] as $key => $JSfile) {
671 if (!is_array($JSfile)) {
672 if (isset($GLOBALS['TSFE']->pSetup['includeJSFooterlibs.'][$key . '.']['if.'])
673 && !$GLOBALS['TSFE']->cObj->checkIf($GLOBALS['TSFE']->pSetup['includeJSFooterlibs.'][$key . '.']['if.'])) {
674 continue;
675 }
676 $ss = $GLOBALS['TSFE']->pSetup['includeJSFooterlibs.'][$key . '.']['external'] ? $JSfile : $GLOBALS['TSFE']->tmpl->getFileName($JSfile);
677 if ($ss) {
678 $type = $GLOBALS['TSFE']->pSetup['includeJSFooterlibs.'][$key . '.']['type'];
679 if (! $type) {
680 $type = 'text/javascript';
681 }
682 $pageRenderer->addJsFooterLibrary(
683 $key,
684 $ss,
685 $type,
686 empty($GLOBALS['TSFE']->pSetup['includeJSFooterlibs.'][$key . '.']['disableCompression']),
687 $GLOBALS['TSFE']->pSetup['includeJSFooterlibs.'][$key . '.']['forceOnTop'] ? TRUE : FALSE,
688 $GLOBALS['TSFE']->pSetup['includeJSFooterlibs.'][$key . '.']['allWrap'],
689 $GLOBALS['TSFE']->pSetup['includeJSFooterlibs.'][$key . '.']['excludeFromConcatenation'] ? TRUE : FALSE
690 );
691 }
692 }
693 }
694 }
695
696 // JavaScript files
697 if (is_array($GLOBALS['TSFE']->pSetup['includeJS.'])) {
698 foreach ($GLOBALS['TSFE']->pSetup['includeJS.'] as $key => $JSfile) {
699 if (!is_array($JSfile)) {
700 if (isset($GLOBALS['TSFE']->pSetup['includeJS.'][$key . '.']['if.'])
701 && !$GLOBALS['TSFE']->cObj->checkIf($GLOBALS['TSFE']->pSetup['includeJS.'][$key . '.']['if.'])) {
702 continue;
703 }
704 $ss = $GLOBALS['TSFE']->pSetup['includeJS.'][$key . '.']['external'] ? $JSfile : $GLOBALS['TSFE']->tmpl->getFileName($JSfile);
705 if ($ss) {
706 $type = $GLOBALS['TSFE']->pSetup['includeJS.'][$key . '.']['type'];
707 if (! $type) {
708 $type = 'text/javascript';
709 }
710 $pageRenderer->addJsFile(
711 $ss,
712 $type,
713 empty($GLOBALS['TSFE']->pSetup['includeJS.'][$key . '.']['disableCompression']),
714 $GLOBALS['TSFE']->pSetup['includeJS.'][$key . '.']['forceOnTop'] ? TRUE : FALSE,
715 $GLOBALS['TSFE']->pSetup['includeJS.'][$key . '.']['allWrap'],
716 $GLOBALS['TSFE']->pSetup['includeJS.'][$key . '.']['excludeFromConcatenation'] ? TRUE : FALSE
717 );
718 }
719 }
720 }
721 }
722
723 if (is_array($GLOBALS['TSFE']->pSetup['includeJSFooter.'])) {
724 foreach ($GLOBALS['TSFE']->pSetup['includeJSFooter.'] as $key => $JSfile) {
725 if (!is_array($JSfile)) {
726 if (isset($GLOBALS['TSFE']->pSetup['includeJSFooter.'][$key . '.']['if.'])
727 && !$GLOBALS['TSFE']->cObj->checkIf($GLOBALS['TSFE']->pSetup['includeJSFooter.'][$key . '.']['if.'])) {
728 continue;
729 }
730 $ss = $GLOBALS['TSFE']->pSetup['includeJSFooter.'][$key . '.']['external'] ? $JSfile : $GLOBALS['TSFE']->tmpl->getFileName($JSfile);
731 if ($ss) {
732 $type = $GLOBALS['TSFE']->pSetup['includeJSFooter.'][$key . '.']['type'];
733 if (! $type) {
734 $type = 'text/javascript';
735 }
736 $pageRenderer->addJsFooterFile(
737 $ss,
738 $type,
739 empty($GLOBALS['TSFE']->pSetup['includeJSFooter.'][$key . '.']['disableCompression']),
740 $GLOBALS['TSFE']->pSetup['includeJSFooter.'][$key . '.']['forceOnTop'] ? TRUE : FALSE,
741 $GLOBALS['TSFE']->pSetup['includeJSFooter.'][$key . '.']['allWrap'],
742 $GLOBALS['TSFE']->pSetup['includeJSFooter.'][$key . '.']['excludeFromConcatenation'] ? TRUE : FALSE
743 );
744 }
745 }
746 }
747 }
748
749 // Headerdata
750 if (is_array($GLOBALS['TSFE']->pSetup['headerData.'])) {
751 $pageRenderer->addHeaderData($GLOBALS['TSFE']->cObj->cObjGet($GLOBALS['TSFE']->pSetup['headerData.'], 'headerData.'));
752 }
753
754 // Footerdata
755 if (is_array($GLOBALS['TSFE']->pSetup['footerData.'])) {
756 $pageRenderer->addFooterData($GLOBALS['TSFE']->cObj->cObjGet($GLOBALS['TSFE']->pSetup['footerData.'], 'footerData.'));
757 }
758
759 // Title
760 $titleTagContent = $GLOBALS['TSFE']->tmpl->printTitle($GLOBALS['TSFE']->altPageTitle ? $GLOBALS['TSFE']->altPageTitle : $GLOBALS['TSFE']->page['title'], $GLOBALS['TSFE']->config['config']['noPageTitle'], $GLOBALS['TSFE']->config['config']['pageTitleFirst']);
761 if ($GLOBALS['TSFE']->config['config']['titleTagFunction']) {
762 $titleTagContent = $GLOBALS['TSFE']->cObj->callUserFunction($GLOBALS['TSFE']->config['config']['titleTagFunction'], array (), $titleTagContent);
763 }
764
765 if (strlen($titleTagContent) && intval($GLOBALS['TSFE']->config['config']['noPageTitle']) !== 2) {
766 $pageRenderer->setTitle($titleTagContent);
767 }
768
769 // add ending slash only to documents rendered as xhtml
770 $endingSlash = $GLOBALS['TSFE']->xhtmlVersion ? ' /' : '';
771
772 $pageRenderer->addMetaTag('<meta name="generator" content="TYPO3 ' . TYPO3_branch . ' CMS"' . $endingSlash . '>');
773
774 $conf = $GLOBALS['TSFE']->pSetup['meta.'];
775 if (is_array($conf)) {
776 foreach ($conf as $theKey => $theValue) {
777 if (! strstr($theKey, '.') || ! isset($conf[substr($theKey, 0, - 1)])) { // Only if 1) the property is set but not the value itself, 2) the value and/or any property
778 if (strstr($theKey, '.')) {
779 $theKey = substr($theKey, 0, - 1);
780 }
781 $val = $GLOBALS['TSFE']->cObj->stdWrap($conf[$theKey], $conf[$theKey . '.']);
782 $key = $theKey;
783 if (trim($val)) {
784 $a = 'name';
785 if (strtolower($key) === 'refresh' || !empty($conf[$theKey . '.']['httpEquivalent'])) {
786 $a = 'http-equiv';
787 }
788 $pageRenderer->addMetaTag('<meta ' . $a . '="' . $key . '" content="' . htmlspecialchars(trim($val)) . '"' . $endingSlash . '>');
789 }
790 }
791 }
792 }
793
794 unset($GLOBALS['TSFE']->additionalHeaderData['JSCode']);
795 unset($GLOBALS['TSFE']->additionalHeaderData['JSImgCode']);
796
797 if (is_array($GLOBALS['TSFE']->config['INTincScript'])) {
798 // Storing the JSCode and JSImgCode vars...
799 $GLOBALS['TSFE']->additionalHeaderData['JSCode'] = $GLOBALS['TSFE']->JSCode;
800 $GLOBALS['TSFE']->additionalHeaderData['JSImgCode'] = $GLOBALS['TSFE']->JSImgCode;
801 $GLOBALS['TSFE']->config['INTincScript_ext']['divKey'] = $GLOBALS['TSFE']->uniqueHash();
802 $GLOBALS['TSFE']->config['INTincScript_ext']['additionalHeaderData'] = $GLOBALS['TSFE']->additionalHeaderData; // Storing the header-data array
803 $GLOBALS['TSFE']->config['INTincScript_ext']['additionalJavaScript'] = $GLOBALS['TSFE']->additionalJavaScript; // Storing the JS-data array
804 $GLOBALS['TSFE']->config['INTincScript_ext']['additionalCSS'] = $GLOBALS['TSFE']->additionalCSS; // Storing the Style-data array
805
806
807 $GLOBALS['TSFE']->additionalHeaderData = array ('<!--HD_' . $GLOBALS['TSFE']->config['INTincScript_ext']['divKey'] . '-->'); // Clearing the array
808 $GLOBALS['TSFE']->divSection .= '<!--TDS_' . $GLOBALS['TSFE']->config['INTincScript_ext']['divKey'] . '-->';
809 } else {
810 $GLOBALS['TSFE']->INTincScript_loadJSCode();
811 }
812 $JSef = TSpagegen::JSeventFunctions();
813
814 // Adding default Java Script:
815 $scriptJsCode = '
816 var browserName = navigator.appName;
817 var browserVer = parseInt(navigator.appVersion);
818 var version = "";
819 var msie4 = (browserName == "Microsoft Internet Explorer" && browserVer >= 4);
820 if ((browserName == "Netscape" && browserVer >= 3) || msie4 || browserName=="Konqueror" || browserName=="Opera") {version = "n3";} else {version = "n2";}
821 // Blurring links:
822 function blurLink(theObject) { //
823 if (msie4) {theObject.blur();}
824 }
825 ' . $JSef[0];
826
827 if ($GLOBALS['TSFE']->spamProtectEmailAddresses && $GLOBALS['TSFE']->spamProtectEmailAddresses !== 'ascii') {
828 $scriptJsCode .= '
829 // decrypt helper function
830 function decryptCharcode(n,start,end,offset) {
831 n = n + offset;
832 if (offset > 0 && n > end) {
833 n = start + (n - end - 1);
834 } else if (offset < 0 && n < start) {
835 n = end - (start - n - 1);
836 }
837 return String.fromCharCode(n);
838 }
839 // decrypt string
840 function decryptString(enc,offset) {
841 var dec = "";
842 var len = enc.length;
843 for(var i=0; i < len; i++) {
844 var n = enc.charCodeAt(i);
845 if (n >= 0x2B && n <= 0x3A) {
846 dec += decryptCharcode(n,0x2B,0x3A,offset); // 0-9 . , - + / :
847 } else if (n >= 0x40 && n <= 0x5A) {
848 dec += decryptCharcode(n,0x40,0x5A,offset); // A-Z @
849 } else if (n >= 0x61 && n <= 0x7A) {
850 dec += decryptCharcode(n,0x61,0x7A,offset); // a-z
851 } else {
852 dec += enc.charAt(i);
853 }
854 }
855 return dec;
856 }
857 // decrypt spam-protected emails
858 function linkTo_UnCryptMailto(s) {
859 location.href = decryptString(s,' . ($GLOBALS['TSFE']->spamProtectEmailAddresses * - 1) . ');
860 }
861 ';
862 }
863
864 //add inline JS
865 $inlineJS = '';
866
867 // defined in php
868 if (is_array($GLOBALS['TSFE']->inlineJS)) {
869 foreach ($GLOBALS['TSFE']->inlineJS as $key => $val) {
870 if (! is_array($val)) {
871 $inlineJS .= LF . $val . LF;
872 }
873 }
874 }
875
876 // defined in TS with page.inlineJS
877 // Javascript inline code
878 $inline = $GLOBALS['TSFE']->cObj->cObjGet($GLOBALS['TSFE']->pSetup['jsInline.'], 'jsInline.');
879 if ($inline) {
880 $inlineJS .= LF . $inline . LF;
881 }
882
883 // Javascript inline code for Footer
884 $inlineFooterJs = $GLOBALS['TSFE']->cObj->cObjGet($GLOBALS['TSFE']->pSetup['jsFooterInline.'], 'jsFooterInline.');
885
886 // Should minify?
887 if ($GLOBALS['TSFE']->config['config']['compressJs']) {
888 $pageRenderer->enableCompressJavascript();
889 $minifyErrorScript = $minifyErrorInline = '';
890 $scriptJsCode = t3lib_div::minifyJavaScript($scriptJsCode, $minifyErrorScript);
891 if ($minifyErrorScript) {
892 $GLOBALS['TT']->setTSlogMessage($minifyErrorScript, 3);
893 }
894 if ($inlineJS) {
895 $inlineJS = t3lib_div::minifyJavaScript($inlineJS, $minifyErrorInline);
896 if ($minifyErrorInline) {
897 $GLOBALS['TT']->setTSlogMessage($minifyErrorInline, 3);
898 }
899 }
900 if ($inlineFooterJs) {
901 $inlineFooterJs = t3lib_div::minifyJavaScript($inlineFooterJs, $minifyErrorInline);
902 if ($minifyErrorInline) {
903 $GLOBALS['TT']->setTSlogMessage($minifyErrorInline, 3);
904 }
905 }
906
907 }
908
909 if (! $GLOBALS['TSFE']->config['config']['removeDefaultJS']) {
910 // inlude default and inlineJS
911 if ($scriptJsCode) {
912 $pageRenderer->addJsInlineCode('_scriptCode', $scriptJsCode, $GLOBALS['TSFE']->config['config']['compressJs']);
913 }
914 if ($inlineJS) {
915 $pageRenderer->addJsInlineCode('TS_inlineJS', $inlineJS, $GLOBALS['TSFE']->config['config']['compressJs']);
916 }
917 if ($inlineFooterJs) {
918 $pageRenderer->addJsFooterInlineCode('TS_inlineFooter', $inlineFooterJs, $GLOBALS['TSFE']->config['config']['compressJs']);
919 }
920 } elseif ($GLOBALS['TSFE']->config['config']['removeDefaultJS'] === 'external') {
921 /*
922 This keeps inlineJS from *_INT Objects from being moved to external files.
923 At this point in frontend rendering *_INT Objects only have placeholders instead
924 of actual content so moving these placeholders to external files would
925 a) break the JS file (syntax errors due to the placeholders)
926 b) the needed JS would never get included to the page
927 Therefore inlineJS from *_INT Objects must not be moved to external files but
928 kept internal.
929 */
930 $inlineJSint = '';
931 self::stripIntObjectPlaceholder($inlineJS, $inlineJSint);
932 if ($inlineJSint) {
933 $pageRenderer->addJsInlineCode('TS_inlineJSint', $inlineJSint, $GLOBALS['TSFE']->config['config']['compressJs']);
934 }
935 $pageRenderer->addJsFile(TSpagegen::inline2TempFile($scriptJsCode . $inlineJS, 'js'), 'text/javascript', $GLOBALS['TSFE']->config['config']['compressJs']);
936
937 if ($inlineFooterJs) {
938 $inlineFooterJSint = '';
939 self::stripIntObjectPlaceholder($inlineFooterJs, $inlineFooterJSint);
940 if ($inlineFooterJSint) {
941 $pageRenderer->addJsFooterInlineCode('TS_inlineFooterJSint', $inlineFooterJSint, $GLOBALS['TSFE']->config['config']['compressJs']);
942 }
943 $pageRenderer->addJsFooterFile(TSpagegen::inline2TempFile($inlineFooterJs, 'js'), 'text/javascript', $GLOBALS['TSFE']->config['config']['compressJs']);
944 }
945 } else {
946 // include only inlineJS
947 if ($inlineJS) {
948 $pageRenderer->addJsInlineCode('TS_inlineJS', $inlineJS, $GLOBALS['TSFE']->config['config']['compressJs']);
949 }
950 if ($inlineFooterJs) {
951 $pageRenderer->addJsFooterInlineCode('TS_inlineFooter', $inlineFooterJs, $GLOBALS['TSFE']->config['config']['compressJs']);
952 }
953 }
954
955 // ExtJS specific code
956 if (is_array($GLOBALS['TSFE']->pSetup['inlineLanguageLabel.'])) {
957 $pageRenderer->addInlineLanguageLabelArray($GLOBALS['TSFE']->pSetup['inlineLanguageLabel.']);
958 }
959
960 if (is_array($GLOBALS['TSFE']->pSetup['inlineSettings.'])) {
961 $pageRenderer->addInlineSettingArray('TS', $GLOBALS['TSFE']->pSetup['inlineSettings.']);
962 }
963
964 if (is_array($GLOBALS['TSFE']->pSetup['extOnReady.'])) {
965 $pageRenderer->addExtOnReadyCode($GLOBALS['TSFE']->cObj->cObjGet($GLOBALS['TSFE']->pSetup['extOnReady.'], 'extOnReady.'));
966 }
967
968 // compression and concatenate settings
969 if ($GLOBALS['TSFE']->config['config']['compressCss']) {
970 $pageRenderer->enableCompressCss();
971 }
972 if ($GLOBALS['TSFE']->config['config']['compressJs']) {
973 $pageRenderer->enableCompressJavascript();
974 }
975 if ($GLOBALS['TSFE']->config['config']['concatenateCss']) {
976 $pageRenderer->enableConcatenateCss();
977 }
978 if ($GLOBALS['TSFE']->config['config']['concatenateJs']) {
979 $pageRenderer->enableConcatenateJavascript();
980 }
981 // backward compatibility for old configuration
982 if ($GLOBALS['TSFE']->config['config']['concatenateJsAndCss']) {
983 $pageRenderer->enableConcatenateFiles();
984 }
985
986 // add header data block
987 if ($GLOBALS['TSFE']->additionalHeaderData) {
988 $pageRenderer->addHeaderData(implode(LF, $GLOBALS['TSFE']->additionalHeaderData));
989 }
990
991 // add footer data block
992 if ($GLOBALS['TSFE']->additionalFooterData) {
993 $pageRenderer->addFooterData(implode(LF, $GLOBALS['TSFE']->additionalFooterData));
994 }
995
996 // Header complete, now add content
997
998
999 if ($GLOBALS['TSFE']->pSetup['frameSet.']) {
1000 $fs = t3lib_div::makeInstance('tslib_frameset');
1001 $pageRenderer->addBodyContent($fs->make($GLOBALS['TSFE']->pSetup['frameSet.']));
1002 $pageRenderer->addBodyContent(LF . '<noframes>' . LF);
1003 }
1004
1005 // Bodytag:
1006 $defBT = $GLOBALS['TSFE']->pSetup['bodyTagCObject'] ? $GLOBALS['TSFE']->cObj->cObjGetSingle($GLOBALS['TSFE']->pSetup['bodyTagCObject'], $GLOBALS['TSFE']->pSetup['bodyTagCObject.'], 'bodyTagCObject') : '';
1007 if (! $defBT)
1008 $defBT = $GLOBALS['TSFE']->defaultBodyTag;
1009 $bodyTag = $GLOBALS['TSFE']->pSetup['bodyTag'] ? $GLOBALS['TSFE']->pSetup['bodyTag'] : $defBT;
1010 if ($bgImg = $GLOBALS['TSFE']->cObj->getImgResource($GLOBALS['TSFE']->pSetup['bgImg'], $GLOBALS['TSFE']->pSetup['bgImg.'])) {
1011 $bodyTag = preg_replace('/>$/', '', trim($bodyTag)) . ' background="' . $GLOBALS["TSFE"]->absRefPrefix . $bgImg[3] . '">';
1012 }
1013
1014 if (isset($GLOBALS['TSFE']->pSetup['bodyTagMargins'])) {
1015 $margins = intval($GLOBALS['TSFE']->pSetup['bodyTagMargins']);
1016 if ($GLOBALS['TSFE']->pSetup['bodyTagMargins.']['useCSS']) {
1017 // Setting margins in CSS, see above
1018 } else {
1019 $bodyTag = preg_replace('/>$/', '', trim($bodyTag)) . ' leftmargin="' . $margins . '" topmargin="' . $margins . '" marginwidth="' . $margins . '" marginheight="' . $margins . '">';
1020 }
1021 }
1022
1023 if (trim($GLOBALS['TSFE']->pSetup['bodyTagAdd'])) {
1024 $bodyTag = preg_replace('/>$/', '', trim($bodyTag)) . ' ' . trim($GLOBALS['TSFE']->pSetup['bodyTagAdd']) . '>';
1025 }
1026
1027 if (count($JSef[1])) { // Event functions:
1028 $bodyTag = preg_replace('/>$/', '', trim($bodyTag)) . ' ' . trim(implode(' ', $JSef[1])) . '>';
1029 }
1030 $pageRenderer->addBodyContent(LF . $bodyTag);
1031
1032 // Div-sections
1033 if ($GLOBALS['TSFE']->divSection) {
1034 $pageRenderer->addBodyContent(LF . $GLOBALS['TSFE']->divSection);
1035 }
1036
1037 // Page content
1038 $pageRenderer->addBodyContent(LF . $pageContent);
1039
1040 // Render complete page
1041 $GLOBALS['TSFE']->content = $pageRenderer->render();
1042
1043 // Ending page
1044 if ($GLOBALS['TSFE']->pSetup['frameSet.']) {
1045 $GLOBALS['TSFE']->content .= LF . '</noframes>';
1046 }
1047
1048 }
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062 /*************************
1063 *
1064 * Helper functions
1065 * Remember: Calls internally must still be done on the non-instantiated class: TSpagegen::inline2TempFile()
1066 *
1067 *************************/
1068
1069 /**
1070 * Searches for placeholder created from *_INT cObjects, removes them from
1071 * $searchString and merges them to $intObjects
1072 *
1073 * @param string $searchString: the String which should be cleaned from int-object markers
1074 * @param string $intObjects: the String the found int-placeholders are moved to (for further processing)
1075 */
1076 protected static function stripIntObjectPlaceholder(&$searchString, &$intObjects) {
1077 $tempArray = array();
1078 preg_match_all('/\<\!--INT_SCRIPT.[a-z0-9]*--\>/', $searchString, $tempArray);
1079 $searchString = preg_replace('/\<\!--INT_SCRIPT.[a-z0-9]*--\>/', '', $searchString);
1080 $intObjects = implode('', $tempArray[0]);
1081 }
1082
1083 /**
1084 * Writes string to a temporary file named after the md5-hash of the string
1085 *
1086 * @param string CSS styles / JavaScript to write to file.
1087 * @param string Extension: "css" or "js"
1088 * @return string <script> or <link> tag for the file.
1089 */
1090 public static function inline2TempFile($str, $ext) {
1091
1092 // Create filename / tags:
1093 $script = '';
1094 switch ($ext) {
1095 case 'js' :
1096 $script = 'typo3temp/javascript_' . substr(md5($str), 0, 10) . '.js';
1097 break;
1098 case 'css' :
1099 $script = 'typo3temp/stylesheet_' . substr(md5($str), 0, 10) . '.css';
1100 break;
1101 }
1102
1103 // Write file:
1104 if ($script) {
1105 if (! @is_file(PATH_site . $script)) {
1106 t3lib_div::writeFile(PATH_site . $script, $str);
1107 }
1108 }
1109
1110 return $script;
1111 }
1112
1113 /**
1114 * Checks if the value defined in "config.linkVars" contains an allowed value. Otherwise, return FALSE which means the value will not be added to any links.
1115 *
1116 * @param string The string in which to find $needle
1117 * @param string The string to find in $haystack
1118 * @return boolean Returns TRUE if $needle matches or is found in $haystack
1119 */
1120 public static function isAllowedLinkVarValue($haystack,$needle) {
1121 $OK = FALSE;
1122
1123 if ($needle=='int' || $needle=='integer') { // Integer
1124
1125 if (t3lib_utility_Math::canBeInterpretedAsInteger($haystack)) {
1126 $OK = TRUE;
1127 }
1128
1129 } elseif (preg_match('/^\/.+\/[imsxeADSUXu]*$/', $needle)) { // Regular expression, only "//" is allowed as delimiter
1130
1131 if (@preg_match($needle, $haystack)) {
1132 $OK = TRUE;
1133 }
1134
1135 } elseif (strstr($needle,'-')) { // Range
1136
1137 if (t3lib_utility_Math::canBeInterpretedAsInteger($haystack)) {
1138 $range = explode('-',$needle);
1139 if ($range[0] <= $haystack && $range[1] >= $haystack) {
1140 $OK = TRUE;
1141 }
1142 }
1143
1144 } elseif (strstr($needle,'|')) { // List
1145
1146 $haystack = str_replace(' ','',$haystack); // Trim the input
1147 if (strstr('|'.$needle.'|', '|'.$haystack.'|')) {
1148 $OK = TRUE;
1149 }
1150
1151 } elseif (!strcmp($needle,$haystack)) { // String comparison
1152 $OK = TRUE;
1153 }
1154
1155 return $OK;
1156 }
1157 }
1158
1159 /**
1160 * Class for fetching record relations for the frontend.
1161 *
1162 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
1163 * @package TYPO3
1164 * @subpackage tslib
1165 * @see tslib_cObj::RECORDS()
1166 */
1167 class FE_loadDBGroup extends t3lib_loadDBGroup {
1168 var $fromTC = 0; // Means that everything is returned instead of only uid and label-field
1169 }
1170
1171 ?>