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