* 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.
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, '<').replace(/\n/g, '\\n');
- html += 'Content: <strong>' + nval + '<\/strong>';
- break;
-
- case 8:
- var nval = n.nodeValue.replace(/</g, '<').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(' ', $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':
}
}
+ $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,
$manage,
$lineBreak,
true,
- $limit_path,
- $perPage,
- $show_upload,
- $page,
- $pages,
- $linkNext,
- $linkPrevious);
+ $smarty_vars
+ );
} // End serendipity_displayImageList()
/**
* @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) {
$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";
}
}
$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));
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 . ' /> <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;
}
* @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 = '';
'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;
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;
-{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} /> <label for="mediaKeyword{$keyword.name}{$mediakey}">{$keyword.name}</label>
+ {else}
+
+ {/if}
+ </td>
+ {/foreach}
+ </tr>
+ {/foreach}
+ </table>
+ </div>
+ {/if}
+
{if $media.enclose AND (($smarty.foreach.mediafiles.iteration % $media.lineBreak) == 0)}
</tr><tr>
{/if}
--- /dev/null
+{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}
--- /dev/null
+<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, '<').replace(/\n/g, '\\n');
+ html += 'Content: <strong>' + nval + '<\/strong>';
+ break;
+
+ case 8:
+ var nval = n.nodeValue.replace(/</g, '<').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}">{' '|@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>
+