/**
* Defines the applyDynatree() function, which turns an HTML "tree" of
* checkboxes or radiobuttons into a dynamic and collapsible tree of options
* using the Dynatree JS library.
*
* @author Mathias Lidal
* @author Yaron Koren
*/
( function( $, mw, pf ) {
'use strict';
// Attach the Dynatree widget to an existing
element
// and pass the tree options as an argument to the dynatree() function.
jQuery.fn.applyDynatree = function() {
var node = this;
var selectMode = 2;
var checkboxClass = "dynatree-checkbox";
if (node.find(":input:radio").length) {
selectMode = 1;
checkboxClass = "dynatree-radio";
}
// @HACK - normally, the "classNames" parameter for the
// dynatree() call only requires *changes* to the default set
// of class names. However, for trees contained in multiple-
// instance templates, the default classNames array is just
// blank. So we need to add the "selected" value in here,
// because that gets used later on. Ideally, the underlying
// bug causing the big blank value would be fixed instead.
var newClassNames = {
checkbox: checkboxClass,
selected: "dynatree-selected"
};
node.dynatree({
checkbox: true,
minExpandLevel: 1,
classNames: newClassNames,
selectMode: selectMode,
onClick: function (dtNode, event) {
var targetType = dtNode.getEventTargetType(event);
if ( targetType === "expander" ) {
dtNode.toggleExpand();
} else if ( targetType === "checkbox" ||
targetType === "title" ) {
dtNode.toggleSelect();
}
return false;
},
// Un/check checkboxes/radiobuttons recursively after
// selection.
onSelect: function (select, dtNode) {
var inputkey = "chb-" + dtNode.data.key;
node.find("[id='" + inputkey + "']").attr("checked", select);
},
// Prevent reappearing of checkbox when node is
// collapsed.
onExpand: function (select, dtNode) {
$("#chb-" + dtNode.data.key).attr("checked",
dtNode.isSelected()).addClass("hidden");
}
});
// Update real checkboxes according to selections.
$.map(node.dynatree("getTree").getSelectedNodes(),
function (dtNode) {
$("#chb-" + dtNode.data.key).attr("checked", true);
dtNode.activate();
});
var activeNode = node.dynatree("getTree").getActiveNode();
if (activeNode !== null) {
activeNode.deactivate();
}
};
}( jQuery, mediaWiki, pf ) );