Added feature #4923: provide new inputfield "directorypicker" in BE, credits Andreas...
[Packages/TYPO3.CMS.git] / typo3 / class.browse_links.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2007 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' && $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 $setTitle; // title (RTE specific)
665 var $doc; // Backend template object
666 var $elements = array(); // Holds information about files
667
668 // GPvars: (Input variables from outside)
669 /**
670 * The mode determines the main kind of output from the element browser.
671 * There are these options for values: rte, db, file, filedrag, wizard.
672 * "rte" will show the link selector for the Rich Text Editor (see main_rte())
673 * "db" will allow you to browse for pages or records in the page tree (for TCEforms, see main_db())
674 * "file"/"filedrag" will allow you to browse for files or folders in the folder mounts (for TCEforms, main_file())
675 * "wizard" will allow you to browse for links (like "rte") which are passed back to TCEforms (see main_rte(1))
676 *
677 * @see main()
678 */
679 var $mode;
680
681 /**
682 * Link selector action.
683 * page,file,url,mail,spec are allowed values.
684 * These are only important with the link selector function and in that case they switch between the various menu options.
685 */
686 var $act;
687
688 /**
689 * 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")
690 */
691 var $expandPage;
692
693 /**
694 * 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/"
695 */
696 var $expandFolder;
697
698
699
700 /**
701 * TYPO3 Element Browser, wizard mode parameters. There is a heap of parameters there, better debug() them out if you need something... :-)
702 */
703 var $P;
704
705 /**
706 * 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.
707 * Example value: "data[pages][39][bodytext]|||tt_content|" or "data[tt_content][NEW3fba56fde763d][image]|||gif,jpg,jpeg,tif,bmp,pcx,tga,png,pdf,ai|"
708 *
709 * Values:
710 * 0: form field name reference, eg. "data[tt_content][123][image]"
711 * 1: old/unused?
712 * 2: old/unused?
713 * 3: allowed types. Eg. "tt_content" or "gif,jpg,jpeg,tif,bmp,pcx,tga,png,pdf,ai"
714 * 4: IRRE uniqueness: target level object-id to perform actions/checks on, eg. "data[79][tt_address][1][<field>][<foreign_table>]"
715 * 5: IRRE uniqueness: name of function in opener window that checks if element is already used, eg. "inline.checkUniqueElement"
716 * 6: IRRE uniqueness: name of function in opener window that performs some additional(!) action, eg. "inline.setUniqueElement"
717 * 7: IRRE uniqueness: name of function in opener window that performs action instead of using addElement/insertElement, eg. "inline.importElement"
718 *
719 * $pArr = explode('|',$this->bparams);
720 * $formFieldName = $pArr[0];
721 * $allowedTablesOrFileTypes = $pArr[3];
722 */
723 var $bparams;
724
725 /**
726 * Used with the Rich Text Editor.
727 * Example value: "tt_content:NEW3fba58c969f5c:bodytext:23:text:23:"
728 */
729 var $RTEtsConfigParams;
730
731
732
733
734 /**
735 * Plus/Minus icon value. Used by the tree class to open/close notes on the trees.
736 */
737 var $PM;
738
739 /**
740 * Pointer, used when browsing a long list of records etc.
741 */
742 var $pointer;
743
744
745
746
747 /**
748 * 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.
749 */
750 var $curUrlArray;
751
752 /**
753 * 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.
754 */
755 var $curUrlInfo;
756
757 /**
758 * array which holds hook objects (initialised in init() )
759 */
760 protected $hookObjects;
761
762
763 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).
764
765
766 /**
767 * Constructor:
768 * Initializes a lot of variables, setting JavaScript functions in header etc.
769 *
770 * @return void
771 */
772 function init() {
773 global $BE_USER,$BACK_PATH;
774
775 // Main GPvars:
776 $this->pointer = t3lib_div::_GP('pointer');
777 $this->bparams = t3lib_div::_GP('bparams');
778 $this->P = t3lib_div::_GP('P');
779 $this->RTEtsConfigParams = t3lib_div::_GP('RTEtsConfigParams');
780 $this->expandPage = t3lib_div::_GP('expandPage');
781 $this->expandFolder = t3lib_div::_GP('expandFolder');
782 $this->PM = t3lib_div::_GP('PM');
783
784 // Find "mode"
785 $this->mode = t3lib_div::_GP('mode');
786 if (!$this->mode) {
787 $this->mode = 'rte';
788 }
789
790 // init hook objects:
791 $this->hookObjects = array();
792 if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/class.browse_links.php']['browseLinksHook'])) {
793 foreach($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/class.browse_links.php']['browseLinksHook'] as $classData) {
794 $processObject = &t3lib_div::getUserObj($classData);
795
796 if(!($processObject instanceof t3lib_browseLinksHook)) {
797 throw new UnexpectedValueException('$processObject must implement interface t3lib_browseLinksHook', 1195039394);
798 }
799
800 $parameters = array();
801 $processObject->init($this, $parameters);
802 $this->hookObjects[] = $processObject;
803 }
804 }
805
806 // Site URL
807 $this->siteURL = t3lib_div::getIndpEnv('TYPO3_SITE_URL'); // Current site url
808
809 // the script to link to
810 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
811
812 // CurrentUrl - the current link url must be passed around if it exists
813 if ($this->mode == 'wizard') {
814 $currentLinkParts = t3lib_div::trimExplode(' ',$this->P['currentValue']);
815 $this->curUrlArray = array(
816 'target' => $currentLinkParts[1]
817 );
818 $this->curUrlInfo=$this->parseCurUrl($this->siteURL.'?id='.$currentLinkParts[0],$this->siteURL);
819 } else {
820 $this->curUrlArray = t3lib_div::_GP('curUrl');
821 if ($this->curUrlArray['all']) {
822 $this->curUrlArray=t3lib_div::get_tag_attributes($this->curUrlArray['all']);
823 }
824 $this->curUrlInfo=$this->parseCurUrl($this->curUrlArray['href'],$this->siteURL);
825 }
826
827 // Determine nature of current url:
828 $this->act=t3lib_div::_GP('act');
829 if (!$this->act) {
830 $this->act=$this->curUrlInfo['act'];
831 }
832
833 // Rich Text Editor specific configuration:
834 $addPassOnParams='';
835 if ((string)$this->mode == 'rte') {
836 $RTEtsConfigParts = explode(':',$this->RTEtsConfigParams);
837 $addPassOnParams.='&RTEtsConfigParams='.rawurlencode($this->RTEtsConfigParams);
838 $RTEsetup = $GLOBALS['BE_USER']->getTSConfig('RTE',t3lib_BEfunc::getPagesTSconfig($RTEtsConfigParts[5]));
839 $this->thisConfig = t3lib_BEfunc::RTEsetup($RTEsetup['properties'],$RTEtsConfigParts[0],$RTEtsConfigParts[2],$RTEtsConfigParts[4]);
840 }
841
842 // Initializing the target value (RTE)
843 $this->setTarget = $this->curUrlArray['target'];
844 if ($this->thisConfig['defaultLinkTarget'] && !isset($this->curUrlArray['target'])) {
845 $this->setTarget=$this->thisConfig['defaultLinkTarget'];
846 }
847
848 // Initializing the title value (RTE)
849 $this->setTitle = $this->curUrlArray['title'];
850
851
852
853 // Creating backend template object:
854 $this->doc = t3lib_div::makeInstance('template');
855 $this->doc->docType= 'xhtml_trans';
856 $this->doc->backPath = $BACK_PATH;
857
858 // BEGIN accumulation of header JavaScript:
859 $JScode = '';
860 $JScode.= '
861 // This JavaScript is primarily for RTE/Link. jumpToUrl is used in the other cases as well...
862 var add_href="'.($this->curUrlArray['href']?'&curUrl[href]='.rawurlencode($this->curUrlArray['href']):'').'";
863 var add_target="'.($this->setTarget?'&curUrl[target]='.rawurlencode($this->setTarget):'').'";
864 var add_title="'.($this->setTitle?'&curUrl[title]='.rawurlencode($this->setTitle):'').'";
865 var add_params="'.($this->bparams?'&bparams='.rawurlencode($this->bparams):'').'";
866
867 var cur_href="'.($this->curUrlArray['href']?$this->curUrlArray['href']:'').'";
868 var cur_target="'.($this->setTarget?$this->setTarget:'').'";
869 var cur_title="'.($this->setTitle?$this->setTitle:'').'";
870
871 function setTarget(target) { //
872 cur_target=target;
873 add_target="&curUrl[target]="+escape(target);
874 }
875 function setTitle(title) { //
876 cur_title=title;
877 add_title="&curUrl[title]="+escape(title);
878 }
879 function setValue(value) { //
880 cur_href=value;
881 add_href="&curUrl[href]="+value;
882 }
883 ';
884
885 if ($this->mode == 'wizard') { // Functions used, if the link selector is in wizard mode (= TCEforms fields)
886 unset($this->P['fieldChangeFunc']['alert']);
887 reset($this->P['fieldChangeFunc']);
888 $update='';
889 while(list($k,$v)=each($this->P['fieldChangeFunc'])) {
890 $update.= '
891 window.opener.'.$v;
892 }
893
894 $P2=array();
895 $P2['itemName']=$this->P['itemName'];
896 $P2['formName']=$this->P['formName'];
897 $P2['fieldChangeFunc']=$this->P['fieldChangeFunc'];
898 $P2['params']['allowedExtensions']=$this->P['params']['allowedExtensions'];
899 $P2['params']['blindLinkOptions']=$this->P['params']['blindLinkOptions'];
900 $addPassOnParams.=t3lib_div::implodeArrayForUrl('P',$P2);
901
902 $JScode.='
903 function link_typo3Page(id,anchor) { //
904 updateValueInMainForm(id+(anchor?anchor:"")+" "+cur_target);
905 close();
906 return false;
907 }
908 function link_folder(folder) { //
909 updateValueInMainForm(folder+" "+cur_target);
910 close();
911 return false;
912 }
913 function link_current() { //
914 if (cur_href!="http://" && cur_href!="mailto:") {
915 var setValue = cur_href+" "+cur_target+" "+cur_title;
916 if (setValue.substr(0,7)=="http://") setValue = setValue.substr(7);
917 if (setValue.substr(0,7)=="mailto:") setValue = setValue.substr(7);
918 updateValueInMainForm(setValue);
919 close();
920 }
921 return false;
922 }
923 function checkReference() { //
924 if (window.opener && window.opener.document && window.opener.document.'.$this->P['formName'].' && window.opener.document.'.$this->P['formName'].'["'.$this->P['itemName'].'"] ) {
925 return window.opener.document.'.$this->P['formName'].'["'.$this->P['itemName'].'"];
926 } else {
927 close();
928 }
929 }
930 function updateValueInMainForm(input) { //
931 var field = checkReference();
932 if (field) {
933 field.value = input;
934 '.$update.'
935 }
936 }
937 ';
938 } else { // Functions used, if the link selector is in RTE mode:
939 $JScode.='
940 function link_typo3Page(id,anchor) { //
941 var theLink = \''.$this->siteURL.'?id=\'+id+(anchor?anchor:"");
942 self.parent.parent.renderPopup_addLink(theLink,cur_target,cur_title);
943 return false;
944 }
945 function link_folder(folder) { //
946 var theLink = \''.$this->siteURL.'\'+folder;
947 self.parent.parent.renderPopup_addLink(theLink,cur_target,cur_title);
948 return false;
949 }
950 function link_spec(theLink) { //
951 self.parent.parent.renderPopup_addLink(theLink,cur_target,cur_title);
952 return false;
953 }
954 function link_current() { //
955 if (cur_href!="http://" && cur_href!="mailto:") {
956 self.parent.parent.renderPopup_addLink(cur_href,cur_target,cur_title);
957 }
958 return false;
959 }
960 ';
961 }
962
963 // General "jumpToUrl" function:
964 $JScode.='
965 function jumpToUrl(URL,anchor) { //
966 var add_act = URL.indexOf("act=")==-1 ? "&act='.$this->act.'" : "";
967 var add_mode = URL.indexOf("mode=")==-1 ? "&mode='.$this->mode.'" : "";
968 var theLocation = URL+add_act+add_mode+add_href+add_target+add_title+add_params'.($addPassOnParams?'+"'.$addPassOnParams.'"':'').'+(anchor?anchor:"");
969 window.location.href = theLocation;
970 return false;
971 }
972 ';
973
974
975 /**
976 * Splits parts of $this->bparams
977 * @see $bparams
978 */
979 $pArr = explode('|',$this->bparams);
980
981 // This is JavaScript especially for the TBE Element Browser!
982 $formFieldName = 'data['.$pArr[0].']['.$pArr[1].']['.$pArr[2].']';
983
984 // insertElement - Call check function (e.g. for uniqueness handling):
985 if ($pArr[4] && $pArr[5]) {
986 $JScodeCheck = '
987 // Call a check function in the opener window (e.g. for uniqueness handling):
988 if (parent.window.opener) {
989 var res = parent.window.opener.'.$pArr[5].'("'.addslashes($pArr[4]).'",table,uid,type);
990 if (!res.passed) {
991 if (res.message) alert(res.message);
992 performAction = false;
993 }
994 } else {
995 alert("Error - reference to main window is not set properly!");
996 parent.close();
997 }
998 ';
999 }
1000 // insertElement - Call helper function:
1001 if ($pArr[4] && $pArr[6]) {
1002 $JScodeHelper = '
1003 // Call helper function to manage data in the opener window:
1004 if (parent.window.opener) {
1005 parent.window.opener.'.$pArr[6].'("'.addslashes($pArr[4]).'",table,uid,type,"'.addslashes($pArr[0]).'");
1006 } else {
1007 alert("Error - reference to main window is not set properly!");
1008 parent.close();
1009 }
1010 ';
1011 }
1012 // insertElement - perform action commands:
1013 if ($pArr[4] && $pArr[7]) {
1014 // Call user defined action function:
1015 $JScodeAction = '
1016 if (parent.window.opener) {
1017 parent.window.opener.'.$pArr[7].'("'.addslashes($pArr[4]).'",table,uid,type);
1018 focusOpenerAndClose(close);
1019 } else {
1020 alert("Error - reference to main window is not set properly!");
1021 parent.close();
1022 }
1023 ';
1024 } else if ($pArr[0] && !$pArr[1] && !$pArr[2]) {
1025 $JScodeAction = '
1026 addElement(filename,table+"_"+uid,fp,close);
1027 ';
1028 } else {
1029 $JScodeAction = '
1030 if (setReferences()) {
1031 parent.window.opener.group_change("add","'.$pArr[0].'","'.$pArr[1].'","'.$pArr[2].'",elRef,targetDoc);
1032 } else {
1033 alert("Error - reference to main window is not set properly!");
1034 }
1035 focusOpenerAndClose(close);
1036 ';
1037 }
1038
1039 $JScode.='
1040 var elRef="";
1041 var targetDoc="";
1042
1043 function launchView(url) { //
1044 var thePreviewWindow="";
1045 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");
1046 if (thePreviewWindow && thePreviewWindow.focus) {
1047 thePreviewWindow.focus();
1048 }
1049 }
1050 function setReferences() { //
1051 if (parent.window.opener
1052 && parent.window.opener.content
1053 && parent.window.opener.content.document.editform
1054 && parent.window.opener.content.document.editform["'.$formFieldName.'"]
1055 ) {
1056 targetDoc = parent.window.opener.content.document;
1057 elRef = targetDoc.editform["'.$formFieldName.'"];
1058 return true;
1059 } else {
1060 return false;
1061 }
1062 }
1063 function insertElement(table, uid, type, filename,fp,filetype,imagefile,action, close) { //
1064 var performAction = true;
1065 '.$JScodeCheck.'
1066 // Call performing function and finish this action:
1067 if (performAction) {
1068 '.$JScodeHelper.$JScodeAction.'
1069 }
1070 return false;
1071 }
1072 function addElement(elName,elValue,altElValue,close) { //
1073 if (parent.window.opener && parent.window.opener.setFormValueFromBrowseWin) {
1074 parent.window.opener.setFormValueFromBrowseWin("'.$pArr[0].'",altElValue?altElValue:elValue,elName);
1075 focusOpenerAndClose(close);
1076 } else {
1077 alert("Error - reference to main window is not set properly!");
1078 parent.close();
1079 }
1080 }
1081 function focusOpenerAndClose(close) { //
1082 BrowseLinks.focusOpenerAndClose(close);
1083 }
1084 ';
1085
1086 // Finally, add the accumulated JavaScript to the template object:
1087 $this->doc->JScode = '<script type="text/javascript" src="contrib/prototype/prototype.js"></script>'."\n";
1088 $this->doc->JScode.= '<script type="text/javascript" src="js/browse_links.js"></script>'."\n";
1089 $this->doc->JScode.= $this->doc->wrapScriptTags($JScode);
1090
1091 // Debugging:
1092 if (FALSE) debug(array(
1093 'pointer' => $this->pointer,
1094 'act' => $this->act,
1095 'mode' => $this->mode,
1096 'curUrlInfo' => $this->curUrlInfo,
1097 'curUrlArray' => $this->curUrlArray,
1098 'P' => $this->P,
1099 'bparams' => $this->bparams,
1100 'RTEtsConfigParams' => $this->RTEtsConfigParams,
1101 'expandPage' => $this->expandPage,
1102 'expandFolder' => $this->expandFolder,
1103 'PM' => $this->PM,
1104 ),'Internal variables of Script Class:');
1105 }
1106
1107
1108 /**
1109 * Session data for this class can be set from outside with this method.
1110 * Call after init()
1111 *
1112 * @param array Session data array
1113 * @return array Session data and boolean which indicates that data needs to be stored in session because it's changed
1114 */
1115 function processSessionData($data) {
1116 $store = false;
1117
1118 switch((string)$this->mode) {
1119 case 'db':
1120 if (isset($this->expandPage)) {
1121 $data['expandPage']=$this->expandPage;
1122 $store = true;
1123 } else {
1124 $this->expandPage=$data['expandPage'];
1125 }
1126 break;
1127 case 'file':
1128 case 'filedrag':
1129 case 'folder':
1130 if (isset($this->expandFolder)) {
1131 $data['expandFolder']=$this->expandFolder;
1132 $store = true;
1133 } else {
1134 $this->expandFolder=$data['expandFolder'];
1135 }
1136 break;
1137 }
1138
1139 return array($data, $store);
1140 }
1141
1142
1143
1144
1145 /******************************************************************
1146 *
1147 * Main functions
1148 *
1149 ******************************************************************/
1150
1151 /**
1152 * Rich Text Editor (RTE) link selector (MAIN function)
1153 * Generates the link selector for the Rich Text Editor.
1154 * Can also be used to select links for the TCEforms (see $wiz)
1155 *
1156 * @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
1157 * @return string Modified content variable.
1158 */
1159 function main_rte($wiz=0) {
1160 global $LANG, $BACK_PATH;
1161
1162 // Starting content:
1163 $content=$this->doc->startPage('RTE link');
1164
1165 // Initializing the action value, possibly removing blinded values etc:
1166 $allowedItems = array_diff(
1167 explode(',','page,file,folder,url,mail,spec'),
1168 t3lib_div::trimExplode(',',$this->thisConfig['blindLinkOptions'],1)
1169 );
1170 $allowedItems = array_diff(
1171 $allowedItems,
1172 t3lib_div::trimExplode(',',$this->P['params']['blindLinkOptions'])
1173 );
1174
1175 //call hook for extra options
1176 foreach($this->hookObjects as $hookObject) {
1177 $allowedItems = $hookObject->addAllowedItems($allowedItems);
1178 }
1179
1180 reset($allowedItems);
1181 if (!in_array($this->act,$allowedItems)) $this->act = current($allowedItems);
1182
1183 // Making menu in top:
1184 $menuDef = array();
1185 if (!$wiz) {
1186 $menuDef['removeLink']['isActive'] = $this->act=='removeLink';
1187 $menuDef['removeLink']['label'] = $LANG->getLL('removeLink',1);
1188 $menuDef['removeLink']['url'] = '#';
1189 $menuDef['removeLink']['addParams'] = 'onclick="self.parent.parent.renderPopup_unLink();return false;"';
1190 }
1191 if (in_array('page',$allowedItems)) {
1192 $menuDef['page']['isActive'] = $this->act=='page';
1193 $menuDef['page']['label'] = $LANG->getLL('page',1);
1194 $menuDef['page']['url'] = '#';
1195 $menuDef['page']['addParams'] = 'onclick="jumpToUrl(\'?act=page\');return false;"';
1196 }
1197 if (in_array('file',$allowedItems)){
1198 $menuDef['file']['isActive'] = $this->act=='file';
1199 $menuDef['file']['label'] = $LANG->getLL('file',1);
1200 $menuDef['file']['url'] = '#';
1201 $menuDef['file']['addParams'] = 'onclick="jumpToUrl(\'?act=file\');return false;"';
1202 }
1203 if (in_array('folder',$allowedItems)){
1204 $menuDef['folder']['isActive'] = $this->act == 'folder';
1205 $menuDef['folder']['label'] = $LANG->getLL('folder', 1);
1206 $menuDef['folder']['url'] = '#';
1207 $menuDef['folder']['addParams'] = 'onclick="jumpToUrl(\'?act=folder\');return false;"';
1208 }
1209 if (in_array('url',$allowedItems)) {
1210 $menuDef['url']['isActive'] = $this->act=='url';
1211 $menuDef['url']['label'] = $LANG->getLL('extUrl',1);
1212 $menuDef['url']['url'] = '#';
1213 $menuDef['url']['addParams'] = 'onclick="jumpToUrl(\'?act=url\');return false;"';
1214 }
1215 if (in_array('mail',$allowedItems)) {
1216 $menuDef['mail']['isActive'] = $this->act=='mail';
1217 $menuDef['mail']['label'] = $LANG->getLL('email',1);
1218 $menuDef['mail']['url'] = '#';
1219 $menuDef['mail']['addParams'] = 'onclick="jumpToUrl(\'?act=mail\');return false;"';
1220 }
1221 if (is_array($this->thisConfig['userLinks.']) && in_array('spec',$allowedItems)) {
1222 $menuDef['spec']['isActive'] = $this->act=='spec';
1223 $menuDef['spec']['label'] = $LANG->getLL('special',1);
1224 $menuDef['spec']['url'] = '#';
1225 $menuDef['spec']['addParams'] = 'onclick="jumpToUrl(\'?act=spec\');return false;"';
1226 }
1227
1228 // call hook for extra options
1229 foreach($this->hookObjects as $hookObject) {
1230 $menuDef = $hookObject->modifyMenuDefinition($menuDef);
1231 }
1232
1233 $content .= $this->doc->getTabMenuRaw($menuDef);
1234
1235 // Adding the menu and header to the top of page:
1236 $content.=$this->printCurrentUrl($this->curUrlInfo['info']).'<br />';
1237
1238
1239 // Depending on the current action we will create the actual module content for selecting a link:
1240 switch($this->act) {
1241 case 'mail':
1242 $extUrl='
1243
1244 <!--
1245 Enter mail address:
1246 -->
1247 <form action="" name="lurlform" id="lurlform">
1248 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkMail">
1249 <tr>
1250 <td>'.$GLOBALS['LANG']->getLL('emailAddress',1).':</td>
1251 <td><input type="text" name="lemail"'.$this->doc->formWidth(20).' value="'.htmlspecialchars($this->curUrlInfo['act']=='mail'?$this->curUrlInfo['info']:'').'" /> '.
1252 '<input type="submit" value="'.$GLOBALS['LANG']->getLL('setLink',1).'" onclick="setTarget(\'\');setValue(\'mailto:\'+document.lurlform.lemail.value); return link_current();" /></td>
1253 </tr>
1254 </table>
1255 </form>';
1256 $content.=$extUrl;
1257 break;
1258 case 'url':
1259 $extUrl='
1260
1261 <!--
1262 Enter External URL:
1263 -->
1264 <form action="" name="lurlform" id="lurlform">
1265 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkURL">
1266 <tr>
1267 <td>URL:</td>
1268 <td><input type="text" name="lurl"'.$this->doc->formWidth(20).' value="'.htmlspecialchars($this->curUrlInfo['act']=='url'?$this->curUrlInfo['info']:'http://').'" /> '.
1269 '<input type="submit" value="'.$GLOBALS['LANG']->getLL('setLink',1).'" onclick="setValue(document.lurlform.lurl.value); return link_current();" /></td>
1270 </tr>
1271 </table>
1272 </form>';
1273 $content.=$extUrl;
1274 break;
1275 case 'file':
1276 case 'folder':
1277 $foldertree = t3lib_div::makeInstance('rteFolderTree');
1278 $foldertree->thisScript = $this->thisScript;
1279 $tree = $foldertree->getBrowsableTree();
1280
1281 if (!$this->curUrlInfo['value'] || $this->curUrlInfo['act'] != $this->act) {
1282 $cmpPath = '';
1283 } elseif (substr(trim($this->curUrlInfo['info']), -1) != '/') {
1284 $cmpPath = PATH_site.dirname($this->curUrlInfo['info']).'/';
1285
1286 if (!isset($this->expandFolder)) {
1287 $this->expandFolder = $cmpPath;
1288 }
1289 } else {
1290 $cmpPath = PATH_site.$this->curUrlInfo['info'];
1291 }
1292
1293 list(, , $specUid) = explode('_', $this->PM);
1294 $files = $this->expandFolder(
1295 $foldertree->specUIDmap[$specUid],
1296 $this->P['params']['allowedExtensions']
1297 );
1298
1299 $content.= '
1300
1301 <!--
1302 Wrapper table for folder tree / file/folder list:
1303 -->
1304 <table border="0" cellpadding="0" cellspacing="0" id="typo3-linkFiles">
1305 <tr>
1306 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('folderTree').':').$tree.'</td>
1307 <td class="c-wCell" valign="top">'.$files.'</td>
1308 </tr>
1309 </table>
1310 ';
1311 break;
1312 case 'spec':
1313 if (is_array($this->thisConfig['userLinks.'])) {
1314 $subcats=array();
1315 $v=$this->thisConfig['userLinks.'];
1316 reset($v);
1317 while(list($k2)=each($v)) {
1318 $k2i = intval($k2);
1319 if (substr($k2,-1)=='.' && is_array($v[$k2i.'.'])) {
1320
1321 // Title:
1322 $title = trim($v[$k2i]);
1323 if (!$title) {
1324 $title=$v[$k2i.'.']['url'];
1325 } else {
1326 $title=$LANG->sL($title);
1327 }
1328 // Description:
1329 $description=$v[$k2i.'.']['description'] ? $LANG->sL($v[$k2i.'.']['description'],1).'<br />' : '';
1330
1331 // URL + onclick event:
1332 $onClickEvent='';
1333 if (isset($v[$k2i.'.']['target'])) $onClickEvent.="setTarget('".$v[$k2i.'.']['target']."');";
1334 $v[$k2i.'.']['url'] = str_replace('###_URL###',$this->siteURL,$v[$k2i.'.']['url']);
1335 if (substr($v[$k2i.'.']['url'],0,7)=='http://' || substr($v[$k2i.'.']['url'],0,7)=='mailto:') {
1336 $onClickEvent.="cur_href=unescape('".rawurlencode($v[$k2i.'.']['url'])."');link_current();";
1337 } else {
1338 $onClickEvent.="link_spec(unescape('".$this->siteURL.rawurlencode($v[$k2i.'.']['url'])."'));";
1339 }
1340
1341 // Link:
1342 $A=array('<a href="#" onclick="'.htmlspecialchars($onClickEvent).'return false;">','</a>');
1343
1344 // Adding link to menu of user defined links:
1345 $subcats[$k2i]='
1346 <tr>
1347 <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>
1348 </tr>';
1349 }
1350 }
1351
1352 // Sort by keys:
1353 ksort($subcats);
1354
1355 // Add menu to content:
1356 $content.= '
1357
1358 <!--
1359 Special userdefined menu:
1360 -->
1361 <table border="0" cellpadding="1" cellspacing="1" id="typo3-linkSpecial">
1362 <tr>
1363 <td class="bgColor5" class="c-wCell" valign="top"><strong>'.$LANG->getLL('special',1).'</strong></td>
1364 </tr>
1365 '.implode('',$subcats).'
1366 </table>
1367 ';
1368 }
1369 break;
1370 case 'page':
1371 $pagetree = t3lib_div::makeInstance('rtePageTree');
1372 $pagetree->thisScript = $this->thisScript;
1373 $tree=$pagetree->getBrowsableTree();
1374 $cElements = $this->expandPage();
1375 $content.= '
1376
1377 <!--
1378 Wrapper table for page tree / record list:
1379 -->
1380 <table border="0" cellpadding="0" cellspacing="0" id="typo3-linkPages">
1381 <tr>
1382 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('pageTree').':').$tree.'</td>
1383 <td class="c-wCell" valign="top">'.$cElements.'</td>
1384 </tr>
1385 </table>
1386 ';
1387 break;
1388 default:
1389 //call hook
1390 foreach($this->hookObjects as $hookObject) {
1391 $content .= $hookObject->getTab($this->act);
1392 }
1393
1394 break;
1395 }
1396
1397 $content .= '
1398
1399
1400
1401 <!--
1402 Selecting title for link:
1403 -->
1404 <form action="" name="ltitleform" id="ltargetform">
1405 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkTarget">
1406 <tr>
1407 <td>'.$GLOBALS['LANG']->getLL('title',1).'</td>
1408 <td><input type="text" name="ltitle" onchange="setTitle(this.value);" value="'.htmlspecialchars($this->setTitle).'"'.$this->doc->formWidth(10).' /></td>
1409 <td><input type="submit" value="'.$GLOBALS['LANG']->getLL('update',1).'" onclick="return link_current();" /></td>
1410 </tr>
1411 </table>
1412 </form>
1413 ';
1414
1415 // Target:
1416 if ($this->act!='mail') {
1417 $ltarget='
1418
1419
1420
1421 <!--
1422 Selecting target for link:
1423 -->
1424 <form action="" name="ltargetform" id="ltargetform">
1425 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkTarget">
1426 <tr>
1427 <td>'.$GLOBALS['LANG']->getLL('target',1).':</td>
1428 <td><input type="text" name="ltarget" onchange="setTarget(this.value);" value="'.htmlspecialchars($this->setTarget).'"'.$this->doc->formWidth(10).' /></td>
1429 <td>
1430 <select name="ltarget_type" onchange="setTarget(this.options[this.selectedIndex].value);document.ltargetform.ltarget.value=this.options[this.selectedIndex].value;this.selectedIndex=0;">
1431 <option></option>
1432 <option value="_top">'.$GLOBALS['LANG']->getLL('top',1).'</option>
1433 <option value="_blank">'.$GLOBALS['LANG']->getLL('newWindow',1).'</option>
1434 </select>
1435 </td>
1436 <td>';
1437
1438 if (($this->curUrlInfo['act']=="page" || $this->curUrlInfo['act']=='file') && $this->curUrlArray['href']) {
1439 $ltarget.='
1440 <input type="submit" value="'.$GLOBALS['LANG']->getLL('update',1).'" onclick="return link_current();" />';
1441 }
1442
1443 $selectJS = '
1444 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) {
1445 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;
1446 setTarget(document.ltargetform.ltarget.value);
1447 setTitle(document.ltitleform.ltitle.value);
1448 document.ltargetform.popup_width.selectedIndex=0;
1449 document.ltargetform.popup_height.selectedIndex=0;
1450 }
1451 ';
1452
1453 $ltarget.=' </td>
1454 </tr>
1455 <tr>
1456 <td>'.$GLOBALS['LANG']->getLL('target_popUpWindow',1).':</td>
1457 <td colspan="3">
1458 <select name="popup_width" onchange="'.htmlspecialchars($selectJS).'">
1459 <option value="0">'.$GLOBALS['LANG']->getLL('target_popUpWindow_width',1).'</option>
1460 <option value="300">300</option>
1461 <option value="400">400</option>
1462 <option value="500">500</option>
1463 <option value="600">600</option>
1464 <option value="700">700</option>
1465 <option value="800">800</option>
1466 </select>
1467 x
1468 <select name="popup_height" onchange="'.htmlspecialchars($selectJS).'">
1469 <option value="0">'.$GLOBALS['LANG']->getLL('target_popUpWindow_height',1).'</option>
1470 <option value="200">200</option>
1471 <option value="300">300</option>
1472 <option value="400">400</option>
1473 <option value="500">500</option>
1474 <option value="600">600</option>
1475 </select>
1476 </td>
1477 </tr>
1478 </table>
1479 </form>';
1480
1481 // Add "target selector" box to content:
1482 $content.=$ltarget;
1483
1484 // Add some space
1485 $content.='<br /><br />';
1486 }
1487
1488 // End page, return content:
1489 $content.= $this->doc->endPage();
1490 $content = $this->doc->insertStylesAndJS($content);
1491 return $content;
1492 }
1493
1494 /**
1495 * TYPO3 Element Browser: Showing a page tree and allows you to browse for records
1496 *
1497 * @return string HTML content for the module
1498 */
1499 function main_db() {
1500
1501 // Starting content:
1502 $content=$this->doc->startPage('TBE record selector');
1503
1504 // Init variable:
1505 $pArr = explode('|',$this->bparams);
1506
1507 // Making the browsable pagetree:
1508 $pagetree = t3lib_div::makeInstance('TBE_PageTree');
1509 $pagetree->thisScript=$this->thisScript;
1510 $pagetree->ext_pArrPages = !strcmp($pArr[3],'pages')?1:0;
1511 $pagetree->ext_showNavTitle = $GLOBALS['BE_USER']->getTSConfigVal('options.pageTree.showNavTitle');
1512 $pagetree->addField('nav_title');
1513 $tree=$pagetree->getBrowsableTree();
1514
1515 // Making the list of elements, if applicable:
1516 $cElements = $this->TBE_expandPage($pArr[3]);
1517
1518 // Putting the things together, side by side:
1519 $content.= '
1520
1521 <!--
1522 Wrapper table for page tree / record list:
1523 -->
1524 <table border="0" cellpadding="0" cellspacing="0" id="typo3-EBrecords">
1525 <tr>
1526 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('pageTree').':').$tree.'</td>
1527 <td class="c-wCell" valign="top">'.$cElements.'</td>
1528 </tr>
1529 </table>
1530 ';
1531
1532 // Add some space
1533 $content.='<br /><br />';
1534
1535 // End page, return content:
1536 $content.= $this->doc->endPage();
1537 $content = $this->doc->insertStylesAndJS($content);
1538 return $content;
1539 }
1540
1541 /**
1542 * TYPO3 Element Browser: Showing a folder tree, allowing you to browse for files.
1543 *
1544 * @return string HTML content for the module
1545 */
1546 function main_file() {
1547 global $BE_USER;
1548
1549 // Starting content:
1550 $content.=$this->doc->startPage('TBE file selector');
1551
1552 // Init variable:
1553 $pArr = explode('|',$this->bparams);
1554
1555 // Create upload/create folder forms, if a path is given:
1556 $fileProcessor = t3lib_div::makeInstance('t3lib_basicFileFunctions');
1557 $fileProcessor->init($GLOBALS['FILEMOUNTS'], $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']);
1558 $path=$this->expandFolder;
1559 if (!$path || !@is_dir($path)) {
1560 $path = $fileProcessor->findTempFolder().'/'; // The closest TEMP-path is found
1561 }
1562 if ($path!='/' && @is_dir($path) && !$this->readOnly && count($GLOBALS['FILEMOUNTS'])) {
1563 $uploadForm=$this->uploadForm($path);
1564 $createFolder=$this->createFolder($path);
1565 } else {
1566 $createFolder='';
1567 $uploadForm='';
1568 }
1569 if ($BE_USER->getTSConfigVal('options.uploadFieldsInTopOfEB')) $content.=$uploadForm;
1570
1571 // Getting flag for showing/not showing thumbnails:
1572 $noThumbs = $GLOBALS['BE_USER']->getTSConfigVal('options.noThumbsInEB');
1573
1574 if (!$noThumbs) {
1575 // MENU-ITEMS, fetching the setting for thumbnails from File>List module:
1576 $_MOD_MENU = array('displayThumbs' => '');
1577 $_MCONF['name']='file_list';
1578 $_MOD_SETTINGS = t3lib_BEfunc::getModuleData($_MOD_MENU, t3lib_div::_GP('SET'), $_MCONF['name']);
1579 $addParams = '&act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
1580 $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>';
1581 } else {
1582 $thumbNailCheck='';
1583 }
1584 $noThumbs = $noThumbs ? $noThumbs : !$_MOD_SETTINGS['displayThumbs'];
1585
1586 // Create folder tree:
1587 $foldertree = t3lib_div::makeInstance('TBE_FolderTree');
1588 $foldertree->thisScript=$this->thisScript;
1589 $foldertree->ext_noTempRecyclerDirs = ($this->mode == 'filedrag');
1590 $tree=$foldertree->getBrowsableTree();
1591
1592 list(,,$specUid) = explode('_',$this->PM);
1593
1594 if ($this->mode=='filedrag') {
1595 $files = $this->TBE_dragNDrop($foldertree->specUIDmap[$specUid],$pArr[3]);
1596 } else {
1597 $files = $this->TBE_expandFolder($foldertree->specUIDmap[$specUid],$pArr[3],$noThumbs);
1598 }
1599
1600 // Putting the parts together, side by side:
1601 $content.= '
1602
1603 <!--
1604 Wrapper table for folder tree / file list:
1605 -->
1606 <table border="0" cellpadding="0" cellspacing="0" id="typo3-EBfiles">
1607 <tr>
1608 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('folderTree').':').$tree.'</td>
1609 <td class="c-wCell" valign="top">'.$files.'</td>
1610 </tr>
1611 </table>
1612 ';
1613 $content.= $thumbNailCheck;
1614
1615 // Adding create folder + upload forms if applicable:
1616 if (!$BE_USER->getTSConfigVal('options.uploadFieldsInTopOfEB')) $content.=$uploadForm;
1617 if ($BE_USER->isAdmin() || $BE_USER->getTSConfigVal('options.createFoldersInEB')) $content.=$createFolder;
1618
1619 // Add some space
1620 $content.='<br /><br />';
1621
1622 // Setup indexed elements:
1623 $this->doc->JScode.= $this->doc->wrapScriptTags('BrowseLinks.addElements('.t3lib_div::array2json($this->elements).');');
1624 // Ending page, returning content:
1625 $content.= $this->doc->endPage();
1626 $content = $this->doc->insertStylesAndJS($content);
1627
1628 return $content;
1629 }
1630
1631 /**
1632 * TYPO3 Element Browser: Showing a folder tree, allowing you to browse for folders.
1633 *
1634 * @return string HTML content for the module
1635 */
1636 function main_folder() {
1637 global $BE_USER;
1638
1639 // Starting content:
1640 $content = $this->doc->startPage('TBE folder selector');
1641
1642 // Init variable:
1643 $parameters = explode('|', $this->bparams);
1644
1645 // Create upload/create folder forms, if a path is given:
1646 $fileProcessor = t3lib_div::makeInstance('t3lib_basicFileFunctions');
1647 $fileProcessor->init(
1648 $GLOBALS['FILEMOUNTS'],
1649 $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']
1650 );
1651
1652 $path = $this->expandFolder;
1653 if(!$path || !@is_dir($path)) {
1654 $path = $fileProcessor->findTempFolder().'/'; // The closest TEMP-path is found
1655 }
1656 if($path != '/' && @is_dir($path)) {
1657 $createFolder = $this->createFolder($path);
1658 } else {
1659 $createFolder='';
1660 }
1661
1662 // Create folder tree:
1663 $foldertree = t3lib_div::makeInstance('TBE_FolderTree');
1664 $foldertree->thisScript = $this->thisScript;
1665 $foldertree->ext_noTempRecyclerDirs = ($this->mode == 'filedrag');
1666 $tree = $foldertree->getBrowsableTree(false);
1667
1668 list(, , $specUid) = explode('_', $this->PM);
1669
1670 if($this->mode == 'filedrag') {
1671 $folders = $this->TBE_dragNDrop(
1672 $foldertree->specUIDmap[$specUid],
1673 $parameters[3]
1674 );
1675 } else {
1676 $folders = $this->TBE_expandSubFolders($foldertree->specUIDmap[$specUid]);
1677 }
1678
1679 // Putting the parts together, side by side:
1680 $content.= '
1681
1682 <!--
1683 Wrapper table for folder tree / folder list:
1684 -->
1685 <table border="0" cellpadding="0" cellspacing="0" id="typo3-EBfiles">
1686 <tr>
1687 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('folderTree').':').$tree.'</td>
1688 <td class="c-wCell" valign="top">'.$folders.'</td>
1689 </tr>
1690 </table>
1691 ';
1692
1693 // Adding create folder if applicable:
1694 if($BE_USER->isAdmin() || $BE_USER->getTSConfigVal('options.createFoldersInEB')) {
1695 $content .= $createFolder;
1696 }
1697
1698 // Add some space
1699 $content .= '<br /><br />';
1700
1701 // Ending page, returning content:
1702 $content.= $this->doc->endPage();
1703 $content = $this->doc->insertStylesAndJS($content);
1704
1705 return $content;
1706 }
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724 /******************************************************************
1725 *
1726 * Record listing
1727 *
1728 ******************************************************************/
1729 /**
1730 * For RTE: This displays all content elements on a page and lets you create a link to the element.
1731 *
1732 * @return string HTML output. Returns content only if the ->expandPage value is set (pointing to a page uid to show tt_content records from ...)
1733 */
1734 function expandPage() {
1735 global $BE_USER, $BACK_PATH;
1736
1737 $out='';
1738 $expPageId = $this->expandPage; // Set page id (if any) to expand
1739
1740 // If there is an anchor value (content element reference) in the element reference, then force an ID to expand:
1741 if (!$this->expandPage && $this->curUrlInfo['cElement']) {
1742 $expPageId = $this->curUrlInfo['pageid']; // Set to the current link page id.
1743 }
1744
1745 // Draw the record list IF there is a page id to expand:
1746 if ($expPageId && t3lib_div::testInt($expPageId) && $BE_USER->isInWebMount($expPageId)) {
1747
1748 // Set header:
1749 $out.=$this->barheader($GLOBALS['LANG']->getLL('contentElements').':');
1750
1751 // Create header for listing, showing the page title/icon:
1752 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
1753 $mainPageRec = t3lib_BEfunc::getRecordWSOL('pages',$expPageId);
1754 $picon=t3lib_iconWorks::getIconImage('pages',$mainPageRec,'','');
1755 $picon.= htmlspecialchars(t3lib_div::fixed_lgd_cs($mainPageRec['title'],$titleLen));
1756 $out.=$picon.'<br />';
1757
1758 // Look up tt_content elements from the expanded page:
1759 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
1760 'uid,header,hidden,starttime,endtime,fe_group,CType,colpos,bodytext',
1761 'tt_content',
1762 'pid='.intval($expPageId).
1763 t3lib_BEfunc::deleteClause('tt_content').
1764 t3lib_BEfunc::versioningPlaceholderClause('tt_content'),
1765 '',
1766 'colpos,sorting'
1767 );
1768 $cc = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
1769
1770 // Traverse list of records:
1771 $c=0;
1772 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
1773 $c++;
1774 $icon=t3lib_iconWorks::getIconImage('tt_content',$row,$BACK_PATH,'');
1775 if ($this->curUrlInfo['act']=='page' && $this->curUrlInfo['cElement']==$row['uid']) {
1776 $arrCol='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_left.gif','width="5" height="9"').' class="c-blinkArrowL" alt="" />';
1777 } else {
1778 $arrCol='';
1779 }
1780 // Putting list element HTML together:
1781 $out.='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/join'.($c==$cc?'bottom':'').'.gif','width="18" height="16"').' alt="" />'.
1782 $arrCol.
1783 '<a href="#" onclick="return link_typo3Page(\''.$expPageId.'\',\'#'.$row['uid'].'\');">'.
1784 $icon.
1785 htmlspecialchars(t3lib_div::fixed_lgd_cs($row['header'],$titleLen)).
1786 '</a><br />';
1787
1788 // Finding internal anchor points:
1789 if (t3lib_div::inList('text,textpic', $row['CType'])) {
1790 $split = preg_split('/(<a[^>]+name=[\'"]?([^"\'>[:space:]]+)[\'"]?[^>]*>)/i', $row['bodytext'], -1, PREG_SPLIT_DELIM_CAPTURE);
1791
1792 foreach($split as $skey => $sval) {
1793 if (($skey%3)==2) {
1794 // Putting list element HTML together:
1795 $sval = substr($sval,0,100);
1796 $out.='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/line.gif','width="18" height="16"').' alt="" />'.
1797 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/join'.($skey+3>count($split)?'bottom':'').'.gif','width="18" height="16"').' alt="" />'.
1798 '<a href="#" onclick="return link_typo3Page(\''.$expPageId.'\',\'#'.rawurlencode($sval).'\');">'.
1799 htmlspecialchars(' <A> '.$sval).
1800 '</a><br />';
1801 }
1802 }
1803 }
1804 }
1805 }
1806 return $out;
1807 }
1808
1809 /**
1810 * For TYPO3 Element Browser: This lists all content elements from the given list of tables
1811 *
1812 * @param string Commalist of tables. Set to "*" if you want all tables.
1813 * @return string HTML output.
1814 */
1815 function TBE_expandPage($tables) {
1816 global $TCA,$BE_USER, $BACK_PATH;
1817
1818 $out='';
1819 if ($this->expandPage>=0 && t3lib_div::testInt($this->expandPage) && $BE_USER->isInWebMount($this->expandPage)) {
1820
1821 // Set array with table names to list:
1822 if (!strcmp(trim($tables),'*')) {
1823 $tablesArr = array_keys($TCA);
1824 } else {
1825 $tablesArr = t3lib_div::trimExplode(',',$tables,1);
1826 }
1827 reset($tablesArr);
1828
1829 // Headline for selecting records:
1830 $out.=$this->barheader($GLOBALS['LANG']->getLL('selectRecords').':');
1831
1832 // Create the header, showing the current page for which the listing is. Includes link to the page itself, if pages are amount allowed tables.
1833 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
1834 $mainPageRec = t3lib_BEfunc::getRecordWSOL('pages',$this->expandPage);
1835 $ATag='';
1836 $ATag_e='';
1837 $ATag2='';
1838 if (in_array('pages',$tablesArr)) {
1839 $ficon=t3lib_iconWorks::getIcon('pages',$mainPageRec);
1840 $ATag="<a href=\"#\" onclick=\"return insertElement('pages', '".$mainPageRec['uid']."', 'db', ".t3lib_div::quoteJSvalue($mainPageRec['title']).", '', '', '".$ficon."','',1);\">";
1841 $ATag2="<a href=\"#\" onclick=\"return insertElement('pages', '".$mainPageRec['uid']."', 'db', ".t3lib_div::quoteJSvalue($mainPageRec['title']).", '', '', '".$ficon."','',0);\">";
1842 $ATag_alt=substr($ATag,0,-4).",'',1);\">";
1843 $ATag_e='</a>';
1844 }
1845 $picon=t3lib_iconWorks::getIconImage('pages',$mainPageRec,$BACK_PATH,'');
1846 $pBicon=$ATag2?'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' alt="" />':'';
1847 $pText=htmlspecialchars(t3lib_div::fixed_lgd_cs($mainPageRec['title'],$titleLen));
1848 $out.=$picon.$ATag2.$pBicon.$ATag_e.$ATag.$pText.$ATag_e.'<br />';
1849
1850 // Initialize the record listing:
1851 $id = $this->expandPage;
1852 $pointer = t3lib_div::intInRange($this->pointer,0,100000);
1853 $perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1);
1854 $pageinfo = t3lib_BEfunc::readPageAccess($id,$perms_clause);
1855 $table='';
1856
1857 // Generate the record list:
1858 $dblist = t3lib_div::makeInstance('TBE_browser_recordList');
1859 $dblist->thisScript=$this->thisScript;
1860 $dblist->backPath = $GLOBALS['BACK_PATH'];
1861 $dblist->thumbs = 0;
1862 $dblist->calcPerms = $GLOBALS['BE_USER']->calcPerms($pageinfo);
1863 $dblist->noControlPanels=1;
1864 $dblist->clickMenuEnabled=0;
1865 $dblist->tableList=implode(',',$tablesArr);
1866
1867 $dblist->start($id,t3lib_div::_GP('table'),$pointer,
1868 t3lib_div::_GP('search_field'),
1869 t3lib_div::_GP('search_levels'),
1870 t3lib_div::_GP('showLimit')
1871 );
1872 $dblist->setDispFields();
1873 $dblist->generateList();
1874 $dblist->writeBottom();
1875
1876 // Add the HTML for the record list to output variable:
1877 $out.=$dblist->HTMLcode;
1878
1879 // Add support for fieldselectbox in singleTableMode
1880 if ($dblist->table) {
1881 $out.= $dblist->fieldSelectBox($dblist->table);
1882 }
1883
1884 $out.=$dblist->getSearchBox();
1885 }
1886
1887 // Return accumulated content:
1888 return $out;
1889 }
1890
1891
1892 /**
1893 * Render list of folders inside a folder.
1894 *
1895 * @param string string of the current folder
1896 * @return string HTML output
1897 */
1898 function TBE_expandSubFolders($expandFolder=0) {
1899 $content = '';
1900
1901 $expandFolder = $expandFolder ?
1902 $expandFolder :
1903 $this->expandFolder;
1904
1905 if($expandFolder && $this->checkFolder($expandFolder)) {
1906 if(t3lib_div::isFirstPartOfStr($expandFolder, PATH_site)) {
1907 $rootFolder = substr($expandFolder, strlen(PATH_site));
1908 }
1909
1910 $folders = array();
1911
1912 // Listing the folders:
1913 $folders = t3lib_div::get_dirs($expandFolder);
1914 if(count($folders) > 0) {
1915 foreach($folders as $index => $folder) {
1916 $folders[$index] = $rootFolder.$folder.'/';
1917 }
1918 }
1919 $content.= $this->folderList($rootFolder, $folders);
1920 }
1921
1922 // Return accumulated content for folderlisting:
1923 return $content;
1924 }
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936 /******************************************************************
1937 *
1938 * File listing
1939 *
1940 ******************************************************************/
1941 /**
1942 * For RTE: This displays all files from folder. No thumbnails shown
1943 *
1944 * @param string The folder path to expand
1945 * @param string List of fileextensions to show
1946 * @return string HTML output
1947 */
1948 function expandFolder($expandFolder=0,$extensionList='') {
1949 global $BACK_PATH;
1950
1951 $expandFolder = $expandFolder ? $expandFolder : $this->expandFolder;
1952 $out='';
1953 if ($expandFolder && $this->checkFolder($expandFolder)) {
1954
1955 // Create header for filelisting:
1956 $out.=$this->barheader($GLOBALS['LANG']->getLL('files').':');
1957
1958 // Prepare current path value for comparison (showing red arrow)
1959 if (!$this->curUrlInfo['value']) {
1960 $cmpPath='';
1961 } else {
1962 $cmpPath=PATH_site.$this->curUrlInfo['info'];
1963 }
1964
1965
1966 // Create header element; The folder from which files are listed.
1967 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
1968 $picon='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/i/_icon_webfolders.gif','width="18" height="16"').' alt="" />';
1969 $picon.=htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($expandFolder),$titleLen));
1970 $picon='<a href="#" onclick="return link_folder(\''.t3lib_div::rawUrlEncodeFP(substr($expandFolder,strlen(PATH_site))).'\');">'.$picon.'</a>';
1971 $out.=$picon.'<br />';
1972
1973 // Get files from the folder:
1974 $files = t3lib_div::getFilesInDir($expandFolder,$extensionList,1,1); // $extensionList="",$prependPath=0,$order='')
1975 $c=0;
1976 $cc=count($files);
1977
1978 if (is_array($files)) {
1979 foreach($files as $filepath) {
1980 $c++;
1981 $fI=pathinfo($filepath);
1982
1983 // File icon:
1984 $icon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
1985
1986 // If the listed file turns out to be the CURRENT file, then show blinking arrow:
1987 if ($this->curUrlInfo['act']=="file" && $cmpPath==$filepath) {
1988 $arrCol='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_left.gif','width="5" height="9"').' class="c-blinkArrowL" alt="" />';
1989 } else {
1990 $arrCol='';
1991 }
1992
1993 // Get size and icon:
1994 $size=' ('.t3lib_div::formatSize(filesize($filepath)).'bytes)';
1995 $icon = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/fileicons/'.$icon.'','width="18" height="16"').' title="'.htmlspecialchars($fI['basename'].$size).'" alt="" />';
1996
1997 // Put it all together for the file element:
1998 $out.='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/join'.($c==$cc?'bottom':'').'.gif','width="18" height="16"').' alt="" />'.
1999 $arrCol.
2000 '<a href="#" onclick="return link_folder(\''.t3lib_div::rawUrlEncodeFP(substr($filepath,strlen(PATH_site))).'\');">'.
2001 $icon.
2002 htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen)).
2003 '</a><br />';
2004 }
2005 }
2006 }
2007 return $out;
2008 }
2009
2010 /**
2011 * For TYPO3 Element Browser: Expand folder of files.
2012 *
2013 * @param string The folder path to expand
2014 * @param string List of fileextensions to show
2015 * @param boolean Whether to show thumbnails or not. If set, no thumbnails are shown.
2016 * @return string HTML output
2017 */
2018 function TBE_expandFolder($expandFolder=0,$extensionList='',$noThumbs=0) {
2019 global $LANG;
2020
2021 $expandFolder = $expandFolder ? $expandFolder : $this->expandFolder;
2022 $out='';
2023 if ($expandFolder && $this->checkFolder($expandFolder)) {
2024 // Listing the files:
2025 $files = t3lib_div::getFilesInDir($expandFolder,$extensionList,1,1); // $extensionList="",$prependPath=0,$order='')
2026 $out.= $this->fileList($files, $expandFolder, $noThumbs);
2027 }
2028
2029 // Return accumulated content for filelisting:
2030 return $out;
2031 }
2032
2033 /**
2034 * Render list of files.
2035 *
2036 * @param array List of files. See t3lib_div::getFilesInDir
2037 * @param string If set a header with a folder icon and folder name are shown
2038 * @param boolean Whether to show thumbnails or not. If set, no thumbnails are shown.
2039 * @return string HTML output
2040 */
2041 function fileList($files, $folderName='', $noThumbs=0) {
2042 global $LANG, $BACK_PATH;
2043
2044 $out='';
2045
2046 // Listing the files:
2047 if (is_array($files)) {
2048
2049 // Create headline (showing number of files):
2050 $filesCount = count($files);
2051 $out.=$this->barheader(sprintf($GLOBALS['LANG']->getLL('files').' (%s):', $filesCount));
2052 $out.=$this->getBulkSelector($filesCount);
2053
2054 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
2055
2056 // Create the header of current folder:
2057 if($folderName) {
2058 $picon='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/i/_icon_webfolders.gif','width="18" height="16"').' alt="" />';
2059 $picon.=htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($folderName),$titleLen));
2060 $out.=$picon.'<br />';
2061 }
2062
2063 // Init graphic object for reading file dimensions:
2064 $imgObj = t3lib_div::makeInstance('t3lib_stdGraphic');
2065 $imgObj->init();
2066 $imgObj->mayScaleUp=0;
2067 $imgObj->tempPath=PATH_site.$imgObj->tempPath;
2068
2069 // Traverse the file list:
2070 $lines=array();
2071 foreach($files as $filepath) {
2072 $fI=pathinfo($filepath);
2073
2074 // Thumbnail/size generation:
2075 if (t3lib_div::inList(strtolower($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']),strtolower($fI['extension'])) && !$noThumbs) {
2076 $imgInfo = $imgObj->getImageDimensions($filepath);
2077 $pDim = $imgInfo[0].'x'.$imgInfo[1].' pixels';
2078 $clickIcon = t3lib_BEfunc::getThumbNail($BACK_PATH.'thumbs.php',$filepath,'hspace="5" vspace="5" border="1"');
2079 } else {
2080 $clickIcon = '';
2081 $pDim = '';
2082 }
2083
2084 // Create file icon:
2085 $ficon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
2086 $size=' ('.t3lib_div::formatSize(filesize($filepath)).'bytes'.($pDim?', '.$pDim:'').')';
2087 $icon = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/fileicons/'.$ficon,'width="18" height="16"').' title="'.htmlspecialchars($fI['basename'].$size).'" class="absmiddle" alt="" />';
2088
2089 // Create links for adding the file:
2090 if (strstr($filepath,',') || strstr($filepath,'|')) { // In case an invalid character is in the filepath, display error message:
2091 $eMsg = $LANG->JScharCode(sprintf($LANG->getLL('invalidChar'),', |'));
2092 $ATag = $ATag_alt = "<a href=\"#\" onclick=\"alert(".$eMsg.");return false;\">";
2093 $bulkCheckBox = '';
2094 } else { // If filename is OK, just add it:
2095 $filesIndex = count($this->elements);
2096 $this->elements['file_'.$filesIndex] = array(
2097 'md5' => t3lib_div::shortMD5($filepath),
2098 'type' => 'file',
2099 'fileName' => $fI['basename'],
2100 'filePath' => $filepath,
2101 'fileExt' => $fI['extension'],
2102 'fileIcon' => $ficon,
2103 );
2104 $ATag = "<a href=\"#\" onclick=\"return BrowseLinks.File.insertElement('file_$filesIndex');\">";
2105 $ATag_alt = substr($ATag,0,-4).",1);\">";
2106 $bulkCheckBox = '<input type="checkbox" class="typo3-bulk-item" name="file_'.$filesIndex.'" value="0" /> ';
2107 }
2108 $ATag_e='</a>';
2109
2110 // Create link to showing details about the file in a window:
2111 $Ahref = $BACK_PATH.'show_item.php?table='.rawurlencode($filepath).'&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'));
2112 $ATag2='<a href="'.htmlspecialchars($Ahref).'">';
2113 $ATag2_e='</a>';
2114
2115 // Combine the stuff:
2116 $filenameAndIcon=$bulkCheckBox.$ATag_alt.$icon.htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen)).$ATag_e;
2117
2118 // Show element:
2119 if ($pDim) { // Image...
2120 $lines[]='
2121 <tr class="bgColor4">
2122 <td nowrap="nowrap">'.$filenameAndIcon.'&nbsp;</td>
2123 <td>'.$ATag.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$LANG->getLL('addToList',1).'" alt="" />'.$ATag_e.'</td>
2124 <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>
2125 <td nowrap="nowrap">&nbsp;'.$pDim.'</td>
2126 </tr>';
2127 $lines[]='
2128 <tr>
2129 <td colspan="4">'.$ATag_alt.$clickIcon.$ATag_e.'</td>
2130 </tr>';
2131 } else {
2132 $lines[]='
2133 <tr class="bgColor4">
2134 <td nowrap="nowrap">'.$filenameAndIcon.'&nbsp;</td>
2135 <td>'.$ATag.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$LANG->getLL('addToList',1).'" alt="" />'.$ATag_e.'</td>
2136 <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>
2137 <td>&nbsp;</td>
2138 </tr>';
2139 }
2140 $lines[]='
2141 <tr>
2142 <td colspan="3"><img src="clear.gif" width="1" height="3" alt="" /></td>
2143 </tr>';
2144 }
2145
2146 // Wrap all the rows in table tags:
2147 $out.='
2148
2149
2150
2151 <!--
2152 File listing
2153 -->
2154 <table border="0" cellpadding="0" cellspacing="1" id="typo3-fileList">
2155 '.implode('',$lines).'
2156 </table>';
2157 }
2158 // Return accumulated content for filelisting:
2159 return $out;
2160 }
2161
2162 /**
2163 * Render list of folders.
2164 *
2165 * @param array List of folders. See t3lib_div::get_dirs
2166 * @param string If set a header with a folder icon and folder name are shown
2167 * @return string HTML output
2168 */
2169 function folderList($baseFolder, $folders) {
2170 global $LANG, $BACK_PATH;
2171
2172 $content = '';
2173
2174 // Create headline (showing number of folders):
2175 $content.=$this->barheader(
2176 sprintf($GLOBALS['LANG']->getLL('folders').' (%s):',count($folders))
2177 );
2178
2179 $titleLength = intval($GLOBALS['BE_USER']->uc['titleLen']);
2180
2181 // Create the header of current folder:
2182 if($baseFolder) {
2183 if (strstr($baseFolder, ',') || strstr($baseFolder, '|')) {
2184 // In case an invalid character is in the filepath, display error message:
2185 $errorMessage = $LANG->JScharCode(sprintf($LANG->getLL('invalidChar'),', |'));
2186 $aTag = $aTag_alt = "<a href=\"#\" onclick=\"alert(".$errorMessage.");return false;\">";
2187 } else {
2188 // If foldername is OK, just add it:
2189 $aTag = "<a href=\"#\" onclick=\"return insertElement('','".rawurlencode($baseFolder)."', 'folder', '".rawurlencode($baseFolder)."', unescape('".rawurlencode($baseFolder)."'), '".$fI['extension']."', '".$ficon."');\">";
2190 $aTag_alt = substr($aTag,0,-4).",'',1);\">";
2191 }
2192 $aTag_e = '</a>';
2193
2194 // add the foder icon
2195 $folderIcon = $aTag_alt;
2196 $folderIcon.= '<img'.t3lib_iconWorks::skinImg(
2197 $BACK_PATH,
2198 'gfx/i/_icon_webfolders.gif','width="18" height="16"'
2199 ).' alt="" />';
2200 $folderIcon.= htmlspecialchars(
2201 t3lib_div::fixed_lgd_cs(basename($baseFolder),$titleLength)
2202 );
2203 $folderIcon.= $aTag_e;
2204
2205 $content.=$folderIcon.'<br />';
2206 }
2207
2208 // Listing the folders:
2209 if(is_array($folders)) {
2210 if(count($folders) > 0) {
2211 // Traverse the folder list:
2212 $lines = array();
2213 foreach($folders as $folderPath) {
2214 $pathInfo = pathinfo($folderPath);
2215
2216 // Create folder icon:
2217 $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="" />';
2218
2219 // Create links for adding the folder:
2220 if($this->P['itemName'] != '' && $this->P['formName'] != '') {
2221 $aTag = "<a href=\"#\" onclick=\"return set_folderpath(unescape('".rawurlencode($folderPath)."'));\">";
2222 } else {
2223 $aTag = "<a href=\"#\" onclick=\"return insertElement('','".rawurlencode($folderPath)."', 'folder', '".rawurlencode($folderPath)."', unescape('".rawurlencode($folderPath)."'), '".$pathInfo['extension']."', '".$ficon."');\">";
2224 }
2225
2226 if (strstr($folderPath,',') || strstr($folderPath,'|')) {
2227 // In case an invalid character is in the filepath, display error message:
2228 $errorMessage = $LANG->JScharCode(sprintf($LANG->getLL('invalidChar'),', |'));
2229 $aTag = $aTag_alt = "<a href=\"#\" onclick=\"alert(".$errorMessage.");return false;\">";
2230 } else {
2231 // If foldername is OK, just add it:
2232 $aTag_alt = substr($aTag,0,-4).",'',1);\">";
2233 }
2234 $aTag_e='</a>';
2235
2236 // Combine icon and folderpath:
2237 $foldernameAndIcon = $aTag_alt.$icon.htmlspecialchars(
2238 t3lib_div::fixed_lgd_cs(basename($folderPath),$titleLength)
2239 ).$aTag_e;
2240
2241 if($this->P['itemName'] != '') {
2242 $lines[] = '
2243 <tr class="bgColor4">
2244 <td nowrap="nowrap">'.$foldernameAndIcon.'&nbsp;</td>
2245 <td>&nbsp;</td>
2246 </tr>';
2247 } else {
2248 $lines[] = '
2249 <tr class="bgColor4">
2250 <td nowrap="nowrap">'.$foldernameAndIcon.'&nbsp;</td>
2251 <td>'.$aTag.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$LANG->getLL('addToList',1).'" alt="" />'.$aTag_e.'</td>
2252 <td>&nbsp;</td>
2253 </tr>';
2254 }
2255
2256 $lines[] = '
2257 <tr>
2258 <td colspan="3"><img src="clear.gif" width="1" height="3" alt="" /></td>
2259 </tr>';
2260 }
2261 }
2262
2263 // Wrap all the rows in table tags:
2264 $content.='
2265
2266 <!--
2267 Folder listing
2268 -->
2269 <table border="0" cellpadding="0" cellspacing="1" id="typo3-folderList">
2270 '.implode('', $lines).'
2271 </table>';
2272 }
2273
2274 // Return accumulated content for folderlisting:
2275 return $content;
2276 }
2277
2278 /**
2279 * For RTE: This displays all IMAGES (gif,png,jpg) (from extensionList) from folder. Thumbnails are shown for images.
2280 * This listing is of images located in the web-accessible paths ONLY - the listing is for drag-n-drop use in the RTE
2281 *
2282 * @param string The folder path to expand
2283 * @param string List of fileextensions to show
2284 * @return string HTML output
2285 */
2286 function TBE_dragNDrop($expandFolder=0,$extensionList='') {
2287 global $BACK_PATH;
2288
2289 $expandFolder = $expandFolder ? $expandFolder : $this->expandFolder;
2290 $out='';
2291 if ($expandFolder && $this->checkFolder($expandFolder)) {
2292 if ($this->isWebFolder($expandFolder)) {
2293
2294 // Read files from directory:
2295 $files = t3lib_div::getFilesInDir($expandFolder,$extensionList,1,1); // $extensionList="",$prependPath=0,$order='')
2296 if (is_array($files)) {
2297 $out.=$this->barheader(sprintf($GLOBALS['LANG']->getLL('files').' (%s):',count($files)));
2298
2299 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
2300 $picon='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/i/_icon_webfolders.gif','width="18" height="16"').' alt="" />';
2301 $picon.=htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($expandFolder),$titleLen));
2302 $out.=$picon.'<br />';
2303
2304 // Init row-array:
2305 $lines=array();
2306
2307 // Add "drag-n-drop" message:
2308 $lines[]='
2309 <tr>
2310 <td colspan="2">'.$this->getMsgBox($GLOBALS['LANG']->getLL('findDragDrop')).'</td>
2311 </tr>';
2312
2313 // Fraverse files:
2314 while(list(,$filepath)=each($files)) {
2315 $fI = pathinfo($filepath);
2316
2317 // URL of image:
2318 $iurl = $this->siteURL.t3lib_div::rawurlencodeFP(substr($filepath,strlen(PATH_site)));
2319
2320 // Show only web-images
2321 if (t3lib_div::inList('gif,jpeg,jpg,png',strtolower($fI['extension']))) {
2322 $imgInfo = @getimagesize($filepath);
2323 $pDim = $imgInfo[0].'x'.$imgInfo[1].' pixels';
2324
2325 $ficon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
2326 $size=' ('.t3lib_div::formatSize(filesize($filepath)).'bytes'.($pDim?', '.$pDim:'').')';
2327 $icon = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/fileicons/'.$ficon,'width="18" height="16"').' class="absmiddle" title="'.htmlspecialchars($fI['basename'].$size).'" alt="" />';
2328 $filenameAndIcon=$icon.htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen));
2329
2330 if (t3lib_div::_GP('noLimit')) {
2331 $maxW=10000;
2332 $maxH=10000;
2333 } else {
2334 $maxW=380;
2335 $maxH=500;
2336 }
2337 $IW = $imgInfo[0];
2338 $IH = $imgInfo[1];
2339 if ($IW>$maxW) {
2340 $IH=ceil($IH/$IW*$maxW);
2341 $IW=$maxW;
2342 }
2343 if ($IH>$maxH) {
2344 $IW=ceil($IW/$IH*$maxH);
2345 $IH=$maxH;
2346 }
2347
2348 // Make row:
2349 $lines[]='
2350 <tr class="bgColor4">
2351 <td nowrap="nowrap">'.$filenameAndIcon.'&nbsp;</td>
2352 <td nowrap="nowrap">'.
2353 ($imgInfo[0]!=$IW ? '<a href="'.htmlspecialchars(t3lib_div::linkThisScript(array('noLimit'=>'1'))).'">'.
2354 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/icon_warning2.gif','width="18" height="16"').' title="'.$GLOBALS['LANG']->getLL('clickToRedrawFullSize',1).'" alt="" />'.
2355 '</a>':'').
2356 $pDim.'&nbsp;</td>
2357 </tr>';
2358
2359 $lines[]='
2360 <tr>
2361 <td colspan="2"><img src="'.$iurl.'" width="'.$IW.'" height="'.$IH.'" border="1" alt="" /></td>
2362 </tr>';
2363 $lines[]='
2364 <tr>
2365 <td colspan="2"><img src="clear.gif" width="1" height="3" alt="" /></td>
2366 </tr>';
2367 }
2368 }
2369
2370 // Finally, wrap all rows in a table tag:
2371 $out.='
2372
2373
2374 <!--
2375 File listing / Drag-n-drop
2376 -->
2377 <table border="0" cellpadding="0" cellspacing="1" id="typo3-dragBox">
2378 '.implode('',$lines).'
2379 </table>';
2380 }
2381 } else {
2382 // Print this warning if the folder is NOT a web folder:
2383 $out.=$this->barheader($GLOBALS['LANG']->getLL('files'));
2384 $out.=$this->getMsgBox($GLOBALS['LANG']->getLL('noWebFolder'),'icon_warning2');
2385 }
2386 }
2387 return $out;
2388 }
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401 /******************************************************************
2402 *
2403 * Miscellaneous functions
2404 *
2405 ******************************************************************/
2406
2407
2408 /**
2409 * Verifies that a path is a web-folder:
2410 *
2411 * @param string Absolute filepath
2412 * @return boolean If the input path is found in PATH_site then it returns true.
2413 */
2414 function isWebFolder($folder) {
2415 $folder = ereg_replace('\/$','',$folder).'/';
2416 return t3lib_div::isFirstPartOfStr($folder,PATH_site) ? TRUE : FALSE;
2417 }
2418
2419 /**
2420 * Checks, if a path is within the mountpoints of the backend user
2421 *
2422 * @param string Absolute filepath
2423 * @return boolean If the input path is found in the backend users filemounts, then return true.
2424 */
2425 function checkFolder($folder) {
2426 $fileProcessor = t3lib_div::makeInstance('t3lib_basicFileFunctions');
2427 $fileProcessor->init($GLOBALS['FILEMOUNTS'], $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']);
2428
2429 return $fileProcessor->checkPathAgainstMounts(ereg_replace('\/$','',$folder).'/') ? TRUE : FALSE;
2430 }
2431
2432 /**
2433 * Prints a 'header' where string is in a tablecell
2434 *
2435 * @param string The string to print in the header. The value is htmlspecialchars()'ed before output.
2436 * @return string The header HTML (wrapped in a table)
2437 */
2438 function barheader($str) {
2439 return '
2440
2441 <!--
2442 Bar header:
2443 -->
2444 <h3 class="bgColor5">'.htmlspecialchars($str).'</h3>
2445 ';
2446 }
2447
2448 /**
2449 * Displays a message box with the input message
2450 *
2451 * @param string Input message to show (will be htmlspecialchars()'ed inside of this function)
2452 * @param string Icon filename body from gfx/ (default is "icon_note") - meant to allow change to warning type icons...
2453 * @return string HTML for the message (wrapped in a table).
2454 */
2455 function getMsgBox($in_msg,$icon='icon_note') {
2456 global $BACK_PATH;
2457
2458 $msg = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/'.$icon.'.gif','width="18" height="16"').' alt="" />'.htmlspecialchars($in_msg);
2459 $msg = '
2460
2461 <!--
2462 Message box:
2463 -->
2464 <table cellspacing="0" class="bgColor4" id="typo3-msgBox">
2465 <tr>
2466 <td>'.$msg.'</td>
2467 </tr>
2468 </table>
2469 ';
2470 return $msg;
2471 }
2472
2473 /**
2474 * For RTE/link: This prints the 'currentUrl'
2475 *
2476 * @param string URL value. The value is htmlspecialchars()'ed before output.
2477 * @return string HTML content, wrapped in a table.
2478 */
2479 function printCurrentUrl($str) {
2480 return '
2481
2482 <!--
2483 Print current URL
2484 -->
2485 <table border="0" cellpadding="0" cellspacing="0" class="bgColor5" id="typo3-curUrl">
2486 <tr>
2487 <td>'.$GLOBALS['LANG']->getLL('currentLink',1).': '.htmlspecialchars(rawurldecode($str)).'</td>
2488 </tr>
2489 </table>';
2490 }
2491
2492 /**
2493 * For RTE/link: Parses the incoming URL and determines if it's a page, file, external or mail address.
2494 *
2495 * @param string HREF value tp analyse
2496 * @param string The URL of the current website (frontend)
2497 * @return array Array with URL information stored in assoc. keys: value, act (page, file, spec, mail), pageid, cElement, info
2498 */
2499 function parseCurUrl($href,$siteUrl) {
2500 $href = trim($href);
2501 if ($href) {
2502 $info=array();
2503
2504 // Default is "url":
2505 $info['value']=$href;
2506 $info['act']='url';
2507
2508 $specialParts = explode('#_SPECIAL',$href);
2509 if (count($specialParts)==2) { // Special kind (Something RTE specific: User configurable links through: "userLinks." from ->thisConfig)
2510 $info['value']='#_SPECIAL'.$specialParts[1];
2511 $info['act']='spec';
2512 } elseif (t3lib_div::isFirstPartOfStr($href,$siteUrl)) { // If URL is on the current frontend website:
2513 $rel = substr($href,strlen($siteUrl));
2514 if (@file_exists(PATH_site.rawurldecode($rel))) { // URL is a file, which exists:
2515 $info['value']=rawurldecode($rel);
2516 $info['act']='file';
2517 } else { // URL is a page (id parameter)
2518 $uP=parse_url($rel);
2519 if (!trim($uP['path'])) {
2520 $pp = explode('id=',$uP['query']);
2521 $id = $pp[1];
2522 if ($id) {
2523 // Checking if the id-parameter is an alias.
2524 if (!t3lib_div::testInt($id)) {
2525 list($idPartR) = t3lib_BEfunc::getRecordsByField('pages','alias',$id);
2526 $id=intval($idPartR['uid']);
2527 }
2528
2529 $pageRow = t3lib_BEfunc::getRecordWSOL('pages',$id);
2530 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
2531 $info['value']=$GLOBALS['LANG']->getLL('page',1)." '".htmlspecialchars(t3lib_div::fixed_lgd_cs($pageRow['title'],$titleLen))."' (ID:".$id.($uP['fragment']?', #'.$uP['fragment']:'').')';
2532 $info['pageid']=$id;
2533 $info['cElement']=$uP['fragment'];
2534 $info['act']='page';
2535 }
2536 }
2537 }
2538 } else { // Email link:
2539 if (strtolower(substr($href,0,7))=='mailto:') {
2540 $info['value']=trim(substr($href,7));
2541 $info['act']='mail';
2542 }
2543 }
2544 $info['info'] = $info['value'];
2545 } else { // NO value inputted:
2546 $info=array();
2547 $info['info']=$GLOBALS['LANG']->getLL('none');
2548 $info['value']='';
2549 $info['act']='page';
2550 }
2551
2552 // let the hook have a look
2553 foreach($this->hookObjects as $hookObject) {
2554 $info = $hookObject->parseCurrentUrl($href, $siteUrl, $info);
2555 }
2556
2557 return $info;
2558 }
2559
2560 /**
2561 * For TBE: Makes an upload form for uploading files to the filemount the user is browsing.
2562 * The files are uploaded to the tce_file.php script in the core which will handle the upload.
2563 *
2564 * @param string Absolute filepath on server to which to upload.
2565 * @return string HTML for an upload form.
2566 */
2567 function uploadForm($path) {
2568 global $BACK_PATH;
2569 $count=3;
2570
2571 // Create header, showing upload path:
2572 $header = t3lib_div::isFirstPartOfStr($path,PATH_site)?substr($path,strlen(PATH_site)):$path;
2573 $code=$this->barheader($GLOBALS['LANG']->getLL('uploadImage').':');
2574 $code.='
2575
2576 <!--
2577 Form, for uploading files:
2578 -->
2579 <form action="'.$BACK_PATH.'tce_file.php" method="post" name="editform" enctype="'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'].'">
2580 <table border="0" cellpadding="0" cellspacing="3" id="typo3-uplFiles">
2581 <tr>
2582 <td><strong>'.$GLOBALS['LANG']->getLL('path',1).':</strong> '.htmlspecialchars($header).'</td>
2583 </tr>
2584 <tr>
2585 <td>';
2586
2587 // Traverse the number of upload fields (default is 3):
2588 for ($a=1;$a<=$count;$a++) {
2589 $code.='<input type="file" name="upload_'.$a.'"'.$this->doc->formWidth(35).' size="50" />
2590 <input type="hidden" name="file[upload]['.$a.'][target]" value="'.htmlspecialchars($path).'" />
2591 <input type="hidden" name="file[upload]['.$a.'][data]" value="'.$a.'" /><br />';
2592 }
2593
2594 // Make footer of upload form, including the submit button:
2595 $redirectValue = $this->thisScript.'?act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
2596 $code.='<input type="hidden" name="redirect" value="'.htmlspecialchars($redirectValue).'" />'.
2597 '<input type="submit" name="submit" value="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_upload.php.submit',1).'" />';
2598
2599 $code.='
2600 <div id="c-override">
2601 <input type="checkbox" name="overwriteExistingFiles" id="overwriteExistingFiles" value="1" /> <label for="overwriteExistingFiles">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_misc.xml:overwriteExistingFiles',1).'</label>
2602 </div>
2603 ';
2604
2605
2606 $code.='</td>
2607 </tr>
2608 </table>
2609 </form>';
2610
2611 return $code;
2612 }
2613
2614 /**
2615 * For TBE: Makes a form for creating new folders in the filemount the user is browsing.
2616 * The folder creation request is sent to the tce_file.php script in the core which will handle the creation.
2617 *
2618 * @param string Absolute filepath on server in which to create the new folder.
2619 * @return string HTML for the create folder form.
2620 */
2621 function createFolder($path) {
2622 global $BACK_PATH;
2623 // Create header, showing upload path:
2624 $header = t3lib_div::isFirstPartOfStr($path,PATH_site)?substr($path,strlen(PATH_site)):$path;
2625 $code=$this->barheader($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_newfolder.php.pagetitle').':');
2626 $code.='
2627
2628 <!--
2629 Form, for creating new folders:
2630 -->
2631 <form action="'.$BACK_PATH.'tce_file.php" method="post" name="editform2">
2632 <table border="0" cellpadding="0" cellspacing="3" id="typo3-crFolder">
2633 <tr>
2634 <td><strong>'.$GLOBALS['LANG']->getLL('path',1).':</strong> '.htmlspecialchars($header).'</td>
2635 </tr>
2636 <tr>
2637 <td>';
2638
2639 // Create the new-folder name field:
2640 $a=1;
2641 $code.='<input'.$this->doc->formWidth(20).' type="text" name="file[newfolder]['.$a.'][data]" />'.
2642 '<input type="hidden" name="file[newfolder]['.$a.'][target]" value="'.htmlspecialchars($path).'" />';
2643
2644 // Make footer of upload form, including the submit button:
2645 $redirectValue = $this->thisScript.'?act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
2646 $code.='<input type="hidden" name="redirect" value="'.htmlspecialchars($redirectValue).'" />'.
2647 '<input type="submit" name="submit" value="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_newfolder.php.submit',1).'" />';
2648
2649 $code.='</td>
2650 </tr>
2651 </table>
2652 </form>';
2653
2654 return $code;
2655 }
2656
2657 /**
2658 * Get the HTML data required for a bulk selection of files of the TYPO3 Element Browser.
2659 *
2660 * @param integer $filesCount: Number of files currently displayed
2661 * @return string HTML data required for a bulk selection of files - if $filesCount is 0, nothing is returned
2662 */
2663 function getBulkSelector($filesCount) {
2664 if ($filesCount) {
2665 $labelToggleSelection = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_browse_links.php:toggleSelection',1);
2666 $labelImportSelection = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_browse_links.php:importSelection',1);
2667
2668 $out = $this->doc->spacer(15).'<div>' .
2669 '<a href="#" onclick="BrowseLinks.Selector.toggle()">' .
2670 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/clip_select.gif','width="12" height="12"').' title="'.$labelToggleSelection.'" alt="" /> ' .
2671 $labelToggleSelection.'</a>'.$this->doc->spacer(5) .
2672 '<a href="#" onclick="BrowseLinks.Selector.handle()">' .
2673 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/import.gif','width="12" height="12"').' title="'.$labelImportSelection.'" alt="" /> ' .
2674 $labelImportSelection.'</a>' .
2675 '</div>'.$this->doc->spacer(15);
2676 }
2677 return $out;
2678 }
2679 }
2680
2681 // Include extension?
2682 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.browse_links.php']) {
2683 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.browse_links.php']);
2684 }
2685
2686
2687 ?>