Geavaheaddji:Jeblad/filter.js

Wikipedia'as/is

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 + '">&nbsp;</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>&nbsp;';
				$('.filter-title', el).before(toggle);
				$('.filter-toggle a', el).click(wgFilter.toggle);
			});
		});
	}
	catch (e) {
		// just go away 
	}
}