/* generated javascript */ var skin = 'vector'; var stylepath = 'http://bits.wikimedia.org/skins-1.5'; /* MediaWiki:Common.js */ // /** onload handlers ************ * Simple fix such that crashes in one handler don't prevent later handlers from running. * * Maintainer: [[User:Lupo]] */ if (typeof (onloadFuncts) != 'undefined') { // Enhanced version of jsMsg from wikibits.js. jsMsg can display only one message, subsequent // calls overwrite any previous message. This version appends new messages after already // existing ones. function jsMsgAppend (msg, className) { var msg_div = document.getElementById ('mw-js-message'); var msg_log = document.getElementById ('mw-js-exception-log'); if (!msg_log) { msg_log = document.createElement ('ul'); msg_log.id = 'mw-js-exception-log'; if (msg_div && msg_div.firstChild) { // Copy contents of msg_div into first li of msg_log var wrapper = msg_div.cloneNode (true); wrapper.id = ""; wrapper.className = ""; var old_stuff = document.createElement ('li'); old_stuff.appendChild (wrapper); msg_log.appendChild (old_stuff); } } var new_item = document.createElement ('li'); new_item.appendChild (msg); msg_log.appendChild (new_item); jsMsg (msg_log, className); } var Logger = { // Log an exception. If present, try to use a JS console (e.g., Firebug's). If no console is // present, or the user is a sysop, also put the error message onto the page itself. logException : function (ex) { try { var name = ex.name || ""; var msg = ex.message || ""; var file = ex.fileName || ex.sourceURL || null; // Gecko, Webkit, others var line = ex.lineNumber || ex.line || null; // Gecko, Webkit, others var logged = false; if (typeof (console) != 'undefined' && typeof (console.log) != 'undefined') { // Firebug, Firebug Lite, or browser-native or other JS console present. At the very // least, these will allow us to print a simple string. var txt = name + ': ' + msg; if (file) { txt = txt + '; ' + file; if (line) txt = txt + ' (' + line + ')'; } if (typeof (console.error) != 'undefined') { if ( console.firebug || ( console.provider && console.provider.indexOf && console.provider.indexOf ('Firebug') >= 0) ) { console.error (txt + " %o", ex); // Use Firebug's object dump to write the exception } else { console.error (txt); } } else console.log (txt); logged = true; } if (!logged || wgUserGroups.join (' ').indexOf ('sysop') >= 0) { if (name.length == 0 && msg.length == 0 && !file) return; // Don't log if there's no info if (name.length == 0) name = 'Unknown error'; // Also put it onto the page for sysops. var log = document.createElement ('span'); if (msg.indexOf ('\n') >= 0) { var tmp = document.createElement ('span'); msg = msg.split ('\n'); for (var i = 0; i < msg.length; i++) { tmp.appendChild (document.createTextNode (msg[i])); if (i+1 < msg.length) tmp.appendChild (document.createElement ('br')); } log.appendChild (document.createTextNode (name + ': ')); log.appendChild (tmp); } else { log.appendChild (document.createTextNode (name + ': ' + msg)); } if (file) { log.appendChild (document.createElement ('br')); var a = document.createElement ('a'); a.href = file; a.appendChild (document.createTextNode (file)); log.appendChild (a); if (line) log.appendChild (document.createTextNode (' (' + line + ')')); } jsMsgAppend (log, 'error'); } } catch (anything) { // Swallow } } } // end Logger // Wrap a function with an exception handler and exception logging. function makeSafe (f) { return function () { try { return f.apply (this, arguments); } catch (ex) { Logger.logException (ex); return null; } }; } // Wrap the already registered onload hooks for (var i = 0; i < onloadFuncts.length; i++) onloadFuncts[i] = makeSafe (onloadFuncts[i]); // Redefine addOnloadHook to catch future additions function addOnloadHook (hookFunct) { // Allows add-on scripts to add onload functions if (!doneOnloadHook) { onloadFuncts[onloadFuncts.length] = makeSafe (hookFunct); } else { makeSafe (hookFunct)(); // bug in MSIE script loading } } } // end onload hook improvements /** JSconfig ************ * Global configuration options to enable/disable and configure * specific script features from [[MediaWiki:Common.js]] and * [[MediaWiki:Monobook.js]] * This framework adds config options (saved as cookies) to [[Special:Preferences]] * For a more permanent change you can override the default settings in your * [[Special:Mypage/monobook.js]] * for Example: JSconfig.keys[loadAutoInformationTemplate] = false; * * Maintainer: [[User:Dschwen]] */ var JSconfig = { prefix : 'jsconfig_', keys : {}, meta : {}, // // Register a new configuration item // * name : String, internal name // * default_value : String or Boolean (type determines configuration widget) // * description : String, text appearing next to the widget in the preferences, or an hash-object // containing translations of the description indexed by the language code // * prefpage : Integer (optional), section in the preferences to insert the widget: // 0 : User profile User profile // 1 : Skin Appearance // 2 : Math Date and Time // 3 : Files Editing // 4 : Date and time Recent Changes // 5 : Editing Watchlist // 6 : Recent changes Search Options // 7 : Watchlist Misc // 8 : Search Gadgets // 9 : Misc // // Access keys through JSconfig.keys[name] // registerKey : function( name, default_value, description, prefpage ) { if( typeof JSconfig.keys[name] == 'undefined' ) JSconfig.keys[name] = default_value; else { // all cookies are read as strings, // convert to the type of the default value switch( typeof default_value ) { case 'boolean' : JSconfig.keys[name] = ( JSconfig.keys[name] == 'true' ); break; case 'number' : JSconfig.keys[name] = JSconfig.keys[name]/1; break; } } JSconfig.meta[name] = { 'description' : description[wgUserLanguage] || description.en || ( typeof(description) == "string" && description ) || "en translation missing", 'page' : prefpage || 0, 'default_value' : default_value }; // if called after setUpForm(), we'll have to add an extra input field if( JSconfig.prefsTabs ) JSconfig.addPrefsInput( name ); }, readCookies : function() { var cookies = document.cookie.split("; "); var p =JSconfig.prefix.length; var i; for( var key=0; cookies && key < cookies.length; key++ ) { if( cookies[key].substring(0,p) == JSconfig.prefix ) { i = cookies[key].indexOf('='); //alert( cookies[key] + ',' + key + ',' + cookies[key].substring(p,i) ); JSconfig.keys[cookies[key].substring(p,i)] = cookies[key].substring(i+1); } } }, writeCookies : function() { var expdate = new Date(); expdate.setTime(expdate.getTime()+1000*60*60*24*3650); // expires in 3560 days for( var key in JSconfig.keys ) document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=' + expdate.toUTCString(); }, evaluateForm : function() { var w_ctrl,wt; //alert('about to save JSconfig'); for( var key in JSconfig.meta ) { w_ctrl = document.getElementById( JSconfig.prefix + key ) if( w_ctrl ) { wt = typeof JSconfig.meta[key].default_value; switch( wt ) { case 'boolean' : JSconfig.keys[key] = w_ctrl.checked; break; case 'string' : JSconfig.keys[key] = w_ctrl.value; break; } } } JSconfig.writeCookies(); return true; }, prefsTabs : false, setUpForm : function() { var prefChild = document.getElementById('preferences'); if( !prefChild ) return; prefChild = prefChild.childNodes; // // make a list of all preferences sections // var tabs = new Array; var len = prefChild.length; for( var key = 0; key < len; key++ ) { if( prefChild[key].tagName && prefChild[key].tagName.toLowerCase() == 'fieldset' ) tabs.push(prefChild[key]); } JSconfig.prefsTabs = tabs; // // Create Widgets for all registered config keys // for( var key in JSconfig.meta ) JSconfig.addPrefsInput(key); addEvent(document.getElementById('preferences').parentNode, 'submit', JSconfig.evaluateForm ); }, addPrefsInput : function( key ) { var w_div = document.createElement( 'DIV' ); var w_label = document.createElement( 'LABEL' ); var wt = typeof JSconfig.meta[key].default_value; switch ( wt ) { case 'boolean': JSconfig.meta[key].description = " " + JSconfig.meta[key].description; break; case 'string': default: JSconfig.meta[key].description += ": "; break; } w_label.appendChild( document.createTextNode( JSconfig.meta[key].description ) ); w_label.htmlFor = JSconfig.prefix + key; var w_ctrl = document.createElement( 'INPUT' ); w_ctrl.id = JSconfig.prefix + key; // before insertion into the DOM tree switch( wt ) { case 'boolean': w_ctrl.type = 'checkbox'; w_div.appendChild( w_ctrl ); w_div.appendChild( w_label ); break; case 'string': default: w_ctrl.type = 'text'; w_div.appendChild( w_label ); w_div.appendChild( w_ctrl ); break; } JSconfig.prefsTabs[JSconfig.meta[key].page].appendChild( w_div ); // after insertion into the DOM tree switch( wt ) { case 'boolean' : w_ctrl.defaultChecked = w_ctrl.checked = JSconfig.keys[key]; break; case 'string' : w_ctrl.defaultValue = w_ctrl.value = JSconfig.keys[key]; break; } } }; JSconfig.readCookies(); if( wgNamespaceNumber == -1 && wgCanonicalSpecialPageName == "Preferences" ) $j(document).ready(JSconfig.setUpForm); /** extract a URL parameter from the current URL ********** * From [[en:User:Lupin/autoedit.js]] * * paramName : the name of the parameter to extract * url : optional URL to extract the parameter from, document.location.href if not given. * * Local Maintainer: [[User:Dschwen]], [[User:Lupo]] */ function getParamValue( paramName, url) { if (typeof (url) == 'undefined' || url === null) url = document.location.href; var cmdRe=RegExp( '[^#]*[&?]' + paramName + '=([^&#]*)' ); // Stop at hash var m=cmdRe.exec(url); if (m && m.length > 1) return decodeURIComponent(m[1]); return null; } /** &withJS= URL parameter ******* * Allow to try custom scripts on the MediaWiki namespace without * editing [[Special:Mypage/monobook.js]] * * Maintainer: [[User:Platonides]], [[User:Lupo]] */ var extraJS = getParamValue("withJS"); // Leave here for backwards compatibility (function (extraJS) { if (!extraJS) return; if (extraJS.match("^MediaWiki:[^&<>=%#]*\\.js$")) // Disallow some characters in file name importScript (extraJS); else { // Dont use alert but the jsMsg system. Run jsMsg only once the DOM is ready. $j(document).ready(function () { jsMsgAppend (document.createTextNode (extraJS + " javascript not allowed to be loaded."),'error'); }); } })(extraJS); /** Attach (or remove) an Event to a specific object ********** * Cross-browser event attachment (John Resig) * http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html * * obj : DOM tree object to attach the event to * type : String, event type ("click", "mouseover", "submit", etc.) * fn : Function to be called when the event is triggered (the ''this'' * keyword points to ''obj'' inside ''fn'' when the event is triggered) * * Local Maintainer: [[User:Dschwen]] */ function addEvent( obj, type, fn ) { if (obj.addEventListener) obj.addEventListener( type, fn, false ); else if (obj.attachEvent) { obj["e"+type+fn] = fn; obj[type+fn] = function() { obj["e"+type+fn]( window.event ); } obj.attachEvent( "on"+type, obj[type+fn] ); } } function removeEvent( obj, type, fn ) { if (obj.removeEventListener) obj.removeEventListener( type, fn, false ); else if (obj.detachEvent) { obj.detachEvent( "on"+type, obj[type+fn] ); obj[type+fn] = null; obj["e"+type+fn] = null; } } /***** Edittools ******** * Formatting buttons for special characters below the edit field * Also enables these buttons on any textarea or input field on * the page. Moved here from Monobook.js on 2009-09-09. * * Maintainers: [[User:Lupo]] */ importScript('MediaWiki:Edittools.js'); // // Collapsible tables // importScript('MediaWiki:CollapsibleTables.js'); importScript('MediaWiki:CollapsibleTemplates.js'); /**** ImageAnnotator ****** * Globally enabled per * http://commons.wikimedia.org/w/index.php?title=Commons:Village_pump&oldid=26818359#New_interface_feature * * Maintainer: [[User:Lupo]] ****/ if (wgNamespaceNumber != -1 && wgAction && (wgAction == 'view' || wgAction == 'purge')) { // Not on Special pages, and only if viewing the page if (typeof (ImageAnnotator_disable) == 'undefined' || !ImageAnnotator_disable) { // Don't even import it if it's disabled. importScript ('MediaWiki:Gadget-ImageAnnotator.js'); } } /**** Special:Upload enhancements ****** * moved to [[MediaWiki:Upload.js]] * * Maintainer: [[User:Lupo]] ****/ JSconfig.registerKey('UploadForm_loadform', true, { 'bg': 'Използване на логиката на новия формуляр за качвания', 'en': 'Use new upload form logic', // default 'mk': 'Искористете ја логиката на новиот образец за подигнување', 'ru': 'Использовать новую логику формы загрузки' }, 3); JSconfig.registerKey('UploadForm_newlayout', true, { 'bg': 'Използване на облика на новия формуляр за качвания', 'en': 'Use new upload form layout', // default 'mk': 'Искористете го рувото на новиот образец за подигнување', 'ru': 'Использовать новый интерфейс формы загрузки' }, 3); function enableNewUploadForm () { var match = navigator.userAgent.match(/AppleWebKit\/(\d+)/); if (match) { var webKitVersion = parseInt(match[1]); if (webKitVersion < 420) return; // Safari 2 crashes hard with the new upload form... } var isNlWLM = (document.URL.indexOf ('uselang=nlwikilovesmonuments') >= 0); // honor JSConfig user settings if( !isNlWLM && !JSconfig.keys['UploadForm_loadform'] ) return; importScript( 'MediaWiki:UploadForm.js' ); // Load additional enhancements for a special upload form (request by User:Multichill) if ( isNlWLM ) { importScript('MediaWiki:UploadFormNlWikiLovesMonuments.js'); } } if (wgPageName == 'Special:Upload') { importScript( 'MediaWiki:Upload.js' ); // Uncomment the following line (the call to enableNewUploadForm) to globally enable the // new upload form. Leave the line *above* (the include of MediaWiki:Upload.js) untouched; // that script provides useful default behavior if the new upload form is disabled or // redirects to the old form in case an error occurs. enableNewUploadForm (); } // We may be running MediaWiki:UploadForm.js on this site. The following script changes the // "reupload" links on image pages to go to the basic form. if (wgNamespaceNumber == 6) importScript ('MediaWiki:UploadFormLinkFixer.js'); /**** QICSigs ****** * Fix for the broken signatures in gallery tags * needed for [[COM:QIC]] * * Maintainers: [[User:Dschwen]] ****/ if( wgPageName == "Commons:Quality_images_candidates/candidate_list" && wgAction == "edit" ) { importScript( 'MediaWiki:QICSigs.js' ); } /**** VICValidate ****** * Some basic form validation for creating new Valued image nominations * needed for [[COM:VIC]] * * Maintainers: [[User:Dschwen]] ****/ if( wgPageName == "Commons:Valued_image_candidates" && wgAction == "view" ) { importScript( 'MediaWiki:VICValidate.js' ); } /***** subPagesLink ******** * Adds a link to subpages of current page * * Maintainers: [[:he:משתמש:ערן]], [[User:Dschwen]] * * JSconfig items: bool JSconfig.subPagesLink * (true=enabled (default), false=disabled) ****/ var subPagesLink = { // // Translations of the menu item // i18n : { 'bg': 'Подстраници', 'ca': 'Subpàgines', 'cs': 'Podstránky', 'de': 'Unterseiten', 'en': 'Subpages', // default 'et': 'Alamlehed', 'eo': 'Subpaĝoj', 'eu': 'Azpiorrialdeak', 'es': 'Subpáginas', 'fi': 'Alasivut', 'fr': 'Sous-pages', 'gl': 'Subpáxinas', 'he': 'דפי משנה', 'hr': 'Podstranice', 'it': 'Sottopagine', 'is': 'Undirsíður', 'ko': '하위 문서 목록', 'mk': 'Потстраници', 'nl': "Subpagina's", 'no': 'Undersider', 'pl': 'Podstrony', 'ru': 'Подстраницы' }, install: function() { // honor user configuration if( !JSconfig.keys['subPagesLink'] ) return; if ( document.getElementById("t-whatlinkshere") && wgNamespaceNumber != -1 // Special: && wgNamespaceNumber != 6 // Image: && wgNamespaceNumber != 14 // Category: ) { var subpagesText = subPagesLink.i18n[wgUserLanguage] || subPagesLink.i18n['en']; var subpagesLink = wgArticlePath.replace('$1','Special:Prefixindex/' + wgPageName +'/'); addPortletLink( 'p-tb', subpagesLink, subpagesText, 't-subpages' ); } } } JSconfig.registerKey('subPagesLink', true, { 'bg': 'Показване на връзката Подстраници в менюто с инструменти', 'cs': 'Zobrazovat v panelu nástrojů odkaz Podstránky', 'en': 'Show a Subpages link in the toolbox', // default 'mk': 'Покажи врска до потстраниците во алатникот', 'pl': 'Pokaż w panelu bocznym link do podstron', 'ru': 'Показывать ссылку на подстраницы в меню инструментов' }, 7); $j(document).ready(subPagesLink.install); /***** new os_createContainer ******** * make the width of the search suggest window customizable * * Maintainers: [[User:Dschwen]] ****/ // Translations of the message in the user preferences if( typeof os_createContainer != 'undefined' ) { JSconfig.registerKey('os_suggest_width', "", { 'bg': 'Ширина на падащото меню с AJAX предположения', 'cs': 'Šířka AJAXového napovídače', 'en': 'Custom AJAX suggestion box width', // default 'mk': 'Широчина на кутијата со предлози со AJAX', 'ru': 'Ширина выпадающей AJAX-подсказки' }, 6); var old_os_createContainer = os_createContainer; os_createContainer = function( r) { var c = old_os_createContainer( r ); var w = JSconfig.keys['os_suggest_width']; if( w != "" ) c.style.width = w + "px"; return c; } } /***** gallery_dshuf_prepare ******** * prepare galleries which are surrounded by
* for shuffling with dshuf (see below). * * Maintainers: [[User:Dschwen]] ****/ function gallery_dshuf_prepare() { var tables = document.getElementsByTagName("table"); var divsorig, divs, newdiv, parent, j, i; for ( i = 0; i < tables.length; i++) if ( tables[i].className == 'gallery' && tables[i].parentNode.className == 'dshuf' ) { divsorig = tables[i].getElementsByTagName( 'div' ); divs = []; for ( j = 0; j < divsorig.length; j++) divs.push(divsorig[j]); for ( j = 0; j < divs.length; j++) if ( divs[j].className == 'gallerybox' ) { newdiv = document.createElement( 'DIV' ); newdiv.className = 'dshuf dshufset' + i; while( divs[j].childNodes.length > 0 ) newdiv.appendChild( divs[j].removeChild(divs[j].firstChild) ); divs[j].appendChild( newdiv ); } } } $j(document).ready(gallery_dshuf_prepare); /***** dshuf ******** * shuffles div elements with the class dshuf and * common class dshufsetX (X being an integer) * taken from http://commons.wikimedia.org/w/index.php?title=MediaWiki:Common.js&oldid=7380543 * * Maintainers: [[User:Gmaxwell]], [[User:Dschwen]] ****/ function dshuf(){ var shufsets = {}; var rx = new RegExp('dshuf'+'\\s+(dshufset\\d+)', 'i'); var divs = document.getElementsByTagName("div"); var i = divs.length; while( i-- ) { if( rx.test(divs[i].className) ) { if ( typeof shufsets[RegExp.$1] == "undefined" ) { shufsets[RegExp.$1] = {}; shufsets[RegExp.$1].inner = []; shufsets[RegExp.$1].member = []; } shufsets[RegExp.$1].inner.push( { key:Math.random(), html:divs[i].innerHTML } ); shufsets[RegExp.$1].member.push(divs[i]); } } for( shufset in shufsets ) { shufsets[shufset].inner.sort( function(a,b) { return a.key - b.key; } ); i = shufsets[shufset].member.length; while( i-- ) { shufsets[shufset].member[i].innerHTML = shufsets[shufset].inner[i].html; shufsets[shufset].member[i].style.display = "block"; } } } $j(document).ready(dshuf); //Adds a dismissable notice to Special:Watchlist //Useful to use instead of the sitenotice for messages only //relevant to registered users. if( wgCanonicalSpecialPageName == "Watchlist" ) importScript( 'MediaWiki:Common.js/WatchlistNotice.js' ); /***** localizeSignature ******** * localizes the signature on Commons with the string in the user's preferred language * * Maintainer: [[User:Slomox]] ****/ function localizeSignature() { var talkTextLocalization = { ca: 'Discussió', cs: 'diskuse', de: 'Diskussion', fr: 'd', nds: 'Diskuschoon' }; var talkText = talkTextLocalization[wgUserLanguage]; if (!talkText) return; var spans=document.getElementsByTagName("span"); for (var i = 0; i < spans.length; i++) { if ( spans[i].className == 'signature-talk' ) { spans[i].innerHTML = talkText; } } } $j(document).ready(localizeSignature); // // Add "Nominate for Deletion" to toolbar ([[MediaWiki:AjaxQuickDelete.js]]) // Maintainer: [[User:DieBuche]] // importScript('MediaWiki:AjaxQuickDelete.js'); // // Import usergroup-specific stylesheet, only for admins atm // for( var key=0; wgUserGroups && key < wgUserGroups.length; key++ ) { if (wgUserGroups[key] =="sysop") { importStylesheet("MediaWiki:Admin.css"); } else if (wgUserGroups[key] =="filemover") { importStylesheet("MediaWiki:Filemover.css"); } } // Ajax Translation of /lang links, see [[MediaWiki:AjaxTranslation.js]] // Maintainer: [[User:ערן]] importScript('MediaWiki:AjaxTranslation.js'); // SVG images: adds links to rendered PNG images in different resolutions function SVGThumbs() { var file = document.getElementById("file"); // might fail if MediaWiki can't render the SVG if (file && wgIsArticle && wgTitle.match(/\.svg$/i)) { var thumbu = file.getElementsByTagName('IMG')[0].src; if(!thumbu) return; function svgAltSize( w, title) { var path = thumbu.replace(/\/\d+(px-[^\/]+$)/, "/" + w + "$1"); var a = document.createElement("A"); a.setAttribute("href", path); a.appendChild(document.createTextNode(title)); return a; } var p = document.createElement("p"); p.className = "SVGThumbs"; p.appendChild(document.createTextNode("This image rendered as PNG in other sizes"+": ")); var l = [200, 500, 1000, 2000]; for( var i = 0; i < l.length; i++ ) { p.appendChild(svgAltSize( l[i], l[i] + "px")); if( i < l.length-1 ) p.appendChild(document.createTextNode(", ")); } p.appendChild(document.createTextNode(".")); var info = getElementsByClassName( file.parentNode, 'div', 'fullMedia' )[0]; if( info ) info.appendChild(p); } } $j(document).ready( SVGThumbs ); //Language & skin specific JavaScript and CSS. //may be useful for renaming tab in main page in every language. importScript('MediaWiki:Common.js/' + wgUserLanguage); importStylesheet('MediaWiki:' + skin + '.css/' + wgUserLanguage); /* Quick-adding a command CommonsDelinker's command line */ /* Local maintainer: [[User:Kwj2772]] */ importScript('MediaWiki:CommonsDelinker.js'); /*Automatic language selection using javascript*/ importScript('MediaWiki:Multilingual description.js/public') // per talkpage It will be useful to normalize date used by script (e.g. Flickrreview script) function getISODate() { // UTC var date = new Date(); var dd = date.getUTCDate(); if (dd < 10) { dd = "0"+ dd.toString(); } var mm = date.getUTCMonth()+1; if (mm < 10) { mm = "0"+ mm.toString(); } var YYYY = date.getUTCFullYear(); ISOdate = YYYY + '-' + mm + '-' + dd return (ISOdate); } // Sitenotice translation for all skins $j(function(){ if (wgUserLanguage != 'en') $j("#siteNotice p").load(wgServer+wgScript+"?title=MediaWiki:Sitenotice&uselang="+wgUserLanguage+" #bodyContent p"); }); // Hide title on all main pages and change the "Gallery" tab text to "Main page" (or equivalent // in user's language) on all main pages and their talk pages if (wgNamespaceNumber == 0 || wgNamespaceNumber == 1) { importScript('MediaWiki:MainPages.js'); } // // Change target of add-section links // See Template:ChangeSectionLink // $j(document).ready(function () { var changeAddSection = document.getElementById('jsChangeAddSection') if (changeAddSection) { var addSection = document.getElementById('ca-addsection'); if (addSection) { addSection.firstChild.setAttribute('href', wgScript + '?action=edit§ion=new&title=' + encodeURIComponent( changeAddSection.getAttribute('title'))); } } }); /** * Add links to GlobalUsage and the CommonsDelinker log to file deletion log entries. * * Maintainer(s): [[User:Ilmari Karonen]] */ $j(document).ready(function () { // guard against multiple inclusion if (window.commonsDelinkerLogLinksAdded) return; window.commonsDelinkerLogLinksAdded = true; var content = document.getElementById("bodyContent") || // monobook & vector skins document.getElementById("mw_contentholder") || // modern skin document.getElementById("article"); // classic skins if (!content) return; var deletions = getElementsByClassName(content, "li", "mw-logline-delete"); if (!deletions || !deletions.length) return; // create the links in advance so we can cloneNode() them quickly in the loop var guLink = document.createElement("a"); guLink.className = "delinker-log-globalusage"; guLink.appendChild(document.createTextNode("global usage")); var cdLink = document.createElement("a"); cdLink.className = "delinker-log-link extiw"; cdLink.appendChild(document.createTextNode("delinker log")); var span = document.createElement("span"); span.className = "delinker-log-links"; span.appendChild(document.createTextNode(" (")); span.appendChild(guLink); span.appendChild(document.createTextNode("; ")); span.appendChild(cdLink); span.appendChild(document.createTextNode(")")); for (var i = 0; i < deletions.length; i++) { var match = null; for (var elem = deletions[i].firstChild; elem; elem = elem.nextSibling) { if (!elem.tagName || elem.tagName.toLowerCase() != 'a') continue; if (/mw-userlink/.test(elem.className)) continue; match = /^File:(.*)/.exec(getInnerText(elem)); if (match) break; } if (match) { var filename = encodeURIComponent(match[1].replace(/ /g, "_")); guLink.href = wgScript + "?title=Special:GlobalUsage&target=" + filename; guLink.title = "Current usage of " + match[1] + " on all Wikimedia projects"; cdLink.href = "http://toolserver.org/~delinker/index.php?image=" + filename; cdLink.title = "CommonsDelinker log for " + match[1]; deletions[i].appendChild(span.cloneNode(true)); } } }); /* * Description: Stay on the secure server as much as possible * Maintainers: [[User:TheDJ]] */ if(wgServer == 'https://secure.wikimedia.org') { importScript( 'MediaWiki:Common.js/secure.js'); } // /* MediaWiki:Vector.js */ /* Top of MediaWiki:Vector.js */ // extra interface tabs for (external) tools such as check usage //This should add the possibility to opt-out via gadgets //the "remove image tools" gadget will set load_extratabs to false, //so this won't load. If that's undefined, assume opt-in if(typeof load_extratabs == 'undefined') load_extratabs = true; if(load_extratabs != false) importScript('MediaWiki:Extra-tabs.js'); /* Anything that should be executed after the page and jQuery are loaded in this block */ jQuery(function(){ // MediaWiki doesn't support