]> git.mjollnir.org Git - s9y.git/commitdiff
More smartification, show detailed image data.
authorgarvinhicking <garvinhicking>
Wed, 12 Apr 2006 11:34:42 +0000 (11:34 +0000)
committergarvinhicking <garvinhicking>
Wed, 12 Apr 2006 11:34:42 +0000 (11:34 +0000)
docs/NEWS
include/admin/images.inc.php
include/functions_images.inc.php
templates/default/admin/media_items.tpl
templates/default/admin/media_properties.tpl [new file with mode: 0644]
templates/default/admin/media_upload.tpl [new file with mode: 0644]

index a4806491be373ebb8b124509ff5005cc409ea160..f1514ffcd1833d846c24c3115f2417f92485e2f4 100644 (file)
--- a/docs/NEWS
+++ b/docs/NEWS
@@ -10,7 +10,6 @@ Version 1.1-alpha4()
 
    * Make media manager able to store media properties (garvinhicking)
      TODO:
-        - Show more existing properties in edit interface/Smartify [see TODO in file]
         - Read/Parse EXIF metadata, ask which to import [config option?]
         - Search/Filter for specific properties/keywords
         - Move/rename images/directories (browse serendipity_entries to fix up image paths [using <img src="..." />]. Also move ALL images of a directory, like when moving s9y installations. Put this into "Sync Thumbs" or "Manage Directories" panel.
index 2774939d9be2ba35124f578e0f95d9cca633c991..075965288a44462c7f18d19a6cfbdf39093c2297 100644 (file)
@@ -558,274 +558,24 @@ switch ($serendipity['GET']['adminAction']) {
             NULL,
             'write'
         );
-?>
-    <div class="image_add_form"><?php echo ADD_MEDIA_BLAHBLAH; ?></div>
-
-    <script type="text/javascript">
-    // Function prototype inspired by http://molily.de/javascript-nodelist
-    function showNodes(n) {
-        var html;
-        html = '<!--nodeset--><li>';
-
-        switch (n.nodeType) {
-            case 1:
-                html += 'Type is <em>' + n.nodeName + '<\/em>';
-                if (n.hasChildNodes()) {
-                    ausgabe += ' - childNodes: ' + n.childNodes.length;
-                }
-                break;
-
-            case 3:
-                var nval = n.nodeValue.replace(/</g, '&lt;').replace(/\n/g, '\\n');
-                html += 'Content: <strong>' + nval + '<\/strong>';
-                break;
-
-            case 8:
-                var nval = n.nodeValue.replace(/</g, '&lt;').replace(/\n/g, '\\n');
-                html += 'Hidden: <em>' + nval + '<\/em>';
-                break;
-
-            default:
-                html += 'Type is ' + n.nodeType + ', Content is <strong>' + n.nodeValue + '<\/strong>';
-        }
-
-        if (n.hasChildNodes()) {
-            html += '\n<ol>\n';
-            for (i=0; i < n.childNodes.length; i++) {
-                j = n.childNodes[i];
-                html += showNodes(j);
-            }
-            html += '</ol>\n';
-        }
-        html += '</li>\n';
-
-        return html;
-    }
-
-    function getfilename(value) {
-        re = /^.+[\/\\]+?(.+)$/;
-        return value.replace(re, "$1");
-    }
-
-    isFileUpload = true;
-    function hideForeign() {
-        document.getElementById('foreign_upload').style.display = 'none';
-        document.getElementById('imageurl').value = '';
-        isFileUpload = false;
-    }
-
-    var fieldcount = 1;
-    function addField() {
-        fieldcount++;
-
-        fields = document.getElementById('upload_template').cloneNode(true);
-        fields.id = 'upload_form_' + fieldcount;
-        fields.style.display = 'block';
-
-        // Get the DOM outline be uncommenting this:
-        //document.getElementById('debug').innerHTML = showNodes(fields);
-
-        // garvin: This gets a bit weird. Opera, Mozilla and IE all have their own numbering.
-        // We cannot operate on "ID" basis, since a unique ID is not yet set before instancing.
-        if (fields.childNodes[0].nodeValue == null) {
-            // This is Internet Explorer, it does not have a linebreak as first element.
-            userfile       = fields.childNodes[0].childNodes[0].childNodes[0].childNodes[1].childNodes[0];
-            targetfilename = fields.childNodes[0].childNodes[0].childNodes[2].childNodes[1].childNodes[0];
-            targetdir      = fields.childNodes[0].childNodes[0].childNodes[3].childNodes[1].childNodes[0];
-            columncount    = fields.childNodes[1].childNodes[0];
-        } else {
-            // We have a browser which has \n's as their own nodes. Don't ask me. Now let's check if it's Opera or Mozilla.
-            if (fields.childNodes[1].childNodes[0].nodeValue == null) {
-                // This is Opera.
-                userfile       = fields.childNodes[1].childNodes[0].childNodes[0].childNodes[1].childNodes[0];
-                targetfilename = fields.childNodes[1].childNodes[0].childNodes[2].childNodes[1].childNodes[0];
-                targetdir      = fields.childNodes[1].childNodes[0].childNodes[3].childNodes[1].childNodes[0];
-                columncount    = fields.childNodes[3].childNodes[0];
-            } else if (fields.childNodes[1].childNodes[1].childNodes[0].childNodes[3] == null) {
-               // This is Safari.
-                userfile       = fields.childNodes[1].childNodes[1].childNodes[0].childNodes[1].childNodes[0];
-                targetfilename = fields.childNodes[1].childNodes[1].childNodes[2].childNodes[1].childNodes[0];
-                targetdir      = fields.childNodes[1].childNodes[1].childNodes[3].childNodes[1].childNodes[0];
-                columncount    = fields.childNodes[3].childNodes[0];
-            } else {
-                // This is Mozilla.
-                userfile       = fields.childNodes[1].childNodes[1].childNodes[0].childNodes[3].childNodes[0];
-                targetfilename = fields.childNodes[1].childNodes[1].childNodes[4].childNodes[3].childNodes[0];
-                targetdir      = fields.childNodes[1].childNodes[1].childNodes[6].childNodes[3].childNodes[0];
-                columncount    = fields.childNodes[3].childNodes[0];
-            }
-        }
-
-        userfile.id   = 'userfile_' + fieldcount;
-        userfile.name = 'serendipity[userfile][' + fieldcount + ']';
-
-        targetfilename.id   = 'target_filename_' + fieldcount;
-        targetfilename.name = 'serendipity[target_filename][' + fieldcount + ']';
-
-        targetdir.id   = 'target_directory_' + fieldcount;
-        targetdir.name = 'serendipity[target_directory][' + fieldcount + ']';
-
-        columncount.id   = 'column_count_' + fieldcount;
-        columncount.name = 'serendipity[column_count][' + fieldcount + ']';
-
-        iNode = document.getElementById('upload_form');
-        iNode.parentNode.insertBefore(fields, iNode);
-
-        document.getElementById(targetdir.id).selectedIndex = document.getElementById('target_directory_' + (fieldcount - 1)).selectedIndex;
-    }
-
-    var inputStorage = new Array();
-    function checkInputs() {
-        for (i = 1; i <= fieldcount; i++) {
-            if (!inputStorage[i]) {
-                fillInput(i, i);
-            } else if (inputStorage[i] == document.getElementById('target_filename_' + i).value) {
-                fillInput(i, i);
-            }
-        }
-
-    }
-
-    function debugFields() {
-        for (i = 1; i <= fieldcount; i++) {
-            debugField('target_filename_' + i);
-            debugField('userfile_' + i);
-        }
-    }
-
-    function rememberOptions() {
-        td     = document.getElementById('target_directory_2');
-        td_val = td.options[td.selectedIndex].value;
-        SetCookie("addmedia_directory", td_val);
-    }
-
-    function debugField(id) {
-        alert(id + ': ' + document.getElementById(id).value);
-    }
-
-    function fillInput(source, target) {
-        useDuplicate = false;
-
-        // First field is a special value for foreign URLs instead of uploaded files
-        if (source == 1 && document.getElementById('imageurl').value != "") {
-            sourceval = getfilename(document.getElementById('imageurl').value);
-            useDuplicate = true;
-        } else {
-            sourceval = getfilename(document.getElementById('userfile_' + source).value);
-        }
-
-        if (sourceval.length > 0) {
-            document.getElementById('target_filename_' + target).value = sourceval;
-            inputStorage[target] = sourceval;
-        }
 
-        // Display filename in duplicate form as well!
-        if (useDuplicate) {
-            tkey = target + 1;
-
-            if (!inputStorage[tkey] || inputStorage[tkey] == document.getElementById('target_filename_' + tkey).value) {
-                document.getElementById('target_filename_' + (target+1)).value = sourceval;
-                inputStorage[target + 1] = '~~~';
-            }
-        }
-    }
-    </script>
-
-    <form action="?" method="POST" id="uploadform" enctype="multipart/form-data" onsubmit="rememberOptions()">
-        <div>
-            <?php echo serendipity_setFormToken(); ?>
-            <input type="hidden" name="serendipity[action]"      value="admin" />
-            <input type="hidden" name="serendipity[adminModule]" value="images" />
-            <input type="hidden" name="serendipity[adminAction]" value="add" />
-<?php
+        $form_hidden = '';
         if (isset($image_selector_addvars) && is_array($image_selector_addvars)) {
             // These variables may come from serendipity_admin_image_selector.php to show embedded upload form
             foreach($image_selector_addvars AS $imgsel_key => $imgsel_val) {
-                echo '          <input type="hidden" name="serendipity[' . htmlspecialchars($imgsel_key) . ']" value="' . htmlspecialchars($imgsel_val) . '" />' . "\n";
+                $form_hidden .= '          <input type="hidden" name="serendipity[' . htmlspecialchars($imgsel_key) . ']" value="' . htmlspecialchars($imgsel_val) . '" />' . "\n";
             }
         }
-?>
-            <table id="foreign_upload" class="image_add_foreign">
-                <tr>
-                    <td nowrap="nowrap"><?php echo ENTER_MEDIA_URL; ?></td>
-                    <td><input type="text" id="imageurl" name="serendipity[imageurl]"
-                             onchange="checkInputs()"
-                              value=""
-                               size="40" /></td>
-                </tr>
-                <tr>
-                    <td nowrap="nowrap"><?php echo ENTER_MEDIA_URL_METHOD; ?></td>
-                    <td>
-                        <select name="serendipity[imageimporttype]">
-                            <option value="image"><?php echo FETCH_METHOD_IMAGE; ?></option>
-                            <option value="hotlink"><?php echo FETCH_METHOD_HOTLINK; ?></option>
-                        </select>
-                    </td>
-                </tr>
-
-                <tr>
-                    <td align="center" colspan="2"><b> - <?php echo WORD_OR; ?> - </b></td>
-                </tr>
-            </table>
-
-            <!-- WARNING: Do not change spacing or breaks below. If you do, the JavaScript childNodes need to be edited. Newlines count as nodes! -->
-            <div id="upload_template">
-            <table style="margin-top: 35px" id="upload_table" class="image_add_local">
-                <tr>
-                    <td nowrap='nowrap'><?php echo ENTER_MEDIA_UPLOAD; ?></td>
-                    <td><input id="userfile_1" name="serendipity[userfile][1]"
-                             onchange="checkInputs();"
-                               type="file" /></td>
-                </tr>
-
-                <tr>
-                    <td align="center" colspan="2"><br /></td>
-                </tr>
-
-                <tr>
-                    <td><?php echo SAVE_FILE_AS; ?></td>
-                    <td><input type="text" id="target_filename_1" name="serendipity[target_filename][1]" value="" size="40" /></td>
-                </tr>
-
-                <tr>
-                    <td><?php echo STORE_IN_DIRECTORY; ?></td>
-                    <td><select id="target_directory_1" name="serendipity[target_directory][1]">
-                        <option value=""><?php echo BASE_DIRECTORY; ?></option>
-                        <?php foreach ($folders as $folder) { ?>
-                        <option <?php echo ($serendipity['GET']['only_path'] == $folder['relpath']) ? 'selected="selected"' : '' ?> value="<?php echo $folder['relpath'] ?>"><?php echo str_repeat('&nbsp;', $folder['depth']*2) . ' '. $folder['name'] ?></option>
-                        <?php } ?>
-                        </select>
-                    </td>
-                </tr>
-           </table>
-           <div id="ccounter"><input type="hidden" name="serendipity[column_count][1]" id="column_count_1" value="true" /></div>
-           </div>
-
-           <div id="debug">
-           </div>
-
-           <script type="text/javascript">
-                document.getElementById('upload_template').style.display  = 'none';
-                document.write('<span id="upload_form"><' + '/span>');
-                addField();
-           </script>
-
-            <?php serendipity_plugin_api::hook_event('backend_image_addform', $serendipity); ?>
-
-            <div style="text-align: center; margin-top: 15px; margin-bottom: 15px">
-                <script type="text/javascript">
-                    document.write('<input class="serendipityPrettyButton" type="button" value="<?php echo IMAGE_MORE_INPUT; ?>" onclick="hideForeign(); addField()"' + '/><br' + '/>');
-                </script>
-                <input type="hidden" name="serendipity[all_authors]" value="true" checked="checked" id="all_authors" />
-                <br />
-                <input onclick="checkInputs();" type="submit" value="<?php echo GO; ?>" class="serendipityPrettyButton" />
-                - <?php echo WORD_OR; ?> -
-                <input onclick="checkInputs();" name="go_properties" type="submit" value="<?php echo htmlspecialchars(GO_ADD_PROPERTIES); ?>" class="serendipityPrettyButton" />
-            </div>
-        </div>
-        <div class="image_add_note"><?php echo ADD_MEDIA_BLAHBLAH_NOTE; ?></div>
-    </form>
-<?php
+
+        serendipity_smarty_init();
+        $media = array(
+            'token' => serendipity_setFormToken(),
+            'form_hidden' => $form_hidden,
+            'folders' => $folders,
+            'only_path' => $serendipity['GET']['only_path']
+        );
+        $serendipity['smarty']->assign('media', $media);
+        $serendipity['smarty']->display(serendipity_getTemplateFile('admin/media_upload.tpl', 'serendipityPath'));
     break;
 
     case 'rotateCW':
index 697d1ff7d6b6b8520f4264dca1265f83e8a757d7..8eb588b5986e29fa2e0052279671df29adc1b1fd 100644 (file)
@@ -1343,6 +1343,15 @@ function serendipity_displayImageList($page = 0, $lineBreak = NULL, $manage = fa
         }
     }
 
