Fixed bug #5189: images with uppercase file extension aren't displayed in drag-n...
[Packages/TYPO3.CMS.git] / typo3 / class.browse_links.php
index 96b81d3..3734d3d 100755 (executable)
@@ -2,7 +2,7 @@
 /***************************************************************
 *  Copyright notice
 *
-*  (c) 1999-2005 Kasper Skaarhoj (kasperYYYY@typo3.com)
+*  (c) 1999-2007 Kasper Skaarhoj (kasperYYYY@typo3.com)
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
@@ -234,14 +234,14 @@ class TBE_browser_recordList extends localRecordList {
        }
 
        /**
-        * Returns the title (based on $code) of a table ($table) without a link
+        * Local version that sets allFields to true to support userFieldSelect
         *
-        * @param       string          Table name
-        * @param       string          Table label
-        * @return      string          The linked table label
+        * @return      void
+        * @see fieldSelectBox
         */
-       function linkWrapTable($table,$code)    {
-               return $code;
+       function generateList() {
+               $this->allFields = true;
+               parent::generateList();
        }
 }
 
@@ -663,6 +663,7 @@ class browse_links {
        var $setTarget;                 // Target (RTE specific)
        var $setTitle;                  // title (RTE specific)
        var $doc;                               // Backend template object
+       var $elements = array();        // Holds information about files
 
                // GPvars:      (Input variables from outside)
        /**
@@ -706,10 +707,14 @@ class browse_links {
         * Example value: "data[pages][39][bodytext]|||tt_content|" or "data[tt_content][NEW3fba56fde763d][image]|||gif,jpg,jpeg,tif,bmp,pcx,tga,png,pdf,ai|"
         *
         * Values:
-        * 0: form field name reference
+        * 0: form field name reference, eg. "data[tt_content][123][image]"
         * 1: old/unused?
         * 2: old/unused?
         * 3: allowed types. Eg. "tt_content" or "gif,jpg,jpeg,tif,bmp,pcx,tga,png,pdf,ai"
+        * 4: IRRE uniqueness: target level object-id to perform actions/checks on, eg. "data[79][tt_address][1][<field>][<foreign_table>]"
+        * 5: IRRE uniqueness: name of function in opener window that checks if element is already used, eg. "inline.checkUniqueElement"
+        * 6: IRRE uniqueness: name of function in opener window that performs some additional(!) action, eg. "inline.setUniqueElement"
+        * 7: IRRE uniqueness: name of function in opener window that performs action instead of using addElement/insertElement, eg. "inline.importElement"
         *
         * $pArr = explode('|',$this->bparams);
         * $formFieldName = $pArr[0];
@@ -946,9 +951,70 @@ class browse_links {
                ';
 
 
-                       // This is JavaScript especially for the TBE Element Browser!
+               /**
+                * Splits parts of $this->bparams
+                * @see $bparams
+                */
                $pArr = explode('|',$this->bparams);
+
+                       // This is JavaScript especially for the TBE Element Browser!
                $formFieldName = 'data['.$pArr[0].']['.$pArr[1].']['.$pArr[2].']';
+
+                       // insertElement - Call check function (e.g. for uniqueness handling):
+               if ($pArr[4] && $pArr[5]) {
+                       $JScodeCheck = '
+                                       // Call a check function in the opener window (e.g. for uniqueness handling):
+                               if (parent.window.opener) {
+                                       var res = parent.window.opener.'.$pArr[5].'("'.addslashes($pArr[4]).'",table,uid,type);
+                                       if (!res.passed) {
+                                               if (res.message) alert(res.message);
+                                               performAction = false;
+                                       }
+                               } else {
+                                       alert("Error - reference to main window is not set properly!");
+                                       parent.close();
+                               }
+                       ';
+               }
+                       // insertElement - Call helper function:
+               if ($pArr[4] && $pArr[6]) {
+                       $JScodeHelper = '
+                                               // Call helper function to manage data in the opener window:
+                                       if (parent.window.opener) {
+                                               parent.window.opener.'.$pArr[6].'("'.addslashes($pArr[4]).'",table,uid,type,"'.addslashes($pArr[0]).'");
+                                       } else {
+                                               alert("Error - reference to main window is not set properly!");
+                                               parent.close();
+                                       }
+                       ';
+               }
+                       // insertElement - perform action commands:
+               if ($pArr[4] && $pArr[7]) {
+                               // Call user defined action function:
+                       $JScodeAction = '
+                                       if (parent.window.opener) {
+                                               parent.window.opener.'.$pArr[7].'("'.addslashes($pArr[4]).'",table,uid,type);
+                                               focusOpenerAndClose(close);
+                                       } else {
+                                               alert("Error - reference to main window is not set properly!");
+                                               parent.close();
+                                       }
+                       ';
+               } else if ($pArr[0] && !$pArr[1] && !$pArr[2]) {
+                       $JScodeAction = '
+                                       addElement(filename,table+"_"+uid,fp,close);
+                       ';
+               } else {
+                       $JScodeAction = '
+                                       if (setReferences()) {
+                                               parent.window.opener.group_change("add","'.$pArr[0].'","'.$pArr[1].'","'.$pArr[2].'",elRef,targetDoc);
+                                       } else {
+                                               alert("Error - reference to main window is not set properly!");
+                                       }
+                                       focusOpenerAndClose(close);
+                       ';
+               }
+
                $JScode.='
                        var elRef="";
                        var targetDoc="";
@@ -974,37 +1040,32 @@ class browse_links {
                                }
                        }
                        function insertElement(table, uid, type, filename,fp,filetype,imagefile,action, close)  {       //
-                               if (1=='.($pArr[0]&&!$pArr[1]&&!$pArr[2] ? 1 : 0).')    {
-                                       addElement(filename,table+"_"+uid,fp,close);
-                               } else {
-                                       if (setReferences())    {
-                                               parent.window.opener.group_change("add","'.$pArr[0].'","'.$pArr[1].'","'.$pArr[2].'",elRef,targetDoc);
-                                       } else {
-                                               alert("Error - reference to main window is not set properly!");
-                                       }
-                                       if (close)      {
-                                               parent.window.opener.focus();
-                                               parent.close();
-                                       }
+                               var performAction = true;
+                               '.$JScodeCheck.'
+                                       // Call performing function and finish this action:
+                               if (performAction) {
+                                               '.$JScodeHelper.$JScodeAction.'
                                }
                                return false;
                        }
                        function addElement(elName,elValue,altElValue,close)    {       //
                                if (parent.window.opener && parent.window.opener.setFormValueFromBrowseWin)     {
                                        parent.window.opener.setFormValueFromBrowseWin("'.$pArr[0].'",altElValue?altElValue:elValue,elName);
-                                       if (close)      {
-                                               parent.window.opener.focus();
-                                               parent.close();
-                                       }
+                                       focusOpenerAndClose(close);
                                } else {
                                        alert("Error - reference to main window is not set properly!");
                                        parent.close();
                                }
                        }
+                       function focusOpenerAndClose(close)     {       //
+                               BrowseLinks.focusOpenerAndClose(close);
+                       }
                ';
 
                        // Finally, add the accumulated JavaScript to the template object:
-               $this->doc->JScode = $this->doc->wrapScriptTags($JScode);
+               $this->doc->JScode = '<script type="text/javascript" src="contrib/prototype/prototype.js"></script>'."\n";
+               $this->doc->JScode.= '<script type="text/javascript" src="js/browse_links.js"></script>'."\n";
+               $this->doc->JScode.= $this->doc->wrapScriptTags($JScode);
 
                        // Debugging:
                if (FALSE) debug(array(
@@ -1378,7 +1439,7 @@ class browse_links {
        function main_db()      {
 
                        // Starting content:
-               $content=$this->doc->startPage('TBE file selector');
+               $content=$this->doc->startPage('TBE record selector');
 
                        // Init variable:
                $pArr = explode('|',$this->bparams);
@@ -1387,6 +1448,8 @@ class browse_links {
                $pagetree = t3lib_div::makeInstance('TBE_PageTree');
                $pagetree->thisScript=$this->thisScript;
                $pagetree->ext_pArrPages = !strcmp($pArr[3],'pages')?1:0;
+               $pagetree->ext_showNavTitle = $GLOBALS['BE_USER']->getTSConfigVal('options.pageTree.showNavTitle');
+               $pagetree->addField('nav_title');
                $tree=$pagetree->getBrowsableTree();
 
                        // Making the list of elements, if applicable:
@@ -1454,7 +1517,7 @@ class browse_links {
                        $_MCONF['name']='file_list';
                        $_MOD_SETTINGS = t3lib_BEfunc::getModuleData($_MOD_MENU, t3lib_div::_GP('SET'), $_MCONF['name']);
                        $addParams = '&act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
-                       $thumbNailCheck = t3lib_BEfunc::getFuncCheck('','SET[displayThumbs]',$_MOD_SETTINGS['displayThumbs'],$this->thisScript,$addParams).' '.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_file_list.php:displayThumbs',1);
+                       $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>';
                } else {
                        $thumbNailCheck='';
                }
@@ -1496,6 +1559,8 @@ class browse_links {
                        // Add some space
                $content.='<br /><br />';
 
+                       // Setup indexed elements:
+               $this->doc->JScode.= $this->doc->wrapScriptTags('BrowseLinks.addElements('.t3lib_div::array2json($this->elements).');');
                        // Ending page, returning content:
                $content.= $this->doc->endPage();
                $content = $this->doc->insertStylesAndJS($content);
@@ -1674,6 +1739,12 @@ class browse_links {
 
                                //      Add the HTML for the record list to output variable:
                        $out.=$dblist->HTMLcode;
+
+                               // Add support for fieldselectbox in singleTableMode
+                       if ($dblist->table) {
+                               $out.= $dblist->fieldSelectBox($dblist->table);
+                       }
+
                        $out.=$dblist->getSearchBox();
                }
 
@@ -1806,7 +1877,9 @@ class browse_links {
                if (is_array($files))   {
 
                                // Create headline (showing number of files):
-                       $out.=$this->barheader(sprintf($GLOBALS['LANG']->getLL('files').' (%s):',count($files)));
+                       $filesCount = count($files);
+                       $out.=$this->barheader(sprintf($GLOBALS['LANG']->getLL('files').' (%s):', $filesCount));
+                       $out.=$this->getBulkSelector($filesCount);
 
                        $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
 
@@ -1829,7 +1902,7 @@ class browse_links {
                                $fI=pathinfo($filepath);
 
                                        // Thumbnail/size generation:
-                               if (t3lib_div::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'],$fI['extension']) && !$noThumbs)      {
+                               if (t3lib_div::inList(strtolower($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']),strtolower($fI['extension'])) && !$noThumbs)      {
                                        $imgInfo = $imgObj->getImageDimensions($filepath);
                                        $pDim = $imgInfo[0].'x'.$imgInfo[1].' pixels';
                                        $clickIcon = t3lib_BEfunc::getThumbNail($BACK_PATH.'thumbs.php',$filepath,'hspace="5" vspace="5" border="1"');
@@ -1847,9 +1920,20 @@ class browse_links {
                                if (strstr($filepath,',') || strstr($filepath,'|'))     {       // In case an invalid character is in the filepath, display error message:
                                        $eMsg = $LANG->JScharCode(sprintf($LANG->getLL('invalidChar'),', |'));
                                        $ATag = $ATag_alt = "<a href=\"#\" onclick=\"alert(".$eMsg.");return false;\">";
+                                       $bulkCheckBox = '';
                                } else {        // If filename is OK, just add it:
-                                       $ATag = "<a href=\"#\" onclick=\"return insertElement('','".t3lib_div::shortMD5($filepath)."', 'file', ".t3lib_div::quoteJSvalue($fI['basename']).", ".t3lib_div::quoteJSvalue($filepath).", '".$fI['extension']."', '".$ficon."');\">";
-                                       $ATag_alt = substr($ATag,0,-4).",'',1);\">";
+                                       $filesIndex = count($this->elements);
+                                       $this->elements['file_'.$filesIndex] = array(
+                                               'md5' => t3lib_div::shortMD5($filepath),
+                                               'type' => 'file',
+                                               'fileName' => $fI['basename'],
+                                               'filePath' => $filepath,
+                                               'fileExt' => $fI['extension'],
+                                               'fileIcon' => $ficon,
+                                       );
+                                       $ATag = "<a href=\"#\" onclick=\"return BrowseLinks.File.insertElement('file_$filesIndex');\">";
+                                       $ATag_alt = substr($ATag,0,-4).",1);\">";
+                                       $bulkCheckBox = '<input type="checkbox" class="typo3-bulk-item" name="file_'.$filesIndex.'" value="0" /> ';
                                }
                                $ATag_e='</a>';
 
@@ -1859,7 +1943,7 @@ class browse_links {
                                $ATag2_e='</a>';
 
                                        // Combine the stuff:
-                                       $filenameAndIcon=$ATag_alt.$icon.htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen)).$ATag_e;
+                               $filenameAndIcon=$bulkCheckBox.$ATag_alt.$icon.htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen)).$ATag_e;
 
                                        // Show element:
                                if ($pDim)      {               // Image...
@@ -1901,7 +1985,6 @@ class browse_links {
                                        '.implode('',$lines).'
                                </table>';
                }
-
                        // Return accumulated content for filelisting:
                return $out;
        }
@@ -1943,13 +2026,13 @@ class browse_links {
 
                                                // Fraverse files:
                                        while(list(,$filepath)=each($files))    {
-                                               $fI=pathinfo($filepath);
+                                               $fI = pathinfo($filepath);
 
                                                        // URL of image:
                                                $iurl = $this->siteURL.t3lib_div::rawurlencodeFP(substr($filepath,strlen(PATH_site)));
 
                                                        // Show only web-images
-                                               if (t3lib_div::inList('gif,jpeg,jpg,png',$fI['extension']))     {
+                                               if (t3lib_div::inList('gif,jpeg,jpg,png',strtolower($fI['extension']))) {
                                                        $imgInfo = @getimagesize($filepath);
                                                        $pDim = $imgInfo[0].'x'.$imgInfo[1].' pixels';
 
@@ -2223,7 +2306,7 @@ class browse_links {
 
                $code.='
                        <div id="c-override">
-                               <input type="checkbox" name="overwriteExistingFiles" value="1" /> '.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_misc.xml:overwriteExistingFiles',1).'
+                               <input type="checkbox" name="overwriteExistingFiles" id="overwriteExistingFiles" value="1" /> <label for="overwriteExistingFiles">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_misc.xml:overwriteExistingFiles',1).'</label>
                        </div>
                ';
 
@@ -2278,6 +2361,29 @@ class browse_links {
 
                return $code;
        }
+
+       /**
+        * Get the HTML data required for a bulk selection of files of the TYPO3 Element Browser.
+        *
+        * @param       integer         $filesCount: Number of files currently displayed
+        * @return      string          HTML data required for a bulk selection of files - if $filesCount is 0, nothing is returned
+        */
+       function getBulkSelector($filesCount) {
+               if ($filesCount) {
+                       $labelToggleSelection = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_browse_links.php:toggleSelection',1);
+                       $labelImportSelection = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_browse_links.php:importSelection',1);
+
+                       $out = $this->doc->spacer(15).'<div>' .
+                                       '<a href="#" onclick="BrowseLinks.Selector.toggle()">' .
+                                               '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/clip_select.gif','width="12" height="12"').' title="'.$labelToggleSelection.'" alt="" /> ' .
+                                               $labelToggleSelection.'</a>'.$this->doc->spacer(5) .
+                                       '<a href="#" onclick="BrowseLinks.Selector.handle()">' .
+                                               '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/import.gif','width="12" height="12"').' title="'.$labelImportSelection.'" alt="" /> ' .
+                                               $labelImportSelection.'</a>' .
+                               '</div>'.$this->doc->spacer(15);
+               }
+               return $out;
+       }
 }
 
 // Include extension?
@@ -2286,4 +2392,4 @@ if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class
 }
 
 
-?>
\ No newline at end of file
+?>