Fixed bug #14978: XSS in file tree (thanks to Georg Ringer)
[Packages/TYPO3.CMS.git] / typo3 / class.browse_links.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2010 Kasper Skaarhoj (kasperYYYY@typo3.com)
6 * All rights reserved
7 *
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
16 * A copy is found in the textfile GPL.txt and important notices to the license
17 * from the author is found in LICENSE.txt distributed with these scripts.
18 *
19 *
20 * This script is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
27 /**
28 * Displays the page/file tree for browsing database records or files.
29 * Used from TCEFORMS an other elements
30 * In other words: This is the ELEMENT BROWSER!
31 *
32 * $Id$
33 * Revised for TYPO3 3.6 November/2003 by Kasper Skaarhoj
34 * XHTML compliant
35 *
36 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
37 */
38 /**
39 * [CLASS/FUNCTION INDEX of SCRIPT]
40 *
41 *
42 *
43 * 155: class TBE_browser_recordList extends localRecordList
44 * 163: function TBE_browser_recordList ()
45 * 175: function listURL($altId='',$table=-1,$exclList='')
46 * 194: function ext_addP()
47 * 211: function linkWrapItems($table,$uid,$code,$row)
48 * 244: function linkWrapTable($table,$code)
49 *
50 *
51 * 261: class localPageTree extends t3lib_browseTree
52 * 268: function localPageTree()
53 * 284: function wrapTitle($title,$v,$ext_pArrPages='')
54 * 299: function printTree($treeArr='')
55 * 350: function ext_isLinkable($doktype,$uid)
56 * 364: function PM_ATagWrap($icon,$cmd,$bMark='')
57 * 381: function wrapIcon($icon,$row)
58 *
59 *
60 * 400: class rtePageTree extends localPageTree
61 *
62 *
63 * 417: class TBE_PageTree extends localPageTree
64 * 426: function ext_isLinkable($doktype,$uid)
65 * 438: function wrapTitle($title,$v,$ext_pArrPages)
66 *
67 *
68 * 464: class localFolderTree extends t3lib_folderTree
69 * 473: function localFolderTree()
70 * 485: function wrapTitle($title,$v)
71 * 500: function ext_isLinkable($v)
72 * 517: function PM_ATagWrap($icon,$cmd,$bMark='')
73 * 532: function printTree($treeArr='')
74 *
75 *
76 * 599: class rteFolderTree extends localFolderTree
77 *
78 *
79 * 615: class TBE_FolderTree extends localFolderTree
80 * 624: function ext_isLinkable($v)
81 * 637: function wrapTitle($title,$v)
82 *
83 *
84 * 658: class browse_links
85 * 764: function init()
86 * 1034: function processSessionData($data)
87 *
88 * SECTION: Main functions
89 * 1077: function main_rte($wiz=0)
90 * 1379: function main_db()
91 * 1424: function main_file()
92 *
93 * SECTION: Record listing
94 * 1534: function expandPage()
95 * 1615: function TBE_expandPage($tables)
96 *
97 * SECTION: File listing
98 * 1708: function expandFolder($expandFolder=0,$extensionList='')
99 * 1778: function TBE_expandFolder($expandFolder=0,$extensionList='',$noThumbs=0)
100 * 1801: function fileList($files, $folderName='', $noThumbs=0)
101 * 1918: function TBE_dragNDrop($expandFolder=0,$extensionList='')
102 *
103 * SECTION: Miscellaneous functions
104 * 2046: function isWebFolder($folder)
105 * 2057: function checkFolder($folder)
106 * 2070: function barheader($str)
107 * 2087: function getMsgBox($in_msg,$icon='icon_note')
108 * 2111: function printCurrentUrl($str)
109 * 2131: function parseCurUrl($href,$siteUrl)
110 * 2193: function uploadForm($path)
111 * 2247: function createFolder($path)
112 *
113 * TOTAL FUNCTIONS: 39
114 * (This index is automatically created/updated by the extension "extdeveval")
115 *
116 */
117
118
119 // Include classes
120 require_once (PATH_typo3.'/class.db_list.inc');
121 require_once (PATH_typo3.'/class.db_list_extra.inc');
122
123
124
125
126 /**
127 * Local version of the record list.
128 *
129 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
130 * @package TYPO3
131 * @subpackage core
132 */
133 class TBE_browser_recordList extends localRecordList {
134 var $thisScript = 'browse_links.php';
135
136 /**
137 * Initializes the script path
138 *
139 * @return void
140 */
141 function TBE_browser_recordList () {
142 parent::__construct();
143 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
144 }
145
146 /**
147 * Creates the URL for links
148 *
149 * @param mixed If not blank string, this is used instead of $this->id as the id value.
150 * @param string If this is "-1" then $this->table is used, otherwise the value of the input variable.
151 * @param string Commalist of fields NOT to pass as parameters (currently "sortField" and "sortRev")
152 * @return string Query-string for URL
153 */
154 function listURL($altId='',$table=-1,$exclList='') {
155 return $this->thisScript.
156 '?id='.(strcmp($altId,'')?$altId:$this->id).
157 '&table='.rawurlencode($table==-1?$this->table:$table).
158 ($this->thumbs?'&imagemode='.$this->thumbs:'').
159 ($this->searchString?'&search_field='.rawurlencode($this->searchString):'').
160 ($this->searchLevels?'&search_levels='.rawurlencode($this->searchLevels):'').
161 ((!$exclList || !t3lib_div::inList($exclList,'sortField')) && $this->sortField?'&sortField='.rawurlencode($this->sortField):'').
162 ((!$exclList || !t3lib_div::inList($exclList,'sortRev')) && $this->sortRev?'&sortRev='.rawurlencode($this->sortRev):'').
163 // extra:
164 $this->ext_addP()
165 ;
166 }
167
168 /**
169 * Returns additional, local GET parameters to include in the links of the record list.
170 *
171 * @return string
172 */
173 function ext_addP() {
174 $str = '&act='.$GLOBALS['SOBE']->browser->act.
175 '&mode='.$GLOBALS['SOBE']->browser->mode.
176 '&expandPage='.$GLOBALS['SOBE']->browser->expandPage.
177 '&bparams='.rawurlencode($GLOBALS['SOBE']->browser->bparams);
178 return $str;
179 }
180
181 /**
182 * Returns the title (based on $code) of a record (from table $table) with the proper link around (that is for "pages"-records a link to the level of that record...)
183 *
184 * @param string Table name
185 * @param integer UID (not used here)
186 * @param string Title string
187 * @param array Records array (from table name)
188 * @return string
189 */
190 function linkWrapItems($table,$uid,$code,$row) {
191 global $TCA, $BACK_PATH;
192
193 if (!$code) {
194 $code = '<i>['.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.no_title',1).']</i>';
195 } else {
196 $code = t3lib_BEfunc::getRecordTitlePrep($code, $this->fixedL);
197 }
198
199 $title = t3lib_BEfunc::getRecordTitle($table,$row,FALSE,TRUE);
200 $ficon = t3lib_iconWorks::getIcon($table,$row);
201 $aOnClick = "return insertElement('".$table."', '".$row['uid']."', 'db', ".t3lib_div::quoteJSvalue($title).", '', '', '".$ficon."');";
202 $ATag = '<a href="#" onclick="'.$aOnClick.'">';
203 $ATag_alt = substr($ATag,0,-4).',\'\',1);">';
204 $ATag_e = '</a>';
205
206 return $ATag.
207 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$GLOBALS['LANG']->getLL('addToList',1).'" alt="" />'.
208 $ATag_e.
209 $ATag_alt.
210 $code.
211 $ATag_e;
212 }
213
214 /**
215 * Local version that sets allFields to true to support userFieldSelect
216 *
217 * @return void
218 * @see fieldSelectBox
219 */
220 function generateList() {
221 $this->allFields = true;
222 parent::generateList();
223 }
224 }
225
226
227
228
229
230
231 /**
232 * Class which generates the page tree
233 *
234 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
235 * @package TYPO3
236 * @subpackage core
237 */
238 class localPageTree extends t3lib_browseTree {
239
240 /**
241 * whether the page ID should be shown next to the title, activate through userTSconfig (options.pageTree.showPageIdWithTitle)
242 * @boolean
243 */
244 public $ext_showPageId = FALSE;
245
246 /**
247 * Constructor. Just calling init()
248 *
249 * @return void
250 */
251 function localPageTree() {
252 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
253
254 $this->init();
255
256 $this->clause = ' AND doktype!=255'.$this->clause;
257 }
258
259 /**
260 * Wrapping the title in a link, if applicable.
261 *
262 * @param string Title, (must be ready for output, that means it must be htmlspecialchars()'ed).
263 * @param array The record
264 * @param boolean (Ignore)
265 * @return string Wrapping title string.
266 */
267 function wrapTitle($title,$v,$ext_pArrPages='') {
268 if ($this->ext_isLinkable($v['doktype'],$v['uid'])) {
269 $aOnClick = "return link_typo3Page('".$v['uid']."');";
270 return '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.$title.'</a>';
271 } else {
272 return '<span style="color: #666666;">'.$title.'</span>';
273 }
274 }
275
276 /**
277 * Create the page navigation tree in HTML
278 *
279 * @param array Tree array
280 * @return string HTML output.
281 */
282 function printTree($treeArr='') {
283 global $BACK_PATH;
284 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
285 if (!is_array($treeArr)) $treeArr=$this->tree;
286
287 $out='';
288 $c=0;
289
290 foreach($treeArr as $k => $v) {
291 $c++;
292 $bgColorClass = ($c+1)%2 ? 'bgColor' : 'bgColor-10';
293 if ($GLOBALS['SOBE']->browser->curUrlInfo['act']=='page' && $GLOBALS['SOBE']->browser->curUrlInfo['pageid']==$v['row']['uid'] && $GLOBALS['SOBE']->browser->curUrlInfo['pageid']) {
294 $arrCol='<td><img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_right.gif','width="5" height="9"').' class="c-blinkArrowR" alt="" /></td>';
295 $bgColorClass='bgColor4';
296 } else {
297 $arrCol='<td></td>';
298 }
299
300 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandPage='.$v['row']['uid'].'\');';
301 $cEbullet = $this->ext_isLinkable($v['row']['doktype'],$v['row']['uid']) ?
302 '<a href="#" onclick="'.htmlspecialchars($aOnClick).'"><img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/arrowbullet.gif','width="18" height="16"').' alt="" /></a>' :
303 '';
304 $out.='
305 <tr class="'.$bgColorClass.'">
306 <td nowrap="nowrap"'.($v['row']['_CSSCLASS'] ? ' class="'.$v['row']['_CSSCLASS'].'"' : '').'>'.
307 $v['HTML'].
308 $this->wrapTitle($this->getTitleStr($v['row'],$titleLen),$v['row'],$this->ext_pArrPages).
309 '</td>'.
310 $arrCol.
311 '<td>'.$cEbullet.'</td>
312 </tr>';
313 }
314 $out='
315
316
317 <!--
318 Navigation Page Tree:
319 -->
320 <table border="0" cellpadding="0" cellspacing="0" id="typo3-tree">
321 '.$out.'
322 </table>';
323 return $out;
324 }
325
326 /**
327 * Returns true if a doktype can be linked.
328 *
329 * @param integer Doktype value to test
330 * @param integer uid to test.
331 * @return boolean
332 */
333 function ext_isLinkable($doktype,$uid) {
334 if ($uid && $doktype<199) {
335 return true;
336 }
337 }
338
339 /**
340 * Wrap the plus/minus icon in a link
341 *
342 * @param string HTML string to wrap, probably an image tag.
343 * @param string Command for 'PM' get var
344 * @param boolean If set, the link will have a anchor point (=$bMark) and a name attribute (=$bMark)
345 * @return string Link-wrapped input string
346 */
347 function PM_ATagWrap($icon,$cmd,$bMark='') {
348 if ($bMark) {
349 $anchor = '#'.$bMark;
350 $name=' name="'.$bMark.'"';
351 }
352 $aOnClick = "return jumpToUrl('".$this->thisScript.'?PM='.$cmd."','".$anchor."');";
353
354 return '<a href="#"'.$name.' onclick="'.htmlspecialchars($aOnClick).'">'.$icon.'</a>';
355 }
356
357 /**
358 * Wrapping the image tag, $icon, for the row, $row
359 *
360 * @param string The image tag for the icon
361 * @param array The row for the current element
362 * @return string The processed icon input value.
363 */
364 function wrapIcon($icon, $row) {
365 $content = $this->addTagAttributes($icon, ' title="id=' . $row['uid'] . '"');
366 if ($this->ext_showPageId) {
367 $content .= '[' . $row['uid'] . ']&nbsp;';
368 }
369 return $content;
370 }
371 }
372
373
374
375
376
377
378
379
380 /**
381 * Page tree for the RTE - totally the same, no changes needed. (Just for the sake of beauty - or confusion... :-)
382 *
383 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
384 * @package TYPO3
385 * @subpackage core
386 */
387 class rtePageTree extends localPageTree {
388 }
389
390
391
392
393
394
395
396
397 /**
398 * For TBE record browser
399 *
400 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
401 * @package TYPO3
402 * @subpackage core
403 */
404 class TBE_PageTree extends localPageTree {
405
406 /**
407 * Returns true if a doktype can be linked (which is always the case here).
408 *
409 * @param integer Doktype value to test
410 * @param integer uid to test.
411 * @return boolean
412 */
413 function ext_isLinkable($doktype,$uid) {
414 return true;
415 }
416
417 /**
418 * Wrapping the title in a link, if applicable.
419 *
420 * @param string Title, ready for output.
421 * @param array The record
422 * @param boolean If set, pages clicked will return immediately, otherwise reload page.
423 * @return string Wrapping title string.
424 */
425 function wrapTitle($title,$v,$ext_pArrPages) {
426 $title = htmlspecialchars($title);
427
428 if ($ext_pArrPages) {
429 $ficon=t3lib_iconWorks::getIcon('pages',$v);
430 $onClick = "return insertElement('pages', '".$v['uid']."', 'db', ".t3lib_div::quoteJSvalue($v['title']).", '', '', '".$ficon."','',1);";
431 } else {
432 $onClick = htmlspecialchars('return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandPage='.$v['uid'].'\');');
433 }
434 return '<a href="#" onclick="'.$onClick.'">'.$title.'</a>';
435 }
436 }
437
438
439
440
441
442
443
444
445 /**
446 * Base extension class which generates the folder tree.
447 * Used directly by the RTE.
448 *
449 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
450 * @package TYPO3
451 * @subpackage core
452 */
453 class localFolderTree extends t3lib_folderTree {
454 var $ext_IconMode=1;
455
456
457 /**
458 * Initializes the script path
459 *
460 * @return void
461 */
462 function localFolderTree() {
463 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
464 $this->t3lib_folderTree();
465 }
466
467 /**
468 * Wrapping the title in a link, if applicable.
469 *
470 * @param string Title, ready for output.
471 * @param array The "record"
472 * @return string Wrapping title string.
473 */
474 function wrapTitle($title,$v) {
475 $title = htmlspecialchars($title);
476
477 if ($this->ext_isLinkable($v)) {
478 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandFolder='.rawurlencode($v['path']).'\');';
479 return '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.$title.'</a>';
480 } else {
481 return '<span class="typo3-dimmed">'.$title.'</span>';
482 }
483 }
484
485 /**
486 * Returns true if the input "record" contains a folder which can be linked.
487 *
488 * @param array Array with information about the folder element. Contains keys like title, uid, path, _title
489 * @return boolean True is returned if the path is found in the web-part of the server and is NOT a recycler or temp folder
490 */
491 function ext_isLinkable($v) {
492 $webpath=t3lib_BEfunc::getPathType_web_nonweb($v['path']); // Checking, if the input path is a web-path.
493 if (strstr($v['path'],'_recycler_') || strstr($v['path'],'_temp_') || $webpath!='web') {
494 return 0;
495 }
496 return 1;
497 }
498
499 /**
500 * Wrap the plus/minus icon in a link
501 *
502 * @param string HTML string to wrap, probably an image tag.
503 * @param string Command for 'PM' get var
504 * @param boolean If set, the link will have a anchor point (=$bMark) and a name attribute (=$bMark)
505 * @return string Link-wrapped input string
506 * @access private
507 */
508 function PM_ATagWrap($icon,$cmd,$bMark='') {
509 if ($bMark) {
510 $anchor = '#'.$bMark;
511 $name=' name="'.$bMark.'"';
512 }
513 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?PM='.$cmd.'\',\''.$anchor.'\');';
514 return '<a href="#"'.$name.' onclick="'.htmlspecialchars($aOnClick).'">'.$icon.'</a>';
515 }
516
517 /**
518 * Create the folder navigation tree in HTML
519 *
520 * @param mixed Input tree array. If not array, then $this->tree is used.
521 * @return string HTML output of the tree.
522 */
523 function printTree($treeArr='') {
524 global $BACK_PATH;
525 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
526
527 if (!is_array($treeArr)) $treeArr=$this->tree;
528
529 $out='';
530 $c=0;
531
532 // Preparing the current-path string (if found in the listing we will see a red blinking arrow).
533 if (!$GLOBALS['SOBE']->browser->curUrlInfo['value']) {
534 $cmpPath='';
535 } else if (substr(trim($GLOBALS['SOBE']->browser->curUrlInfo['info']),-1)!='/') {
536 $cmpPath=PATH_site.dirname($GLOBALS['SOBE']->browser->curUrlInfo['info']).'/';
537 } else {
538 $cmpPath=PATH_site.$GLOBALS['SOBE']->browser->curUrlInfo['info'];
539 }
540
541 // Traverse rows for the tree and print them into table rows:
542 foreach($treeArr as $k => $v) {
543 $c++;
544 $bgColorClass=($c+1)%2 ? 'bgColor' : 'bgColor-10';
545
546 // Creating blinking arrow, if applicable:
547 if (($GLOBALS['SOBE']->browser->curUrlInfo['act'] == 'file' || $GLOBALS['SOBE']->browser->curUrlInfo['act'] == 'folder') && $cmpPath == $v['row']['path']) {
548 $arrCol='<td><img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_right.gif','width="5" height="9"').' class="c-blinkArrowR" alt="" /></td>';
549 $bgColorClass='bgColor4';
550 } else {
551 $arrCol='<td></td>';
552 }
553 // Create arrow-bullet for file listing (if folder path is linkable):
554 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandFolder='.rawurlencode($v['row']['path']).'\');';
555 $cEbullet = $this->ext_isLinkable($v['row']) ? '<a href="#" onclick="'.htmlspecialchars($aOnClick).'"><img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/arrowbullet.gif','width="18" height="16"').' alt="" /></a>' : '';
556
557 // Put table row with folder together:
558 $out.='
559 <tr class="'.$bgColorClass.'">
560 <td nowrap="nowrap">'.$v['HTML'].$this->wrapTitle(t3lib_div::fixed_lgd_cs($v['row']['title'],$titleLen),$v['row']).'</td>
561 '.$arrCol.'
562 <td>'.$cEbullet.'</td>
563 </tr>';
564 }
565
566 $out='
567
568 <!--
569 Folder tree:
570 -->
571 <table border="0" cellpadding="0" cellspacing="0" id="typo3-tree">
572 '.$out.'
573 </table>';
574 return $out;
575 }
576 }
577
578
579
580
581
582
583 /**
584 * Folder tree for the RTE - totally the same, no changes needed. (Just for the sake of beauty - or confusion... :-)
585 *
586 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
587 * @package TYPO3
588 * @subpackage core
589 */
590 class rteFolderTree extends localFolderTree {
591 }
592
593
594
595
596
597
598
599 /**
600 * For TBE File Browser
601 *
602 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
603 * @package TYPO3
604 * @subpackage core
605 */
606 class TBE_FolderTree extends localFolderTree {
607 var $ext_noTempRecyclerDirs=0; // If file-drag mode is set, temp and recycler folders are filtered out.
608
609 /**
610 * Returns true if the input "record" contains a folder which can be linked.
611 *
612 * @param array Array with information about the folder element. Contains keys like title, uid, path, _title
613 * @return boolean True is returned if the path is NOT a recycler or temp folder AND if ->ext_noTempRecyclerDirs is not set.
614 */
615 function ext_isLinkable($v) {
616 if ($this->ext_noTempRecyclerDirs && (substr($v['path'],-7)=='_temp_/' || substr($v['path'],-11)=='_recycler_/')) {
617 return 0;
618 } return 1;
619 }
620
621 /**
622 * Wrapping the title in a link, if applicable.
623 *
624 * @param string Title, ready for output.
625 * @param array The 'record'
626 * @return string Wrapping title string.
627 */
628 function wrapTitle($title,$v) {
629 $title = htmlspecialchars($title);
630
631 if ($this->ext_isLinkable($v)) {
632 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandFolder='.rawurlencode($v['path']).'\');';
633 return '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.$title.'</a>';
634 } else {
635 return '<span class="typo3-dimmed">'.$title.'</span>';
636 }
637 }
638 }
639
640
641
642
643
644 /**
645 * class for the Element Browser window.
646 *
647 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
648 * @package TYPO3
649 * @subpackage core
650 */
651 class browse_links {
652
653 // Internal, static:
654 var $siteURL; // Current site URL (Frontend)
655 var $thisScript; // the script to link to
656 var $thisConfig; // RTE specific TSconfig
657 var $setTarget; // Target (RTE specific)
658 var $setClass; // CSS Class (RTE specific)
659 var $setTitle; // title (RTE specific)
660 var $doc; // Backend template object
661 var $elements = array(); // Holds information about files
662
663 // GPvars: (Input variables from outside)
664 /**
665 * The mode determines the main kind of output from the element browser.
666 * There are these options for values: rte, db, file, filedrag, wizard.
667 * "rte" will show the link selector for the Rich Text Editor (see main_rte())
668 * "db" will allow you to browse for pages or records in the page tree (for TCEforms, see main_db())
669 * "file"/"filedrag" will allow you to browse for files or folders in the folder mounts (for TCEforms, main_file())
670 * "wizard" will allow you to browse for links (like "rte") which are passed back to TCEforms (see main_rte(1))
671 *
672 * @see main()
673 */
674 var $mode;
675
676 /**
677 * Link selector action.
678 * page,file,url,mail,spec are allowed values.
679 * These are only important with the link selector function and in that case they switch between the various menu options.
680 */
681 var $act;
682
683 /**
684 * When you click a page title/expand icon to see the content of a certain page, this value will contain that value (the ID of the expanded page). If the value is NOT set, then it will be restored from the module session data (see main(), mode="db")
685 */
686 var $expandPage;
687
688 /**
689 * When you click a folder name/expand icon to see the content of a certain file folder, this value will contain that value (the path of the expanded file folder). If the value is NOT set, then it will be restored from the module session data (see main(), mode="file"/"filedrag"). Example value: "/www/htdocs/typo3/32/3dsplm/fileadmin/css/"
690 */
691 var $expandFolder;
692
693
694
695 /**
696 * TYPO3 Element Browser, wizard mode parameters. There is a heap of parameters there, better debug() them out if you need something... :-)
697 */
698 var $P;
699
700 /**
701 * Active with TYPO3 Element Browser: Contains the name of the form field for which this window opens - thus allows us to make references back to the main window in which the form is.
702 * Example value: "data[pages][39][bodytext]|||tt_content|" or "data[tt_content][NEW3fba56fde763d][image]|||gif,jpg,jpeg,tif,bmp,pcx,tga,png,pdf,ai|"
703 *
704 * Values:
705 * 0: form field name reference, eg. "data[tt_content][123][image]"
706 * 1: htlmArea RTE parameters: editorNo:contentTypo3Language:contentTypo3Charset
707 * 2: RTE config parameters: RTEtsConfigParams
708 * 3: allowed types. Eg. "tt_content" or "gif,jpg,jpeg,tif,bmp,pcx,tga,png,pdf,ai"
709 * 4: IRRE uniqueness: target level object-id to perform actions/checks on, eg. "data[79][tt_address][1][<field>][<foreign_table>]"
710 * 5: IRRE uniqueness: name of function in opener window that checks if element is already used, eg. "inline.checkUniqueElement"
711 * 6: IRRE uniqueness: name of function in opener window that performs some additional(!) action, eg. "inline.setUniqueElement"
712 * 7: IRRE uniqueness: name of function in opener window that performs action instead of using addElement/insertElement, eg. "inline.importElement"
713 *
714 * $pArr = explode('|',$this->bparams);
715 * $formFieldName = $pArr[0];
716 * $allowedTablesOrFileTypes = $pArr[3];
717 */
718 var $bparams;
719
720 /**
721 * Used with the Rich Text Editor.
722 * Example value: "tt_content:NEW3fba58c969f5c:bodytext:23:text:23:"
723 */
724 var $RTEtsConfigParams;
725
726
727
728
729 /**
730 * Plus/Minus icon value. Used by the tree class to open/close notes on the trees.
731 */
732 var $PM;
733
734 /**
735 * Pointer, used when browsing a long list of records etc.
736 */
737 var $pointer;
738
739
740
741
742 /**
743 * Used with the link selector: Contains the GET input information about the CURRENT link in the RTE/TCEform field. This consists of "href", "target" and "title" keys. This information is passed around in links.
744 */
745 var $curUrlArray;
746
747 /**
748 * Used with the link selector: Contains a processed version of the input values from curUrlInfo. This is splitted into pageid, content element id, label value etc. This is used for the internal processing of that information.
749 */
750 var $curUrlInfo;
751
752 /**
753 * array which holds hook objects (initialised in init() )
754 */
755 protected $hookObjects = array();
756
757
758 /**
759 * object for t3lib_basicFileFunctions
760 */
761 public $fileProcessor;
762
763
764 /**
765 * Constructor:
766 * Initializes a lot of variables, setting JavaScript functions in header etc.
767 *
768 * @return void
769 */
770 function init() {
771 global $BE_USER,$BACK_PATH;
772
773 // Main GPvars:
774 $this->pointer = t3lib_div::_GP('pointer');
775 $this->bparams = t3lib_div::_GP('bparams');
776 $this->P = t3lib_div::_GP('P');
777 $this->RTEtsConfigParams = t3lib_div::_GP('RTEtsConfigParams');
778 $this->expandPage = t3lib_div::_GP('expandPage');
779 $this->expandFolder = t3lib_div::_GP('expandFolder');
780 $this->PM = t3lib_div::_GP('PM');
781
782 // Find "mode"
783 $this->mode = t3lib_div::_GP('mode');
784 if (!$this->mode) {
785 $this->mode = 'rte';
786 }
787 // Creating backend template object:
788 $this->doc = t3lib_div::makeInstance('template');
789 $this->doc->backPath = $GLOBALS['BACK_PATH'];
790 // Load the Prototype library and browse_links.js
791 $this->doc->getPageRenderer()->loadPrototype();
792 $this->doc->loadJavascriptLib('js/browse_links.js');
793
794 // init hook objects:
795 $this->hookObjects = array();
796 if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/class.browse_links.php']['browseLinksHook'])) {
797 foreach($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/class.browse_links.php']['browseLinksHook'] as $classData) {
798 $processObject = t3lib_div::getUserObj($classData);
799
800 if(!($processObject instanceof t3lib_browseLinksHook)) {
801 throw new UnexpectedValueException('$processObject must implement interface t3lib_browseLinksHook', 1195039394);
802 }
803
804 $parameters = array();
805 $processObject->init($this, $parameters);
806 $this->hookObjects[] = $processObject;
807 }
808 }
809
810 // Site URL
811 $this->siteURL = t3lib_div::getIndpEnv('TYPO3_SITE_URL'); // Current site url
812
813 // the script to link to
814 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
815
816 // init fileProcessor
817 $this->fileProcessor = t3lib_div::makeInstance('t3lib_basicFileFunctions');
818 $this->fileProcessor->init($GLOBALS['FILEMOUNTS'], $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']);
819
820
821 // CurrentUrl - the current link url must be passed around if it exists
822 if ($this->mode == 'wizard') {
823 $currentLinkParts = t3lib_div::unQuoteFilenames($this->P['currentValue'], TRUE);
824 $initialCurUrlArray = array (
825 'href' => $currentLinkParts[0],
826 'target' => $currentLinkParts[1],
827 'class' => $currentLinkParts[2],
828 'title' => $currentLinkParts[3],
829 );
830 $this->curUrlArray = (is_array(t3lib_div::_GP('curUrl'))) ?
831 array_merge($initialCurUrlArray, t3lib_div::_GP('curUrl')) :
832 $initialCurUrlArray;
833 $this->curUrlInfo = $this->parseCurUrl($this->siteURL.'?id='.$this->curUrlArray['href'], $this->siteURL);
834 if ($this->curUrlInfo['pageid'] == 0 && $this->curUrlArray['href']) { // pageid == 0 means that this is not an internal (page) link
835 if (file_exists(PATH_site.rawurldecode($this->curUrlArray['href']))) { // check if this is a link to a file
836 if (t3lib_div::isFirstPartOfStr($this->curUrlArray['href'], PATH_site)) {
837 $currentLinkParts[0] = substr($this->curUrlArray['href'], strlen(PATH_site));
838 }
839 $this->curUrlInfo = $this->parseCurUrl($this->siteURL.$this->curUrlArray['href'], $this->siteURL);
840 } elseif (strstr($this->curUrlArray['href'], '@')) { // check for email link
841 if (t3lib_div::isFirstPartOfStr($this->curUrlArray['href'], 'mailto:')) {
842 $currentLinkParts[0] = substr($this->curUrlArray['href'], 7);
843 }
844 $this->curUrlInfo = $this->parseCurUrl('mailto:'.$this->curUrlArray['href'], $this->siteURL);
845 } else { // nothing of the above. this is an external link
846 if(strpos($this->curUrlArray['href'], '://') === false) {
847 $currentLinkParts[0] = 'http://' . $this->curUrlArray['href'];
848 }
849 $this->curUrlInfo = $this->parseCurUrl($currentLinkParts[0], $this->siteURL);
850 }
851 } elseif (!$this->curUrlArray['href']) {
852 $this->curUrlInfo = array();
853 $this->act = 'page';
854 } else {
855 $this->curUrlInfo = $this->parseCurUrl($this->siteURL.'?id='.$this->curUrlArray['href'], $this->siteURL);
856 }
857 } else {
858 $this->curUrlArray = t3lib_div::_GP('curUrl');
859 if ($this->curUrlArray['all']) {
860 $this->curUrlArray=t3lib_div::get_tag_attributes($this->curUrlArray['all']);
861 }
862 $this->curUrlInfo=$this->parseCurUrl($this->curUrlArray['href'],$this->siteURL);
863 }
864
865 // Determine nature of current url:
866 $this->act=t3lib_div::_GP('act');
867 if (!$this->act) {
868 $this->act=$this->curUrlInfo['act'];
869 }
870
871 // Rich Text Editor specific configuration:
872 $addPassOnParams='';
873 if ((string)$this->mode == 'rte') {
874 $RTEtsConfigParts = explode(':',$this->RTEtsConfigParams);
875 $addPassOnParams.='&RTEtsConfigParams='.rawurlencode($this->RTEtsConfigParams);
876 $RTEsetup = $GLOBALS['BE_USER']->getTSConfig('RTE',t3lib_BEfunc::getPagesTSconfig($RTEtsConfigParts[5]));
877 $this->thisConfig = t3lib_BEfunc::RTEsetup($RTEsetup['properties'],$RTEtsConfigParts[0],$RTEtsConfigParts[2],$RTEtsConfigParts[4]);
878 }
879
880 // Initializing the target value (RTE)
881 $this->setTarget = ($this->curUrlArray['target'] != '-') ? $this->curUrlArray['target'] : '';
882 if ($this->thisConfig['defaultLinkTarget'] && !isset($this->curUrlArray['target'])) {
883 $this->setTarget=$this->thisConfig['defaultLinkTarget'];
884 }
885
886 // Initializing the class value (RTE)
887 $this->setClass = ($this->curUrlArray['class'] != '-') ? $this->curUrlArray['class'] : '';
888
889 // Initializing the title value (RTE)
890 $this->setTitle = ($this->curUrlArray['title'] != '-') ? $this->curUrlArray['title'] : '';
891
892 // BEGIN accumulation of header JavaScript:
893 $JScode = '
894 // This JavaScript is primarily for RTE/Link. jumpToUrl is used in the other cases as well...
895 var add_href="'.($this->curUrlArray['href']?'&curUrl[href]='.rawurlencode($this->curUrlArray['href']):'').'";
896 var add_target="'.($this->setTarget?'&curUrl[target]='.rawurlencode($this->setTarget):'').'";
897 var add_class="'.($this->setClass ? '&curUrl[class]='.rawurlencode($this->setClass) : '').'";
898 var add_title="'.($this->setTitle?'&curUrl[title]='.rawurlencode($this->setTitle):'').'";
899 var add_params="'.($this->bparams?'&bparams='.rawurlencode($this->bparams):'').'";
900
901 var cur_href="'.($this->curUrlArray['href']?$this->curUrlArray['href']:'').'";
902 var cur_target="'.($this->setTarget?$this->setTarget:'').'";
903 var cur_class = "'.($this->setClass ? $this->setClass : '-').'";
904 var cur_title="'.($this->setTitle?$this->setTitle:'').'";
905
906 function browse_links_setTarget(target) { //
907 cur_target=target;
908 add_target="&curUrl[target]="+escape(target);
909 }
910 function browse_links_setClass(cssClass) { //
911 cur_class = cssClass;
912 add_class = "&curUrl[class]=" + escape(cssClass);
913 }
914 function browse_links_setTitle(title) { //
915 cur_title=title;
916 add_title="&curUrl[title]="+escape(title);
917 }
918 function browse_links_setValue(value) { //
919 cur_href=value;
920 add_href="&curUrl[href]="+value;
921 }
922 ';
923
924 if ($this->mode == 'wizard') { // Functions used, if the link selector is in wizard mode (= TCEforms fields)
925 unset($this->P['fieldChangeFunc']['alert']);
926 $update='';
927 foreach ($this->P['fieldChangeFunc'] as $k => $v) {
928 $update.= '
929 window.opener.'.$v;
930 }
931
932 $P2=array();
933 $P2['itemName']=$this->P['itemName'];
934 $P2['formName']=$this->P['formName'];
935 $P2['fieldChangeFunc']=$this->P['fieldChangeFunc'];
936 $P2['params']['allowedExtensions']=$this->P['params']['allowedExtensions'];
937 $P2['params']['blindLinkOptions']=$this->P['params']['blindLinkOptions'];
938 $addPassOnParams.=t3lib_div::implodeArrayForUrl('P',$P2);
939
940 $JScode.='
941 function link_typo3Page(id,anchor) { //
942 updateValueInMainForm(id + (anchor ? anchor : ""));
943 close();
944 return false;
945 }
946 function link_folder(folder) { //
947 updateValueInMainForm(folder);
948 close();
949 return false;
950 }
951 function link_current() { //
952 if (cur_href!="http://" && cur_href!="mailto:") {
953 returnBeforeCleaned = cur_href;
954 if (returnBeforeCleaned.substr(0, 7) == "http://") {
955 returnToMainFormValue = returnBeforeCleaned.substr(7);
956 } else if (returnBeforeCleaned.substr(0, 7) == "mailto:") {
957 if (returnBeforeCleaned.substr(0, 14) == "mailto:mailto:") {
958 returnToMainFormValue = returnBeforeCleaned.substr(14);
959 } else {
960 returnToMainFormValue = returnBeforeCleaned.substr(7);
961 }
962 } else {
963 returnToMainFormValue = returnBeforeCleaned;
964 }
965 updateValueInMainForm(returnToMainFormValue);
966 close();
967 }
968 return false;
969 }
970 function checkReference() { //
971 if (window.opener && window.opener.document && window.opener.document.'.$this->P['formName'].' && window.opener.document.'.$this->P['formName'].'["'.$this->P['itemName'].'"] ) {
972 return window.opener.document.'.$this->P['formName'].'["'.$this->P['itemName'].'"];
973 } else {
974 close();
975 }
976 }
977 function updateValueInMainForm(input) { //
978 var field = checkReference();
979 if (field) {
980 if (cur_target == "" && (cur_title != "" || cur_class != "-")) {
981 cur_target = "-";
982 }
983 if (cur_title == "" && cur_class == "-") {
984 cur_class = "";
985 }
986 cur_class = cur_class.replace(/[\'\"]/g, "");
987 if (cur_class.indexOf(" ") != -1) {
988 cur_class = "\"" + cur_class + "\"";
989 }
990 cur_title = cur_title.replace(/(^\")|(\"$)/g, "");
991 if (cur_title.indexOf(" ") != -1) {
992 cur_title = "\"" + cur_title + "\"";
993 }
994 input = input + " " + cur_target + " " + cur_class + " " + cur_title;
995 field.value = input;
996 '.$update.'
997 }
998 }
999 ';
1000 } else { // Functions used, if the link selector is in RTE mode:
1001 $JScode.='
1002 function link_typo3Page(id,anchor) { //
1003 var theLink = \''.$this->siteURL.'?id=\'+id+(anchor?anchor:"");
1004 self.parent.parent.renderPopup_addLink(theLink, cur_target, cur_class, cur_title);
1005 return false;
1006 }
1007 function link_folder(folder) { //
1008 var theLink = \''.$this->siteURL.'\'+folder;
1009 self.parent.parent.renderPopup_addLink(theLink, cur_target, cur_class, cur_title);
1010 return false;
1011 }
1012 function link_spec(theLink) { //
1013 self.parent.parent.renderPopup_addLink(theLink, cur_target, cur_class, cur_title);
1014 return false;
1015 }
1016 function link_current() { //
1017 if (cur_href!="http://" && cur_href!="mailto:") {
1018 self.parent.parent.renderPopup_addLink(cur_href, cur_target, cur_class, cur_title);
1019 }
1020 return false;
1021 }
1022 ';
1023 }
1024
1025 // General "jumpToUrl" function:
1026 $JScode.='
1027 function jumpToUrl(URL,anchor) { //
1028 var add_act = URL.indexOf("act=")==-1 ? "&act='.$this->act.'" : "";
1029 var add_mode = URL.indexOf("mode=")==-1 ? "&mode='.$this->mode.'" : "";
1030 var theLocation = URL + add_act + add_mode + add_href + add_target + add_class + add_title + add_params'.($addPassOnParams?'+"'.$addPassOnParams.'"':'').'+(anchor?anchor:"");
1031 window.location.href = theLocation;
1032 return false;
1033 }
1034 ';
1035
1036
1037 /**
1038 * Splits parts of $this->bparams
1039 * @see $bparams
1040 */
1041 $pArr = explode('|',$this->bparams);
1042
1043 // This is JavaScript especially for the TBE Element Browser!
1044 $formFieldName = 'data['.$pArr[0].']['.$pArr[1].']['.$pArr[2].']';
1045
1046 // insertElement - Call check function (e.g. for uniqueness handling):
1047 if ($pArr[4] && $pArr[5]) {
1048 $JScodeCheck = '
1049 // Call a check function in the opener window (e.g. for uniqueness handling):
1050 if (parent.window.opener) {
1051 var res = parent.window.opener.'.$pArr[5].'("'.addslashes($pArr[4]).'",table,uid,type);
1052 if (!res.passed) {
1053 if (res.message) alert(res.message);
1054 performAction = false;
1055 }
1056 } else {
1057 alert("Error - reference to main window is not set properly!");
1058 parent.close();
1059 }
1060 ';
1061 }
1062 // insertElement - Call helper function:
1063 if ($pArr[4] && $pArr[6]) {
1064 $JScodeHelper = '
1065 // Call helper function to manage data in the opener window:
1066 if (parent.window.opener) {
1067 parent.window.opener.'.$pArr[6].'("'.addslashes($pArr[4]).'",table,uid,type,"'.addslashes($pArr[0]).'");
1068 } else {
1069 alert("Error - reference to main window is not set properly!");
1070 parent.close();
1071 }
1072 ';
1073 }
1074 // insertElement - perform action commands:
1075 if ($pArr[4] && $pArr[7]) {
1076 // Call user defined action function:
1077 $JScodeAction = '
1078 if (parent.window.opener) {
1079 parent.window.opener.'.$pArr[7].'("'.addslashes($pArr[4]).'",table,uid,type);
1080 focusOpenerAndClose(close);
1081 } else {
1082 alert("Error - reference to main window is not set properly!");
1083 parent.close();
1084 }
1085 ';
1086 } else if ($pArr[0] && !$pArr[1] && !$pArr[2]) {
1087 $JScodeAction = '
1088 addElement(filename,table+"_"+uid,fp,close);
1089 ';
1090 } else {
1091 $JScodeAction = '
1092 if (setReferences()) {
1093 parent.window.opener.group_change("add","'.$pArr[0].'","'.$pArr[1].'","'.$pArr[2].'",elRef,targetDoc);
1094 } else {
1095 alert("Error - reference to main window is not set properly!");
1096 }
1097 focusOpenerAndClose(close);
1098 ';
1099 }
1100
1101 $JScode.='
1102 var elRef="";
1103 var targetDoc="";
1104
1105 function launchView(url) { //
1106 var thePreviewWindow="";
1107 thePreviewWindow = window.open("'.$BACK_PATH.'show_item.php?table="+url,"ShowItem","height=300,width=410,status=0,menubar=0,resizable=0,location=0,directories=0,scrollbars=1,toolbar=0");
1108 if (thePreviewWindow && thePreviewWindow.focus) {
1109 thePreviewWindow.focus();
1110 }
1111 }
1112 function setReferences() { //
1113 if (parent.window.opener && parent.window.opener.content && parent.window.opener.content.document.editform && parent.window.opener.content.document.editform["'.$formFieldName.'"]) {
1114 targetDoc = parent.window.opener.content.document;
1115 elRef = targetDoc.editform["'.$formFieldName.'"];
1116 return true;
1117 } else {
1118 return false;
1119 }
1120 }
1121 function insertElement(table, uid, type, filename,fp,filetype,imagefile,action, close) { //
1122 var performAction = true;
1123 '.$JScodeCheck.'
1124 // Call performing function and finish this action:
1125 if (performAction) {
1126 '.$JScodeHelper.$JScodeAction.'
1127 }
1128 return false;
1129 }
1130 function addElement(elName,elValue,altElValue,close) { //
1131 if (parent.window.opener && parent.window.opener.setFormValueFromBrowseWin) {
1132 parent.window.opener.setFormValueFromBrowseWin("'.$pArr[0].'",altElValue?altElValue:elValue,elName);
1133 focusOpenerAndClose(close);
1134 } else {
1135 alert("Error - reference to main window is not set properly!");
1136 parent.close();
1137 }
1138 }
1139 function focusOpenerAndClose(close) { //
1140 BrowseLinks.focusOpenerAndClose(close);
1141 }
1142 ';
1143
1144 // Finally, add the accumulated JavaScript to the template object:
1145 $this->doc->JScode.= $this->doc->wrapScriptTags($JScode);
1146
1147 // Debugging:
1148 if (FALSE) debug(array(
1149 'pointer' => $this->pointer,
1150 'act' => $this->act,
1151 'mode' => $this->mode,
1152 'curUrlInfo' => $this->curUrlInfo,
1153 'curUrlArray' => $this->curUrlArray,
1154 'P' => $this->P,
1155 'bparams' => $this->bparams,
1156 'RTEtsConfigParams' => $this->RTEtsConfigParams,
1157 'expandPage' => $this->expandPage,
1158 'expandFolder' => $this->expandFolder,
1159 'PM' => $this->PM,
1160 ),'Internal variables of Script Class:');
1161 }
1162
1163
1164 /**
1165 * Session data for this class can be set from outside with this method.
1166 * Call after init()
1167 *
1168 * @param array Session data array
1169 * @return array Session data and boolean which indicates that data needs to be stored in session because it's changed
1170 */
1171 function processSessionData($data) {
1172 $store = false;
1173
1174 switch((string)$this->mode) {
1175 case 'db':
1176 if (isset($this->expandPage)) {
1177 $data['expandPage']=$this->expandPage;
1178 $store = true;
1179 } else {
1180 $this->expandPage=$data['expandPage'];
1181 }
1182 break;
1183 case 'file':
1184 case 'filedrag':
1185 case 'folder':
1186 if (isset($this->expandFolder)) {
1187 $data['expandFolder']=$this->expandFolder;
1188 $store = true;
1189 } else {
1190 $this->expandFolder=$data['expandFolder'];
1191 }
1192 break;
1193 }
1194
1195 return array($data, $store);
1196 }
1197
1198
1199
1200
1201 /******************************************************************
1202 *
1203 * Main functions
1204 *
1205 ******************************************************************/
1206
1207 /**
1208 * Rich Text Editor (RTE) link selector (MAIN function)
1209 * Generates the link selector for the Rich Text Editor.
1210 * Can also be used to select links for the TCEforms (see $wiz)
1211 *
1212 * @param boolean If set, the "remove link" is not shown in the menu: Used for the "Select link" wizard which is used by the TCEforms
1213 * @return string Modified content variable.
1214 */
1215 function main_rte($wiz=0) {
1216 global $LANG, $BACK_PATH;
1217
1218 // Starting content:
1219 $content=$this->doc->startPage('RTE link');
1220
1221 // Initializing the action value, possibly removing blinded values etc:
1222 $allowedItems = array_diff(
1223 explode(',','page,file,folder,url,mail,spec'),
1224 t3lib_div::trimExplode(',',$this->thisConfig['blindLinkOptions'],1)
1225 );
1226 $allowedItems = array_diff(
1227 $allowedItems,
1228 t3lib_div::trimExplode(',',$this->P['params']['blindLinkOptions'])
1229 );
1230
1231 //call hook for extra options
1232 foreach($this->hookObjects as $hookObject) {
1233 $allowedItems = $hookObject->addAllowedItems($allowedItems);
1234 }
1235
1236 reset($allowedItems);
1237 if (!in_array($this->act,$allowedItems)) $this->act = current($allowedItems);
1238
1239 // Making menu in top:
1240 $menuDef = array();
1241 if (!$wiz) {
1242 $menuDef['removeLink']['isActive'] = $this->act=='removeLink';
1243 $menuDef['removeLink']['label'] = $LANG->getLL('removeLink',1);
1244 $menuDef['removeLink']['url'] = '#';
1245 $menuDef['removeLink']['addParams'] = 'onclick="self.parent.parent.renderPopup_unLink();return false;"';
1246 }
1247 if (in_array('page',$allowedItems)) {
1248 $menuDef['page']['isActive'] = $this->act=='page';
1249 $menuDef['page']['label'] = $LANG->getLL('page',1);
1250 $menuDef['page']['url'] = '#';
1251 $menuDef['page']['addParams'] = 'onclick="jumpToUrl(\'?act=page\');return false;"';
1252 }
1253 if (in_array('file',$allowedItems)){
1254 $menuDef['file']['isActive'] = $this->act=='file';
1255 $menuDef['file']['label'] = $LANG->getLL('file',1);
1256 $menuDef['file']['url'] = '#';
1257 $menuDef['file']['addParams'] = 'onclick="jumpToUrl(\'?act=file\');return false;"';
1258 }
1259 if (in_array('folder',$allowedItems)){
1260 $menuDef['folder']['isActive'] = $this->act == 'folder';
1261 $menuDef['folder']['label'] = $LANG->getLL('folder', 1);
1262 $menuDef['folder']['url'] = '#';
1263 $menuDef['folder']['addParams'] = 'onclick="jumpToUrl(\'?act=folder\');return false;"';
1264 }
1265 if (in_array('url',$allowedItems)) {
1266 $menuDef['url']['isActive'] = $this->act=='url';
1267 $menuDef['url']['label'] = $LANG->getLL('extUrl',1);
1268 $menuDef['url']['url'] = '#';
1269 $menuDef['url']['addParams'] = 'onclick="jumpToUrl(\'?act=url\');return false;"';
1270 }
1271 if (in_array('mail',$allowedItems)) {
1272 $menuDef['mail']['isActive'] = $this->act=='mail';
1273 $menuDef['mail']['label'] = $LANG->getLL('email',1);
1274 $menuDef['mail']['url'] = '#';
1275 $menuDef['mail']['addParams'] = 'onclick="jumpToUrl(\'?act=mail\');return false;"';
1276 }
1277 if (is_array($this->thisConfig['userLinks.']) && in_array('spec',$allowedItems)) {
1278 $menuDef['spec']['isActive'] = $this->act=='spec';
1279 $menuDef['spec']['label'] = $LANG->getLL('special',1);
1280 $menuDef['spec']['url'] = '#';
1281 $menuDef['spec']['addParams'] = 'onclick="jumpToUrl(\'?act=spec\');return false;"';
1282 }
1283
1284 // call hook for extra options
1285 foreach($this->hookObjects as $hookObject) {
1286 $menuDef = $hookObject->modifyMenuDefinition($menuDef);
1287 }
1288
1289 $content .= $this->doc->getTabMenuRaw($menuDef);
1290
1291 // Adding the menu and header to the top of page:
1292 $content.=$this->printCurrentUrl($this->curUrlInfo['info']).'<br />';
1293
1294 // Depending on the current action we will create the actual module content for selecting a link:
1295 switch($this->act) {
1296 case 'mail':
1297 $extUrl='
1298
1299 <!--
1300 Enter mail address:
1301 -->
1302 <form action="" name="lurlform" id="lurlform">
1303 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkMail">
1304 <tr>
1305 <td style="width: 96px;">' . $GLOBALS['LANG']->getLL('emailAddress', 1) . ':</td>
1306 <td><input type="text" name="lemail"'.$this->doc->formWidth(20).' value="'.htmlspecialchars($this->curUrlInfo['act']=='mail'?$this->curUrlInfo['info']:'').'" /> '.
1307 '<input type="submit" value="' . $GLOBALS['LANG']->getLL('setLink', 1) . '" onclick="browse_links_setTarget(\'\');browse_links_setValue(\'mailto:\'+document.lurlform.lemail.value); return link_current();" /></td>
1308 </tr>
1309 </table>
1310 </form>';
1311 $content.=$extUrl;
1312 break;
1313 case 'url':
1314 $extUrl='
1315
1316 <!--
1317 Enter External URL:
1318 -->
1319 <form action="" name="lurlform" id="lurlform">
1320 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkURL">
1321 <tr>
1322 <td style="width: 96px;">URL:</td>
1323 <td><input type="text" name="lurl"'.$this->doc->formWidth(30).' value="'.htmlspecialchars($this->curUrlInfo['act']=='url'?$this->curUrlInfo['info']:'http://').'" /> '.
1324 '<input type="submit" value="' . $GLOBALS['LANG']->getLL('setLink', 1) . '" onclick="browse_links_setValue(document.lurlform.lurl.value); return link_current();" /></td>
1325 </tr>
1326 </table>
1327 </form>';
1328 $content.=$extUrl;
1329 break;
1330 case 'file':
1331 case 'folder':
1332 $foldertree = t3lib_div::makeInstance('rteFolderTree');
1333 $foldertree->thisScript = $this->thisScript;
1334 $tree = $foldertree->getBrowsableTree();
1335
1336 if (!$this->curUrlInfo['value'] || $this->curUrlInfo['act'] != $this->act) {
1337 $cmpPath = '';
1338 } elseif (substr(trim($this->curUrlInfo['info']), -1) != '/') {
1339 $cmpPath = PATH_site.dirname($this->curUrlInfo['info']).'/';
1340 if (!isset($this->expandFolder)) {
1341 $this->expandFolder = $cmpPath;
1342 }
1343 } else {
1344 $cmpPath = PATH_site.$this->curUrlInfo['info'];
1345 if (!isset($this->expandFolder) && $this->curUrlInfo['act'] == 'folder') {
1346 $this->expandFolder = $cmpPath;
1347 }
1348 }
1349
1350 list(, , $specUid) = explode('_', $this->PM);
1351 $files = $this->expandFolder(
1352 $foldertree->specUIDmap[$specUid],
1353 $this->P['params']['allowedExtensions']
1354 );
1355 $content.= '
1356
1357 <!--
1358 Wrapper table for folder tree / file/folder list:
1359 -->
1360 <table border="0" cellpadding="0" cellspacing="0" id="typo3-linkFiles">
1361 <tr>
1362 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('folderTree').':').$tree.'</td>
1363 <td class="c-wCell" valign="top">'.$files.'</td>
1364 </tr>
1365 </table>
1366 ';
1367 break;
1368 case 'spec':
1369 if (is_array($this->thisConfig['userLinks.'])) {
1370 $subcats=array();
1371 $v=$this->thisConfig['userLinks.'];
1372 foreach ($v as $k2 => $value) {
1373 $k2i = intval($k2);
1374 if (substr($k2,-1)=='.' && is_array($v[$k2i.'.'])) {
1375
1376 // Title:
1377 $title = trim($v[$k2i]);
1378 if (!$title) {
1379 $title=$v[$k2i.'.']['url'];
1380 } else {
1381 $title=$LANG->sL($title);
1382 }
1383 // Description:
1384 $description=$v[$k2i.'.']['description'] ? $LANG->sL($v[$k2i.'.']['description'],1).'<br />' : '';
1385
1386 // URL + onclick event:
1387 $onClickEvent='';
1388 if (isset($v[$k2i.'.']['target'])) $onClickEvent.="browse_links_setTarget('".$v[$k2i.'.']['target']."');";
1389 $v[$k2i.'.']['url'] = str_replace('###_URL###',$this->siteURL,$v[$k2i.'.']['url']);
1390 if (substr($v[$k2i.'.']['url'],0,7)=='http://' || substr($v[$k2i.'.']['url'],0,7)=='mailto:') {
1391 $onClickEvent.="cur_href=unescape('".rawurlencode($v[$k2i.'.']['url'])."');link_current();";
1392 } else {
1393 $onClickEvent.="link_spec(unescape('".$this->siteURL.rawurlencode($v[$k2i.'.']['url'])."'));";
1394 }
1395
1396 // Link:
1397 $A=array('<a href="#" onclick="'.htmlspecialchars($onClickEvent).'return false;">','</a>');
1398
1399 // Adding link to menu of user defined links:
1400 $subcats[$k2i]='
1401 <tr>
1402 <td class="bgColor4">'.$A[0].'<strong>'.htmlspecialchars($title).($this->curUrlInfo['info']==$v[$k2i.'.']['url']?'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_right.gif','width="5" height="9"').' class="c-blinkArrowR" alt="" />':'').'</strong><br />'.$description.$A[1].'</td>
1403 </tr>';
1404 }
1405 }
1406
1407 // Sort by keys:
1408 ksort($subcats);
1409
1410 // Add menu to content:
1411 $content.= '
1412
1413 <!--
1414 Special userdefined menu:
1415 -->
1416 <table border="0" cellpadding="1" cellspacing="1" id="typo3-linkSpecial">
1417 <tr>
1418 <td class="bgColor5" class="c-wCell" valign="top"><strong>'.$LANG->getLL('special',1).'</strong></td>
1419 </tr>
1420 '.implode('',$subcats).'
1421 </table>
1422 ';
1423 }
1424 break;
1425 case 'page':
1426 $pagetree = t3lib_div::makeInstance('rtePageTree');
1427 $pagetree->thisScript = $this->thisScript;
1428 $pagetree->ext_showPageId = $GLOBALS['BE_USER']->getTSConfigVal('options.pageTree.showPageIdWithTitle');
1429 $tree=$pagetree->getBrowsableTree();
1430 $cElements = $this->expandPage();
1431
1432 // Outputting Temporary DB mount notice:
1433 if (intval($GLOBALS['BE_USER']->getSessionData('pageTree_temporaryMountPoint'))) {
1434 $link = '<a href="' . htmlspecialchars(t3lib_div::linkThisScript(array('setTempDBmount' => 0))) . '">' .
1435 $LANG->sl('LLL:EXT:lang/locallang_core.xml:labels.temporaryDBmount', 1) .
1436 '</a>';
1437 $flashMessage = t3lib_div::makeInstance(
1438 't3lib_FlashMessage',
1439 $link,
1440 '',
1441 t3lib_FlashMessage::INFO
1442 );
1443 $dbmount = $flashMessage->render();
1444 }
1445
1446 $content.= '
1447
1448 <!--
1449 Wrapper table for page tree / record list:
1450 -->
1451 <table border="0" cellpadding="0" cellspacing="0" id="typo3-linkPages">
1452 <tr>
1453 <td class="c-wCell" valign="top">' . $this->barheader($GLOBALS['LANG']->getLL('pageTree') . ':') . $dbmount . $tree . '</td>
1454 <td class="c-wCell" valign="top">'.$cElements.'</td>
1455 </tr>
1456 </table>
1457 ';
1458 break;
1459 default:
1460 //call hook
1461 foreach($this->hookObjects as $hookObject) {
1462 $content .= $hookObject->getTab($this->act);
1463 }
1464 break;
1465 }
1466
1467 $content .= '
1468
1469 <!--
1470 Selecting class for link:
1471 -->
1472 <form action="" name="lclassform" id="lclassform">
1473 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkClass">
1474 <tr>
1475 <td style="width: 96px;">' . $GLOBALS['LANG']->getLL('class', 1) . '</td>
1476 <td><input type="text" name="lclass" onchange="browse_links_setClass(this.value);" value="' . htmlspecialchars($this->setClass) . '"' . $this->doc->formWidth(10) . ' /></td>
1477 </tr>
1478 </table>
1479 </form>
1480
1481 <!--
1482 Selecting title for link:
1483 -->
1484 <form action="" name="ltitleform" id="ltitleform">
1485 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkTitle">
1486 <tr>
1487 <td style="width: 96px;">' . $GLOBALS['LANG']->getLL('title', 1) . '</td>
1488 <td><input type="text" name="ltitle" onchange="browse_links_setTitle(this.value);" value="' . htmlspecialchars($this->setTitle) . '"' . $this->doc->formWidth(10) . ' /></td>
1489 </tr>
1490 </table>
1491 </form>
1492 ';
1493
1494 // Target:
1495 if ($this->act!='mail') {
1496 $ltarget='
1497
1498
1499
1500 <!--
1501 Selecting target for link:
1502 -->
1503 <form action="" name="ltargetform" id="ltargetform">
1504 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkTarget">
1505 <tr>
1506 <td>'.$GLOBALS['LANG']->getLL('target',1).':</td>
1507 <td><input type="text" name="ltarget" onchange="browse_links_setTarget(this.value);" value="' . htmlspecialchars($this->setTarget) . '"' . $this->doc->formWidth(10) . ' /></td>
1508 <td>
1509 <select name="ltarget_type" onchange="browse_links_setTarget(this.options[this.selectedIndex].value);document.ltargetform.ltarget.value=this.options[this.selectedIndex].value;this.selectedIndex=0;">
1510 <option></option>
1511 <option value="_top">'.$GLOBALS['LANG']->getLL('top',1).'</option>
1512 <option value="_blank">'.$GLOBALS['LANG']->getLL('newWindow',1).'</option>
1513 </select>
1514 </td>
1515 <td>';
1516 if (($this->curUrlInfo['act'] == 'page' || $this->curUrlInfo['act'] == 'file' || $this->curUrlInfo['act'] == 'folder') && $this->curUrlArray['href'] && $this->curUrlInfo['act'] == $this->act) {
1517 $ltarget.='
1518 <input type="submit" value="'.$GLOBALS['LANG']->getLL('update',1).'" onclick="return link_current();" />';
1519 }
1520
1521 $selectJS = '
1522 if (document.ltargetform.popup_width.options[document.ltargetform.popup_width.selectedIndex].value>0 && document.ltargetform.popup_height.options[document.ltargetform.popup_height.selectedIndex].value>0) {
1523 document.ltargetform.ltarget.value = document.ltargetform.popup_width.options[document.ltargetform.popup_width.selectedIndex].value+"x"+document.ltargetform.popup_height.options[document.ltargetform.popup_height.selectedIndex].value;
1524 browse_links_setTarget(document.ltargetform.ltarget.value);
1525 browse_links_setClass(document.lclassform.lclass.value);
1526 browse_links_setTitle(document.ltitleform.ltitle.value);
1527 document.ltargetform.popup_width.selectedIndex=0;
1528 document.ltargetform.popup_height.selectedIndex=0;
1529 }
1530 ';
1531
1532 $ltarget.=' </td>
1533 </tr>
1534 <tr>
1535 <td>'.$GLOBALS['LANG']->getLL('target_popUpWindow',1).':</td>
1536 <td colspan="3">
1537 <select name="popup_width" onchange="'.htmlspecialchars($selectJS).'">
1538 <option value="0">'.$GLOBALS['LANG']->getLL('target_popUpWindow_width',1).'</option>
1539 <option value="300">300</option>
1540 <option value="400">400</option>
1541 <option value="500">500</option>
1542 <option value="600">600</option>
1543 <option value="700">700</option>
1544 <option value="800">800</option>
1545 </select>
1546 x
1547 <select name="popup_height" onchange="'.htmlspecialchars($selectJS).'">
1548 <option value="0">'.$GLOBALS['LANG']->getLL('target_popUpWindow_height',1).'</option>
1549 <option value="200">200</option>
1550 <option value="300">300</option>
1551 <option value="400">400</option>
1552 <option value="500">500</option>
1553 <option value="600">600</option>
1554 </select>
1555 </td>
1556 </tr>
1557 </table>
1558 </form>';
1559
1560 // Add "target selector" box to content:
1561 $content.=$ltarget;
1562
1563 // Add some space
1564 $content.='<br /><br />';
1565 }
1566
1567 // End page, return content:
1568 $content.= $this->doc->endPage();
1569 $content = $this->doc->insertStylesAndJS($content);
1570 return $content;
1571 }
1572
1573 /**
1574 * TYPO3 Element Browser: Showing a page tree and allows you to browse for records
1575 *
1576 * @return string HTML content for the module
1577 */
1578 function main_db() {
1579
1580 // Starting content:
1581 $content=$this->doc->startPage('TBE record selector');
1582
1583 // Init variable:
1584 $pArr = explode('|',$this->bparams);
1585
1586 // Making the browsable pagetree:
1587 $pagetree = t3lib_div::makeInstance('TBE_PageTree');
1588 $pagetree->thisScript=$this->thisScript;
1589 $pagetree->ext_pArrPages = !strcmp($pArr[3],'pages')?1:0;
1590 $pagetree->ext_showNavTitle = $GLOBALS['BE_USER']->getTSConfigVal('options.pageTree.showNavTitle');
1591 $pagetree->ext_showPageId = $GLOBALS['BE_USER']->getTSConfigVal('options.pageTree.showPageIdWithTitle');
1592 $pagetree->addField('nav_title');
1593 $tree=$pagetree->getBrowsableTree();
1594
1595 // Making the list of elements, if applicable:
1596 $cElements = $this->TBE_expandPage($pArr[3]);
1597
1598 // Putting the things together, side by side:
1599 $content.= '
1600
1601 <!--
1602 Wrapper table for page tree / record list:
1603 -->
1604 <table border="0" cellpadding="0" cellspacing="0" id="typo3-EBrecords">
1605 <tr>
1606 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('pageTree').':').$tree.'</td>
1607 <td class="c-wCell" valign="top">'.$cElements.'</td>
1608 </tr>
1609 </table>
1610 ';
1611
1612 // Add some space
1613 $content.='<br /><br />';
1614
1615 // End page, return content:
1616 $content.= $this->doc->endPage();
1617 $content = $this->doc->insertStylesAndJS($content);
1618 return $content;
1619 }
1620
1621 /**
1622 * TYPO3 Element Browser: Showing a folder tree, allowing you to browse for files.
1623 *
1624 * @return string HTML content for the module
1625 */
1626 function main_file() {
1627 global $BE_USER;
1628
1629 // Starting content:
1630 $content.=$this->doc->startPage('TBE file selector');
1631
1632 // Init variable:
1633 $pArr = explode('|',$this->bparams);
1634
1635 // Create upload/create folder forms, if a path is given:
1636 $path=$this->expandFolder;
1637 if (!$path || !@is_dir($path)) {
1638 // The closest TEMP-path is found
1639 $path = $this->fileProcessor->findTempFolder().'/';
1640 }
1641 if ($path!='/' && @is_dir($path)) {
1642 $uploadForm=$this->uploadForm($path);
1643 $createFolder=$this->createFolder($path);
1644 } else {
1645 $createFolder='';
1646 $uploadForm='';
1647 }
1648 if ($BE_USER->getTSConfigVal('options.uploadFieldsInTopOfEB')) $content.=$uploadForm;
1649
1650 // Getting flag for showing/not showing thumbnails:
1651 $noThumbs = $GLOBALS['BE_USER']->getTSConfigVal('options.noThumbsInEB');
1652
1653 if (!$noThumbs) {
1654 // MENU-ITEMS, fetching the setting for thumbnails from File>List module:
1655 $_MOD_MENU = array('displayThumbs' => '');
1656 $_MCONF['name']='file_list';
1657 $_MOD_SETTINGS = t3lib_BEfunc::getModuleData($_MOD_MENU, t3lib_div::_GP('SET'), $_MCONF['name']);
1658 $addParams = '&act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
1659 $thumbNailCheck = t3lib_BEfunc::getFuncCheck('','SET[displayThumbs]',$_MOD_SETTINGS['displayThumbs'],$this->thisScript,$addParams,'id="checkDisplayThumbs"').' <label for="checkDisplayThumbs">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_file_list.php:displayThumbs',1).'</label>';
1660 } else {
1661 $thumbNailCheck='';
1662 }
1663 $noThumbs = $noThumbs ? $noThumbs : !$_MOD_SETTINGS['displayThumbs'];
1664
1665 // Create folder tree:
1666 $foldertree = t3lib_div::makeInstance('TBE_FolderTree');
1667 $foldertree->thisScript=$this->thisScript;
1668 $foldertree->ext_noTempRecyclerDirs = ($this->mode == 'filedrag');
1669 $tree=$foldertree->getBrowsableTree();
1670
1671 list(,,$specUid) = explode('_',$this->PM);
1672
1673 if ($this->mode=='filedrag') {
1674 $files = $this->TBE_dragNDrop($foldertree->specUIDmap[$specUid],$pArr[3]);
1675 } else {
1676 $files = $this->TBE_expandFolder($foldertree->specUIDmap[$specUid],$pArr[3],$noThumbs);
1677 }
1678
1679 // Putting the parts together, side by side:
1680 $content.= '
1681
1682 <!--
1683 Wrapper table for folder tree / file list:
1684 -->
1685 <table border="0" cellpadding="0" cellspacing="0" id="typo3-EBfiles">
1686 <tr>
1687 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('folderTree').':').$tree.'</td>
1688 <td class="c-wCell" valign="top">'.$files.'</td>
1689 </tr>
1690 </table>
1691 ';
1692 $content.= $thumbNailCheck;
1693
1694 // Adding create folder + upload forms if applicable:
1695 if (!$BE_USER->getTSConfigVal('options.uploadFieldsInTopOfEB')) $content.=$uploadForm;
1696 if ($BE_USER->isAdmin() || $BE_USER->getTSConfigVal('options.createFoldersInEB')) $content.=$createFolder;
1697
1698 // Add some space
1699 $content.='<br /><br />';
1700
1701 // Setup indexed elements:
1702 $this->doc->JScode.= $this->doc->wrapScriptTags('BrowseLinks.addElements(' . json_encode($this->elements) . ');');
1703 // Ending page, returning content:
1704 $content.= $this->doc->endPage();
1705 $content = $this->doc->insertStylesAndJS($content);
1706
1707 return $content;
1708 }
1709
1710 /**
1711 * TYPO3 Element Browser: Showing a folder tree, allowing you to browse for folders.
1712 *
1713 * @return string HTML content for the module
1714 */
1715 function main_folder() {
1716 global $BE_USER;
1717
1718 // Starting content:
1719 $content = $this->doc->startPage('TBE folder selector');
1720
1721 // Init variable:
1722 $parameters = explode('|', $this->bparams);
1723
1724
1725 $path = $this->expandFolder;
1726 if (!$path || !@is_dir($path)) {
1727 // The closest TEMP-path is found
1728 $path = $this->fileProcessor->findTempFolder().'/';
1729 }
1730 if ($path != '/' && @is_dir($path)) {
1731 $createFolder = $this->createFolder($path);
1732 } else {
1733 $createFolder='';
1734 }
1735
1736 // Create folder tree:
1737 $foldertree = t3lib_div::makeInstance('TBE_FolderTree');
1738 $foldertree->thisScript = $this->thisScript;
1739 $foldertree->ext_noTempRecyclerDirs = ($this->mode == 'filedrag');
1740 $tree = $foldertree->getBrowsableTree(false);
1741
1742 list(, , $specUid) = explode('_', $this->PM);
1743
1744 if($this->mode == 'filedrag') {
1745 $folders = $this->TBE_dragNDrop(
1746 $foldertree->specUIDmap[$specUid],
1747 $parameters[3]
1748 );
1749 } else {
1750 $folders = $this->TBE_expandSubFolders($foldertree->specUIDmap[$specUid]);
1751 }
1752
1753 // Putting the parts together, side by side:
1754 $content.= '
1755
1756 <!--
1757 Wrapper table for folder tree / folder list:
1758 -->
1759 <table border="0" cellpadding="0" cellspacing="0" id="typo3-EBfiles">
1760 <tr>
1761 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('folderTree').':').$tree.'</td>
1762 <td class="c-wCell" valign="top">'.$folders.'</td>
1763 </tr>
1764 </table>
1765 ';
1766
1767 // Adding create folder if applicable:
1768 if($BE_USER->isAdmin() || $BE_USER->getTSConfigVal('options.createFoldersInEB')) {
1769 $content .= $createFolder;
1770 }
1771
1772 // Add some space
1773 $content .= '<br /><br />';
1774
1775 // Ending page, returning content:
1776 $content.= $this->doc->endPage();
1777 $content = $this->doc->insertStylesAndJS($content);
1778
1779 return $content;
1780 }
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798 /******************************************************************
1799 *
1800 * Record listing
1801 *
1802 ******************************************************************/
1803 /**
1804 * For RTE: This displays all content elements on a page and lets you create a link to the element.
1805 *
1806 * @return string HTML output. Returns content only if the ->expandPage value is set (pointing to a page uid to show tt_content records from ...)
1807 */
1808 function expandPage() {
1809 global $BE_USER, $BACK_PATH;
1810
1811 $out='';
1812 $expPageId = $this->expandPage; // Set page id (if any) to expand
1813
1814 // If there is an anchor value (content element reference) in the element reference, then force an ID to expand:
1815 if (!$this->expandPage && $this->curUrlInfo['cElement']) {
1816 $expPageId = $this->curUrlInfo['pageid']; // Set to the current link page id.
1817 }
1818
1819 // Draw the record list IF there is a page id to expand:
1820 if ($expPageId && t3lib_div::testInt($expPageId) && $BE_USER->isInWebMount($expPageId)) {
1821
1822 // Set header:
1823 $out.=$this->barheader($GLOBALS['LANG']->getLL('contentElements').':');
1824
1825 // Create header for listing, showing the page title/icon:
1826 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
1827 $mainPageRec = t3lib_BEfunc::getRecordWSOL('pages',$expPageId);
1828 $picon = t3lib_iconWorks::getSpriteIconForRecord('pages', $mainPageRec);
1829 $picon.= htmlspecialchars(t3lib_div::fixed_lgd_cs($mainPageRec['title'],$titleLen));
1830 $out.=$picon.'<br />';
1831
1832 // Look up tt_content elements from the expanded page:
1833 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
1834 'uid,header,hidden,starttime,endtime,fe_group,CType,colpos,bodytext',
1835 'tt_content',
1836 'pid='.intval($expPageId).
1837 t3lib_BEfunc::deleteClause('tt_content').
1838 t3lib_BEfunc::versioningPlaceholderClause('tt_content'),
1839 '',
1840 'colpos,sorting'
1841 );
1842 $cc = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
1843
1844 // Traverse list of records:
1845 $c=0;
1846 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
1847 $c++;
1848 $icon = t3lib_iconWorks::getSpriteIconForRecord('tt_content', $row);
1849 if ($this->curUrlInfo['act']=='page' && $this->curUrlInfo['cElement']==$row['uid']) {
1850 $arrCol='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_left.gif','width="5" height="9"').' class="c-blinkArrowL" alt="" />';
1851 } else {
1852 $arrCol='';
1853 }
1854 // Putting list element HTML together:
1855 $out.='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/join'.($c==$cc?'bottom':'').'.gif','width="18" height="16"').' alt="" />'.
1856 $arrCol.
1857 '<a href="#" onclick="return link_typo3Page(\''.$expPageId.'\',\'#'.$row['uid'].'\');">'.
1858 $icon.
1859 htmlspecialchars(t3lib_div::fixed_lgd_cs($row['header'],$titleLen)).
1860 '</a><br />';
1861
1862 // Finding internal anchor points:
1863 if (t3lib_div::inList('text,textpic', $row['CType'])) {
1864 $split = preg_split('/(<a[^>]+name=[\'"]?([^"\'>[:space:]]+)[\'"]?[^>]*>)/i', $row['bodytext'], -1, PREG_SPLIT_DELIM_CAPTURE);
1865
1866 foreach($split as $skey => $sval) {
1867 if (($skey%3)==2) {
1868 // Putting list element HTML together:
1869 $sval = substr($sval,0,100);
1870 $out.='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/line.gif','width="18" height="16"').' alt="" />'.
1871 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/join'.($skey+3>count($split)?'bottom':'').'.gif','width="18" height="16"').' alt="" />'.
1872 '<a href="#" onclick="return link_typo3Page(\''.$expPageId.'\',\'#'.rawurlencode($sval).'\');">'.
1873 htmlspecialchars(' <A> '.$sval).
1874 '</a><br />';
1875 }
1876 }
1877 }
1878 }
1879 }
1880 return $out;
1881 }
1882
1883 /**
1884 * For TYPO3 Element Browser: This lists all content elements from the given list of tables
1885 *
1886 * @param string Commalist of tables. Set to "*" if you want all tables.
1887 * @return string HTML output.
1888 */
1889 function TBE_expandPage($tables) {
1890 global $TCA,$BE_USER, $BACK_PATH;
1891
1892 $out='';
1893 if ($this->expandPage>=0 && t3lib_div::testInt($this->expandPage) && $BE_USER->isInWebMount($this->expandPage)) {
1894
1895 // Set array with table names to list:
1896 if (!strcmp(trim($tables),'*')) {
1897 $tablesArr = array_keys($TCA);
1898 } else {
1899 $tablesArr = t3lib_div::trimExplode(',',$tables,1);
1900 }
1901 reset($tablesArr);
1902
1903 // Headline for selecting records:
1904 $out.=$this->barheader($GLOBALS['LANG']->getLL('selectRecords').':');
1905
1906 // Create the header, showing the current page for which the listing is. Includes link to the page itself, if pages are amount allowed tables.
1907 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
1908 $mainPageRec = t3lib_BEfunc::getRecordWSOL('pages',$this->expandPage);
1909 $ATag='';
1910 $ATag_e='';
1911 $ATag2='';
1912 if (in_array('pages',$tablesArr)) {
1913 $ficon=t3lib_iconWorks::getIcon('pages',$mainPageRec);
1914 $ATag="<a href=\"#\" onclick=\"return insertElement('pages', '".$mainPageRec['uid']."', 'db', ".t3lib_div::quoteJSvalue($mainPageRec['title']).", '', '', '".$ficon."','',1);\">";
1915 $ATag2="<a href=\"#\" onclick=\"return insertElement('pages', '".$mainPageRec['uid']."', 'db', ".t3lib_div::quoteJSvalue($mainPageRec['title']).", '', '', '".$ficon."','',0);\">";
1916 $ATag_alt=substr($ATag,0,-4).",'',1);\">";
1917 $ATag_e='</a>';
1918 }
1919 $picon=t3lib_iconWorks::getSpriteIconForRecord('pages', $mainPageRec);
1920 $pBicon=$ATag2?'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' alt="" />':'';
1921 $pText=htmlspecialchars(t3lib_div::fixed_lgd_cs($mainPageRec['title'],$titleLen));
1922 $out.=$picon.$ATag2.$pBicon.$ATag_e.$ATag.$pText.$ATag_e.'<br />';
1923
1924 // Initialize the record listing:
1925 $id = $this->expandPage;
1926 $pointer = t3lib_div::intInRange($this->pointer,0,100000);
1927 $perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1);
1928 $pageinfo = t3lib_BEfunc::readPageAccess($id,$perms_clause);
1929 $table='';
1930
1931 // Generate the record list:
1932 $dblist = t3lib_div::makeInstance('TBE_browser_recordList');
1933 $dblist->thisScript=$this->thisScript;
1934 $dblist->backPath = $GLOBALS['BACK_PATH'];
1935 $dblist->thumbs = 0;
1936 $dblist->calcPerms = $GLOBALS['BE_USER']->calcPerms($pageinfo);
1937 $dblist->noControlPanels=1;
1938 $dblist->clickMenuEnabled=0;
1939 $dblist->tableList=implode(',',$tablesArr);
1940
1941 $dblist->start($id,t3lib_div::_GP('table'),$pointer,
1942 t3lib_div::_GP('search_field'),
1943 t3lib_div::_GP('search_levels'),
1944 t3lib_div::_GP('showLimit')
1945 );
1946 $dblist->setDispFields();
1947 $dblist->generateList();
1948 $dblist->writeBottom();
1949
1950 // Add the HTML for the record list to output variable:
1951 $out.=$dblist->HTMLcode;
1952
1953 // Add support for fieldselectbox in singleTableMode
1954 if ($dblist->table) {
1955 $out.= $dblist->fieldSelectBox($dblist->table);
1956 }
1957
1958 $out.=$dblist->getSearchBox();
1959 }
1960
1961 // Return accumulated content:
1962 return $out;
1963 }
1964
1965
1966 /**
1967 * Render list of folders inside a folder.
1968 *
1969 * @param string string of the current folder
1970 * @return string HTML output
1971 */
1972 function TBE_expandSubFolders($expandFolder=0) {
1973 $content = '';
1974
1975 $expandFolder = $expandFolder ?
1976 $expandFolder :
1977 $this->expandFolder;
1978
1979 if($expandFolder && $this->checkFolder($expandFolder)) {
1980 if(t3lib_div::isFirstPartOfStr($expandFolder, PATH_site)) {
1981 $rootFolder = substr($expandFolder, strlen(PATH_site));
1982 }
1983
1984 $folders = array();
1985
1986 // Listing the folders:
1987 $folders = t3lib_div::get_dirs($expandFolder);
1988 if(count($folders) > 0) {
1989 foreach($folders as $index => $folder) {
1990 $folders[$index] = $rootFolder.$folder.'/';
1991 }
1992 }
1993 $content.= $this->folderList($rootFolder, $folders);
1994 }
1995
1996 // Return accumulated content for folderlisting:
1997 return $content;
1998 }
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010 /******************************************************************
2011 *
2012 * File listing
2013 *
2014 ******************************************************************/
2015 /**
2016 * For RTE: This displays all files from folder. No thumbnails shown
2017 *
2018 * @param string The folder path to expand
2019 * @param string List of fileextensions to show
2020 * @return string HTML output
2021 */
2022 function expandFolder($expandFolder=0,$extensionList='') {
2023 global $BACK_PATH;
2024
2025 $expandFolder = $expandFolder ? $expandFolder : $this->expandFolder;
2026 $out='';
2027 if ($expandFolder && $this->checkFolder($expandFolder)) {
2028
2029 // Create header for filelisting:
2030 $out.=$this->barheader($GLOBALS['LANG']->getLL('files').':');
2031
2032 // Prepare current path value for comparison (showing red arrow)
2033 if (!$this->curUrlInfo['value']) {
2034 $cmpPath='';
2035 } else {
2036 $cmpPath=PATH_site.$this->curUrlInfo['info'];
2037 }
2038
2039
2040 // Create header element; The folder from which files are listed.
2041 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
2042 $picon='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/i/_icon_webfolders.gif','width="18" height="16"').' alt="" />';
2043 $picon.=htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($expandFolder),$titleLen));
2044 $picon='<a href="#" onclick="return link_folder(\''.t3lib_div::rawUrlEncodeFP(substr($expandFolder,strlen(PATH_site))).'\');">'.$picon.'</a>';
2045 if ($this->curUrlInfo['act'] == 'folder' && $cmpPath == $expandFolder) {
2046 $out.= '<img'.t3lib_iconWorks::skinImg($BACK_PATH, 'gfx/blinkarrow_left.gif', 'width="5" height="9"') . ' class="c-blinkArrowL" alt="" />';
2047 }
2048 $out.=$picon.'<br />';
2049
2050 // Get files from the folder:
2051 if ($this->mode == 'wizard' && $this->act == 'folder') {
2052 $files = t3lib_div::get_dirs($expandFolder);
2053 } else {
2054 $files = t3lib_div::getFilesInDir($expandFolder, $extensionList, 1, 1); // $extensionList='', $prependPath=0, $order='')
2055 }
2056
2057 $c=0;
2058 $cc=count($files);
2059 if (is_array($files)) {
2060 foreach($files as $filepath) {
2061 $c++;
2062 $fI=pathinfo($filepath);
2063
2064 if ($this->mode == 'wizard' && $this->act == 'folder') {
2065 $filepath = $expandFolder.$filepath.'/';
2066 $icon = '<img' . t3lib_iconWorks::skinImg($BACK_PATH, 'gfx/i/_icon_webfolders.gif', 'width="18" height="16"') . ' alt="" />';
2067 } else {
2068 // File icon:
2069 $icon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
2070
2071 // Get size and icon:
2072 $size = ' (' . t3lib_div::formatSize(filesize($filepath)) . 'bytes)';
2073 $icon = '<img' . t3lib_iconWorks::skinImg($BACK_PATH, 'gfx/fileicons/' . $icon . '', 'width="18" height="16"') . ' title="' . htmlspecialchars($fI['basename'] . $size) . '" alt="" />';
2074 }
2075
2076 // If the listed file turns out to be the CURRENT file, then show blinking arrow:
2077 if (($this->curUrlInfo['act'] == 'file' || $this->curUrlInfo['act'] == 'folder') && $cmpPath == $filepath) {
2078 $arrCol='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_left.gif','width="5" height="9"').' class="c-blinkArrowL" alt="" />';
2079 } else {
2080 $arrCol='';
2081 }
2082
2083 // Put it all together for the file element:
2084 $out.='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/join'.($c==$cc?'bottom':'').'.gif','width="18" height="16"').' alt="" />'.
2085 $arrCol.
2086 '<a href="#" onclick="return link_folder(\''.t3lib_div::rawUrlEncodeFP(substr($filepath,strlen(PATH_site))).'\');">'.
2087 $icon.
2088 htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen)).
2089 '</a><br />';
2090 }
2091 }
2092 }
2093 return $out;
2094 }
2095
2096 /**
2097 * For TYPO3 Element Browser: Expand folder of files.
2098 *
2099 * @param string The folder path to expand
2100 * @param string List of fileextensions to show
2101 * @param boolean Whether to show thumbnails or not. If set, no thumbnails are shown.
2102 * @return string HTML output
2103 */
2104 function TBE_expandFolder($expandFolder=0,$extensionList='',$noThumbs=0) {
2105 global $LANG;
2106
2107 $extensionList = ($extensionList == '*') ? '' : $extensionList;
2108 $expandFolder = $expandFolder ? $expandFolder : $this->expandFolder;
2109 $out='';
2110 if ($expandFolder && $this->checkFolder($expandFolder)) {
2111 // Listing the files:
2112 $files = t3lib_div::getFilesInDir($expandFolder,$extensionList,1,1); // $extensionList="",$prependPath=0,$order='')
2113 $out.= $this->fileList($files, $expandFolder, $noThumbs);
2114 }
2115
2116 // Return accumulated content for filelisting:
2117 return $out;
2118 }
2119
2120 /**
2121 * Render list of files.
2122 *
2123 * @param array List of files. See t3lib_div::getFilesInDir
2124 * @param string If set a header with a folder icon and folder name are shown
2125 * @param boolean Whether to show thumbnails or not. If set, no thumbnails are shown.
2126 * @return string HTML output
2127 */
2128 function fileList($files, $folderName='', $noThumbs=0) {
2129 global $LANG, $BACK_PATH;
2130
2131 $out='';
2132
2133 // Listing the files:
2134 if (is_array($files)) {
2135
2136 // Create headline (showing number of files):
2137 $filesCount = count($files);
2138 $out.=$this->barheader(sprintf($GLOBALS['LANG']->getLL('files').' (%s):', $filesCount));
2139 $out.=$this->getBulkSelector($filesCount);
2140
2141 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
2142
2143 // Create the header of current folder:
2144 if($folderName) {
2145 $picon='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/i/_icon_webfolders.gif','width="18" height="16"').' alt="" />';
2146 $picon.=htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($folderName),$titleLen));
2147 $out.=$picon.'<br />';
2148 }
2149
2150 // Init graphic object for reading file dimensions:
2151 $imgObj = t3lib_div::makeInstance('t3lib_stdGraphic');
2152 $imgObj->init();
2153 $imgObj->mayScaleUp=0;
2154 $imgObj->tempPath=PATH_site.$imgObj->tempPath;
2155
2156 // Traverse the file list:
2157 $lines=array();
2158 foreach($files as $filepath) {
2159 $fI=pathinfo($filepath);
2160
2161 // Thumbnail/size generation:
2162 if (t3lib_div::inList(strtolower($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']),strtolower($fI['extension'])) && !$noThumbs) {
2163 $imgInfo = $imgObj->getImageDimensions($filepath);
2164 $pDim = $imgInfo[0].'x'.$imgInfo[1].' pixels';
2165 $clickIcon = t3lib_BEfunc::getThumbNail($BACK_PATH.'thumbs.php',$filepath,'hspace="5" vspace="5" border="1"');
2166 } else {
2167 $clickIcon = '';
2168 $pDim = '';
2169 }
2170
2171 // Create file icon:
2172 $ficon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
2173 $size=' ('.t3lib_div::formatSize(filesize($filepath)).'bytes'.($pDim?', '.$pDim:'').')';
2174 $icon = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/fileicons/'.$ficon,'width="18" height="16"').' title="'.htmlspecialchars($fI['basename'].$size).'" class="absmiddle" alt="" />';
2175
2176 // Create links for adding the file:
2177 if (strstr($filepath,',') || strstr($filepath,'|')) { // In case an invalid character is in the filepath, display error message:
2178 $eMsg = $LANG->JScharCode(sprintf($LANG->getLL('invalidChar'),', |'));
2179 $ATag = $ATag_alt = "<a href=\"#\" onclick=\"alert(".$eMsg.");return false;\">";
2180 $bulkCheckBox = '';
2181 } else { // If filename is OK, just add it:
2182 $filesIndex = count($this->elements);
2183 $this->elements['file_'.$filesIndex] = array(
2184 'md5' => t3lib_div::shortMD5($filepath),
2185 'type' => 'file',
2186 'fileName' => $fI['basename'],
2187 'filePath' => $filepath,
2188 'fileExt' => $fI['extension'],
2189 'fileIcon' => $ficon,
2190 );
2191 $ATag = "<a href=\"#\" onclick=\"return BrowseLinks.File.insertElement('file_$filesIndex');\">";
2192 $ATag_alt = substr($ATag,0,-4).",1);\">";
2193 $bulkCheckBox = '<input type="checkbox" class="typo3-bulk-item" name="file_'.$filesIndex.'" value="0" /> ';
2194 }
2195 $ATag_e='</a>';
2196
2197 // Create link to showing details about the file in a window:
2198 $Ahref = $BACK_PATH.'show_item.php?table='.rawurlencode($filepath).'&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'));
2199 $ATag2='<a href="'.htmlspecialchars($Ahref).'">';
2200 $ATag2_e='</a>';
2201
2202 // Combine the stuff:
2203 $filenameAndIcon=$bulkCheckBox.$ATag_alt.$icon.htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen)).$ATag_e;
2204
2205 // Show element:
2206 if ($pDim) { // Image...
2207 $lines[]='
2208 <tr class="bgColor4">
2209 <td nowrap="nowrap">'.$filenameAndIcon.'&nbsp;</td>
2210 <td>'.$ATag.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$LANG->getLL('addToList',1).'" alt="" />'.$ATag_e.'</td>
2211 <td nowrap="nowrap">'.($ATag2.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/zoom2.gif','width="12" height="12"').' title="'.$LANG->getLL('info',1).'" alt="" /> '.$LANG->getLL('info',1).$ATag2_e).'</td>
2212 <td nowrap="nowrap">&nbsp;'.$pDim.'</td>
2213 </tr>';
2214 $lines[]='
2215 <tr>
2216 <td colspan="4">'.$ATag_alt.$clickIcon.$ATag_e.'</td>
2217 </tr>';
2218 } else {
2219 $lines[]='
2220 <tr class="bgColor4">
2221 <td nowrap="nowrap">'.$filenameAndIcon.'&nbsp;</td>
2222 <td>'.$ATag.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$LANG->getLL('addToList',1).'" alt="" />'.$ATag_e.'</td>
2223 <td nowrap="nowrap">'.($ATag2.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/zoom2.gif','width="12" height="12"').' title="'.$LANG->getLL('info',1).'" alt="" /> '.$LANG->getLL('info',1).$ATag2_e).'</td>
2224 <td>&nbsp;</td>
2225 </tr>';
2226 }
2227 $lines[]='
2228 <tr>
2229 <td colspan="3"><img src="clear.gif" width="1" height="3" alt="" /></td>
2230 </tr>';
2231 }
2232
2233 // Wrap all the rows in table tags:
2234 $out.='
2235
2236
2237
2238 <!--
2239 File listing
2240 -->
2241 <table cellpadding="0" cellspacing="0" id="typo3-fileList">
2242 '.implode('',$lines).'
2243 </table>';
2244 }
2245 // Return accumulated content for filelisting:
2246 return $out;
2247 }
2248
2249 /**
2250 * Render list of folders.
2251 *
2252 * @param array List of folders. See t3lib_div::get_dirs
2253 * @param string If set a header with a folder icon and folder name are shown
2254 * @return string HTML output
2255 */
2256 function folderList($baseFolder, $folders) {
2257 global $LANG, $BACK_PATH;
2258
2259 $content = '';
2260
2261 // Create headline (showing number of folders):
2262 $content.=$this->barheader(
2263 sprintf($GLOBALS['LANG']->getLL('folders').' (%s):',count($folders))
2264 );
2265
2266 $titleLength = intval($GLOBALS['BE_USER']->uc['titleLen']);
2267
2268 // Create the header of current folder:
2269 if($baseFolder) {
2270 if (strstr($baseFolder, ',') || strstr($baseFolder, '|')) {
2271 // In case an invalid character is in the filepath, display error message:
2272 $errorMessage = $LANG->JScharCode(sprintf($LANG->getLL('invalidChar'),', |'));
2273 $aTag = $aTag_alt = "<a href=\"#\" onclick=\"alert(".$errorMessage.");return false;\">";
2274 } else {
2275 // If foldername is OK, just add it:
2276 $aTag = "<a href=\"#\" onclick=\"return insertElement('','".rawurlencode($baseFolder)."', 'folder', '".rawurlencode($baseFolder)."', unescape('".rawurlencode($baseFolder)."'), '".$fI['extension']."', '".$ficon."');\">";
2277 $aTag_alt = substr($aTag,0,-4).",'',1);\">";
2278 }
2279 $aTag_e = '</a>';
2280
2281 // add the foder icon
2282 $folderIcon = $aTag_alt;
2283 $folderIcon.= '<img'.t3lib_iconWorks::skinImg(
2284 $BACK_PATH,
2285 'gfx/i/_icon_webfolders.gif','width="18" height="16"'
2286 ).' alt="" />';
2287 $folderIcon.= htmlspecialchars(
2288 t3lib_div::fixed_lgd_cs(basename($baseFolder),$titleLength)
2289 );
2290 $folderIcon.= $aTag_e;
2291
2292 $content.=$folderIcon.'<br />';
2293 }
2294
2295 // Listing the folders:
2296 if(is_array($folders)) {
2297 if(count($folders) > 0) {
2298 // Traverse the folder list:
2299 $lines = array();
2300 foreach($folders as $folderPath) {
2301 $pathInfo = pathinfo($folderPath);
2302
2303 // Create folder icon:
2304 $icon = '<img src="clear.gif" width="16" height="16" alt="" /><img'.t3lib_iconWorks::skinImg($BACK_PATH, 'gfx/i/_icon_webfolders.gif','width="16" height="16"').' title="'.htmlspecialchars($pathInfo['basename'].$size).'" class="absmiddle" alt="" />';
2305
2306 // Create links for adding the folder:
2307 if($this->P['itemName'] != '' && $this->P['formName'] != '') {
2308 $aTag = "<a href=\"#\" onclick=\"return set_folderpath(unescape('".rawurlencode($folderPath)."'));\">";
2309 } else {
2310 $aTag = "<a href=\"#\" onclick=\"return insertElement('','".rawurlencode($folderPath)."', 'folder', '".rawurlencode($folderPath)."', unescape('".rawurlencode($folderPath)."'), '".$pathInfo['extension']."', '".$ficon."');\">";
2311 }
2312
2313 if (strstr($folderPath,',') || strstr($folderPath,'|')) {
2314 // In case an invalid character is in the filepath, display error message:
2315 $errorMessage = $LANG->JScharCode(sprintf($LANG->getLL('invalidChar'),', |'));
2316 $aTag = $aTag_alt = "<a href=\"#\" onclick=\"alert(".$errorMessage.");return false;\">";
2317 } else {
2318 // If foldername is OK, just add it:
2319 $aTag_alt = substr($aTag,0,-4).",'',1);\">";
2320 }
2321 $aTag_e='</a>';
2322
2323 // Combine icon and folderpath:
2324 $foldernameAndIcon = $aTag_alt.$icon.htmlspecialchars(
2325 t3lib_div::fixed_lgd_cs(basename($folderPath),$titleLength)
2326 ).$aTag_e;
2327
2328 if($this->P['itemName'] != '') {
2329 $lines[] = '
2330 <tr class="bgColor4">
2331 <td nowrap="nowrap">'.$foldernameAndIcon.'&nbsp;</td>
2332 <td>&nbsp;</td>
2333 </tr>';
2334 } else {
2335 $lines[] = '
2336 <tr class="bgColor4">
2337 <td nowrap="nowrap">'.$foldernameAndIcon.'&nbsp;</td>
2338 <td>'.$aTag.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$LANG->getLL('addToList',1).'" alt="" />'.$aTag_e.'</td>
2339 <td>&nbsp;</td>
2340 </tr>';
2341 }
2342
2343 $lines[] = '
2344 <tr>
2345 <td colspan="3"><img src="clear.gif" width="1" height="3" alt="" /></td>
2346 </tr>';
2347 }
2348 }
2349
2350 // Wrap all the rows in table tags:
2351 $content.='
2352
2353 <!--
2354 Folder listing
2355 -->
2356 <table border="0" cellpadding="0" cellspacing="1" id="typo3-folderList">
2357 '.implode('', $lines).'
2358 </table>';
2359 }
2360
2361 // Return accumulated content for folderlisting:
2362 return $content;
2363 }
2364
2365 /**
2366 * For RTE: This displays all IMAGES (gif,png,jpg) (from extensionList) from folder. Thumbnails are shown for images.
2367 * This listing is of images located in the web-accessible paths ONLY - the listing is for drag-n-drop use in the RTE
2368 *
2369 * @param string The folder path to expand
2370 * @param string List of fileextensions to show
2371 * @return string HTML output
2372 */
2373 function TBE_dragNDrop($expandFolder=0,$extensionList='') {
2374 global $BACK_PATH;
2375
2376 $extensionList = ($extensionList == '*') ? '' : $extensionList;
2377 $expandFolder = $expandFolder ? $expandFolder : $this->expandFolder;
2378 $out='';
2379 if ($expandFolder && $this->checkFolder($expandFolder)) {
2380 if ($this->isWebFolder($expandFolder)) {
2381
2382 // Read files from directory:
2383 $files = t3lib_div::getFilesInDir($expandFolder,$extensionList,1,1); // $extensionList="",$prependPath=0,$order='')
2384 if (is_array($files)) {
2385 $out.=$this->barheader(sprintf($GLOBALS['LANG']->getLL('files').' (%s):',count($files)));
2386
2387 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
2388 $picon='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/i/_icon_webfolders.gif','width="18" height="16"').' alt="" />';
2389 $picon.=htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($expandFolder),$titleLen));
2390 $out.=$picon.'<br />';
2391
2392 // Init row-array:
2393 $lines=array();
2394
2395 // Add "drag-n-drop" message:
2396 $lines[]='
2397 <tr>
2398 <td colspan="2">'.$this->getMsgBox($GLOBALS['LANG']->getLL('findDragDrop')).'</td>
2399 </tr>';
2400
2401 // Traverse files:
2402 foreach ($files as $filepath) {
2403 $fI = pathinfo($filepath);
2404
2405 // URL of image:
2406 $iurl = $this->siteURL.t3lib_div::rawurlencodeFP(substr($filepath,strlen(PATH_site)));
2407
2408 // Show only web-images
2409 if (t3lib_div::inList('gif,jpeg,jpg,png',strtolower($fI['extension']))) {
2410 $imgInfo = @getimagesize($filepath);
2411 $pDim = $imgInfo[0].'x'.$imgInfo[1].' pixels';
2412
2413 $ficon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
2414 $size=' ('.t3lib_div::formatSize(filesize($filepath)).'bytes'.($pDim?', '.$pDim:'').')';
2415 $icon = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/fileicons/'.$ficon,'width="18" height="16"').' class="absmiddle" title="'.htmlspecialchars($fI['basename'].$size).'" alt="" />';
2416 $filenameAndIcon=$icon.htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen));
2417
2418 if (t3lib_div::_GP('noLimit')) {
2419 $maxW=10000;
2420 $maxH=10000;
2421 } else {
2422 $maxW=380;
2423 $maxH=500;
2424 }
2425 $IW = $imgInfo[0];
2426 $IH = $imgInfo[1];
2427 if ($IW>$maxW) {
2428 $IH=ceil($IH/$IW*$maxW);
2429 $IW=$maxW;
2430 }
2431 if ($IH>$maxH) {
2432 $IW=ceil($IW/$IH*$maxH);
2433 $IH=$maxH;
2434 }
2435
2436 // Make row:
2437 $lines[]='
2438 <tr class="bgColor4">
2439 <td nowrap="nowrap">'.$filenameAndIcon.'&nbsp;</td>
2440 <td nowrap="nowrap">'.
2441 ($imgInfo[0]!=$IW ? '<a href="'.htmlspecialchars(t3lib_div::linkThisScript(array('noLimit'=>'1'))).'">'.
2442 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/icon_warning2.gif','width="18" height="16"').' title="'.$GLOBALS['LANG']->getLL('clickToRedrawFullSize',1).'" alt="" />'.
2443 '</a>':'').
2444 $pDim.'&nbsp;</td>
2445 </tr>';
2446
2447 $lines[]='
2448 <tr>
2449 <td colspan="2"><img src="'.$iurl.'" width="'.$IW.'" height="'.$IH.'" border="1" alt="" /></td>
2450 </tr>';
2451 $lines[]='
2452 <tr>
2453 <td colspan="2"><img src="clear.gif" width="1" height="3" alt="" /></td>
2454 </tr>';
2455 }
2456 }
2457
2458 // Finally, wrap all rows in a table tag:
2459 $out.='
2460
2461
2462 <!--
2463 File listing / Drag-n-drop
2464 -->
2465 <table border="0" cellpadding="0" cellspacing="1" id="typo3-dragBox">
2466 '.implode('',$lines).'
2467 </table>';
2468 }
2469 } else {
2470 // Print this warning if the folder is NOT a web folder:
2471 $out.=$this->barheader($GLOBALS['LANG']->getLL('files'));
2472 $out.=$this->getMsgBox($GLOBALS['LANG']->getLL('noWebFolder'),'icon_warning2');
2473 }
2474 }
2475 return $out;
2476 }
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489 /******************************************************************
2490 *
2491 * Miscellaneous functions
2492 *
2493 ******************************************************************/
2494
2495
2496 /**
2497 * Verifies that a path is a web-folder:
2498 *
2499 * @param string Absolute filepath
2500 * @return boolean If the input path is found in PATH_site then it returns true.
2501 */
2502 function isWebFolder($folder) {
2503 $folder = rtrim($folder, '/').'/';
2504 return t3lib_div::isFirstPartOfStr($folder,PATH_site) ? TRUE : FALSE;
2505 }
2506
2507 /**
2508 * Checks, if a path is within the mountpoints of the backend user
2509 *
2510 * @param string Absolute filepath
2511 * @return boolean If the input path is found in the backend users filemounts, then return true.
2512 */
2513 function checkFolder($folder) {
2514 return $this->fileProcessor->checkPathAgainstMounts(rtrim($folder, '/') . '/') ? true : false;
2515 }
2516
2517 /**
2518 * Checks, if a path is within a read-only mountpoint of the backend user
2519 *
2520 * @param string Absolute filepath
2521 * @return boolean If the input path is found in the backend users filemounts and if the filemount is of type readonly, then return true.
2522 */
2523 function isReadOnlyFolder($folder) {
2524 return ($GLOBALS['FILEMOUNTS'][$this->fileProcessor->checkPathAgainstMounts(rtrim($folder, '/') . '/')]['type'] == 'readonly');
2525 }
2526
2527 /**
2528 * Prints a 'header' where string is in a tablecell
2529 *
2530 * @param string The string to print in the header. The value is htmlspecialchars()'ed before output.
2531 * @return string The header HTML (wrapped in a table)
2532 */
2533 function barheader($str) {
2534 return '
2535 <!-- Bar header: -->
2536 <h3>' . htmlspecialchars($str) . '</h3>
2537 ';
2538 }
2539
2540 /**
2541 * Displays a message box with the input message
2542 *
2543 * @param string Input message to show (will be htmlspecialchars()'ed inside of this function)
2544 * @param string Icon filename body from gfx/ (default is "icon_note") - meant to allow change to warning type icons...
2545 * @return string HTML for the message (wrapped in a table).
2546 */
2547 function getMsgBox($in_msg,$icon='icon_note') {
2548 global $BACK_PATH;
2549
2550 $msg = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/'.$icon.'.gif','width="18" height="16"').' alt="" />'.htmlspecialchars($in_msg);
2551 $msg = '
2552
2553 <!--
2554 Message box:
2555 -->
2556 <table cellspacing="0" class="bgColor4" id="typo3-msgBox">
2557 <tr>
2558 <td>'.$msg.'</td>
2559 </tr>
2560 </table>
2561 ';
2562 return $msg;
2563 }
2564
2565 /**
2566 * For RTE/link: This prints the 'currentUrl'
2567 *
2568 * @param string URL value. The value is htmlspecialchars()'ed before output.
2569 * @return string HTML content, wrapped in a table.
2570 */
2571 function printCurrentUrl($str) {
2572 if (strlen($str)) {
2573 return '
2574 <!-- Print current URL -->
2575 <table border="0" cellpadding="0" cellspacing="0" id="typo3-curUrl">
2576 <tr>
2577 <td>' . $GLOBALS['LANG']->getLL('currentLink',1) . ': ' .htmlspecialchars(rawurldecode($str)) . '</td>
2578 </tr>
2579 </table>';
2580 } else {
2581 return '';
2582 }
2583 }
2584
2585 /**
2586 * For RTE/link: Parses the incoming URL and determines if it's a page, file, external or mail address.
2587 *
2588 * @param string HREF value tp analyse
2589 * @param string The URL of the current website (frontend)
2590 * @return array Array with URL information stored in assoc. keys: value, act (page, file, spec, mail), pageid, cElement, info
2591 */
2592 function parseCurUrl($href,$siteUrl) {
2593 $href = trim($href);
2594 if ($href) {
2595 $info=array();
2596
2597 // Default is "url":
2598 $info['value']=$href;
2599 $info['act']='url';
2600
2601 $specialParts = explode('#_SPECIAL',$href);
2602 if (count($specialParts)==2) { // Special kind (Something RTE specific: User configurable links through: "userLinks." from ->thisConfig)
2603 $info['value']='#_SPECIAL'.$specialParts[1];
2604 $info['act']='spec';
2605 } elseif (t3lib_div::isFirstPartOfStr($href,$siteUrl)) { // If URL is on the current frontend website:
2606 $rel = substr($href,strlen($siteUrl));
2607 if (file_exists(PATH_site.rawurldecode($rel))) { // URL is a file, which exists:
2608 $info['value']=rawurldecode($rel);
2609 if (@is_dir(PATH_site . $info['value'])) {
2610 $info['act'] = 'folder';
2611 } else {
2612 $info['act'] = 'file';
2613 }
2614 } else { // URL is a page (id parameter)
2615 $uP=parse_url($rel);
2616 if (!trim($uP['path'])) {
2617 $pp = preg_split('/^id=/', $uP['query']);
2618 $pp[1] = preg_replace( '/&id=[^&]*/', '', $pp[1]);
2619 $parameters = explode('&', $pp[1]);
2620 $id = array_shift($parameters);
2621 if ($id) {
2622 // Checking if the id-parameter is an alias.
2623 if (!t3lib_div::testInt($id)) {
2624 list($idPartR) = t3lib_BEfunc::getRecordsByField('pages','alias',$id);
2625 $id=intval($idPartR['uid']);
2626 }
2627
2628 $pageRow = t3lib_BEfunc::getRecordWSOL('pages',$id);
2629 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
2630 $info['value']=$GLOBALS['LANG']->getLL('page',1)." '".htmlspecialchars(t3lib_div::fixed_lgd_cs($pageRow['title'],$titleLen))."' (ID:".$id.($uP['fragment']?', #'.$uP['fragment']:'').')';
2631 $info['pageid']=$id;
2632 $info['cElement']=$uP['fragment'];
2633 $info['act']='page';
2634 $info['query'] = $parameters[0]?'&'.implode('&', $parameters):'';
2635 }
2636 }
2637 }
2638 } else { // Email link:
2639 if (strtolower(substr($href,0,7))=='mailto:') {
2640 $info['value']=trim(substr($href,7));
2641 $info['act']='mail';
2642 }
2643 }
2644 $info['info'] = $info['value'];
2645 } else { // NO value inputted:
2646 $info=array();
2647 $info['info']=$GLOBALS['LANG']->getLL('none');
2648 $info['value']='';
2649 $info['act']='page';
2650 }
2651
2652 // let the hook have a look
2653 foreach($this->hookObjects as $hookObject) {
2654 $info = $hookObject->parseCurrentUrl($href, $siteUrl, $info);
2655 }
2656
2657 return $info;
2658 }
2659
2660 /**
2661 * For TBE: Makes an upload form for uploading files to the filemount the user is browsing.
2662 * The files are uploaded to the tce_file.php script in the core which will handle the upload.
2663 *
2664 * @param string Absolute filepath on server to which to upload.
2665 * @return string HTML for an upload form.
2666 */
2667 function uploadForm($path) {
2668 global $BACK_PATH;
2669
2670 if ($this->isReadOnlyFolder($path)) return '';
2671
2672 // Read configuration of upload field count
2673 $userSetting = $GLOBALS['BE_USER']->getTSConfigVal('options.folderTree.uploadFieldsInLinkBrowser');
2674 $count = isset($userSetting) ? $userSetting : 3;
2675 if ($count === '0') {
2676 return '';
2677 }
2678 $count = intval($count) == 0 ? 3 : intval($count);
2679
2680 // Create header, showing upload path:
2681 $header = t3lib_div::isFirstPartOfStr($path,PATH_site)?substr($path,strlen(PATH_site)):$path;
2682 $code=$this->barheader($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_upload.php.pagetitle',1).':');
2683 $code.='
2684
2685 <!--
2686 Form, for uploading files:
2687 -->
2688 <form action="'.$BACK_PATH.'tce_file.php" method="post" name="editform" enctype="'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'].'">
2689 <table border="0" cellpadding="0" cellspacing="3" id="typo3-uplFiles">
2690 <tr>
2691 <td><strong>'.$GLOBALS['LANG']->getLL('path',1).':</strong> '.htmlspecialchars($header).'</td>
2692 </tr>
2693 <tr>
2694 <td>';
2695
2696 // Traverse the number of upload fields (default is 3):
2697 for ($a=1;$a<=$count;$a++) {
2698 $code.='<input type="file" name="upload_'.$a.'"'.$this->doc->formWidth(35).' size="50" />
2699 <input type="hidden" name="file[upload]['.$a.'][target]" value="'.htmlspecialchars($path).'" />
2700 <input type="hidden" name="file[upload]['.$a.'][data]" value="'.$a.'" /><br />';
2701 }
2702
2703 // Make footer of upload form, including the submit button:
2704 $redirectValue = $this->thisScript.'?act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
2705 $code.='<input type="hidden" name="redirect" value="'.htmlspecialchars($redirectValue).'" />'.
2706 '<input type="submit" name="submit" value="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_upload.php.submit',1).'" />';
2707
2708 $code.='
2709 <div id="c-override">
2710 <input type="checkbox" name="overwriteExistingFiles" id="overwriteExistingFiles" value="1" /> <label for="overwriteExistingFiles">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_misc.xml:overwriteExistingFiles',1).'</label>
2711 </div>
2712 ';
2713
2714
2715 $code.='</td>
2716 </tr>
2717 </table>
2718 </form>';
2719
2720 return $code;
2721 }
2722
2723 /**
2724 * For TBE: Makes a form for creating new folders in the filemount the user is browsing.
2725 * The folder creation request is sent to the tce_file.php script in the core which will handle the creation.
2726 *
2727 * @param string Absolute filepath on server in which to create the new folder.
2728 * @return string HTML for the create folder form.
2729 */
2730 function createFolder($path) {
2731 global $BACK_PATH;
2732
2733 if ($this->isReadOnlyFolder($path)) return '';
2734
2735 // Don't show Folder-create form if it's denied
2736 if ($GLOBALS['BE_USER']->getTSConfigVal('options.folderTree.hideCreateFolder')) {
2737 return '';
2738 }
2739 // Create header, showing upload path:
2740 $header = t3lib_div::isFirstPartOfStr($path,PATH_site)?substr($path,strlen(PATH_site)):$path;
2741 $code=$this->barheader($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_newfolder.php.pagetitle').':');
2742 $code.='
2743
2744 <!--
2745 Form, for creating new folders:
2746 -->
2747 <form action="'.$BACK_PATH.'tce_file.php" method="post" name="editform2">
2748 <table border="0" cellpadding="0" cellspacing="3" id="typo3-crFolder">
2749 <tr>
2750 <td><strong>'.$GLOBALS['LANG']->getLL('path',1).':</strong> '.htmlspecialchars($header).'</td>
2751 </tr>
2752 <tr>
2753 <td>';
2754
2755 // Create the new-folder name field:
2756 $a=1;
2757 $code.='<input'.$this->doc->formWidth(20).' type="text" name="file[newfolder]['.$a.'][data]" />'.
2758 '<input type="hidden" name="file[newfolder]['.$a.'][target]" value="'.htmlspecialchars($path).'" />';
2759
2760 // Make footer of upload form, including the submit button:
2761 $redirectValue = $this->thisScript.'?act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
2762 $code.='<input type="hidden" name="redirect" value="'.htmlspecialchars($redirectValue).'" />'.
2763 '<input type="submit" name="submit" value="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_newfolder.php.submit',1).'" />';
2764
2765 $code.='</td>
2766 </tr>
2767 </table>
2768 </form>';
2769
2770 return $code;
2771 }
2772
2773 /**
2774 * Get the HTML data required for a bulk selection of files of the TYPO3 Element Browser.
2775 *
2776 * @param integer $filesCount: Number of files currently displayed
2777 * @return string HTML data required for a bulk selection of files - if $filesCount is 0, nothing is returned
2778 */
2779 function getBulkSelector($filesCount) {
2780 if ($filesCount) {
2781 $labelToggleSelection = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_browse_links.php:toggleSelection',1);
2782 $labelImportSelection = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_browse_links.php:importSelection',1);
2783
2784 $out = $this->doc->spacer(15).'<div>' .
2785 '<a href="#" onclick="BrowseLinks.Selector.toggle()">' .
2786 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/clip_select.gif','width="12" height="12"').' title="'.$labelToggleSelection.'" alt="" /> ' .
2787 $labelToggleSelection.'</a>'.$this->doc->spacer(5) .
2788 '<a href="#" onclick="BrowseLinks.Selector.handle()">' .
2789 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/import.gif','width="12" height="12"').' title="'.$labelImportSelection.'" alt="" /> ' .
2790 $labelImportSelection.'</a>' .
2791 '</div>'.$this->doc->spacer(15);
2792 }
2793 return $out;
2794 }
2795 }
2796
2797
2798 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.browse_links.php']) {
2799 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.browse_links.php']);
2800 }
2801
2802 ?>