+    $smarty_vars = array(
+        'limit_path'    => $limit_path,
+        'perPage'       => $perPage,
+        'show_upload'   => $show_upload,
+        'page'          => $page,
+        'pages'         => $pages,
+        'linkNext'      => $linkNext,
+        'linkPrevious'  => $linkPrevious
+    );
     serendipity_showMedia(
         $serendipity['imageList'],
         $paths,
@@ -1350,13 +1359,8 @@ function serendipity_displayImageList($page = 0, $lineBreak = NULL, $manage = fa
         $manage,
         $lineBreak,
         true,
-        $limit_path,
-        $perPage,
-        $show_upload,
-        $page,
-        $pages,
-        $linkNext,
-        $linkPrevious);
+        $smarty_vars
+    );
 } // End serendipity_displayImageList()
 
 /**
@@ -1867,7 +1871,7 @@ function serendipity_getImageData($sRelativePath) {
  * @return boolean
  *
  */
-function serendipity_showPropertyForm(&$new_media, $keywordsPerBlock = 3, $manage = true) {
+function serendipity_showPropertyForm(&$new_media, $keywordsPerBlock = 3, $is_edit = true) {
     global $serendipity;
 
     if (!is_array($new_media) || count($new_media) < 1) {
@@ -1880,21 +1884,11 @@ function serendipity_showPropertyForm(&$new_media, $keywordsPerBlock = 3, $manag
     $dprops   = explode(';', $serendipity['mediaProperties']);
     $keywords = explode(';', $serendipity['mediaKeywords']);
 
-    if ($manage) {
-?>
-    <form id="mediaPropertyForm" action="?" method="POST">
-        <div>
-            <?php echo serendipity_setFormToken(); ?>
-            <input type="hidden" name="serendipity[action]"         value="admin" />
-            <input type="hidden" name="serendipity[adminModule]"    value="images" />
-            <input type="hidden" name="serendipity[adminAction]"    value="add" />
-            <input type="hidden" name="serendipity[adminSubAction]" value="properties" />
-<?php
-        if (isset($GLOBALS['image_selector_addvars']) && is_array($GLOBALS['image_selector_addvars'])) {
-            // These variables may come from serendipity_admin_image_selector.php to show embedded upload form
-            foreach($GLOBALS['image_selector_addvars'] AS $imgsel_key => $imgsel_val) {
-                echo '          <input type="hidden" name="serendipity[' . htmlspecialchars($imgsel_key) . ']" value="' . htmlspecialchars($imgsel_val) . '" />' . "\n";
-            }
+    $editform_hidden = '';
+    if (isset($GLOBALS['image_selector_addvars']) && is_array($GLOBALS['image_selector_addvars'])) {
+        // These variables may come from serendipity_admin_image_selector.php to show embedded upload form
+        foreach($GLOBALS['image_selector_addvars'] AS $imgsel_key => $imgsel_val) {
+            $editform_hidden .= '          <input type="hidden" name="serendipity[' . htmlspecialchars($imgsel_key) . ']" value="' . htmlspecialchars($imgsel_val) . '" />' . "\n";
         }
     }
 
@@ -1905,9 +1899,6 @@ function serendipity_showPropertyForm(&$new_media, $keywordsPerBlock = 3, $manag
         $show[$idx] =& $media['internal'];
         serendipity_prepareMedia($show[$idx]);
 
-        echo '<input type="hidden" name="serendipity[mediaProperties][' . $idx . '][image_id]"          value="' . (int)$media['image_id'] . '" />' . "\n";
-
-        echo '<h3>' . MEDIA_PROP . '</h3>';
         foreach($dprops AS $prop) {
             $type = 'input';
             $parts = explode(':', trim($prop));
@@ -1915,69 +1906,51 @@ function serendipity_showPropertyForm(&$new_media, $keywordsPerBlock = 3, $manag
             if ($parts[1] == 'MULTI') {
                 $type = 'textarea';
             }
-            if (!$manage) {
+            if (!$is_edit) {
                 $type = 'readonly';
             }
             $val =& $props['base_property'][$parts[0]];
 
-            echo '<label for="mediaProperty' . htmlspecialchars($parts[0]) . $idx . '">';
-            if (defined('MEDIA_PROPERTY_' . strtoupper($parts[0]))) {
-                echo constant('MEDIA_PROPERTY_' . strtoupper($parts[0]));
-            } else {
-                echo htmlspecialchars($parts[0]);
-            }
-            echo '</label><br /><div>';
-
-            switch($type) {
-                case 'textarea':
-                    echo '<textarea cols="80" rows="5" id="mediaProperty' . htmlspecialchars($parts[0]) . '%d" name="serendipity[mediaProperties][' . $idx . '][' . htmlspecialchars($parts[0]) . ']">' . htmlspecialchars($val) . '</textarea>' . "\n";
-                    break;
-
-                case 'readonly':
-                    echo '<div>' . htmlspecialchars($val) . '</div>';
-                    break;
-
-                case 'input':
-                default:
-                    echo '<input id="mediaProperty' . htmlspecialchars($parts[0]) . $idx . '" type="text" name="serendipity[mediaProperties][' . $idx . '][' . htmlspecialchars($parts[0]) . ']" value="' . htmlspecialchars($val) . '" />' . "\n";
-                    break;
-            }
-            echo '</div>';
+            $show[$idx]['base_property'][htmlspecialchars($parts[0]) . $idx] = array(
+                'label' => htmlspecialchars(defined('MEDIA_PROPERTY_' . strtoupper($parts[0])) ? constant('MEDIA_PROPERTY_' . strtoupper($parts[0])) : $parts[0]),
+                'type'  => $type,
+                'val'   => $val,
+                'title' => htmlspecialchars($parts[0])
+            );
         }
 
-        echo '<h3>' . MEDIA_KEYWORDS . '</h3>';
-        echo '<div><table>';
         $rows = ceil(count($keywords) / $keywordsPerBlock);
         for($i = 0; $i < $rows; $i++) {
-            echo '<tr>';
             for ($j = 0; $j < $keywordsPerBlock; $j++) {
                 $kidx = ($i*$keywordsPerBlock) + $j;
-                echo '<td>';
                 if (isset($keywords[$kidx])) {
-                    $kw = htmlspecialchars($keywords[$kidx]);
-                    if (isset($props['base_keyword'][$keywords[$kidx]])) {
-                        $selected = 'checked="checked"';
-                    } else {
-                        $selected = '';
-                    }
-                    echo '<input id="mediaKeyword' . $kw . $idx . '" type="checkbox" name="serendipity[mediaKeywords][' . $idx . '][' . $kw . ']" value="true" ' . $selected . ' />&nbsp;<label for="mediaKeyword' . $kw . $idx . '">' . $kw . '</label></td>';
+                    $show[$idx]['base_keywords'][$i][$j] = array(
+                        'name'      => htmlspecialchars($keywords[$kidx]),
+                        'selected'  => isset($props['base_keyword'][$keywords[$kidx]]) ? true : false
+                    );
+                } else {
+                    $show[$idx]['base_keywords'][$i][$j] = array();
                 }
-                echo '</td>';
             }
-            echo '</tr>' . "\n";
         }
-        echo '</table></div>' . "\n";
     }
 
-    // TODO: SMARTIFY!
     // TODO: EXIF!
-    // TODO: Upload date, Dimensions, Filename, Autor, Mime, ...
-    serendipity_showMedia($show, $mirror, $url, false, 1, false);
-?>
-        <br /><input type="submit" name="submit" value="<?php echo GO; ?>" class="serendipityPrettyButton" />
-        </div>
-    </form>
-<?php
+    $smarty_vars = array(
+        'is_edit'           => $is_edit,
+        'editform_hidden'   => $editform_hidden,
+        'keywordsPerBlock'  => $keywordsPerBlock,
+        'keywords'          => $keywords,
+        'dprops'            => $dprops
+    );
+    serendipity_showMedia(
+        $show,
+        $mirror,
+        $url,
+        false,
+        1,
+        false,
+        $smarty_vars);
 
     return true;
 }
@@ -2171,7 +2144,7 @@ function serendipity_prepareMedia(&$file, $url = '') {
  * @return boolean
  *
  */
-function serendipity_showMedia(&$file, &$paths, $url = '', $manage = false, $lineBreak = 3, $enclose = true, $limit_path = null, $perPage = 8, $show_upload = false, $page = 1, $pages = 1, $linkNext = '', $linkPrevious = '') {
+function serendipity_showMedia(&$file, &$paths, $url = '', $manage = false, $lineBreak = 3, $enclose = true, $smarty_vars = array()) {
     global $serendipity;
 
     $form_hidden = '';
@@ -2199,22 +2172,16 @@ function serendipity_showMedia(&$file, &$paths, $url = '', $manage = false, $lin
         'nextIMG'           => serendipity_getTemplateFile('admin/img/next.png'),
         'token'             => serendipity_setFormToken(),
         'form_hidden'       => $form_hidden,
-        'limit_path'        => $limit_path,
         'blimit_path'       => basename($limit_path),
         'only_path'         => $serendipity['GET']['only_path'],
         'only_filename'     => $serendipity['GET']['only_filename'],
         'sortorder'         => $serendipity['GET']['sortorder'],
         'sort_order'        => serendipity_getImageFields(),
         'sort_row_interval' => array(8, 16, 50, 100),
-        'perPage'           => $perPage,
-        'show_upload'       => $show_upload,
         'nr_files'          => count($file),
-        'page'              => $page,
-        'pages'             => $pages,
-        'linkNext'          => $linkNext,
-        'linkPrevious'      => $linkPrevious
     );
 
+    $media = array_merge($media, $smarty_vars);
     $media['files'] =& $file;
     $media['paths'] =& $paths;
 
@@ -2224,7 +2191,8 @@ function serendipity_showMedia(&$file, &$paths, $url = '', $manage = false, $lin
         serendipity_smarty_fetch('MEDIA_ITEMS', 'admin/media_items.tpl');
         $serendipity['smarty']->display(serendipity_getTemplateFile('admin/media_pane.tpl', 'serendipityPath'));
     } else {
-        $serendipity['smarty']->display(serendipity_getTemplateFile('admin/media_items.tpl', 'serendipityPath'));
+        serendipity_smarty_fetch('MEDIA_ITEMS', 'admin/media_items.tpl');
+        $serendipity['smarty']->display(serendipity_getTemplateFile('admin/media_properties.tpl', 'serendipityPath'));
     }
 
     return true;
index 34d2a41db3a06f2800fe33a782c3a0c4b47e075c..a87ba25b20927491ecda4cf9db1479b73f94a0e6 100644 (file)
@@ -1,4 +1,4 @@
-{foreach from=$media.files item="file" name="mediafiles"}
+{foreach from=$media.files item="file" name="mediafiles" key="mediakey"}
     {if $media.enclose}
     <td nowrap="nowrap" align="center" valign="{if $media.manage}top{else}middle{/if}" width="{$media.lineBreakP}%" class="serendipity_admin_list_item serendipity_admin_list_item_even">
     {/if}
     </td>
     {/if}
 
+    {if NOT $media.enclose}
+        <h3>{$file.name}.{$file.extension} [<em>{$file.mime}</em>]</h3>
+        <div>
+            {if $file.authorid != 0}{$CONST.POSTED_BY} {$file.authorname}{/if} {$CONST.ON} {$file.date|@formatTime:DATE_FORMAT_ENTRY}.
+            {if $file.hotlink}
+                {$file.nice_hotlink}
+            {elseif $file.is_image}
+                {$CONST.ORIGINAL_SHORT}: {$file.dimensions_width}x{$file.dimensions_height},
+                {$CONST.THUMBNAIL_SHORT}: {$file.dim.0}x{$file.dim.1}
+            {/if}
+            , {$file.nice_size}kb
+        </div>
+
+        <input type="hidden" name="serendipity[mediaProperties][{$mediakey}][image_id]" value="{$file.image_id}" />
+        <h3>{$CONST.MEDIA_PROP}</h3>
+        <div>
+        {foreach from=$file.base_property key="prop_fieldname" item="prop_content"}
+            <label for="mediaProperty{$prop_fieldname}">{$prop_content.label}</label><br />
+            <div>
+            {if $prop_content.type == 'textarea'}
+                <textarea cols="80" rows="5" id="mediaProperty{$prop_fieldname}" name="serendipity[mediaProperties][{$mediakey}][{$prop_content.title}]">{$prop_content.val|@escape}</textarea>
+            {elseif $prop_content.type == 'readonly'}
+                <div>{$prop_content.val|@escape}</div>
+            {elseif $prop_content.type == 'input'}
+                <input id="mediaProperty{$prop_fieldname}" type="text" name="serendipity[mediaProperties][{$mediakey}][{$prop_content.title}]" value="{$prop_content.val|@escape}" />
+            {/if}
+            </div>
+        {/foreach}
+        </div>
+
+        <h3>{$CONST.MEDIA_KEYWORDS}</h3>
+        <div>
+            <table>
+            {foreach from=$file.base_keywords key="keyword_row" item="keyword_cells"}
+                <tr>
+                {foreach from=$keyword_cells key="keyword_cell" item="keyword"}
+                    <td>
+                    {if $keyword.name}
+                        <input id="mediaKeyword{$keyword.name}{$mediakey}" type="checkbox" name="serendipity[mediaKeywords][{$mediakey}][{$keyword.name}]" value="true" {if $keyword.selected}checked="checked"{/if} />&nbsp;<label for="mediaKeyword{$keyword.name}{$mediakey}">{$keyword.name}</label>
+                    {else}
+                        &nbsp;
+                    {/if}
+                    </td>
+                {/foreach}
+                </tr>
+            {/foreach}
+            </table>
+        </div>
+    {/if}
+
     {if $media.enclose AND (($smarty.foreach.mediafiles.iteration % $media.lineBreak) == 0)}
     </tr><tr>
     {/if}
diff --git a/templates/default/admin/media_properties.tpl b/templates/default/admin/media_properties.tpl
new file mode 100644 (file)
index 0000000..754c434
--- /dev/null
@@ -0,0 +1,18 @@
+{if $media.is_edit}
+<form id="mediaPropertyForm" action="?" method="POST">
+    <div>
+        <?php echo serendipity_setFormToken(); ?>
+        <input type="hidden" name="serendipity[action]"         value="admin" />
+        <input type="hidden" name="serendipity[adminModule]"    value="images" />
+        <input type="hidden" name="serendipity[adminAction]"    value="add" />
+        <input type="hidden" name="serendipity[adminSubAction]" value="properties" />
+        {$media.editform_hidden}
+{/if}
+
+{$MEDIA_ITEMS}
+
+{if $media.is_edit}
+    <br /><input type="submit" name="submit" value="{$CONST.GO}" class="serendipityPrettyButton" />
+    </div>
+</form>
+{/if}
diff --git a/templates/default/admin/media_upload.tpl b/templates/default/admin/media_upload.tpl
new file mode 100644 (file)
index 0000000..dbae3ff
--- /dev/null
@@ -0,0 +1,260 @@
+<div class="image_add_form">{$CONST.ADD_MEDIA_BLAHBLAH}</div>
+
+<script type="text/javascript">
+// Function prototype inspired by http://molily.de/javascript-nodelist
+function showNodes(n) {ldelim}
+    var html;
+    html = '<!--nodeset--><li>';
+
+    switch (n.nodeType) {ldelim}
+        case 1:
+            html += 'Type is <em>' + n.nodeName + '<\/em>';
+            if (n.hasChildNodes()) {ldelim}
+                ausgabe += ' - childNodes: ' + n.childNodes.length;
+            {rdelim}
+            break;
+
+        case 3:
+            var nval = n.nodeValue.replace(/</g, '&lt;').replace(/\n/g, '\\n');
+            html += 'Content: <strong>' + nval + '<\/strong>';
+            break;
+
+        case 8:
+            var nval = n.nodeValue.replace(/</g, '&lt;').replace(/\n/g, '\\n');
+            html += 'Hidden: <em>' + nval + '<\/em>';
+            break;
+
+        default:
+            html += 'Type is ' + n.nodeType + ', Content is <strong>' + n.nodeValue + '<\/strong>';
+    }
+
+    if (n.hasChildNodes()) {ldelim}
+        html += '\n<ol>\n';
+        for (i=0; i < n.childNodes.length; i++) {ldelim}
+            j = n.childNodes[i];
+            html += showNodes(j);
+        {rdelim}
+        html += '</ol>\n';
+    {rdelim}
+    html += '</li>\n';
+
+    return html;
+{rdelim}
+
+function getfilename(value) {ldelim}
+    re = /^.+[\/\\]+?(.+)$/;
+    return value.replace(re, "$1");
+{rdelim}
+
+isFileUpload = true;
+function hideForeign() {ldelim}
+    document.getElementById('foreign_upload').style.display = 'none';
+    document.getElementById('imageurl').value = '';
+    isFileUpload = false;
+{rdelim}
+
+var fieldcount = 1;
+function addField() {ldelim}
+    fieldcount++;
+
+    fields = document.getElementById('upload_template').cloneNode(true);
+    fields.id = 'upload_form_' + fieldcount;
+    fields.style.display = 'block';
+
+    // Get the DOM outline be uncommenting this:
+    //document.getElementById('debug').innerHTML = showNodes(fields);
+
+    // garvin: This gets a bit weird. Opera, Mozilla and IE all have their own numbering.
+    // We cannot operate on "ID" basis, since a unique ID is not yet set before instancing.
+    if (fields.childNodes[0].nodeValue == null) {ldelim}
+        // This is Internet Explorer, it does not have a linebreak as first element.
+        userfile       = fields.childNodes[0].childNodes[0].childNodes[0].childNodes[1].childNodes[0];
+        targetfilename = fields.childNodes[0].childNodes[0].childNodes[2].childNodes[1].childNodes[0];
+        targetdir      = fields.childNodes[0].childNodes[0].childNodes[3].childNodes[1].childNodes[0];
+        columncount    = fields.childNodes[1].childNodes[0];
+    {rdelim} else {ldelim}
+        // We have a browser which has \n's as their own nodes. Don't ask me. Now let's check if it's Opera or Mozilla.
+        if (fields.childNodes[1].childNodes[0].nodeValue == null) {ldelim}
+            // This is Opera.
+            userfile       = fields.childNodes[1].childNodes[0].childNodes[0].childNodes[1].childNodes[0];
+            targetfilename = fields.childNodes[1].childNodes[0].childNodes[2].childNodes[1].childNodes[0];
+            targetdir      = fields.childNodes[1].childNodes[0].childNodes[3].childNodes[1].childNodes[0];
+            columncount    = fields.childNodes[3].childNodes[0];
+        {rdelim} else if (fields.childNodes[1].childNodes[1].childNodes[0].childNodes[3] == null) {ldelim}
+               // This is Safari.
+            userfile       = fields.childNodes[1].childNodes[1].childNodes[0].childNodes[1].childNodes[0];
+            targetfilename = fields.childNodes[1].childNodes[1].childNodes[2].childNodes[1].childNodes[0];
+            targetdir      = fields.childNodes[1].childNodes[1].childNodes[3].childNodes[1].childNodes[0];
+            columncount    = fields.childNodes[3].childNodes[0];
+        {rdelim} else {ldelim}
+            // This is Mozilla.
+            userfile       = fields.childNodes[1].childNodes[1].childNodes[0].childNodes[3].childNodes[0];
+            targetfilename = fields.childNodes[1].childNodes[1].childNodes[4].childNodes[3].childNodes[0];
+            targetdir      = fields.childNodes[1].childNodes[1].childNodes[6].childNodes[3].childNodes[0];
+            columncount    = fields.childNodes[3].childNodes[0];
+        {rdelim}
+    {rdelim}
+
+    userfile.id   = 'userfile_' + fieldcount;
+    userfile.name = 'serendipity[userfile][' + fieldcount + ']';
+
+    targetfilename.id   = 'target_filename_' + fieldcount;
+    targetfilename.name = 'serendipity[target_filename][' + fieldcount + ']';
+
+    targetdir.id   = 'target_directory_' + fieldcount;
+    targetdir.name = 'serendipity[target_directory][' + fieldcount + ']';
+
+    columncount.id   = 'column_count_' + fieldcount;
+    columncount.name = 'serendipity[column_count][' + fieldcount + ']';
+
+    iNode = document.getElementById('upload_form');
+    iNode.parentNode.insertBefore(fields, iNode);
+
+    document.getElementById(targetdir.id).selectedIndex = document.getElementById('target_directory_' + (fieldcount - 1)).selectedIndex;
+{rdelim}
+
+var inputStorage = new Array();
+function checkInputs() {ldelim}
+    for (i = 1; i <= fieldcount; i++) {ldelim}
+        if (!inputStorage[i]) {ldelim}
+            fillInput(i, i);
+        {rdelim} else if (inputStorage[i] == document.getElementById('target_filename_' + i).value) {ldelim}
+            fillInput(i, i);
+        {rdelim}
+    {rdelim}
+
+{rdelim}
+
+function debugFields() {ldelim}
+    for (i = 1; i <= fieldcount; i++) {ldelim}
+        debugField('target_filename_' + i);
+        debugField('userfile_' + i);
+    {rdelim}
+{rdelim}
+
+function rememberOptions() {ldelim}
+    td     = document.getElementById('target_directory_2');
+    td_val = td.options[td.selectedIndex].value;
+    SetCookie("addmedia_directory", td_val);
+{rdelim}
+
+function debugField(id) {ldelim}
+    alert(id + ': ' + document.getElementById(id).value);
+{rdelim}
+
+function fillInput(source, target) {ldelim}
+    useDuplicate = false;
+
+    // First field is a special value for foreign URLs instead of uploaded files
+    if (source == 1 && document.getElementById('imageurl').value != "") {ldelim}
+        sourceval = getfilename(document.getElementById('imageurl').value);
+        useDuplicate = true;
+    {rdelim} else {ldelim}
+        sourceval = getfilename(document.getElementById('userfile_' + source).value);
+    {rdelim}
+
+    if (sourceval.length > 0) {ldelim}
+        document.getElementById('target_filename_' + target).value = sourceval;
+        inputStorage[target] = sourceval;
+    {rdelim}
+
+    // Display filename in duplicate form as well!
+    if (useDuplicate) {ldelim}
+        tkey = target + 1;
+
+        if (!inputStorage[tkey] || inputStorage[tkey] == document.getElementById('target_filename_' + tkey).value) {ldelim}
+            document.getElementById('target_filename_' + (target+1)).value = sourceval;
+            inputStorage[target + 1] = '~~~';
+        {rdelim}
+    {rdelim}
+{rdelim}
+</script>
+
+<form action="?" method="POST" id="uploadform" enctype="multipart/form-data" onsubmit="rememberOptions()">
+    <div>
+        {$media.token}
+        <input type="hidden" name="serendipity[action]"      value="admin" />
+        <input type="hidden" name="serendipity[adminModule]" value="images" />
+        <input type="hidden" name="serendipity[adminAction]" value="add" />
+        {$media.form_hidden}
+        <table id="foreign_upload" class="image_add_foreign">
+            <tr>
+                <td nowrap="nowrap">{$CONST.ENTER_MEDIA_URL}</td>
+                <td><input type="text" id="imageurl" name="serendipity[imageurl]"
+                         onchange="checkInputs()"
+                          value=""
+                           size="40" /></td>
+            </tr>
+            <tr>
+                <td nowrap="nowrap">{$CONST.ENTER_MEDIA_URL_METHOD}</td>
+                <td>
+                    <select name="serendipity[imageimporttype]">
+                        <option value="image">{$CONST.FETCH_METHOD_IMAGE}</option>
+                        <option value="hotlink">{$CONST.FETCH_METHOD_HOTLINK}</option>
+                    </select>
+                </td>
+            </tr>
+
+            <tr>
+                <td align="center" colspan="2"><b> - {$CONST.WORD_OR} - </b></td>
+            </tr>
+        </table>
+
+        <!-- WARNING: Do not change spacing or breaks below. If you do, the JavaScript childNodes need to be edited. Newlines count as nodes! -->
+        <div id="upload_template">
+        <table style="margin-top: 35px" id="upload_table" class="image_add_local">
+            <tr>
+                <td nowrap='nowrap'>{$CONST.ENTER_MEDIA_UPLOAD}</td>
+                <td><input id="userfile_1" name="serendipity[userfile][1]"
+                         onchange="checkInputs();"
+                           type="file" /></td>
+            </tr>
+
+            <tr>
+                <td align="center" colspan="2"><br /></td>
+            </tr>
+
+            <tr>
+                <td>{$CONST.SAVE_FILE_AS}</td>
+                <td><input type="text" id="target_filename_1" name="serendipity[target_filename][1]" value="" size="40" /></td>
+            </tr>
+
+            <tr>
+                <td>{$CONST.STORE_IN_DIRECTORY}</td>
+                <td><select id="target_directory_1" name="serendipity[target_directory][1]">
+                    <option value="">{$CONST.BASE_DIRECTORY}</option>
+                    {foreach from=$media.folders item="folder"}
+                    <option {if $media.only_path == $folder.relpath}selected="selected"{/if} value="{$folder.relpath}">{'&nbsp;'|@str_repeat:$folder.depth*2} {$folder.name}</option>
+                    {/foreach}
+                    </select>
+                </td>
+            </tr>
+       </table>
+       <div id="ccounter"><input type="hidden" name="serendipity[column_count][1]" id="column_count_1" value="true" /></div>
+       </div>
+
+       <div id="debug">
+       </div>
+
+       <script type="text/javascript">
+            document.getElementById('upload_template').style.display  = 'none';
+            document.write('<span id="upload_form"><' + '/span>');
+            addField();
+       </script>
+
+        {serendipity_hookPlugin hook="backend_image_addform" hookAll=true}
+
+        <div style="text-align: center; margin-top: 15px; margin-bottom: 15px">
+            <script type="text/javascript">
+                document.write('<input class="serendipityPrettyButton" type="button" value="{$CONST.IMAGE_MORE_INPUT}" onclick="hideForeign(); addField()"' + '/><br' + '/>');
+            </script>
+            <input type="hidden" name="serendipity[all_authors]" value="true" checked="checked" id="all_authors" />
+            <br />
+            <input onclick="checkInputs();" type="submit" value="{$CONST.GO}" class="serendipityPrettyButton" />
+            - {$CONST.WORD_OR} -
+            <input onclick="checkInputs();" name="go_properties" type="submit" value="{$CONST.GO_ADD_PROPERTIES|@escape}" class="serendipityPrettyButton" />
+        </div>
+    </div>
+    <div class="image_add_note">{$CONST.ADD_MEDIA_BLAHBLAH_NOTE}</div>
+</form>
+