2
* JavaScript functions for the CategoryTree extension, an AJAX based gadget
3
* to display the category structure of a wiki
6
* @subpackage Extensions
7
* @author Daniel Kinzler, brightbyte.de
8
* @copyright © 2006 Daniel Kinzler
9
* @licence GNU General Public Licence 2.0 or later
11
* NOTE: if you change this, increment $wgCategoryTreeVersion
12
* in CategoryTree.php to avoid users getting stale copies from cache.
15
// Default messages if new code loaded with old cached page
16
var categoryTreeErrorMsg = "Problem loading data.";
17
var categoryTreeRetryMsg = "Please wait a moment and try again.";
19
function categoryTreeNextDiv(e) {
21
while ( n && ( n.nodeType != 1 || n.nodeName != 'DIV') ) {
22
//alert('nodeType: ' + n.nodeType + '; nodeName: ' + n.nodeName);
29
function categoryTreeExpandNode(cat, options, lnk) {
30
var div= categoryTreeNextDiv( lnk.parentNode.parentNode );
32
div.style.display= 'block';
33
lnk.innerHTML= categoryTreeCollapseBulletMsg;
34
lnk.title= categoryTreeCollapseMsg;
35
lnk.onclick= function() { categoryTreeCollapseNode(cat, options, lnk) }
37
if (!lnk.className.match(/(^| )CategoryTreeLoaded($| )/)) {
38
categoryTreeLoadNode(cat, options, lnk, div);
42
function categoryTreeCollapseNode(cat, options, lnk) {
43
var div= categoryTreeNextDiv( lnk.parentNode.parentNode );
45
div.style.display= 'none';
46
lnk.innerHTML= categoryTreeExpandBulletMsg;
47
lnk.title= categoryTreeExpandMsg;
48
lnk.onclick= function() { categoryTreeExpandNode(cat, options, lnk) }
51
function categoryTreeLoadNode(cat, options, lnk, div) {
52
div.style.display= 'block';
53
lnk.className= 'CategoryTreeLoaded';
54
lnk.innerHTML= categoryTreeCollapseBulletMsg;
55
lnk.title= categoryTreeCollapseMsg;
56
lnk.onclick= function() { categoryTreeCollapseNode(cat, options, lnk) }
58
categoryTreeLoadChildren(cat, options, div)
61
// FIXME Why can't this just use uneval()?
62
function categoryTreeEncodeValue(value) {
63
switch (typeof value) {
65
throw new Error("categoryTreeEncodeValue encountered a function");
69
s = '"' + value.replace(/([\\"'])/g, "\\$1") + '"';
82
else if (typeof value.length === 'number' && !(value.propertyIsEnumerable('length'))) {
84
for (i = 0; i<value.length; i++) {
86
if ( s!='' ) s += ', ';
87
s += categoryTreeEncodeValue( v );
95
if ( s!='' ) s += ', ';
96
s += categoryTreeEncodeValue( k );
98
s += categoryTreeEncodeValue( v );
104
throw new Error("categoryTreeEncodeValue encountered strange variable type " + (typeof value));
110
function categoryTreeLoadChildren(cat, options, div) {
111
div.innerHTML= '<i class="CategoryTreeNotice">' + categoryTreeLoadingMsg + '</i>';
113
if ( typeof options == "string" ) { //hack for backward compatibility
114
options = { mode : options };
117
function f( request ) {
118
if (request.status != 200) {
119
div.innerHTML = '<i class="CategoryTreeNotice">' + categoryTreeErrorMsg + ' </i>';
120
var retryLink = document.createElement('a');
121
retryLink.innerHTML = categoryTreeRetryMsg;
122
retryLink.onclick = function() {
123
categoryTreeLoadChildren(cat, options, div, enc);
125
div.appendChild(retryLink);
129
result= request.responseText;
130
result= result.replace(/^\s+|\s+$/, '');
132
if ( result == '' ) {
133
result= '<i class="CategoryTreeNotice">';
135
if ( options.mode == 0 ) result= categoryTreeNoSubcategoriesMsg;
136
else if ( options.mode == 10 ) result= categoryTreeNoPagesMsg;
137
else if ( options.mode == 100 ) result= categoryTreeNoParentCategoriesMsg;
138
else result= categoryTreeNothingFoundMsg;
143
result = result.replace(/##LOAD##/g, categoryTreeExpandMsg);
144
div.innerHTML= result;
147
var opt = categoryTreeEncodeValue(options);
148
sajax_do_call( "efCategoryTreeAjaxWrapper", [cat, opt, 'json'] , f );
151
// Re-show the CategoryTreeToggles.
152
addOnloadHook( function() {
153
var toggles = getElementsByClassName( document, 'span', 'CategoryTreeToggle' );
155
for( var i = 0; i<toggles.length; ++i ) {
156
toggles[i].style.display = 'inline';