diff --git a/classes/File.php b/classes/File.php
index af97812..cfa59a9 100644
--- a/classes/File.php
+++ b/classes/File.php
@@ -403,8 +403,8 @@ function DeleteThumbnail()
$this->DBSave();
}
- // completly removes the file from DB and FS
- function Remove($bulk = false)
+ // completly removes the file from DB (and FS)
+ function Remove($bulk = false, $dont_delete = false)
{
global $wpdb;
@@ -422,7 +422,7 @@ function Remove($bulk = false)
$this->Lock(true); // prevent Delete() from saving to DB!
- return $this->Delete();
+ return $dont_delete || $this->Delete();
}
private function getInfoValue($path)
diff --git a/classes/Sync.php b/classes/Sync.php
index 6910e2d..62f9672 100644
--- a/classes/Sync.php
+++ b/classes/Sync.php
@@ -10,6 +10,8 @@ class WPFB_Sync
static $error_log_file;
static $debug_output = false;
+ const OLD_THUMB_SUFFIX = '/-([0-9]+)x([0-9]+)\.(jpg|jpeg|png|gif)$/i';
+
static function InitClass()
{
wpfb_loadclass("Admin", "GetID3", "FileUtils", "Misc");
@@ -631,6 +633,9 @@ static function GetMemStats()
);
}
+ /**
+ * @param WPFB_SyncData $sync_data
+ */
static function GetThumbnails($sync_data)
{
$num_files_to_add = $num_new_files = count($sync_data->new_files);
@@ -738,7 +743,23 @@ static function GetThumbnails($sync_data)
$sync_data->num_files_to_add--;
}
}
- }
+
+ // FIX: check for db files with a thumbnail-style file name and assign it to a file with similar name
+ foreach($sync_data->db_file_states as $fs_thumb) {
+ $matches = array();
+ if (preg_match(self::OLD_THUMB_SUFFIX, $fs_thumb->path_rel, $matches)
+ && ($file=$sync_data->getDbStateByPathPrefix(substr($fs_thumb->path_rel, 0, -strlen($matches[0])).'.'))
+ && $file->getFile()->IsLocal()
+ && ($is = getimagesize($fs_thumb->getFile()->GetLocalPath()))
+ && $is[0] == $matches[1] && $is[1] == $matches[2]
+ ) {
+ $fs_thumb->getFile()->DeleteThumbnail();
+ $file->getFile()->DeleteThumbnail();
+ $file->getFile()->file_thumbnail = basename($fs_thumb->getFile()->GetLocalPath());
+ $file->getFile()->DBSave(true);
+ $fs_thumb->getFile()->Remove(false, true);
+ }
+ }}
static function SyncCats($cats = null, $output = false)
{
@@ -1206,4 +1227,19 @@ private function queryDbState() {
}
}
+ /**
+ * @param string $prefix
+ *
+ * @return WPFB_FileState
+ */
+ public function getDbStateByPathPrefix($prefix) {
+ $pl = strlen($prefix);
+ foreach($this->db_file_states as $fs) {
+ if( strlen($fs->path_rel) > $pl && strncmp($fs->path_rel, $prefix, $pl) === 0 ) {
+ return $fs;
+ }
+ }
+ return null;
+ }
+
}
diff --git a/extras/jquery/treeview/jquery.treeview-async-edit.js b/extras/jquery/treeview/jquery.treeview-async-edit.js
new file mode 100644
index 0000000..f89656d
--- /dev/null
+++ b/extras/jquery/treeview/jquery.treeview-async-edit.js
@@ -0,0 +1,411 @@
+/*
+ * Treeview 1.5pre - jQuery plugin to hide and show branches of a tree
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
+ * http://docs.jquery.com/Plugins/Treeview
+ *
+ * Copyright 2010 Jörn Zaefferer
+ * Released under the MIT license:
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+;(function($) {
+
+ // TODO rewrite as a widget, removing all the extra plugins
+ $.extend($.fn, {
+ swapClass: function(c1, c2) {
+ var c1Elements = this.filter('.' + c1);
+ this.filter('.' + c2).removeClass(c2).addClass(c1);
+ c1Elements.removeClass(c1).addClass(c2);
+ return this;
+ },
+ replaceClass: function(c1, c2) {
+ return this.filter('.' + c1).removeClass(c1).addClass(c2).end();
+ },
+ hoverClass: function(className) {
+ className = className || "hover";
+ return this.hover(function() {
+ $(this).addClass(className);
+ }, function() {
+ $(this).removeClass(className);
+ });
+ },
+ heightToggle: function(animated, callback) {
+ animated ?
+ this.animate({ height: "toggle" }, animated, callback) :
+ this.each(function(){
+ jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
+ if(callback)
+ callback.apply(this, arguments);
+ });
+ },
+ heightHide: function(animated, callback) {
+ if (animated) {
+ this.animate({ height: "hide" }, animated, callback);
+ } else {
+ this.hide();
+ if (callback)
+ this.each(callback);
+ }
+ },
+ prepareBranches: function(settings) {
+ if (!settings.prerendered) {
+ // mark last tree items
+ this.filter(":last-child:not(ul)").addClass(CLASSES.last);
+ // collapse whole tree, or only those marked as closed, anyway except those marked as open
+ this.filter((settings.collapsed !== false ? "" : "." + CLASSES.closed) + ":not(." + CLASSES.open + ")").find(">ul").hide();
+ }
+ // return all items with sublists
+ return this.filter(":has(>ul)");
+ },
+ applyClasses: function(settings, toggler) {
+ // TODO use event delegation
+ this.filter(":has(>ul):not(:has(>a))").find(">span").unbind("click.treeview").bind("click.treeview", function(event) {
+ // don't handle click events on children, eg. checkboxes
+ // WPFB MOD: also toggle when clicking children
+ //if ( this == event.target )
+ toggler.apply($(this).next());
+ }).add( $("a", this) ).hoverClass();
+
+ if (!settings.prerendered) {
+ // handle closed ones first
+ this.filter(":has(>ul:hidden)")
+ .addClass(CLASSES.expandable)
+ .replaceClass(CLASSES.last, CLASSES.lastExpandable);
+
+ // handle open ones
+ this.not(":has(>ul:hidden)")
+ .addClass(CLASSES.collapsable)
+ .replaceClass(CLASSES.last, CLASSES.lastCollapsable);
+
+ // create hitarea if not present
+ var hitarea = this.find("div." + CLASSES.hitarea);
+ if (!hitarea.length)
+ hitarea = this.prepend("
").find("div." + CLASSES.hitarea);
+ hitarea.removeClass().addClass(CLASSES.hitarea).each(function() {
+ var classes = "";
+ $.each($(this).parent().attr("class").split(" "), function() {
+ classes += this + "-hitarea ";
+ });
+ $(this).addClass( classes );
+ })
+ }
+
+ // apply event to hitarea
+ this.find("div." + CLASSES.hitarea).click( toggler );
+ },
+ treeview: function(settings) {
+
+ settings = $.extend({
+ cookieId: "treeview"
+ }, settings);
+
+ if ( settings.toggle ) {
+ var callback = settings.toggle;
+ settings.toggle = function() {
+ return callback.apply($(this).parent()[0], arguments);
+ };
+ }
+
+ // factory for treecontroller
+ function treeController(tree, control) {
+ // factory for click handlers
+ function handler(filter) {
+ return function() {
+ // reuse toggle event handler, applying the elements to toggle
+ // start searching for all hitareas
+ toggler.apply( $("div." + CLASSES.hitarea, tree).filter(function() {
+ // for plain toggle, no filter is provided, otherwise we need to check the parent element
+ return filter ? $(this).parent("." + filter).length : true;
+ }) );
+ return false;
+ };
+ }
+ // click on first element to collapse tree
+ $("a:eq(0)", control).click( handler(CLASSES.collapsable) );
+ // click on second to expand tree
+ $("a:eq(1)", control).click( handler(CLASSES.expandable) );
+ // click on third to toggle tree
+ $("a:eq(2)", control).click( handler() );
+ }
+
+ // handle toggle event
+ function toggler() {
+ $(this)
+ .parent()
+ // swap classes for hitarea
+ .find(">.hitarea")
+ .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
+ .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea )
+ .end()
+ // swap classes for parent li
+ .swapClass( CLASSES.collapsable, CLASSES.expandable )
+ .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
+ // find child lists
+ .find( ">ul" )
+ // toggle them
+ .heightToggle( settings.animated, settings.toggle );
+ if ( settings.unique ) {
+ $(this).parent()
+ .siblings()
+ // swap classes for hitarea
+ .find(">.hitarea")
+ .replaceClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
+ .replaceClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea )
+ .end()
+ .replaceClass( CLASSES.collapsable, CLASSES.expandable )
+ .replaceClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
+ .find( ">ul" )
+ .heightHide( settings.animated, settings.toggle );
+ }
+ }
+ this.data("toggler", toggler);
+
+ function serialize() {
+ function binary(arg) {
+ return arg ? 1 : 0;
+ }
+ var data = [];
+ branches.each(function(i, e) {
+ data[i] = $(e).is(":has(>ul:visible)") ? 1 : 0;
+ });
+ $.cookie(settings.cookieId, data.join(""), settings.cookieOptions );
+ }
+
+ function deserialize() {
+ var stored = $.cookie(settings.cookieId);
+ if ( stored ) {
+ var data = stored.split("");
+ branches.each(function(i, e) {
+ $(e).find(">ul")[ parseInt(data[i]) ? "show" : "hide" ]();
+ });
+ }
+ }
+
+ // add treeview class to activate styles
+ this.addClass("treeview");
+
+ // prepare branches and find all tree items with child lists
+ var branches = this.find("li").prepareBranches(settings);
+
+ switch(settings.persist) {
+ case "cookie":
+ var toggleCallback = settings.toggle;
+ settings.toggle = function() {
+ serialize();
+ if (toggleCallback) {
+ toggleCallback.apply(this, arguments);
+ }
+ };
+ deserialize();
+ break;
+ case "location":
+ var current = this.find("a").filter(function() {
+ return location.href.toLowerCase().indexOf(this.href.toLowerCase()) == 0;
+ });
+ if ( current.length ) {
+ // TODO update the open/closed classes
+ var items = current.addClass("selected").parents("ul, li").add( current.next() ).show();
+ if (settings.prerendered) {
+ // if prerendered is on, replicate the basic class swapping
+ items.filter("li")
+ .swapClass( CLASSES.collapsable, CLASSES.expandable )
+ .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
+ .find(">.hitarea")
+ .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
+ .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea );
+ }
+ }
+ break;
+ }
+
+ branches.applyClasses(settings, toggler);
+
+ // if control option is set, create the treecontroller and show it
+ if ( settings.control ) {
+ treeController(this, settings.control);
+ $(settings.control).show();
+ }
+
+ return this;
+ }
+ });
+
+ // classes used by the plugin
+ // need to be styled via external stylesheet, see first example
+ $.treeview = {};
+ var CLASSES = ($.treeview.classes = {
+ open: "open",
+ closed: "closed",
+ expandable: "expandable",
+ expandableHitarea: "expandable-hitarea",
+ lastExpandableHitarea: "lastExpandable-hitarea",
+ collapsable: "collapsable",
+ collapsableHitarea: "collapsable-hitarea",
+ lastCollapsableHitarea: "lastCollapsable-hitarea",
+ lastCollapsable: "lastCollapsable",
+ lastExpandable: "lastExpandable",
+ last: "last",
+ hitarea: "hitarea"
+ });
+
+})(jQuery);
+
+
+
+
+
+
+
+
+
+/*
+ * Async Treeview 0.1 - Lazy-loading extension for Treeview
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
+ *
+ * Copyright 2010 Jörn Zaefferer
+ * Released under the MIT license:
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+;(function($) {
+
+ function load(settings, root, child, container) {
+ function createNode(parent) {
+ var current = $("").attr("id", this.id || "").html("" + this.text + "").appendTo(parent);
+ if (this.classes) {
+ current.children("span").addClass(this.classes);
+ }
+ if (this.expanded) {
+ current.addClass("open");
+ }
+ if (this.hasChildren || this.children && this.children.length) {
+ var branch = $("").appendTo(current);
+ if (this.hasChildren) {
+ current.addClass("hasChildren");
+ createNode.call({
+ classes: "placeholder",
+ text: " ",
+ children:[]
+ }, branch);
+ }
+ if (this.children && this.children.length) {
+ $.each(this.children, createNode, [branch])
+ }
+ }
+ }
+ $.ajax($.extend(true, {
+ url: settings.url,
+ dataType: "json",
+ data: {
+ root: root
+ },
+ success: function(response) {
+ child.empty();
+ $.each(response, function() { createNode.call(this, child); });
+ $(container).treeview({add: child});
+ }
+ }, settings.ajax));
+ /*
+ $.getJSON(settings.url, {root: root}, function(response) {
+ function createNode(parent) {
+ var current = $("").attr("id", this.id || "").html("" + this.text + "").appendTo(parent);
+ if (this.classes) {
+ current.children("span").addClass(this.classes);
+ }
+ if (this.expanded) {
+ current.addClass("open");
+ }
+ if (this.hasChildren || this.children && this.children.length) {
+ var branch = $("").appendTo(current);
+ if (this.hasChildren) {
+ current.addClass("hasChildren");
+ createNode.call({
+ classes: "placeholder",
+ text: " ",
+ children:[]
+ }, branch);
+ }
+ if (this.children && this.children.length) {
+ $.each(this.children, createNode, [branch])
+ }
+ }
+ }
+ child.empty();
+ $.each(response, createNode, [child]);
+ $(container).treeview({add: child});
+ });
+ */
+ }
+
+ var proxied = $.fn.treeview;
+ $.fn.treeview = function(settings) {
+ if (!settings.url) {
+ return proxied.apply(this, arguments);
+ }
+ if (!settings.root) {
+ settings.root = "source";
+ }
+ var container = this;
+ if (!container.children().size())
+ load(settings, settings.root, this, container);
+ var userToggle = settings.toggle;
+ return proxied.call(this, $.extend({}, settings, {
+ collapsed: true,
+ toggle: function() {
+ var $this = $(this);
+ if ($this.hasClass("hasChildren")) {
+ var childList = $this.removeClass("hasChildren").find("ul").first();
+ load(settings, this.id, childList, container);
+ }
+ if (userToggle) {
+ userToggle.apply(this, arguments);
+ }
+ }
+ }));
+ };
+
+})(jQuery);
+
+
+
+
+
+(function($) {
+ var CLASSES = $.treeview.classes;
+ var proxied = $.fn.treeview;
+ $.fn.treeview = function(settings) {
+ settings = $.extend({}, settings);
+ if (settings.add) {
+ return this.trigger("add", [settings.add]);
+ }
+ if (settings.remove) {
+ return this.trigger("remove", [settings.remove]);
+ }
+ return proxied.apply(this, arguments).bind("add", function(event, branches) {
+ $(branches).prev()
+ .removeClass(CLASSES.last)
+ .removeClass(CLASSES.lastCollapsable)
+ .removeClass(CLASSES.lastExpandable)
+ .find(">.hitarea")
+ .removeClass(CLASSES.lastCollapsableHitarea)
+ .removeClass(CLASSES.lastExpandableHitarea);
+ $(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings, $(this).data("toggler"));
+ }).bind("remove", function(event, branches) {
+ var prev = $(branches).prev();
+ var parent = $(branches).parent();
+ $(branches).remove();
+ prev.filter(":last-child").addClass(CLASSES.last)
+ .filter("." + CLASSES.expandable).replaceClass(CLASSES.last, CLASSES.lastExpandable).end()
+ .find(">.hitarea").replaceClass(CLASSES.expandableHitarea, CLASSES.lastExpandableHitarea).end()
+ .filter("." + CLASSES.collapsable).replaceClass(CLASSES.last, CLASSES.lastCollapsable).end()
+ .find(">.hitarea").replaceClass(CLASSES.collapsableHitarea, CLASSES.lastCollapsableHitarea);
+ if (parent.is(":not(:has(>))") && parent[0] != this) {
+ parent.parent().removeClass(CLASSES.collapsable).removeClass(CLASSES.expandable)
+ parent.siblings(".hitarea").andSelf().remove();
+ }
+ });
+ };
+
+})(jQuery);
\ No newline at end of file
diff --git a/extras/jquery/treeview/jquery.treeview-async-edit.min.js b/extras/jquery/treeview/jquery.treeview-async-edit.min.js
index d2a00e3..dece1a9 100644
--- a/extras/jquery/treeview/jquery.treeview-async-edit.min.js
+++ b/extras/jquery/treeview/jquery.treeview-async-edit.min.js
@@ -1 +1,14 @@
-!function(a){a.extend(a.fn,{swapClass:function(a,e){var l=this.filter("."+a);return this.filter("."+e).removeClass(e).addClass(a),l.removeClass(a).addClass(e),this},replaceClass:function(a,e){return this.filter("."+a).removeClass(a).addClass(e).end()},hoverClass:function(e){return e=e||"hover",this.hover(function(){a(this).addClass(e)},function(){a(this).removeClass(e)})},heightToggle:function(a,e){a?this.animate({height:"toggle"},a,e):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"](),e&&e.apply(this,arguments)})},heightHide:function(a,e){a?this.animate({height:"hide"},a,e):(this.hide(),e&&this.each(e))},prepareBranches:function(a){return a.prerendered||(this.filter(":last-child:not(ul)").addClass(e.last),this.filter((a.collapsed?"":"."+e.closed)+":not(."+e.open+")").find(">ul").hide()),this.filter(":has(>ul)")},applyClasses:function(l,s){if(this.filter(":has(>ul):not(:has(>a))").find(">span").unbind("click.treeview").bind("click.treeview",function(e){s.apply(a(this).next())}).add(a("a",this)).hoverClass(),!l.prerendered){this.filter(":has(>ul:hidden)").addClass(e.expandable).replaceClass(e.last,e.lastExpandable),this.not(":has(>ul:hidden)").addClass(e.collapsable).replaceClass(e.last,e.lastCollapsable);var t=this.find("div."+e.hitarea);t.length||(t=this.prepend('').find("div."+e.hitarea)),t.removeClass().addClass(e.hitarea).each(function(){var e="";a.each(a(this).parent().attr("class").split(" "),function(){e+=this+"-hitarea "}),a(this).addClass(e)})}this.find("div."+e.hitarea).click(s)},treeview:function(l){function s(l,s){function i(s){return function(){return t.apply(a("div."+e.hitarea,l).filter(function(){return s?a(this).parent("."+s).length:!0})),!1}}a("a:eq(0)",s).click(i(e.collapsable)),a("a:eq(1)",s).click(i(e.expandable)),a("a:eq(2)",s).click(i())}function t(){a(this).parent().find(">.hitarea").swapClass(e.collapsableHitarea,e.expandableHitarea).swapClass(e.lastCollapsableHitarea,e.lastExpandableHitarea).end().swapClass(e.collapsable,e.expandable).swapClass(e.lastCollapsable,e.lastExpandable).find(">ul").heightToggle(l.animated,l.toggle),l.unique&&a(this).parent().siblings().find(">.hitarea").replaceClass(e.collapsableHitarea,e.expandableHitarea).replaceClass(e.lastCollapsableHitarea,e.lastExpandableHitarea).end().replaceClass(e.collapsable,e.expandable).replaceClass(e.lastCollapsable,e.lastExpandable).find(">ul").heightHide(l.animated,l.toggle)}function i(){var e=[];d.each(function(l,s){e[l]=a(s).is(":has(>ul:visible)")?1:0}),a.cookie(l.cookieId,e.join(""),l.cookieOptions)}function n(){var e=a.cookie(l.cookieId);if(e){var s=e.split("");d.each(function(e,l){a(l).find(">ul")[parseInt(s[e])?"show":"hide"]()})}}if(l=a.extend({cookieId:"treeview"},l),l.toggle){var r=l.toggle;l.toggle=function(){return r.apply(a(this).parent()[0],arguments)}}this.data("toggler",t),this.addClass("treeview");var d=this.find("li").prepareBranches(l);switch(l.persist){case"cookie":var o=l.toggle;l.toggle=function(){i(),o&&o.apply(this,arguments)},n();break;case"location":var h=this.find("a").filter(function(){return 0==location.href.toLowerCase().indexOf(this.href.toLowerCase())});if(h.length){var p=h.addClass("selected").parents("ul, li").add(h.next()).show();l.prerendered&&p.filter("li").swapClass(e.collapsable,e.expandable).swapClass(e.lastCollapsable,e.lastExpandable).find(">.hitarea").swapClass(e.collapsableHitarea,e.expandableHitarea).swapClass(e.lastCollapsableHitarea,e.lastExpandableHitarea)}}return d.applyClasses(l,t),l.control&&(s(this,l.control),a(l.control).show()),this}}),a.treeview={};var e=a.treeview.classes={open:"open",closed:"closed",expandable:"expandable",expandableHitarea:"expandable-hitarea",lastExpandableHitarea:"lastExpandable-hitarea",collapsable:"collapsable",collapsableHitarea:"collapsable-hitarea",lastCollapsableHitarea:"lastCollapsable-hitarea",lastCollapsable:"lastCollapsable",lastExpandable:"lastExpandable",last:"last",hitarea:"hitarea"}}(jQuery),function(a){var e=a.treeview.classes,l=a.fn.treeview;a.fn.treeview=function(s){return s=a.extend({},s),s.add?this.trigger("add",[s.add]):s.remove?this.trigger("remove",[s.remove]):l.apply(this,arguments).bind("add",function(l,t){a(t).prev().removeClass(e.last).removeClass(e.lastCollapsable).removeClass(e.lastExpandable).find(">.hitarea").removeClass(e.lastCollapsableHitarea).removeClass(e.lastExpandableHitarea),a(t).find("li").andSelf().prepareBranches(s).applyClasses(s,a(this).data("toggler"))}).bind("remove",function(l,s){var t=a(s).prev(),i=a(s).parent();a(s).remove(),t.filter(":last-child").addClass(e.last).filter("."+e.expandable).replaceClass(e.last,e.lastExpandable).end().find(">.hitarea").replaceClass(e.expandableHitarea,e.lastExpandableHitarea).end().filter("."+e.collapsable).replaceClass(e.last,e.lastCollapsable).end().find(">.hitarea").replaceClass(e.collapsableHitarea,e.lastCollapsableHitarea),i.is(":not(:has(>))")&&i[0]!=this&&(i.parent().removeClass(e.collapsable).removeClass(e.expandable),i.siblings(".hitarea").andSelf().remove())})}}(jQuery),function(a){function e(e,l,s,t){function i(e){var l=a("").attr("id",this.id||"").html(""+this.text+"").appendTo(e);if(this.classes&&l.children("span").addClass(this.classes),this.expanded&&l.addClass("open"),this.hasChildren||this.children&&this.children.length){var s=a("").appendTo(l);this.hasChildren&&(l.addClass("hasChildren"),i.call({classes:"placeholder",text:" ",children:[]},s)),this.children&&this.children.length&&a.each(this.children,i,[s])}}a.ajax(a.extend(!0,{url:e.url,dataType:"json",data:{root:l},success:function(e){s.empty(),a.each(e,i,[s]),a(t).treeview({add:s})}},e.ajax))}var l=a.fn.treeview;a.fn.treeview=function(s){if(!s.url)return l.apply(this,arguments);s.root||(s.root="source");var t=this;t.children().size()||e(s,s.root,this,t);var i=s.toggle;return l.call(this,a.extend({},s,{collapsed:!0,toggle:function(){var l=a(this);if(l.hasClass("hasChildren")){var n=l.removeClass("hasChildren").find("ul").first();e(s,this.id,n,t)}i&&i.apply(this,arguments)}}))}}(jQuery);
\ No newline at end of file
+(function(b){b.extend(b.fn,{swapClass:function(a,b){var f=this.filter("."+a);this.filter("."+b).removeClass(b).addClass(a);f.removeClass(a).addClass(b);return this},replaceClass:function(a,b){return this.filter("."+a).removeClass(a).addClass(b).end()},hoverClass:function(a){a=a||"hover";return this.hover(function(){b(this).addClass(a)},function(){b(this).removeClass(a)})},heightToggle:function(a,b){a?this.animate({height:"toggle"},a,b):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?
+"show":"hide"]();b&&b.apply(this,arguments)})},heightHide:function(a,b){a?this.animate({height:"hide"},a,b):(this.hide(),b&&this.each(b))},prepareBranches:function(b){b.prerendered||(this.filter(":last-child:not(ul)").addClass(a.last),this.filter((!1!==b.collapsed?"":"."+a.closed)+":not(."+a.open+")").find(">ul").hide());return this.filter(":has(>ul)")},applyClasses:function(c,d){this.filter(":has(>ul):not(:has(>a))").find(">span").unbind("click.treeview").bind("click.treeview",function(a){d.apply(b(this).next())}).add(b("a",
+this)).hoverClass();if(!c.prerendered){this.filter(":has(>ul:hidden)").addClass(a.expandable).replaceClass(a.last,a.lastExpandable);this.not(":has(>ul:hidden)").addClass(a.collapsable).replaceClass(a.last,a.lastCollapsable);var f=this.find("div."+a.hitarea);f.length||(f=this.prepend('').find("div."+a.hitarea));f.removeClass().addClass(a.hitarea).each(function(){var a="";b.each(b(this).parent().attr("class").split(" "),function(){a+=this+"-hitarea "});b(this).addClass(a)})}this.find("div."+
+a.hitarea).click(d)},treeview:function(c){function d(c,d){function e(d){return function(){f.apply(b("div."+a.hitarea,c).filter(function(){return d?b(this).parent("."+d).length:!0}));return!1}}b("a:eq(0)",d).click(e(a.collapsable));b("a:eq(1)",d).click(e(a.expandable));b("a:eq(2)",d).click(e())}function f(){b(this).parent().find(">.hitarea").swapClass(a.collapsableHitarea,a.expandableHitarea).swapClass(a.lastCollapsableHitarea,a.lastExpandableHitarea).end().swapClass(a.collapsable,a.expandable).swapClass(a.lastCollapsable,
+a.lastExpandable).find(">ul").heightToggle(c.animated,c.toggle);c.unique&&b(this).parent().siblings().find(">.hitarea").replaceClass(a.collapsableHitarea,a.expandableHitarea).replaceClass(a.lastCollapsableHitarea,a.lastExpandableHitarea).end().replaceClass(a.collapsable,a.expandable).replaceClass(a.lastCollapsable,a.lastExpandable).find(">ul").heightHide(c.animated,c.toggle)}function e(){var a=[];l.each(function(d,c){a[d]=b(c).is(":has(>ul:visible)")?1:0});b.cookie(c.cookieId,a.join(""),c.cookieOptions)}
+function h(){var a=b.cookie(c.cookieId);if(a){var d=a.split("");l.each(function(a,c){b(c).find(">ul")[parseInt(d[a])?"show":"hide"]()})}}c=b.extend({cookieId:"treeview"},c);if(c.toggle){var g=c.toggle;c.toggle=function(){return g.apply(b(this).parent()[0],arguments)}}this.data("toggler",f);this.addClass("treeview");var l=this.find("li").prepareBranches(c);switch(c.persist){case "cookie":var m=c.toggle;c.toggle=function(){e();m&&m.apply(this,arguments)};h();break;case "location":var k=this.find("a").filter(function(){return 0==
+location.href.toLowerCase().indexOf(this.href.toLowerCase())});k.length&&(k=k.addClass("selected").parents("ul, li").add(k.next()).show(),c.prerendered&&k.filter("li").swapClass(a.collapsable,a.expandable).swapClass(a.lastCollapsable,a.lastExpandable).find(">.hitarea").swapClass(a.collapsableHitarea,a.expandableHitarea).swapClass(a.lastCollapsableHitarea,a.lastExpandableHitarea))}l.applyClasses(c,f);c.control&&(d(this,c.control),b(c.control).show());return this}});b.treeview={};var a=b.treeview.classes=
+{open:"open",closed:"closed",expandable:"expandable",expandableHitarea:"expandable-hitarea",lastExpandableHitarea:"lastExpandable-hitarea",collapsable:"collapsable",collapsableHitarea:"collapsable-hitarea",lastCollapsableHitarea:"lastCollapsable-hitarea",lastCollapsable:"lastCollapsable",lastExpandable:"lastExpandable",last:"last",hitarea:"hitarea"}})(jQuery);
+(function(b){function a(a,c,e,h){function g(a){a=b("").attr("id",this.id||"").html(""+this.text+"").appendTo(a);this.classes&&a.children("span").addClass(this.classes);this.expanded&&a.addClass("open");if(this.hasChildren||this.children&&this.children.length){var c=b("").appendTo(a);this.hasChildren&&(a.addClass("hasChildren"),g.call({classes:"placeholder",text:" ",children:[]},c));this.children&&this.children.length&&b.each(this.children,g,[c])}}b.ajax(b.extend(!0,{url:a.url,
+dataType:"json",data:{root:c},success:function(a){e.empty();b.each(a,function(){g.call(this,e)});b(h).treeview({add:e})}},a.ajax))}var c=b.fn.treeview;b.fn.treeview=function(d){if(!d.url)return c.apply(this,arguments);d.root||(d.root="source");var f=this;f.children().size()||a(d,d.root,this,f);var e=d.toggle;return c.call(this,b.extend({},d,{collapsed:!0,toggle:function(){var c=b(this);c.hasClass("hasChildren")&&(c=c.removeClass("hasChildren").find("ul").first(),a(d,this.id,c,f));e&&e.apply(this,
+arguments)}}))}})(jQuery);
+(function(b){var a=b.treeview.classes,c=b.fn.treeview;b.fn.treeview=function(d){d=b.extend({},d);return d.add?this.trigger("add",[d.add]):d.remove?this.trigger("remove",[d.remove]):c.apply(this,arguments).bind("add",function(c,e){b(e).prev().removeClass(a.last).removeClass(a.lastCollapsable).removeClass(a.lastExpandable).find(">.hitarea").removeClass(a.lastCollapsableHitarea).removeClass(a.lastExpandableHitarea);b(e).find("li").andSelf().prepareBranches(d).applyClasses(d,b(this).data("toggler"))}).bind("remove",
+function(c,d){var h=b(d).prev(),g=b(d).parent();b(d).remove();h.filter(":last-child").addClass(a.last).filter("."+a.expandable).replaceClass(a.last,a.lastExpandable).end().find(">.hitarea").replaceClass(a.expandableHitarea,a.lastExpandableHitarea).end().filter("."+a.collapsable).replaceClass(a.last,a.lastCollapsable).end().find(">.hitarea").replaceClass(a.collapsableHitarea,a.lastCollapsableHitarea);g.is(":not(:has(>))")&&g[0]!=this&&(g.parent().removeClass(a.collapsable).removeClass(a.expandable),
+g.siblings(".hitarea").andSelf().remove())})}})(jQuery);
\ No newline at end of file
diff --git a/readme.txt b/readme.txt
index 2350ca3..3b35ac7 100644
--- a/readme.txt
+++ b/readme.txt
@@ -3,8 +3,8 @@ Contributors: fabifott
Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=wpfilebase%40fabi%2eme&item_name=WP-Filebase&no_shipping=0&no_note=1&tax=0¤cy_code=USD&lc=US&bn=PP%2dDonationsBF&charset=UTF%2d8
Tags: filebase, filemanager, file, files, manager, upload, download, downloads, downloadmanager, images, pdf, widget, filelist, list, thumbnails, thumbnail, attachment, attachments, category, categories, media, template, ftp, http, mp3, id3
Requires at least: 3.1
-Tested up to: 4.4.1
-Stable tag: 3.4.3
+Tested up to: 4.5
+Stable tag: 3.4.4
Adds a powerful download manager including file categories, downloads counter, widgets, sorted file lists and more to your WordPress blog.
@@ -120,6 +120,10 @@ Goto WP-Filebase Settings and disable Permalinks under "Download". Try to disabl
== Changelog ==
+= 3.4.4 =
+* Fixed jQuery treeview compatibility issue
+* Sync: improved thumbnail handling (stop thumbnails from being added as files)
+
= 3.4.3 =
* New Dashboard
* New upload box -- More responsive, new coloring adapts to admin theme
diff --git a/wp-filebase.php b/wp-filebase.php
index 0793391..dea9371 100644
--- a/wp-filebase.php
+++ b/wp-filebase.php
@@ -4,7 +4,7 @@
Plugin Name: WP-Filebase
Plugin URI: https://wpfilebase.com/
Description: Adds a powerful downloads manager supporting file categories, download counter, widgets, sorted file lists and more to your WordPress blog.
- Version: 3.4.3
+ Version: 3.4.4
Author: Fabian Schlieper
Author URI: http://fabi.me/
License: GPL2
@@ -16,7 +16,7 @@
if (!defined('WPFB')) {
define('WPFB', 'wpfb');
- define('WPFB_VERSION', '3.4.3');
+ define('WPFB_VERSION', '3.4.4');
define('WPFB_PLUGIN_ROOT', str_replace('\\', '/', dirname(__FILE__)) . '/');
if (!defined('ABSPATH')) {
define('ABSPATH', dirname(dirname(dirname(dirname(__FILE__)))));