MediaWiki:Common.js
aus Stargate Wiki, dem deutschsprachigen Stargate-Lexikon
Hinweis: Leere nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.
- Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
- Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
- Internet Explorer: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
- Opera: Extras → Internetspuren löschen … → Individuelle Auswahl → Den kompletten Cache löschen
/* Jedes JavaScript hier wird für alle Benutzer für jede Seite geladen. */ //=========================================================================== // Externe Links in neuem Fenster öffnen, sofern sie nicht in dieses Wiki mit unterbundener Weiterleitung ([[Vorlage:KeinRedirect]]) führen //--------------------------------------------------------------------------- $(function() { $(".external").each(function( i ) { var url = $(this).attr("href"); if ((url.indexOf("stargate-wiki.de/")!=-1)&&((url.indexOf("redirect=no")!=-1)||(url.indexOf("unhide=1")!=-1))) $(this).attr("target","_self"); else $(this).attr("target","_blank"); }); }); //=========================================================================== //=========================================================================== // Fügt eine Betreffzeile auf leeren Diskussionsseiten ein //--------------------------------------------------------------------------- $(function() { if(wgNamespaceNumber != 0 && wgNamespaceNumber != 1) return; var tab = document.getElementById( 'ca-talk' ); if( !tab || tab.className != 'new' ) return; var link = tab.getElementsByTagName( 'a' )[0]; if( !link ) return; link.href += '§ion=new'; }); //=========================================================================== //=========================================================================== // import Onlyifuploading-functions // SEE ALSO [[MediaWiki:Onlyifuploading.js]] //--------------------------------------------------------------------------- if (wgCanonicalSpecialPageName == "Upload") { importScript("MediaWiki:Onlyifuploading.js"); } //=========================================================================== //=========================================================================== // Einbinden von [[Vorlage:Mentorenliste]] //--------------------------------------------------------------------------- importScript('Vorlage:Mentorenliste'); //=========================================================================== //=========================================================================== // Darstellung der Abschnitte in der Kategorie für wichtige SG1-Episoden // nach einzelnen Staffeln //--------------------------------------------------------------------------- $(function() { if (wgPageName != "Kategorie:Stargate_Kommando_SG-1_Wichtige_Episode") return; $("div#mw-pages h3").html(function(i, text) { return (text.substr(0, 1) == "@")?"10"+text.substr(1):text; }); }); //=========================================================================== //=========================================================================== // Zeilen der Infoboxen abwechselnd einfärben //--------------------------------------------------------------------------- $(function() { $("tr[class*='blauzebra']:not(.spoiler):even").addClass("zebrablau"); $("tr[class*='blauzebra']:not(.spoiler):odd").removeClass("zebrablau"); $("tr[class*='grünzebra']:not(.spoiler):even").addClass("zebragrün"); $("tr[class*='grünzebra']:not(.spoiler):odd").removeClass("zebragrün"); }); //=========================================================================== //=========================================================================== // Wenige (<6) Einzelnachweise in nur einer Spalte darstellen //--------------------------------------------------------------------------- $('ol.references').each(function(){ if($(this).children('li').length<6){ $(this).css({ 'column-count': '1', '-moz-column-count': '1', '-webkit-column-count': '1' }); } }); //=========================================================================== //=========================================================================== // Sortierung von Datum und Zeit der Form „11:58, 21. Jul. 2012“ in Tabellen //--------------------------------------------------------------------------- if ($("table.sortable").length) { mw.loader.using("jquery.tablesorter", function() { if ($ && $.tablesorter) { $.tablesorter.addParser({ id: "sgwDateTime", is: function(s) { return /(\d\d):(\d\d), (\d\d)\. (...)\. (\d{4})/.test(s); }, format: function(s) { s = $.trim(s.toLowerCase()); for (var i=0; i<12; ++i) s = s.replace($.tablesorter.monthNames[1][i+1], i); var x = /(\d\d):(\d\d), (\d\d)\. (\d?)\. (\d{4})/.exec(s); return !x?0:$.tablesorter.formatFloat(new Date(x[5], x[4], x[3], x[1], x[2], 0).getTime()); }, type: "numeric" }); } }); } //=========================================================================== //=========================================================================== // Zählt die Anzahl der Bearbeitungen eines Benutzers // Siehe auch [[Benutzer:CF/revisionMainspaceCounter.js]] // Bearbeitung von [[MediaWiki:Gadget-revisionCounter.js]] //--------------------------------------------------------------------------- var revisionMainspaceCounter = { queryUrl : function(i) { if (revisionMainspaceCounter.queries[i] == null) return null; if (revisionMainspaceCounter.queries[i].Namespaces == '-100') return wgScriptPath + '/api.php?action=query&list=logevents&leuser=' + encodeURIComponent(revisionMainspaceCounter.queries[i].User) + '&letype=upload&leprop=userid&format=json&lelimit=max&callback=revisionMainspaceCounter.queryResult&requestid=' + i; else return wgScriptPath + '/api.php?action=query&list=usercontribs&ucuser=' + encodeURIComponent(revisionMainspaceCounter.queries[i].User) + '&ucnamespace=' + revisionMainspaceCounter.queries[i].Namespaces + '&ucprop=&format=json&uclimit=max&callback=revisionMainspaceCounter.queryResult&requestid=' + i; //Bei leerer ucprop-Angabe werden nur noch userid und user angegeben - sollte MW das mal ändern, muss hier wieder etwas übergeben werden (vorzugsweise ids) }, queries : [ /*{ revisionCountUser : 0, User : wgUserName, Namespaces : '0', InputId : 'revisionMainspaceCounter', OutputId : 'revisionMainspaceCounterTarget', ReplaceFirstChild : false }*/ ], execute : function() { for (var i=0; i<revisionMainspaceCounter.queries.length; ++i) if (revisionMainspaceCounter.queryUrl(i)) importScriptURI(revisionMainspaceCounter.queryUrl(i)); }, queryResult : function(res) { if (!res['query'] || !res['requestid'] || res.requestid >= revisionMainspaceCounter.queries.length || res.requestid < 0 || revisionMainspaceCounter.queries[res.requestid] === null) return; var continu = false; var i = res.requestid; if (revisionMainspaceCounter.queries[res.requestid].Namespaces == '-100') { if (!res['query']['logevents']) return; var revs = res['query']['logevents']; revisionMainspaceCounter.queries[i].revisionCountUser += revs.length; if (res && res['query-continue']) { var lequerycont=res['query-continue'].logevents.lecontinue; importScriptURI(revisionMainspaceCounter.queryUrl(i) + '&lestart=' + encodeURIComponent(lequerycont.substring(0,lequerycont.indexOf("|")))); continu = true; } } else { if (!res['query']['usercontribs']) return; var revs = res['query']['usercontribs']; revisionMainspaceCounter.queries[i].revisionCountUser += revs.length; if (res && res['query-continue']) { var ucquerycont=res['query-continue'].usercontribs.uccontinue; importScriptURI(revisionMainspaceCounter.queryUrl(i) + '&ucstart=' + encodeURIComponent(ucquerycont.substring(0,ucquerycont.indexOf("|")))); continu = true; } } if (!continu && document.getElementById(revisionMainspaceCounter.queries[i].OutputId)) { var info = document.createElement("span"); info.appendChild(document.createTextNode(revisionMainspaceCounter.queries[i].revisionCountUser)); var infoTitle = document.createAttribute("title"); infoTitle.nodeValue = revisionMainspaceCounter.queries[i].User + " hat " + revisionMainspaceCounter.queries[i].revisionCountUser + " Bearbeitungen i" + (revisionMainspaceCounter.queries[i].Namespaces==="0" ? "m Hauptnamensraum." : ((revisionMainspaceCounter.queries[i].Namespaces.indexOf("|")>-1 ? "n den Namensräumen ": "m Namensraum ") + revisionMainspaceCounter.queries[i].Namespaces + ".")); info.setAttributeNode(infoTitle); var e = document.getElementById(revisionMainspaceCounter.queries[i].OutputId); if (revisionMainspaceCounter.queries[i].ReplaceFirstChild) e.replaceChild(info, e.firstChild); else e.appendChild(info); var input = document.getElementById(revisionMainspaceCounter.queries[i].InputId); var header = $(input).parents("table.sortable")[0]; if (input && input.parentNode) { input.parentNode.removeChild(input); if (header && $(header).find("span.revisionMainspaceCounter").length === 0) { $(header).find(".headerSort").unbind("click"); $(header).tablesorter(); } } revisionMainspaceCounter.queries[i] = null; } }, findCounter : function() { var found = 0; $("span.revisionMainspaceCounter").each(function() { var i = this.innerHTML.split("#"); if (i.length == 4 && ++found) revisionMainspaceCounter.queries.push({ revisionCountUser : 0, User : i[0], Namespaces : i[1].replace(/ /g,"").split(",").join("|"), InputId : this.id, OutputId : i[2], ReplaceFirstChild : i[3]==="j" }); }); if (found) revisionMainspaceCounter.execute(); } }; $(revisionMainspaceCounter.findCounter); //=========================================================================== //=========================================================================== // Versteckt Inhalte // [[Vorlage:Spoiler]] //--------------------------------------------------------------------------- mw.SGWSpoiler = { showAll: false, init: function() { if ($(".spoiler").size()>0) { var vector = $("body.skin-vector").size()>0; var node = mw.util.addPortletLink(vector ? "p-views" : "p-cactions", "#", "Spoiler aufdecken", "ca-spoiler", "Vorhandene Spoiler auf- und zudecken", "s", $("#ca-watch")[0] || $("#ca-unwatch")[0]); if (node) { node.onclick = mw.SGWSpoiler.toggleAll; if (vector) $("#ca-spoiler a").html('<img width="24" height="24" alt="Spoiler auf- oder zudecken" src="http://www.stargate-wiki.de/w/images/thumb/1/17/System-search.svg/24px-System-search.svg.png" style="position:relative; top: -5px;" />'); } } }, toggleNext: function(obj) { if (mw.SGWSpoiler.showAll) return; $(obj).next(".spoiler").toggleClass("spoilerShow"); var headings = $(obj).next(".spoiler").find(':header > span'); if(headings.length){ headings.each(function(i, e){ spoilerHeadings.toggle(e.id); }); } }, toggleNextRow: function(obj) { if (mw.SGWSpoiler.showAll) return; $(obj).parent().parent().next("tr.spoiler").toggleClass("spoilerShow"); var headings = $(obj).parent().parent().next("tr.spoiler").find(':header > span'); if(headings.length){ headings.each(function(i, e){ spoilerHeadings.toggle(e.id); }); } }, toggleAll: function(obj) { mw.SGWSpoiler.showAll ^= true; if (mw.SGWSpoiler.showAll) { $(".spoiler").addClass("spoilerShowAll"); $("#ca-spoiler").addClass("selected"); if (obj){ $(obj).parent().parent().next("tr.spoiler").removeClass("spoilerShow"); $(obj).next(".spoiler").removeClass("spoilerShow"); } spoilerHeadings.showAll(); } else { $(".spoiler").removeClass("spoilerShowAll"); $("#ca-spoiler").removeClass("selected"); spoilerHeadings.hideAll(); } return false; } } $( mw.SGWSpoiler.init ); //=========================================================================== //=========================================================================== // automatisiertes Einbinden vom virtuellen Schneefall im Dezember und Januar //--------------------------------------------------------------------------- var curmonth=new Date().getMonth(); if(curmonth===11 || curmonth===0) importScript('Benutzer:CF/Schnee.js'); //=========================================================================== //=========================================================================== // Toggles the display of elements on a page // Author/contact: Austin Che http://openwetware.org/wiki/User:Austin //--------------------------------------------------------------------------- // indexed array of toggler ids to array of associated toggle operations // each operation is a two element array, the first being the type, the second a class name or array of elements // operation types are strings like "_reset" or "" for the default toggle operation var togglers = new Array(); var allClasses = new Object(); // associative map of class names to page elements function toggler(id) { var toBeToggled = togglers[id]; if (!toBeToggled) return; // if some element is in list more than once, it will be toggled multiple times for (var i = 0; i < toBeToggled.length; i++) { // get array of elements to operate on var toggles = toBeToggled[i][1]; if (typeof(toggles) == "string") { if (toggles.charAt(0) == '-') { // treat as an element ID, not as class toggles = document.getElementById(toggles.substring(1)); if (toggles) toggles = new Array(toggles); } else toggles = allClasses[toggles]; } if (!toggles || !toggles.length) continue; var op = toBeToggled[i][0]; // what the operation will be switch (op) { case "_reset": for (var j in toggles) toggles[j].style.display = toggles[j]._toggle_original_display; break; case "_show": for (var j in toggles) toggles[j].style.display = ''; break; case "_hide": for (var j in toggles) toggles[j].style.display = 'none'; break; case "": default: // Toggle for (var j in toggles) toggles[j].style.display = ((toggles[j].style.display == 'none') ? '' : 'none'); break; } } } function createTogglerLink(toggler, id) { var toggle = document.createElement("a"); toggle.className = 'toggler-link'; toggle.setAttribute('id', 'toggler' + id); toggle.setAttribute('href', 'javascript:toggler("' + id + '");'); var child = toggler.firstChild; toggler.removeChild(child); toggle.appendChild(child); toggler.insertBefore(toggle, toggler.firstChild); } function toggleInit() { var togglerElems = new Array(); var toggleGroup = new Array(); // make list of all document classes var elems = document.getElementsByTagName("*"); var numelems = elems.length; for (var i = 0; i < elems.length; i++) { var elem = elems[i]; if (!elem.className) continue; elem._toggle_original_display = elem.style.display; var togglerID = -1; if( typeof elem.className == "string" ) { var elemClasses = elem.className.split(' '); // get list of classes for (var j = 0; j < elemClasses.length; j++) { var elemClass = elemClasses[j]; if (! allClasses[elemClass]) allClasses[elemClass] = new Array(); allClasses[elemClass].push(elem); // all the special classes begin with _toggle if (elemClass.substring(0, 7) != "_toggle") continue; if (elemClass == "_togglegroup") toggleGroup = new Array(); else if (elemClass == "_toggle") toggleGroup.push(elem); else if (elemClass.substring(0, 12) == "_toggle_init") { // set initial value for display (ignore the original CSS set value) // understands _toggle_initshow and _toggle_inithide var disp = elemClass.substring(12); if (disp == "show") elem.style.display = ''; else if (disp == "hide") elem.style.display = 'none'; elem._toggle_original_display = disp; } else if (elemClass.substring(0, 8) == "_toggler") { if (togglerID == -1) { togglerID = togglers.length; togglers[togglerID] = new Array(); togglerElems[togglerID] = elem; } // all classes are of form _toggler_op-CLASS // figure out what class we're toggling // if none is specified, then we use the current toggle group var toBeToggled; var hyphen = elemClass.indexOf('-'); if (hyphen != -1) toBeToggled = elemClass.substring(hyphen+1); else { toBeToggled = toggleGroup; hyphen = elemClass.length; } var op = elemClass.substring(8, hyphen); togglers[togglerID].push(new Array(op, toBeToggled)); } } } } // add javascript links to all toggler elements for (var i = 0; i < togglerElems.length; i++) createTogglerLink(togglerElems[i], i); } $(toggleInit); function unToggle() { var path=window.location.href; var parts=path.split("#"); if(parts.length > 1) { path=parts[parts.length-1]; parts=path.split(".23"); var untogglerGroup = new Array(); var untogglerClass = new Array(); // make list of all document classes var elems = document.getElementsByTagName("*"); var numelems = elems.length; for (var c=0; c < parts.length; c++) { for (var i = 0; i < elems.length; i++) { var elem = elems[i]; if (!elem.className) continue; var elemClasses = elem.className.split(' '); // get list of classes for (var j = 0; j < elemClasses.length; j++) { var elemClass=elemClasses[j]; if (elemClass != parts[c]) continue; else { untogglerGroup.push(elem); untogglerClass.push(elemClass); } } } } // add javascript links to all toggler elements for (var i = 0; i < untogglerGroup.length; i++) { untogglerGroup[i].style.display = ''; } } } //=========================================================================== //=========================================================================== // Import-Skript zum Auslagern großer Scripte //--------------------------------------------------------------------------- function importScript(page) { // TODO: might want to introduce a utility function to match wfUrlencode() in PHP var uri = wgScript + '?title=' + encodeURIComponent(page.replace(/ /g,'_')).replace(/%2F/ig,'/').replace(/%3A/ig,':') + '&action=raw&ctype=text/javascript'; return importScriptURI(uri); } var loadedScripts = {}; // included-scripts tracker function importScriptURI(url) { if (loadedScripts[url]) { return null; } loadedScripts[url] = true; var s = document.createElement('script'); s.setAttribute('src',url); s.setAttribute('type','text/javascript'); document.getElementsByTagName('head')[0].appendChild(s); return s; } //=========================================================================== //=========================================================================== // automatische Aktualisierung der Letzten Änderungen via Ajax //--------------------------------------------------------------------------- if (wgUserGroups) { for (var i=0; i<wgUserGroups.length; i++) { if (wgUserGroups[i]=="user") {//Prüft, ob Benutzer angemeldet ist importScript('Benutzer:Ghost/Ajax.js'); break; } } } //=========================================================================== //=========================================================================== // bessere Linktitel für Wikipedia-Links //--------------------------------------------------------------------------- $("a[href^='http://de.wikipedia.org']").each(function(){ $(this).attr('title',$(this).text()+' in der deutschen Wikipedia'); }); $("a[href^='http://en.wikipedia.org']").each(function(){ $(this).attr('title',$(this).text()+' in der englischen Wikipedia'); }); //=========================================================================== //=========================================================================== // behebt Anzeigefehler bei unmarkierten Änderungen: Wenn eine Box vor der Infobox steht und maximale Breite füllt, überlappte sich deren Inhalt bei Sichtern teils mit der Infobox. //--------------------------------------------------------------------------- $("#mw-fr-revisiontag").after("<div style='height: 10px;'></div>"); //=========================================================================== //=========================================================================== // verbirgt das Betreff-Eingabefeld bei Löschanträgen, da die Überschrift schon im Editor hinzugefügt wird //--------------------------------------------------------------------------- if($('.noSummary').length){ $('#editform #wpSummary').hide(); $('#editform #wpSummaryLabel').hide(); } //=========================================================================== //=========================================================================== // behebt einen Fehler mit den slideshows, damit sie nicht teilweise mitten im Text hängen //--------------------------------------------------------------------------- $('.slideshow').each(function(){ $(this).css('clear',($(this).css('float')=='left')?'left':'right'); }) //=========================================================================== //=========================================================================== // Lade die verlinkten anderen TV-Planer auf der Hauptseite direkt anstatt des normal angezeigten, ohne die Seite verlassen zu müssen //--------------------------------------------------------------------------- if(mw.config.get('wgPageName')==="Hauptseite"){ var TVPlanerActive=0; $('#TVPlaner + table td:first-child a, #TVPlaner-thisWeek a, #TVPlaner + table td:nth-child(3) a').each(function(){ $(this).click(function(e){ var url=$(this).attr('href'); var title=$(this).attr('title'); var num=url.split('/')[4]; num=num.substr(0,num.indexOf('.')); if(TVPlanerActive!=num){ //wenn eine Woche gerade angezeigt wird, muss sie nicht neu geladen werden e.preventDefault ? e.preventDefault() : (e.returnValue = false); //wahrt Kompatibilität zu IE8 und älter $('#TVPlaner-loading').show('fast'); $('#TVPlaner').slideUp(); if($('#TVPlaner-thisWeek').is(':hidden')) $('#TVPlaner-thisWeek').show(); //beim ersten "Umschalten" muss der Link zur aktuellen Woche sichtbar gemacht werden $('#TVPlaner').load(url+'#mw-content-text table', function(){ $('#TVPlaner').slideDown(); $('#TVPlaner-loading').hide('fast'); }); if($('#Diese_Woche_im_TV small a').length) $('#Diese_Woche_im_TV small a').attr('href', url).attr('title', title); TVPlanerActive=num; } }); }); } //=========================================================================== //=========================================================================== // Fix für das inputbox-Problem: Ignoriere alle inputboxen innerhalb der vector-Vorschau, sonst wird evtl. auf der falschen Seite gespeichert //--------------------------------------------------------------------------- if(mw.config.get('wgAction')==="edit"){ window.onload = function () { var observer=new MutationObserver(function(mutations){ mutations.forEach(function(m){ if(m.addedNodes.length){ $('.wikiEditor-preview-contents').promise().done(function() { $('.wikiEditor-preview-contents input').prop('disabled', true); }); } }); }); observer.observe(document.querySelector('.wikiEditor-preview-contents'),{childList: true}); }; } //=========================================================================== //=========================================================================== // ergänze Facebook-Link links oben, Einblendung erfogt animiert (Button wird ohnehin erst einige Momente nach dem Seitenaufbau ergänzt) //--------------------------------------------------------------------------- $('#mw-head').prepend("<div id='FBButton'>" +"<div class='floatleft'>" +"<a href='https://www.facebook.com/stargatewikide' title='Folge uns auf Facebook!' rel='nofollow'>" +"<img alt='' src='/w/images/thumb/c/c2/F_icon.svg/11px-F_icon.svg.png' srcset='/w/images/thumb/c/c2/F_icon.svg/17px-F_icon.svg.png 1.5x, /w/images/thumb/c/c2/F_icon.svg/22px-F_icon.svg.png 2x' data-file-width='267' data-file-height='267' height='11' width='11'>" +" Folge uns auf Facebook" +"</a></div></div>"); $('#FBButton').css('visibility', 'visible').animate({opacity: 1.0}, 400); //=========================================================================== //=========================================================================== // Versteckt Spoiler-Abschnitte im Inhaltsverzeichnis //--------------------------------------------------------------------------- spoilerHeadings = { headings: [], init: function(){ $('.spoiler :header > span').each(function(i, e){ spoilerHeadings.headings.push(e.id); }); spoilerHeadings.hideAll(); }, hideAll: function(){ spoilerHeadings.headings.forEach(function(val){ spoilerHeadings.hide(val); }); }, showAll: function(){ spoilerHeadings.headings.forEach(function(val){ spoilerHeadings.show(val); }); }, hide: function(id){ $("#toc li > a[href='#"+id+"']").parent('li').hide(); }, show: function(id){ $("#toc li > a[href='#"+id+"']").parent('li').show(); }, toggle: function(id){ $("#toc li > a[href='#"+id+"']").parent('li').toggle(); } } $( spoilerHeadings.init ); //=========================================================================== //=========================================================================== // Gleicht die Abstände zwischen den Boxen in den Spalten der Hauptseite aus, sodass am Ende keine große Lücke in einer Spalte entsteht //--------------------------------------------------------------------------- if(wgPageName=='Hauptseite' && wgAction=='view'){ var balanceHeights={ diff: 0, surplusRight: undefined, relevantBuffers: undefined, leftBuffers: undefined, rightBuffers: undefined, getHeightDiff: function(){ return $('#leftcol').height() - $('#rightcol').height(); }, checkBalance: function(){ balanceHeights.diff = balanceHeights.getHeightDiff(); if(balanceHeights.diff === 0) return; if(balanceHeights.diff<0){ balanceHeights.diff *= -1; balanceHeights.surplusRight = true; balanceHeights.relevantBuffers = balanceHeights.leftBuffers; }else{ balanceHeights.surplusRight = false; balanceHeights.relevantBuffers = balanceHeights.rightBuffers; } }, init: function(){ $('#leftcol .vertbuffer, #rightcol .vertbuffer').css('transition', 'height .3s'); balanceHeights.leftBuffers = $('#leftcol .vertbuffer'); balanceHeights.rightBuffers = $('#rightcol .vertbuffer'); balanceHeights.checkBalance(); balanceHeights.relevantBuffers.each(function(i, e){ e.style.height = Math.round(balanceHeights.diff / balanceHeights.relevantBuffers.length)+"px" }); balanceHeights.checkBalance(); balanceHeights.relevantBuffers.last().get(0).style.height = balanceHeights.relevantBuffers.last().height()+balanceHeights.diff+"px" } }; $(balanceHeights.init); } //=========================================================================== //=========================================================================== // Passt Links, die mit der [[Vorlage:Gelöschte Seite]] erzeugt werden, farblich vollständig (samt Unterstrich) an echte Redlinks an. //--------------------------------------------------------------------------- $(function() { $('.geloeschteSeite').parent().css('color','#ba0000'); }); //=========================================================================== //=========================================================================== // Import-Skript für CSS-Styles analog zu importScript //--------------------------------------------------------------------------- function importStyle(page) { var uri = wgScript + '?title=' + encodeURIComponent(page.replace(/ /g,'_')).replace(/%2F/ig,'/').replace(/%3A/ig,':') + '&action=raw&ctype=text/css'; return importStyleURI(uri); } var loadedStyles = {}; // included-styles tracker function importStyleURI(url) { if (loadedStyles[url]) { return null; } loadedStyles[url] = true; var e = document.createElement('link'); e.setAttribute('href',url); e.setAttribute('rel','stylesheet'); document.getElementsByTagName('head')[0].appendChild(e); return e; } //===========================================================================