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