Geavaheaddji:Jeblad/filter.js
Fuomáš: Maŋŋel go almmuhat, soaitá leat dárbbašlaš sihkkut neahttalohkkii gaskaráju vai oainnat rievdadusaid.
- Firefox / Safari: Doala Shift dan botta go deattát Reload, dahje deaddil Ctrl-F5 dahje Ctrl-R (⌘-R Mac'as)
- Google Chrome: Deaddil Ctrl-Shift-R (⌘-Shift-R Mac'as)
- Internet Explorer / Edge: Doala Ctrl dan botta go deattát Álggat ođđasit, dahje deaddil Ctrl-F5
- Opera: deaddil Ctrl-F5.
var wgFilter = {
strings : { show : '+', hide : '−', none : '×', fail : '?' },
delay : 200,
maxdepth : 4,
maxpages : 2000,
cats : Object(),
sets : Object(),
postpone : Array(),
query : {
action: 'query',
generator: 'categorymembers',
gcmlimit: 50,
prop: 'categories',
format: 'json',
cllimit: 500
},
info : function(el, txt) {
$('.filter-toggle a + img', el).remove();
var name = $('.filter-use', el).html().replace(/[^\w\-]/g, '_');
if (0<name.length) {
if (txt) $('.' + body, el.parentNode).html(txt).show();
else $('.' + body, el.parentNode).html('').hide();
}
else {
if (txt) $('.filter-content', el).html(txt).show();
else $('.filter-content', el).remove();
}
$('.filter-toggle', el).html('[' + wgFilter.strings['fail'] + ']');
},
regexp : function(el) {
var patterns = Array();
$('.filter-pattern', el).each(function(i, el){
var pattern = el.innerHTML;
if (pattern.charAt(0) == '/')
patterns.push(pattern.substring(pattern.indexOf('/'), pattern.lastIndexOf('/')));
else
patterns.push(pattern.replace(/\x3F/g, '.?').replace(/\x2B/g, '.+').replace(/\x2A/g, '.*'));
});
return ( patterns.length ? RegExp(':(' + patterns.join('|') + ')$') : null);
},
build : function(el, title) {
var re = wgFilter.regexp(el);
var items = Object();
for (var cat in wgFilter.sets[title].categories) {
for (var x in wgFilter.cats[cat].pages) {
if (wgFilter.cats[cat].pages[x].ns == 0) {
var p = wgFilter.cats[cat].pages[x];
var hits = 0;
if (re && p.categories) {
for (var y in p.categories)
if (p.categories[y].ns == 14 && re.test(p.categories[y].title))
hits++;
}
else if (re == null) hits++;
if (hits) items[p.title]++;
}
}
}
var txt = '';
for (var x in items) {
txt += (txt.length ? ', ': '')
+ '<a href="' + wgArticlePath.replace('$1', encodeURIComponent(x)) + '">' + x + '</a>';
}
$('.filter-toggle a + img', el).remove();
var body = $('.filter-use', el).html().replace(/[^\w\-]/g, '_');
if (0<body.length) {
if (txt) $('.' + body, el.parentNode).html(txt).show();
else $('.' + body, el.parentNode).html('').hide();
}
else {
if (txt) $('.filter-content', el).html(txt).show();
else $('.filter-content', el).remove();
}
$(txt ? '.filter-toggle a' : '.filter-toggle', el).html('[' + wgFilter.strings[txt ? 'hide' : 'none'] + ']');
},
load : function (el, category, depth, cont) {
if (!depth--) return; // should not happen
var title = $('.filter-title', el).html();
if (!cont) {
if (!wgFilter.sets[title])
wgFilter.sets[title] = { pending : 0, categories : {} };
if (!wgFilter.cats[category])
wgFilter.cats[category] = { pending : 0, pages : [] };
if (wgFilter.cats[category].pending) {
// there is an on-going process for this category
wgFilter.postpone.push([el, category, depth+1, cont]);
// done, but must be called again
return false;
}
else if (!wgFilter.sets[title].pending && wgFilter.sets[title].categories.length) {
// build blir ikke kalt for et set når alle kategorier er lastet tidligere
// strengt tatt vil aldri denne være nødvendig...
// there are no more pending in this set and it is constructed so build
wgFilter.build(el, title);
// done at this level
return true;
}
else if (!wgFilter.cats[category].pending && wgFilter.cats[category].pages.length) {
// det må lages nødvendige data for set
// når depth er null (?) og det er data så kalles build
var calls = 0;
// there are data from a previous process for this category so decend
for (var x in wgFilter.cats[category].pages) {
if (wgFilter.cats[category].pages[x].ns == 14) {
calls++;
var cat = wgFilter.cats[category].pages[x].title.replace(/^.*?:/, '');
wgFilter.load(el, cat, depth);
}
}
if (!calls) wgFilter.build(el, title);
// done at this level
return true;
}
wgFilter.cats[category].pending++;
wgFilter.sets[title].categories[category]++;
wgFilter.sets[title].pending++;
}
// still unresolved
var query = jQuery.extend({gcmtitle: 'category:'+category}, wgFilter.query);
if (cont) query = jQuery.extend(cont.categorymembers, query);
$.getJSON(wgScriptPath + "/api.php", query, function(data, txt) {
// normal reply
if (data['query']) {
for (var x in data['query'].pages) {
// keep the entries
wgFilter.cats[category].pages[x] = data['query'].pages[x];
// request additional if necessary
if (depth && data['query'].pages[x].ns == 14) {
var cat = data['query'].pages[x].title.replace(/^.*?:/, '');
wgFilter.load(el, cat, depth);
}
}
// need more, or just decrement
if (data['query-continue'])
wgFilter.load(el, category, depth, data['query-continue']);
else {
wgFilter.sets[title].pending--;
wgFilter.cats[category].pending--;
}
// if there are no more pending in this set then build
if (!wgFilter.sets[title].pending)
wgFilter.build(el, title);
}
// freaked reply
else if (!wgFilter.sets[title].pending)
wgFilter.info(el, txt == 'success' ? null : txt);
// try to get rid of some of the postponed calls
for (var x in wgFilter.postpone)
if (wgFilter.postpone[x])
if (wgFilter.load.apply(wgFilter.postpone[x]))
wgFilter.postpone[x] = null;
});
// done, we register next time if necessary
return false;
},
toggle : function () {
var link = this;
var container = $(this).parents('.filter-container').get(0);
var category = $('.filter-category', container).html();
var name = $('.filter-use', container).html().replace(/[^\w\-]/g, '_'); // blow away everything we don't like
var depth = parseInt($('.filter-depth', container).html());
if (depth == 0 || isNaN(depth)) depth = 1; // just make sure we have a number
var state = $(this).data('filter-state');
$(this).data('filter-state', !state);
if (name.length) { // we will reuse a common box
var content = $('.' + name, container.parentNode);
if (!content.length) { // build the box
$(container.parentNode)
.append('<div class="' + name + '"> </div>');
$('.' + name, container.parentNode).css('zoom', 1);
}
$('.filter-toggle a', container.parentNode).each(function(i, el) {
if (el != link && $(el).data('filter-state')) {
$(el).next('img').remove();
$(el).html('[' + wgFilter.strings['show'] + ']').data('filter-state', false);
}
});
//alert(state ? 'true' : 'false');
if (!state) {
$(container)
.find('.filter-toggle')
.append('<img src="http://bits.wikimedia.org/skins-1.5/common/images/spinner.gif" />')
.find('a', container).html('[' + wgFilter.strings['hide'] + ']');
wgFilter.load(container, category, depth<wgFilter.maxdepth ? depth : wgFilter.maxdepth);
}
else {
$('.filter-toggle a', container).html('[' + wgFilter.strings['show'] + ']');
content.hide();
}
}
else { // we will use our own box
var content = $('.filter-content', container);
if (!content.length) { // really wetter we have the data
$(container)
.append('<div class="filter-content" style="display:none"/>')
.find('.filter-toggle')
.append('<img src="http://bits.wikimedia.org/skins-1.5/common/images/spinner.gif" />');
wgFilter.load(container, category, depth<wgFilter.maxdepth ? depth : wgFilter.maxdepth);
}
else {
if (state) {
$('.filter-toggle a', container).html('[' + wgFilter.strings['show'] + ']');
content.slideUp(wgFilter.delay);
}
else {
$('.filter-toggle a', container).html('[' + wgFilter.strings['hide'] + ']');
content.slideDown(wgFilter.delay);
}
}
}
return false;
}
};
if (wgArticleId && (wgAction=="view" || wgAction=="purge")) {
try {
if (typeof($j) == 'undefined')
mw.loader.load("//bits.wikimedia.org/skins-1.5/common/jquery.min.js");
addOnloadHook( function() {
$('#bodyContent .filter').each(function(i, el) {
el.style.display = 'block';
});
$('#bodyContent .filter-container').each(function(i, el) {
var name = $('.filter-use', el).html();
el.style.display = (0 < name.length) ? 'inline-block' : 'block';
var toggle = '<span class="filter-toggle"><a href="#">[' + wgFilter.strings['show'] + ']</a></span> ';
$('.filter-title', el).before(toggle);
$('.filter-toggle a', el).click(wgFilter.toggle);
});
});
}
catch (e) {
// just go away
}
}