Difference between revisions of "MediaWiki:Jquery.treeview.js"

From Wikimini Stock
Jump to: navigation, search
(Created page with "/* * Treeview 1.4.2 - jQuery plugin to hide and show branches of a tree * * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/ * * Copyright Jörn Zaefferer *...")
 
(Blanked the page)
 
Line 1: Line 1:
/*
 
* Treeview 1.4.2 - jQuery plugin to hide and show branches of a tree
 
*
 
* http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
 
*
 
* Copyright 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 ? "" : "." + 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
 
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("<div class=\"" + CLASSES.hitarea + "\"/>").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);
 

Latest revision as of 18:24, 23 February 2017