From: garvinhicking Date: Thu, 6 Apr 2006 14:00:02 +0000 (+0000) Subject: Added directory tree view widget (JS) to the Media Selector X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=0d730e1abb04da330fa72ce849d74d13558c666b;p=s9y.git Added directory tree view widget (JS) to the Media Selector --- diff --git a/bundled-libs/YahooUI/treeview/YAHOO.js b/bundled-libs/YahooUI/treeview/YAHOO.js new file mode 100644 index 0000000..33e3ff4 --- /dev/null +++ b/bundled-libs/YahooUI/treeview/YAHOO.js @@ -0,0 +1,63 @@ +/* +Copyright (c) 2006 Yahoo! Inc. All rights reserved. +version 0.9.0 +*/ + +/** + * @class The Yahoo global namespace + */ +var YAHOO = function() { + + return { + + /** + * Yahoo presentation platform utils namespace + */ + util: {}, + + /** + * Yahoo presentation platform widgets namespace + */ + widget: {}, + + /** + * Yahoo presentation platform examples namespace + */ + example: {}, + + /** + * Returns the namespace specified and creates it if it doesn't exist + * + * YAHOO.namespace("property.package"); + * YAHOO.namespace("YAHOO.property.package"); + * + * Either of the above would create YAHOO.property, then + * YAHOO.property.package + * + * @param {String} sNameSpace String representation of the desired + * namespace + * @return {Object} A reference to the namespace object + */ + namespace: function( sNameSpace ) { + + if (!sNameSpace || !sNameSpace.length) { + return null; + } + + var levels = sNameSpace.split("."); + + var currentNS = YAHOO; + + // YAHOO is implied, so it is ignored if it is included + for (var i=(levels[0] == "YAHOO") ? 1 : 0; i '; + } + + var f = document.createElement("div"); + var s = f.style; + s.position = "absolute"; + s.top = "-1000px"; + s.left = "-1000px"; + f.innerHTML = sb.join(""); + + document.body.appendChild(f); +}; + +YAHOO.widget.TreeView.addHandler(window, + "load", YAHOO.widget.TreeView.preload); + +/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */ + +/** + * @class Abstract node class + * @constructor + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {YAHOO.widget.Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ +YAHOO.widget.Node = function(oData, oParent, expanded) { + if (oParent) { this.init(oData, oParent, expanded); } +}; + +YAHOO.widget.Node.prototype = { + + /** + * The index for this instance obtained from global counter in YAHOO.widget.TreeView. + * + * @type int + */ + index: 0, + + /** + * This node's child node collection. + * + * @type YAHOO.widget.Node[] + */ + children: null, + + /** + * Tree instance this node is part of + * + * @type YAHOO.widget.TreeView + */ + tree: null, + + /** + * The data linked to this node. This can be any object or primitive + * value, and the data can be used in getNodeHtml(). + * + * @type object + */ + data: null, + + /** + * Parent node + * + * @type YAHOO.widget.Node + */ + parent: null, + + /** + * The depth of this node. We start at -1 for the root node. + * + * @type int + */ + depth: -1, + + /** + * The href for the node's label. If one is not specified, the href will + * be set so that it toggles the node. + * + * @type string + */ + href: null, + + /** + * The label href target, defaults to current window + * + * @type string + */ + target: "_self", + + /** + * The node's expanded/collapsed state + * + * @type boolean + */ + expanded: false, + + /** + * Can multiple children be expanded at once? + * + * @type boolean + */ + multiExpand: true, + + /** + * Should we render children for a collapsed node? It is possible that the + * implementer will want to render the hidden data... @todo verify that we + * need this, and implement it if we do. + * + * @type boolean + */ + renderHidden: false, + + /** + * Flag that is set to true the first time this node's children are rendered. + * + * @type boolean + */ + childrenRendered: false, + + /** + * This node's previous sibling + * + * @type YAHOO.widget.Node + */ + previousSibling: null, + + /** + * This node's next sibling + * + * @type YAHOO.widget.Node + */ + nextSibling: null, + + /** + * We can set the node up to call an external method to get the child + * data dynamically. + * + * @type boolean + * @private + */ + _dynLoad: false, + + /** + * Function to execute when we need to get this node's child data. + * + * @type function + */ + dataLoader: null, + + /** + * This is true for dynamically loading nodes while waiting for the + * callback to return. + * + * @type boolean + */ + isLoading: false, + + /** + * The toggle/branch icon will not show if this is set to false. This + * could be useful if the implementer wants to have the child contain + * extra info about the parent, rather than an actual node. + * + * @type boolean + */ + hasIcon: true, + + /** + * Initializes this node, gets some of the properties from the parent + * + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {YAHOO.widget.Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ + init: function(oData, oParent, expanded) { + this.data = oData; + this.children = []; + this.index = YAHOO.widget.TreeView.nodeCount; + ++YAHOO.widget.TreeView.nodeCount; + this.expanded = expanded; + + // oParent should never be null except when we create the root node. + if (oParent) { + this.tree = oParent.tree; + this.parent = oParent; + this.href = "javascript:" + this.getToggleLink(); + this.depth = oParent.depth + 1; + this.multiExpand = oParent.multiExpand; + + oParent.appendChild(this); + } + }, + + /** + * Appends a node to the child collection. + * + * @param node {YAHOO.widget.Node} the new node + * @return {YAHOO.widget.Node} the child node + * @private + */ + appendChild: function(node) { + if (this.hasChildren()) { + var sib = this.children[this.children.length - 1]; + sib.nextSibling = node; + node.previousSibling = sib; + } + + this.tree.regNode(node); + this.children[this.children.length] = node; + return node; + + }, + + /** + * Returns a node array of this node's siblings, null if none. + * + * @return YAHOO.widget.Node[] + */ + getSiblings: function() { + return this.parent.children; + }, + + /** + * Shows this node's children + */ + showChildren: function() { + if (!this.tree.animateExpand(this.getChildrenEl())) { + if (this.hasChildren()) { + this.getChildrenEl().style.display = ""; + } + } + }, + + /** + * Hides this node's children + */ + hideChildren: function() { + + if (!this.tree.animateCollapse(this.getChildrenEl())) { + this.getChildrenEl().style.display = "none"; + } + }, + + /** + * Returns the id for this node's container div + * + * @return {string} the element id + */ + getElId: function() { + return "ygtv" + this.index; + }, + + /** + * Returns the id for this node's children div + * + * @return {string} the element id for this node's children div + */ + getChildrenElId: function() { + return "ygtvc" + this.index; + }, + + /** + * Returns the id for this node's toggle element + * + * @return {string} the toggel element id + */ + getToggleElId: function() { + return "ygtvt" + this.index; + }, + + /** + * Returns this node's container html element + * + * @return {Object} the container html element + */ + getEl: function() { + return document.getElementById(this.getElId()); + }, + + /** + * Returns the div that was generated for this node's children + * + * @return {Object} this node's children div + */ + getChildrenEl: function() { + return document.getElementById(this.getChildrenElId()); + }, + + /** + * Returns the element that is being used for this node's toggle. + * + * @return {Object} this node's toggel html element + */ + getToggleEl: function() { + return document.getElementById(this.getToggleElId()); + }, + + /** + * Generates the link that will invoke this node's toggle method + * + * @return {string} the javascript url for toggling this node + */ + getToggleLink: function() { + return "YAHOO.widget.TreeView.getNode(\'" + this.tree.id + "\'," + + this.index + ").toggle()"; + }, + + /** + * Hides this nodes children (creating them if necessary), changes the + * toggle style. + */ + collapse: function() { + // Only collapse if currently expanded + if (!this.expanded) { return; } + + if (!this.getEl()) { + this.expanded = false; + return; + } + + // hide the child div + this.hideChildren(); + this.expanded = false; + + if (this.hasIcon) { + this.getToggleEl().className = this.getStyle(); + } + + // fire the collapse event handler + this.tree.onCollapse(this); + }, + + /** + * Shows this nodes children (creating them if necessary), changes the + * toggle style, and collapses its siblings if multiExpand is not set. + */ + expand: function() { + // Only expand if currently collapsed. + if (this.expanded) { return; } + + if (!this.getEl()) { + this.expanded = true; + return; + } + + if (! this.childrenRendered) { + this.getChildrenEl().innerHTML = this.renderChildren(); + } + + this.expanded = true; + if (this.hasIcon) { + this.getToggleEl().className = this.getStyle(); + } + + // We do an extra check for children here because the lazy + // load feature can expose nodes that have no children. + + // if (!this.hasChildren()) { + if (this.isLoading) { + this.expanded = false; + return; + } + + if (! this.multiExpand) { + var sibs = this.getSiblings(); + for (var i=0; i 0 || + (checkForLazyLoad && this.isDynamic() && !this.childrenRendered) ); + }, + + /** + * Expands if node is collapsed, collapses otherwise. + */ + toggle: function() { + if (!this.tree.locked && ( this.hasChildren(true) || this.isDynamic()) ) { + if (this.expanded) { this.collapse(); } else { this.expand(); } + } + }, + + /** + * Returns the markup for this node and its children. + * + * @return {string} the markup for this node and its expanded children. + */ + getHtml: function() { + var sb = []; + sb[sb.length] = '
'; + sb[sb.length] = this.getNodeHtml(); + sb[sb.length] = this.getChildrenHtml(); + sb[sb.length] = '
'; + return sb.join(""); + }, + + /** + * Called when first rendering the tree. We always build the div that will + * contain this nodes children, but we don't render the children themselves + * unless this node is expanded. + * + * @return {string} the children container div html and any expanded children + * @private + */ + getChildrenHtml: function() { + var sb = []; + sb[sb.length] = '
= this.depth || depth < 0) { + return null; + } + + var p = this.parent; + + while (p.depth > depth) { + p = p.parent; + } + + return p; + }, + + /** + * Returns the css class for the spacer at the specified depth for + * this node. If this node's ancestor at the specified depth + * has a next sibling the presentation is different than if it + * does not have a next sibling + * + * @param {int} depth the depth of the ancestor. + * @return {string} the css class for the spacer + */ + getDepthStyle: function(depth) { + return (this.getAncestor(depth).nextSibling) ? + "ygtvdepthcell" : "ygtvblankdepthcell"; + }, + + /** + * Get the markup for the node. This is designed to be overrided so that we can + * support different types of nodes. + * + * @return {string} the html for this node + */ + getNodeHtml: function() { + return ""; + } + +}; + +/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */ + +/** + * @class A custom YAHOO.widget.Node that handles the unique nature of + * the virtual, presentationless root node. + * + * @extends YAHOO.widget.Node + * @constructor + */ +YAHOO.widget.RootNode = function(oTree) { + // Initialize the node with null params. The root node is a + // special case where the node has no presentation. So we have + // to alter the standard properties a bit. + this.init(null, null, true); + + /** + * For the root node, we get the tree reference from as a param + * to the constructor instead of from the parent element. + * + * @type YAHOO.widget.TreeView + */ + this.tree = oTree; +}; +YAHOO.widget.RootNode.prototype = new YAHOO.widget.Node(); + +// overrides YAHOO.widget.Node +YAHOO.widget.RootNode.prototype.getNodeHtml = function() { + return ""; +}; + +/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */ + +/** + * @class The default node presentation. The first parameter should be + * either a string that will be used as the node's label, or an object + * that has a string propery called label. By default, the clicking the + * label will toggle the expanded/collapsed state of the node. By + * changing the href property of the instance, this behavior can be + * changed so that the label will go to the specified href. + * + * @extends YAHOO.widget.Node + * @constructor + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {YAHOO.widget.Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ +YAHOO.widget.TextNode = function(oData, oParent, expanded) { + if (oParent) { + this.init(oData, oParent, expanded); + this.setUpLabel(oData); + } +}; + +YAHOO.widget.TextNode.prototype = new YAHOO.widget.Node(); + +/** + * The CSS class for the label href. Defaults to ygtvlabel, but can be + * overridden to provide a custom presentation for a specific node. + * + * @type string + */ +YAHOO.widget.TextNode.prototype.labelStyle = "ygtvlabel"; + +/** + * The derived element id of the label for this node + * + * @type string + */ +YAHOO.widget.TextNode.prototype.labelElId = null; + +/** + * The text for the label. It is assumed that the oData parameter will + * either be a string that will be used as the label, or an object that + * has a property called "label" that we will use. + * + * @type string + */ +YAHOO.widget.TextNode.prototype.label = null; + +/** + * Sets up the node label + * + * @param oData string containing the label, or an object with a label property + */ +YAHOO.widget.TextNode.prototype.setUpLabel = function(oData) { + if (typeof oData == "string") { + oData = { label: oData }; + } + this.label = oData.label; + + // update the link + if (oData.href) { + this.href = oData.href; + } + + // set the target + if (oData.target) { + this.target = oData.target; + } + + this.labelElId = "ygtvlabelel" + this.index; +}; + +/** + * Returns the label element + * + * @return {object} the element + */ +YAHOO.widget.TextNode.prototype.getLabelEl = function() { + return document.getElementById(this.labelElId); +}; + +// overrides YAHOO.widget.Node +YAHOO.widget.TextNode.prototype.getNodeHtml = function() { + var sb = new Array(); + + sb[sb.length] = ''; + sb[sb.length] = ''; + + for (i=0;i '; + } + + var getNode = 'YAHOO.widget.TreeView.getNode(\'' + + this.tree.id + '\',' + this.index + ')'; + + sb[sb.length] = ' '; + sb[sb.length] = ''; + sb[sb.length] = ''; + } + + if (this.hasIcon) { + sb[sb.length] = ' '; + if (this.hasChildren(true)) { + sb[sb.length] = ' onmouseover="this.className='; + sb[sb.length] = 'YAHOO.widget.TreeView.getNode(\''; + sb[sb.length] = this.tree.id + '\',' + this.index + ').getHoverStyle()"'; + sb[sb.length] = ' onmouseout="this.className='; + sb[sb.length] = 'YAHOO.widget.TreeView.getNode(\''; + sb[sb.length] = this.tree.id + '\',' + this.index + ').getStyle()"'; + } + sb[sb.length] = ''; + } + + sb[sb.length] = ' diff --git a/docs/NEWS b/docs/NEWS index 4fc4d47..cb9add9 100644 --- a/docs/NEWS +++ b/docs/NEWS @@ -3,6 +3,9 @@ Version 1.1-alpha1() ------------------------------------------------------------------------ + * Added directory tree view widget (JS) to the Media Selector + (garvinhicking) + * Create a new index on the plugin DB table, optimize fetching config values for plugins. Load language file when permissions could not allow reading the config file. (garvinhicking) diff --git a/include/admin/images.inc.php b/include/admin/images.inc.php index 23efa34..0d14c9c 100644 --- a/include/admin/images.inc.php +++ b/include/admin/images.inc.php @@ -91,7 +91,7 @@ switch ($serendipity['GET']['adminAction']) { 'thumb' => $serendipity['thumbSuffix'], 'fthumb' => $file['thumbnail_name'] )); - + serendipity_plugin_api::hook_event('backend_media_rename', $renameValues); // Rename file @@ -191,7 +191,7 @@ switch ($serendipity['GET']['adminAction']) { $fp = fopen($tempfile, 'w'); fwrite($fp, $fContent); fclose($fp); - + $image_id = @serendipity_insertHotlinkedImageInDatabase($tfile, $serendipity['POST']['imageurl'], $authorid, null, $tempfile); printf(HOTLINK_DONE. '
', $serendipity['POST']['imageurl'], $tfile); serendipity_plugin_api::hook_event('backend_image_addHotlink', $tempfile); @@ -207,7 +207,7 @@ switch ($serendipity['GET']['adminAction']) { 'thumb' => $serendipity['thumbSuffix'] )); serendipity_plugin_api::hook_event('backend_media_makethumb', $thumbs); - + foreach($thumbs as $thumb) { // Create thumbnail if ( $created_thumbnail = serendipity_makeThumbnail($tfile, $serendipity['POST']['target_directory'][$tindex], $thumb['thumbSize'], $thumb['thumb']) ) { @@ -226,7 +226,7 @@ switch ($serendipity['GET']['adminAction']) { if (!is_array($serendipity['POST']['target_filename'])) { break; } - + foreach($serendipity['POST']['target_filename'] AS $idx => $target_filename) { $uploadfile = &$_FILES['serendipity']['name']['userfile'][$idx]; $uploadtmp = &$_FILES['serendipity']['tmp_name']['userfile'][$idx]; @@ -238,7 +238,7 @@ switch ($serendipity['GET']['adminAction']) { // skip empty array continue; } - + $tfile = serendipity_uploadSecure(basename($tfile)); if (serendipity_isActiveFile($tfile)) { @@ -246,10 +246,10 @@ switch ($serendipity['GET']['adminAction']) { echo '
'; continue; } - + $serendipity['POST']['target_directory'][$idx] = serendipity_uploadSecure($serendipity['POST']['target_directory'][$idx], true, true); $target = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $serendipity['POST']['target_directory'][$idx] . $tfile; - + if (file_exists($target)) { echo '(' . $target . ') ' . ERROR_FILE_EXISTS_ALREADY; echo '
'; @@ -259,13 +259,13 @@ switch ($serendipity['GET']['adminAction']) { printf(FILE_UPLOADED . '
', $uploadfile, $target); @umask(0000); @chmod($target, 0664); - + $thumbs = array(array( 'thumbSize' => $serendipity['thumbSize'], 'thumb' => $serendipity['thumbSuffix'] )); serendipity_plugin_api::hook_event('backend_media_makethumb', $thumbs); - + foreach($thumbs as $thumb) { // Create thumbnail if ( $created_thumbnail = serendipity_makeThumbnail($tfile, $serendipity['POST']['target_directory'][$idx], $thumb['thumbSize'], $thumb['thumb']) ) { @@ -315,11 +315,11 @@ switch ($serendipity['GET']['adminAction']) { 'relpath' => $use_dir ) ); - + if (!serendipity_directoryACL($checkpath, 'write')) { return; } - + if (!empty($serendipity['POST']['save'])) { serendipity_ACLGrant(0, 'directory', 'read', $serendipity['POST']['read_authors'], $use_dir); serendipity_ACLGrant(0, 'directory', 'write', $serendipity['POST']['write_authors'], $use_dir); @@ -334,7 +334,7 @@ switch ($serendipity['GET']['adminAction']) {

- +
'; + sb[sb.length] = ' 
@@ -354,7 +354,7 @@ switch ($serendipity['GET']['adminAction']) { - +
@@ -390,7 +390,7 @@ switch ($serendipity['GET']['adminAction']) {

- + @@ -424,6 +424,8 @@ switch ($serendipity['GET']['adminAction']) { printf(DIRECTORY_CREATED, $serendipity['POST']['name']); @umask(0000); @chmod($serendipity['serendipityPath'] . $serendipity['uploadPath'] . $new_dir, 0777); + serendipity_ACLGrant(0, 'directory', 'read', array(0), $new_dir . '/'); + serendipity_ACLGrant(0, 'directory', 'write', array(0), $new_dir . '/'); } else { printf(DIRECTORY_WRITE_ERROR, $new_dir); } @@ -450,7 +452,7 @@ switch ($serendipity['GET']['adminAction']) {

- +
@@ -608,10 +610,10 @@ switch ($serendipity['GET']['adminAction']) { 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]; + 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]; + columncount = fields.childNodes[3].childNodes[0]; } else { // This is Mozilla. userfile = fields.childNodes[1].childNodes[1].childNodes[0].childNodes[3].childNodes[0]; @@ -620,16 +622,16 @@ switch ($serendipity['GET']['adminAction']) { 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 + ']'; @@ -638,7 +640,7 @@ switch ($serendipity['GET']['adminAction']) { document.getElementById(targetdir.id).selectedIndex = document.getElementById('target_directory_' + (fieldcount - 1)).selectedIndex; } - + var inputStorage = new Array(); function checkInputs() { for (i = 1; i <= fieldcount; i++) { @@ -650,14 +652,14 @@ switch ($serendipity['GET']['adminAction']) { } } - + 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; @@ -677,7 +679,7 @@ switch ($serendipity['GET']['adminAction']) { useDuplicate = true; } else { sourceval = getfilename(document.getElementById('userfile_' + source).value); - } + } if (sourceval.length > 0) { document.getElementById('target_filename_' + target).value = sourceval; @@ -687,7 +689,7 @@ switch ($serendipity['GET']['adminAction']) { // 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] = '~~~'; @@ -698,7 +700,7 @@ switch ($serendipity['GET']['adminAction']) {
- + @@ -713,9 +715,9 @@ switch ($serendipity['GET']['adminAction']) {
- @@ -738,8 +740,8 @@ switch ($serendipity['GET']['adminAction']) {
- @@ -765,7 +767,7 @@ switch ($serendipity['GET']['adminAction']) {
- +
@@ -774,14 +776,14 @@ switch ($serendipity['GET']['adminAction']) { document.write('<' + '/span>'); addField(); - +
- +
@@ -888,7 +890,7 @@ switch ($serendipity['GET']['adminAction']) {
- + " /> diff --git a/include/functions.inc.php b/include/functions.inc.php index eb9382d..c76a073 100644 --- a/include/functions.inc.php +++ b/include/functions.inc.php @@ -1034,5 +1034,29 @@ if (!function_exists('microtime_float')) { } } +/** + * Converts Array data to be used as a GET string + */ +function serendipity_build_query(&$array, $array_prefix = null, $comb_char = '&') { + $ret = array(); + if (!is_array($array)) { + return ''; + } + + foreach ($array as $k => $v) { + $newkey = urlencode($k); + if ($array_prefix) { + $newkey = $array_prefix . '[' . $newkey . ']'; + } + if (is_array($v)) { + $ret[] = serendipity_build_query($v, $newkey, $comb_char); + } else { + $ret[] = $newkey . '=' . urlencode($v); + } + } + + return implode($comb_char, $ret); +} + define("serendipity_FUNCTIONS_LOADED", true); /* vim: set sts=4 ts=4 expandtab : */ diff --git a/include/functions_images.inc.php b/include/functions_images.inc.php index 9b24023..5e85b98 100644 --- a/include/functions_images.inc.php +++ b/include/functions_images.inc.php @@ -248,21 +248,27 @@ function serendipity_fetchImages($group = false, $start = 0, $end = 20, $images if ($dir = @opendir($basedir . $odir)) { $aTempArray = array(); while (($file = @readdir($dir)) !== false) { + if ($file == '.svn' || $file == 'CVS' || $file == '.' || $file == '..') { + continue; + } array_push($aTempArray, $file); } @closedir($dir); sort($aTempArray); foreach($aTempArray as $f) { - if ($f != '.' && $f != '..' && strpos($f, $serendipity['thumbSuffix']) === false) { - $cdir = ($odir != '' ? $odir . '/' : ''); - if (is_dir($basedir . $odir . '/' . $f)) { - $temp = serendipity_fetchImages($group, $start, $end, $images, $cdir . $f); - foreach($temp AS $tkey => $tval) { - array_push($images, $tval); - } - } else { - array_push($images, $cdir . $f); + if (strpos($f, $serendipity['thumbSuffix']) !== false) { + // This is a s9y thumbnail, skip it. + continue; + } + + $cdir = ($odir != '' ? $odir . '/' : ''); + if (is_dir($basedir . $odir . '/' . $f)) { + $temp = serendipity_fetchImages($group, $start, $end, $images, $cdir . $f); + foreach($temp AS $tkey => $tval) { + array_push($images, $tval); } + } else { + array_push($images, $cdir . $f); } } } @@ -1193,7 +1199,7 @@ function serendipity_displayImageList($page = 0, $lineBreak = NULL, $manage = fa } unset($aResultSet[$sKey]); } - sort($paths); + //sort($paths); if ($debug) echo "

Got files:

" . print_r($aFilesOnDisk, true) . "

"; $serendipity['current_image_hash'] = md5(serialize($aFilesOnDisk)); @@ -1361,7 +1367,7 @@ function serendipity_displayImageList($page = 0, $lineBreak = NULL, $manage = fa - + diff --git a/serendipity_admin_image_selector.php b/serendipity_admin_image_selector.php index 095a134..c5a2ed4 100644 --- a/serendipity_admin_image_selector.php +++ b/serendipity_admin_image_selector.php @@ -24,12 +24,12 @@ if (!isset($serendipity['GET']['step'])) { function ifRemember($name, $value, $isDefault = false, $att = 'checked') { global $serendipity; - + if (!is_array($serendipity['COOKIE']) && !$isDefault) { return false; } - - if ((!is_array($serendipity['COOKIE']) && $isDefault) || + + if ((!is_array($serendipity['COOKIE']) && $isDefault) || (!isset($serendipity['COOKIE']['serendipity_' . $name]) && $isDefault) || (isset($serendipity['COOKIE']['serendipity_' . $name]) && $serendipity['COOKIE']['serendipity_' . $name] == $value)) { @@ -42,9 +42,24 @@ function ifRemember($name, $value, $isDefault = false, $att = 'checked') { <?php echo SELECT_FILE; ?> + + + - + + + + + + + +
+ " />
$serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $file['path'] . $file['name'] .'.'. $file['extension']); - serendipity_plugin_api::hook_event('frontend_image_selector_link_url', $aArray); + serendipity_plugin_api::hook_event('frontend_image_selector_link_url', $aArray); ?>
@@ -233,8 +267,8 @@ switch ($serendipity['GET']['step']) { ?> block = ''; - if (self.opener.editorref) { - self.opener.editorref.surroundHTML(block, ''); + if (parent.self.opener.editorref) { + parent.self.opener.editorref.surroundHTML(block, ''); } else { - self.opener.serendipity_imageSelector_addToBody(block, ''); + parent.self.opener.serendipity_imageSelector_addToBody(block, ''); } - self.close(); + parent.self.close(); true, ".svn" => true); + serendipity_plugin_api::hook_event('backend_media_path_exclude_directories', $aExclude); + $paths = array(); + + $aResultSet = serendipity_traversePath( + $serendipity['serendipityPath'] . $serendipity['uploadPath'], + '', + false, + NULL, + 1, + NULL, + FALSE, + $aExclude + ); + + foreach ($aResultSet AS $sKey => $sFile) { + if ($sFile['directory']) { + array_push($paths, $sFile); + } + unset($aResultSet[$sKey]); + } + serendipity_directoryACL($paths, 'read'); +?> + + +
+ +
+
+ +
+
+
+ +
+ +
+ +
+ + + +


@@ -282,7 +404,6 @@ switch ($serendipity['GET']['step']) { ); } ?> -
diff --git a/serendipity_editor.js b/serendipity_editor.js index c754971..fa927da 100644 --- a/serendipity_editor.js +++ b/serendipity_editor.js @@ -72,7 +72,7 @@ function wrapSelectionWithLink(txtarea) { document.getElementById && getMozSelection(txtarea) == "") { var my_desc = prompt("Enter Description", ''); } - + var my_title = prompt("Enter title/tooltip:", ""); html_title = ""; @@ -142,7 +142,7 @@ function serendipity_insLink (area) { area.focus(); return; } - + html_title = ""; if (my_title != "") { html_title = ' title="' + my_title + '"'; @@ -194,8 +194,8 @@ function serendipity_imageSelector_done(textarea) } if (f['serendipity[filename_only]'] && f['serendipity[filename_only]'].value == 'true') { - self.opener.serendipity_imageSelector_addToElement(img, f['serendipity[htmltarget]'].value); - self.close(); + parent.self.opener.serendipity_imageSelector_addToElement(img, f['serendipity[htmltarget]'].value); + parent.self.close(); return true; } @@ -232,14 +232,14 @@ function serendipity_imageSelector_done(textarea) block = insert; } - if (self.opener.editorref) { - self.opener.editorref.surroundHTML(block, ''); + if (parent.self.opener.editorref) { + parent.self.opener.editorref.surroundHTML(block, ''); } else { - - self.opener.serendipity_imageSelector_addToBody(block, textarea); + + parent.self.opener.serendipity_imageSelector_addToBody(block, textarea); } - self.close(); + parent.self.close(); } // --> diff --git a/templates/default/treeview/lm.gif b/templates/default/treeview/lm.gif new file mode 100644 index 0000000..e7d0a3c Binary files /dev/null and b/templates/default/treeview/lm.gif differ diff --git a/templates/default/treeview/lmh.gif b/templates/default/treeview/lmh.gif new file mode 100644 index 0000000..3ff6302 Binary files /dev/null and b/templates/default/treeview/lmh.gif differ diff --git a/templates/default/treeview/ln.gif b/templates/default/treeview/ln.gif new file mode 100644 index 0000000..b7b3e55 Binary files /dev/null and b/templates/default/treeview/ln.gif differ diff --git a/templates/default/treeview/loading.gif b/templates/default/treeview/loading.gif new file mode 100644 index 0000000..0bbf3bc Binary files /dev/null and b/templates/default/treeview/loading.gif differ diff --git a/templates/default/treeview/lp.gif b/templates/default/treeview/lp.gif new file mode 100644 index 0000000..b87f003 Binary files /dev/null and b/templates/default/treeview/lp.gif differ diff --git a/templates/default/treeview/lph.gif b/templates/default/treeview/lph.gif new file mode 100644 index 0000000..e3478d8 Binary files /dev/null and b/templates/default/treeview/lph.gif differ diff --git a/templates/default/treeview/screen.css b/templates/default/treeview/screen.css new file mode 100644 index 0000000..a709519 --- /dev/null +++ b/templates/default/treeview/screen.css @@ -0,0 +1 @@ +html, body { padding: 0px 0px 10px 0px; border: 0; margin: 0; } body { font: normal 11px verdana, sans-serif; color: #333; line-height: 19px; margin: 0; } #container { clear: both; text-align: left; padding: 0 0; margin: 0 0; } #containerTop { height:48px; } #pad { padding: 0px 20px 0px 20px; } a { text-decoration: underline; color: #46546C; } a:hover { text-decoration: underline; color: #4d77c3; } h1, h2, h3, h4, h5, h6 { font-family: palatino, georgia, "Times New Roman", serif; } h2 { font-size:16px; font-weight: bold; margin: 0 0 11px 0; } .border_2px { border: 1px solid #D8D8D8; padding: 2px; background: #fff; } .border_5px { border: 1px solid #D8D8D8; padding: 5px; background: #fff; margin: 0 0 4px 0; } img { padding: 0; margin: 0; border: 0; } form { padding: 0; margin: 0; } .input { width: 85px; font-size: 9px; } .submit { font-size: 9px; } #pageTitle { position:absolute;top:10px;left:90px; } #pageTitle H3 { font-size:14pt; color:#666666 } #header h1 { float:left; margin-top: 19px; margin-left: 50px; } #header h1 a { display: block; height: 19px; text-decoration: none; } #header { height: 60px; border: 0px solid #CFFB00; margin-bottom:0px; } #header h4 { position: relative; float: right; font-size:11px; letter-spacing: 1px; top: 10px; right: 30px; line-height: 15px; padding: 0 0 0 13px; margin: 0px; } #content { float: left; width: 500px; min-height:400px; padding:10px 0px; border: 0px solid #C13B00; margin-left: 50px; top:0px; } #content h1 { font-size:18px; margin:0px; } .newsItem { padding-bottom:25px; margin-bottom:25px; overflow: hidden; } .newsItem h3 { font-size:18px; margin:0px; } .newsItem h3 a { text-decoration:none; color:#6A7981; } .newsItem h3 a:hover { text-decoration:underline; color:#000; } .newsItemFooter, .newsItemFooter a { font-size:9px; color:#999; font-weight:normal; } .newsItemFooter a:hover { color:#222; } #footer { padding: 0px 0px 20px 0px; clear: both; color: #999; border-top:0px #CCC solid; margin:0px 26px 0px 30px } #footer a { color: #999; } #footer a:hover { color: #222; } #footerContainer { clear: both; } #rightbar { float: right; padding: 5px 5px 5px 5px; width: 304px; /* for IE5-Win */ width: 300px; border: 1px solid #333333; position:relative; right:48px; top:0px; background-color:#eeeeee; } #rightbar h2, #rightbar h3 { font-size:12px; text-align:center; color:#FFF; border-bottom:#848B8F solid 1px; border-right:#949B9F solid 1px; border-top:#eee solid 1px; padding:1px; margin:0px 0px 0px 0px; background-color:#383e45; width:100%; } #rightbar h2 a, #rightbar h3 a { font-size:12px; color:#FFF; text-decoration:none; display:block; } #rightBarPad { margin:0px; } #sidenav { margin: 0px 0; border-bottom: 1px solid #ddd; } #sidenav ul { margin: 0; padding: 0; border: 0; } #sidenav ul li { list-style: none; list-style-image: none !important; margin: 0; padding:0; } #sidenav ul li a { text-decoration: none; padding: 5px 0px 5px 0px; color: #4C5250; display: block; width: 187px; font-size: 11px !important; font-weight: bold; border-top: 1px solid #ddd; border-bottom: 1px solid #aaa; border-left: 1px solid #C7CBD0; text-shadow: -2px -2px 0px #FFF; } #sidenav ul li a:hover { /* background: url(../img/navHover2.png) top no-repeat; */ border-top: 1px solid #A1AAAF; border-bottom: 1px solid #CCC; border-right: 0px solid #C3C7CA; border-left: 1px solid #C3C7CA; text-shadow: 4px 4px 0px #C3C7CA; } \ No newline at end of file diff --git a/templates/default/treeview/tm.gif b/templates/default/treeview/tm.gif new file mode 100644 index 0000000..e30abad Binary files /dev/null and b/templates/default/treeview/tm.gif differ diff --git a/templates/default/treeview/tmh.gif b/templates/default/treeview/tmh.gif new file mode 100644 index 0000000..ad7e557 Binary files /dev/null and b/templates/default/treeview/tmh.gif differ diff --git a/templates/default/treeview/tn.gif b/templates/default/treeview/tn.gif new file mode 100644 index 0000000..4a28039 Binary files /dev/null and b/templates/default/treeview/tn.gif differ diff --git a/templates/default/treeview/tp.gif b/templates/default/treeview/tp.gif new file mode 100644 index 0000000..d6d0ed0 Binary files /dev/null and b/templates/default/treeview/tp.gif differ diff --git a/templates/default/treeview/tph.gif b/templates/default/treeview/tph.gif new file mode 100644 index 0000000..e4d7d99 Binary files /dev/null and b/templates/default/treeview/tph.gif differ diff --git a/templates/default/treeview/tree.css b/templates/default/treeview/tree.css new file mode 100644 index 0000000..835742b --- /dev/null +++ b/templates/default/treeview/tree.css @@ -0,0 +1,115 @@ +#expandcontractdiv { + font-size: xx-small; + margin-bottom: 5px; + text-align: center; +} + +#serendipityAdminBodyImageSelectorTree { + background-color: #EEE; + background-image: none; + border-right: 1px dotted black; + height: 100%; +} + +#media_frame_tree { + background-color: #EEE; +} + + +/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */ + +/* first or middle sibling, no children */ +.ygtvtn { + width:16px; height:22px; + background: url(tn.gif) 0 0 no-repeat; +} + +/* first or middle sibling, collapsable */ +.ygtvtm { + width:16px; height:22px; + cursor:pointer ; + background: url(tm.gif) 0 0 no-repeat; +} + +/* first or middle sibling, collapsable, hover */ +.ygtvtmh { + width:16px; height:22px; + cursor:pointer ; + background: url(tmh.gif) 0 0 no-repeat; +} + +/* first or middle sibling, expandable */ +.ygtvtp { + width:16px; height:22px; + cursor:pointer ; + background: url(tp.gif) 0 0 no-repeat; +} + +/* first or middle sibling, expandable, hover */ +.ygtvtph { + width:16px; height:22px; + cursor:pointer ; + background: url(tph.gif) 0 0 no-repeat; +} + +/* last sibling, no children */ +.ygtvln { + width:16px; height:22px; + background: url(ln.gif) 0 0 no-repeat; +} + +/* Last sibling, collapsable */ +.ygtvlm { + width:16px; height:22px; + cursor:pointer ; + background: url(lm.gif) 0 0 no-repeat; +} + +/* Last sibling, collapsable, hover */ +.ygtvlmh { + width:16px; height:22px; + cursor:pointer ; + background: url(lmh.gif) 0 0 no-repeat; +} + +/* Last sibling, expandable */ +.ygtvlp { + width:16px; height:22px; + cursor:pointer ; + background: url(lp.gif) 0 0 no-repeat; +} + +/* Last sibling, expandable, hover */ +.ygtvlph { + width:17px; height:22px; cursor:pointer ; + background: url(lph.gif) 0 0 no-repeat; +} + +/* Loading icon */ +.ygtvloading { + width:16px; height:22px; + background: url(loading.gif) 0 0 no-repeat; +} + +/* the style for the empty cells that are used for rendering the depth + * of the node */ +.ygtvdepthcell { + width:16px; height:22px; + background: url(vline.gif) 0 0 no-repeat; +} + +.ygtvblankdepthcell { width:16px; height:22px; } + +/* the style of the div around each node */ +.ygtvitem { } + +/* the style of the div around each node's collection of children */ +.ygtvchildren { } +* html .ygtvchildren { height:2%; } + +/* the style of the text label in ygTextNode */ +.ygtvlabel, .ygtvlabel:link, .ygtvlabel:visited, .ygtvlabel:hover { + margin-left:2px; + text-decoration: none; +} + diff --git a/templates/default/treeview/vline.gif b/templates/default/treeview/vline.gif new file mode 100644 index 0000000..1fb0de8 Binary files /dev/null and b/templates/default/treeview/vline.gif differ