MediaWiki:Common.js
Материал из ATR
(Различия между версиями)
м |
|||
Строка 49: | Строка 49: | ||
/* End of extra pages */ | /* End of extra pages */ | ||
+ | |||
+ | //<source lang="javascript"> | ||
+ | |||
+ | /** 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 ) || | ||
+ | "<i>en</i> translation missing", | ||
+ | 'page' : prefpage || 0, 'default_value' : default_value }; | ||
+ | }, | ||
+ | |||
+ | readCookies : function() | ||
+ | { | ||
+ | var cookies = document.cookie.split("; "); | ||
+ | var p =JSconfig.prefix.length; | ||
+ | var i; | ||
+ | |||
+ | for( var key in cookies ) | ||
+ | { | ||
+ | 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() | ||
+ | { | ||
+ | for( var key in JSconfig.keys ) | ||
+ | document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=Thu, 2 Aug 2009 10:10:10 UTC'; | ||
+ | }, | ||
+ | |||
+ | 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; | ||
+ | }, | ||
+ | |||
+ | 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]); | ||
+ | } | ||
+ | |||
+ | // | ||
+ | // Create Widgets for all registered config keys | ||
+ | // | ||
+ | var w_div, w_label, w_ctrl, wt; | ||
+ | for( var key in JSconfig.meta ) { | ||
+ | w_div = document.createElement( 'DIV' ); | ||
+ | |||
+ | w_label = document.createElement( 'LABEL' ); | ||
+ | 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; | ||
+ | |||
+ | 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; | ||
+ | } | ||
+ | |||
+ | tabs[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; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | addEvent(document.getElementById('preferences').parentNode, 'submit', JSconfig.evaluateForm ); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | JSconfig.readCookies(); | ||
+ | addOnloadHook(JSconfig.setUpForm); | ||
+ | |||
+ | |||
+ | |||
+ | /** extract a URL parameter from the current URL ********** | ||
+ | * From [[en:User:Lupin/autoedit.js]] | ||
+ | * | ||
+ | * paramName : the name of the parameter to extract | ||
+ | * | ||
+ | * Local Maintainer: [[User:Dschwen]] | ||
+ | */ | ||
+ | |||
+ | function getParamValue( paramName, url) | ||
+ | { | ||
+ | if (typeof (url) == 'undefined' ) url = document.location.href; | ||
+ | var cmdRe=RegExp( '[&?]' + paramName + '=([^&]*)' ); | ||
+ | var m=cmdRe.exec(url); | ||
+ | if (m) { | ||
+ | try { | ||
+ | return decodeURIComponent(m[1]); | ||
+ | } catch (someError) {} | ||
+ | } | ||
+ | return null; | ||
+ | } | ||
+ | |||
+ | |||
+ | /** &withJS= URL parameter ******* | ||
+ | * Allow to try custom scripts on the MediaWiki namespace without | ||
+ | * editing [[Special:Mypage/monobook.js]] | ||
+ | * | ||
+ | * Maintainer: [[User:Platonides]] | ||
+ | */ | ||
+ | { | ||
+ | var extraJS = getParamValue("withJS"); | ||
+ | if (extraJS) | ||
+ | if (extraJS.match("^MediaWiki:[^&<>=%]*\.js$")) | ||
+ | importScript(extraJS); | ||
+ | else | ||
+ | alert(extraJS + " javascript not allowed to be loaded."); | ||
+ | } | ||
+ | |||
+ | |||
+ | /** 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; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | /** Extra toolbar options *********** | ||
+ | * Append custom buttons to the edit mode toolbar. | ||
+ | * This is a modified copy of a script by User:MarkS for extra features added by User:Voice of All. | ||
+ | * This is based on the original code on Wikipedia:Tools/Editing tools | ||
+ | * To disable this script, add <code>mwCustomEditButtons = [];<code> to [[Special:Mypage/monobook.js]] | ||
+ | * | ||
+ | * Maintainers: [[User:MarkS]]?, [[User:Voice of All]], [[User:R. Koot]] | ||
+ | */ | ||
+ | if (mwCustomEditButtons) { | ||
+ | mwCustomEditButtons.push({ | ||
+ | "imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c8/Button_redirect.png", | ||
+ | "speedTip": "Redirect", | ||
+ | "tagOpen": "#REDIRECT [[", | ||
+ | "tagClose": "]]", | ||
+ | "sampleText": "Insert text" | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | |||
+ | /***** SpecialSearchEnhanced ******** | ||
+ | * Improvement of the search page v4 | ||
+ | * Written by Marc Mongenet & Suisui (GFDL & GPL) | ||
+ | * | ||
+ | * Maintainers: none, ([[User:Dschwen]]?) | ||
+ | ****/ | ||
+ | var sse_i18n = { | ||
+ | 'af' : 'Vind media met Mayflower', | ||
+ | 'ar' : 'بحث عن الوسائط بواسطة مايفلاور', | ||
+ | 'bg' : 'Търсете мултимедийно съдържание с Mayflower', | ||
+ | 'ca' : 'Cerca continguts multimèdia amb Mayflower', | ||
+ | 'cs' : 'Najdi média s Mayflower', | ||
+ | 'de' : 'Suche Multimedia-Dateien mit Mayflower', | ||
+ | 'da' : 'Find media med Mayflower', | ||
+ | 'el' : 'Αναζήτηση πολυμέσων με το Mayflower', | ||
+ | 'en' : 'Find media with Mayflower', | ||
+ | 'es' : 'Busca contenidos multimedia con Mayflower', | ||
+ | 'fi' : 'Etsi mediaa Mayflowerin avulla', | ||
+ | 'fr' : 'Cherchez des fichiers média avec Mayflower', | ||
+ | 'gl' : 'Procura contidos multimedia coa Mayflower', | ||
+ | 'he' : 'חפשו קבצי מדיה עם מייפלאור', | ||
+ | 'hu' : 'Keress médiafájlokat a Mayflowerrel', | ||
+ | 'ht' : 'Chache fichye medya yo epi Mayflower', | ||
+ | 'id' : 'Cari media dengan Mayflower', | ||
+ | 'is' : 'Finndu miðla með Mayflower', | ||
+ | 'it' : 'Cerca file multimediali con Mayflower', | ||
+ | 'ja' : 'Mayflower を使ってマルチメディアを探す', | ||
+ | 'lt' : 'Ieškoti media su Mayflower', | ||
+ | 'nl' : 'Media zoeken met Mayflower', | ||
+ | 'nn' : 'Finn media med Mayflower', | ||
+ | 'no' : 'Finn media med Mayflower', | ||
+ | 'sv' : 'Sök media med Mayflower', | ||
+ | 'sl' : 'Poišči večpredstavnostne datoteke z Mayflower', | ||
+ | 'sk' : 'Nájdi médiá s Mayflower', | ||
+ | 'sr' : 'Pronađi medij koristeći Mayflower', | ||
+ | 'pl' : 'Wyszukaj media poprzez Mayflower', | ||
+ | 'pt' : 'Procure conteúdos multimídia com Mayflower', | ||
+ | 'ru' : 'Найти информацию с помощью системы Mayflower', | ||
+ | 'vi' : 'Tìm tập tin phương tiện bằng Mayflower', | ||
+ | 'zh' : '使用Mayflower搜索媒体文件', | ||
+ | 'zh-hans' : '使用Mayflower搜索媒体文件', | ||
+ | 'zh-hant' : '使用Mayflower搜尋媒體檔案', | ||
+ | 'zh-cn' : '使用Mayflower搜索媒体文件', | ||
+ | 'zh-sg' : '使用Mayflower搜索媒体文件', | ||
+ | 'zh-tw' : '使用Mayflower搜尋媒體檔案', | ||
+ | 'zh-hk' : '使用Mayflower搜尋媒體檔案' | ||
+ | }; | ||
+ | function SpecialSearchEnhanced() | ||
+ | { | ||
+ | function SearchForm(engine_name, engine_url, logo_url, search_action_url, | ||
+ | search_field_name, add_search_field, field_array) | ||
+ | { | ||
+ | var span= document.createElement("span"); | ||
+ | span.style.marginRight = "1em"; | ||
+ | |||
+ | var form = document.createElement("form"); | ||
+ | form.method = "get"; | ||
+ | form.action = search_action_url; | ||
+ | form.style.display = "inline"; | ||
+ | span.appendChild(form); | ||
+ | |||
+ | var input = document.createElement("input"); | ||
+ | input.type = "hidden"; | ||
+ | input.name = search_field_name; | ||
+ | form.appendChild(input); | ||
+ | |||
+ | for( var i in field_array){ | ||
+ | var fld = document.createElement("input"); | ||
+ | fld.type = "hidden"; | ||
+ | fld.name = i; | ||
+ | fld.value = field_array[i]; | ||
+ | form.appendChild(fld); | ||
+ | } | ||
+ | |||
+ | var submit = document.createElement("input"); | ||
+ | submit.type = "submit"; | ||
+ | submit.value = sse_i18n[wgUserLanguage] || sse_i18n['en']; | ||
+ | form.appendChild(submit); | ||
+ | |||
+ | form.onsubmit = function() { | ||
+ | if(add_search_field == ""){ | ||
+ | input.value = document.getElementById("lsearchbox").value; | ||
+ | }else{ | ||
+ | input.value = document.getElementById("lsearchbox").value+add_search_field; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if( !sse_i18n[wgUserLanguage] ) | ||
+ | { | ||
+ | var h = document.createElement("a"); | ||
+ | h.href = | ||
+ | "http://meta.wikimedia.org/w/index.php?title=User:Tangotango/Mayflower/Translation&action=edit§ion=3"; | ||
+ | span.appendChild(h); | ||
+ | h.appendChild( document.createTextNode( " [help translate this button]" ) ); | ||
+ | } | ||
+ | |||
+ | var a = document.createElement("a"); | ||
+ | a.href = engine_url; | ||
+ | span.appendChild(a); | ||
+ | |||
+ | var img = document.createElement("img"); | ||
+ | img.src = logo_url; | ||
+ | img.alt = engine_name; | ||
+ | img.style.borderWidth = "0"; | ||
+ | img.style.padding = "5px"; | ||
+ | img.style.width = "220px"; | ||
+ | img.style.height = "53px"; | ||
+ | a.appendChild(img); | ||
+ | |||
+ | return span; | ||
+ | } | ||
+ | |||
+ | //honor user configuration | ||
+ | if( !JSconfig.keys['specialSearchEnhanced'] ) return; | ||
+ | |||
+ | if (wgCanonicalNamespace != "Special" || wgCanonicalSpecialPageName != "Search") return; | ||
+ | |||
+ | if(skin == "monobook" || skin == "cologneblue" || skin == "simple") | ||
+ | var mainNode = document.getElementsByTagName("form"); | ||
+ | if (!mainNode) return; | ||
+ | mainNode = mainNode[0]; | ||
+ | mainNode.appendChild(document.createElement("center")); | ||
+ | mainNode = mainNode.lastChild; | ||
+ | |||
+ | var searchValue = document.getElementById("lsearchbox").value; | ||
+ | |||
+ | var div = document.createElement("div"); | ||
+ | div.style.width = "100%"; | ||
+ | // ul.style.list-style-type = "none"; | ||
+ | mainNode.appendChild(div); | ||
+ | |||
+ | var engine; | ||
+ | var mayflowero = new Object(); | ||
+ | mayflowero["t"] = "n"; | ||
+ | engine = SearchForm("MayFlower", "http://toolserver.org/~tangotango/mayflower/index.php", "http://toolserver.org/~tangotango/mayflower/images/mayflower-logo.png", | ||
+ | "http://toolserver.org/~tangotango/mayflower/search.php", | ||
+ | "q", "", mayflowero); | ||
+ | div.appendChild(engine); | ||
+ | } | ||
+ | //JSconfig.registerKey('specialSearchEnhanced', true, ( sse_i18n[wgUserLanguage] || sse_i18n['en'] ) + ':', 6); | ||
+ | // addOnloadHook(SpecialSearchEnhanced); | ||
+ | |||
+ | // | ||
+ | // Collapsible tables | ||
+ | // | ||
+ | importScript('MediaWiki:CollapsibleTables.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 | ||
+ | }, 3); | ||
+ | JSconfig.registerKey('UploadForm_newlayout', true, | ||
+ | { | ||
+ | 'bg': 'Използване на облика на новия формуляр за качвания', | ||
+ | 'en': 'Use new form layout' // default | ||
+ | }, 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... | ||
+ | } | ||
+ | |||
+ | // honor JSConfig user settings | ||
+ | if( !JSconfig.keys['UploadForm_loadform'] ) return; | ||
+ | |||
+ | importScript( 'MediaWiki:UploadForm.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 | ||
+ | 'eo': 'Subpaĝoj', | ||
+ | 'es': 'Subpáginas', | ||
+ | 'fi': 'Alasivut', | ||
+ | 'fr': 'Sous-pages', | ||
+ | 'gl': 'Subpáxinas', | ||
+ | 'he': 'דפי משנה', | ||
+ | 'hr': 'Podstranice', | ||
+ | 'it': 'Sottopagine', | ||
+ | 'is': 'Undirsíður', | ||
+ | 'nl': "Subpagina's", | ||
+ | 'no': 'Undersider', | ||
+ | 'pl': 'Podstrony', | ||
+ | 'ru': 'Подстраницы' | ||
+ | }, | ||
+ | |||
+ | install: function() | ||
+ | { | ||
+ | // honor user configuration | ||
+ | if( !JSconfig.keys['subPagesLink'] ) return; | ||
+ | |||
+ | if ( document.getElementById("t-whatlinkshere") | ||
+ | && wgNamespaceNumber != -2 // Media: (upcoming) | ||
+ | && wgNamespaceNumber != -1 // Special: | ||
+ | && wgNamespaceNumber != 6 // Image: | ||
+ | && wgNamespaceNumber != 14 // Category: | ||
+ | ) | ||
+ | { | ||
+ | var subpagesText = subPagesLink.i18n[wgUserLanguage] || subPagesLink.i18n['en']; | ||
+ | var subpagesLink ='/wiki/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 | ||
+ | 'pl': 'Pokaż w panelu bocznym link do podstron' | ||
+ | }, 7); | ||
+ | addOnloadHook(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 | ||
+ | }, 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 <div class="dshuf"></div> | ||
+ | * 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 ); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | addOnloadHook(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"; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | addOnloadHook(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', 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; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | addOnloadHook(localizeSignature); | ||
+ | |||
+ | // Load POTY gallery enhancements | ||
+ | function POTYenhancements() { | ||
+ | var g = document.getElementById('poty2008') | ||
+ | if (g && wgUserName) { | ||
+ | uri = wgScript + '?title=User:Kalan/poty.js&action=raw&ctype=text/javascript&go=' + g.className.match(/version-\d+/)[0] | ||
+ | importScriptURI(uri) | ||
+ | } | ||
+ | } | ||
+ | |||
+ | addOnloadHook(POTYenhancements) | ||
+ | |||
+ | // | ||
+ | // Add "Nominate for Deletion" to toolbar ([[MediaWiki talk:Quick-delete-code.js]]) | ||
+ | // | ||
+ | importScript('MediaWiki:Quick-delete-code.js'); | ||
+ | |||
+ | // | ||
+ | // Import usergroup-specific stylesheet, only for admins atm | ||
+ | // | ||
+ | for( var key in wgUserGroups ) | ||
+ | { | ||
+ | if (wgUserGroups[key] =="sysop") | ||
+ | { | ||
+ | importStylesheet("MediaWiki:Admin.css"); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // SVG images: adds links to rendered PNG images in different resolutions | ||
+ | addOnloadHook(function() { | ||
+ | if (wgAction == "view" && wgNamespaceNumber == 6 && wgTitle.substring(wgTitle.lastIndexOf(".")).toLowerCase() == ".svg") { | ||
+ | var file = document.getElementById("file"); | ||
+ | if (!file) return; // might happen if MediaWiki can't render the SVG | ||
+ | var div = document.createElement("div"); | ||
+ | div.appendChild(document.createTextNode("SVG rendered as PNG images in different resolutions:")); | ||
+ | div.appendChild(document.createElement("br")); | ||
+ | var a200 = document.createElement("a"); | ||
+ | a200.setAttribute("href", "http://commons.wikimedia.org/w/thumb.php?f=" + wgTitle + "&width=200px"); | ||
+ | a200.appendChild(document.createTextNode("200px")); | ||
+ | var a500 = document.createElement("a"); | ||
+ | a500.setAttribute("href", "http://commons.wikimedia.org/w/thumb.php?f=" + wgTitle + "&width=500px"); | ||
+ | a500.appendChild(document.createTextNode("500px")); | ||
+ | var a1000 = document.createElement("a"); | ||
+ | a1000.setAttribute("href", "http://commons.wikimedia.org/w/thumb.php?f=" + wgTitle + "&width=1000px"); | ||
+ | a1000.appendChild(document.createTextNode("1000px")); | ||
+ | var a2000 = document.createElement("a"); | ||
+ | a2000.setAttribute("href", "http://commons.wikimedia.org/w/thumb.php?f=" + wgTitle + "&width=2000px"); | ||
+ | a2000.appendChild(document.createTextNode("2000px")); | ||
+ | div.appendChild(a200); | ||
+ | div.appendChild(document.createTextNode(", ")); | ||
+ | div.appendChild(a500); | ||
+ | div.appendChild(document.createTextNode(", ")); | ||
+ | div.appendChild(a1000); | ||
+ | div.appendChild(document.createTextNode(", ")); | ||
+ | div.appendChild(a2000); | ||
+ | div.appendChild(document.createTextNode(".")); | ||
+ | file.parentNode.insertBefore(div, document.getElementById("file").nextSibling.nextSibling); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | //Language-specific JavaScript. | ||
+ | //may be useful for renaming tab in main page in every language. | ||
+ | importScript('MediaWiki:Common.js/' + wgUserLanguage); | ||
+ | |||
+ | /* Quick-adding a command CommonsDelinker's command line */ | ||
+ | /* Local maintainer: [[User:Kwj2772]] */ | ||
+ | importScript('MediaWiki:CommonsDelinker.js'); | ||
+ | |||
+ | /*Automatic language selection using javascript*/ | ||
+ | importScript('MediaWiki:Common.js/LangSelect.js'); | ||
+ | |||
+ | //</source> |
Версия 15:56, 10 июля 2009
/* Размещённый здесь код JavaScript будет загружен всем пользователям при обращении к какой-либо странице */ /** Extra toolbar options ****************************************************** * * Description: UNDOCUMENTED * Maintainers: [[User:MarkS]]?, [[User:Voice of All]], [[User:R. Koot]] */ //This is a modified copy of a script by User:MarkS for extra features added by User:Voice of All. // This is based on the original code on Wikipedia:Tools/Editing tools // To disable this script, add <code>mwCustomEditButtons = [];<code> to [[Special:Mypage/monobook.js]] if (mwCustomEditButtons) { mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://www.koreanwikiproject.com/wiki/skins/common/images/Button_mp3.png", "speedTip": "Mp3", "tagOpen": "<flashmp3>filename.mp3|leftbg=003478|rightbg=c60c30|lefticon=ffffff|righticon=ffffff</flashmp3>", "tagClose": "", "sampleText": ""}; } function includePage( name ) { document.write('<script type="text/javascript" src="' + wgScript + '?title=' + name + '&action=raw&ctype=text/javascript"><\/script>' ); } /* End of includePage */ /* Including extra .js pages ********************************************************* */ // switches for scripts // TODO: migrate to JSConfig // var load_extratabs = true; var load_edittools = true; // extra drop down menu on editing for adding special characters includePage( 'MediaWiki:Edittools.js' ); //Editpage scripts if (wgAction=='edit' || wgAction == 'submit') importScript('MediaWiki:Editpage.js') /* End of extra pages */ //<source lang="javascript"> /** 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 ) || "<i>en</i> translation missing", 'page' : prefpage || 0, 'default_value' : default_value }; }, readCookies : function() { var cookies = document.cookie.split("; "); var p =JSconfig.prefix.length; var i; for( var key in cookies ) { 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() { for( var key in JSconfig.keys ) document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=Thu, 2 Aug 2009 10:10:10 UTC'; }, 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; }, 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]); } // // Create Widgets for all registered config keys // var w_div, w_label, w_ctrl, wt; for( var key in JSconfig.meta ) { w_div = document.createElement( 'DIV' ); w_label = document.createElement( 'LABEL' ); 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; 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; } tabs[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; } } addEvent(document.getElementById('preferences').parentNode, 'submit', JSconfig.evaluateForm ); } } JSconfig.readCookies(); addOnloadHook(JSconfig.setUpForm); /** extract a URL parameter from the current URL ********** * From [[en:User:Lupin/autoedit.js]] * * paramName : the name of the parameter to extract * * Local Maintainer: [[User:Dschwen]] */ function getParamValue( paramName, url) { if (typeof (url) == 'undefined' ) url = document.location.href; var cmdRe=RegExp( '[&?]' + paramName + '=([^&]*)' ); var m=cmdRe.exec(url); if (m) { try { return decodeURIComponent(m[1]); } catch (someError) {} } return null; } /** &withJS= URL parameter ******* * Allow to try custom scripts on the MediaWiki namespace without * editing [[Special:Mypage/monobook.js]] * * Maintainer: [[User:Platonides]] */ { var extraJS = getParamValue("withJS"); if (extraJS) if (extraJS.match("^MediaWiki:[^&<>=%]*\.js$")) importScript(extraJS); else alert(extraJS + " javascript not allowed to be loaded."); } /** 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; } } /** Extra toolbar options *********** * Append custom buttons to the edit mode toolbar. * This is a modified copy of a script by User:MarkS for extra features added by User:Voice of All. * This is based on the original code on Wikipedia:Tools/Editing tools * To disable this script, add <code>mwCustomEditButtons = [];<code> to [[Special:Mypage/monobook.js]] * * Maintainers: [[User:MarkS]]?, [[User:Voice of All]], [[User:R. Koot]] */ if (mwCustomEditButtons) { mwCustomEditButtons.push({ "imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c8/Button_redirect.png", "speedTip": "Redirect", "tagOpen": "#REDIRECT [[", "tagClose": "]]", "sampleText": "Insert text" }); } /***** SpecialSearchEnhanced ******** * Improvement of the search page v4 * Written by Marc Mongenet & Suisui (GFDL & GPL) * * Maintainers: none, ([[User:Dschwen]]?) ****/ var sse_i18n = { 'af' : 'Vind media met Mayflower', 'ar' : 'بحث عن الوسائط بواسطة مايفلاور', 'bg' : 'Търсете мултимедийно съдържание с Mayflower', 'ca' : 'Cerca continguts multimèdia amb Mayflower', 'cs' : 'Najdi média s Mayflower', 'de' : 'Suche Multimedia-Dateien mit Mayflower', 'da' : 'Find media med Mayflower', 'el' : 'Αναζήτηση πολυμέσων με το Mayflower', 'en' : 'Find media with Mayflower', 'es' : 'Busca contenidos multimedia con Mayflower', 'fi' : 'Etsi mediaa Mayflowerin avulla', 'fr' : 'Cherchez des fichiers média avec Mayflower', 'gl' : 'Procura contidos multimedia coa Mayflower', 'he' : 'חפשו קבצי מדיה עם מייפלאור', 'hu' : 'Keress médiafájlokat a Mayflowerrel', 'ht' : 'Chache fichye medya yo epi Mayflower', 'id' : 'Cari media dengan Mayflower', 'is' : 'Finndu miðla með Mayflower', 'it' : 'Cerca file multimediali con Mayflower', 'ja' : 'Mayflower を使ってマルチメディアを探す', 'lt' : 'Ieškoti media su Mayflower', 'nl' : 'Media zoeken met Mayflower', 'nn' : 'Finn media med Mayflower', 'no' : 'Finn media med Mayflower', 'sv' : 'Sök media med Mayflower', 'sl' : 'Poišči večpredstavnostne datoteke z Mayflower', 'sk' : 'Nájdi médiá s Mayflower', 'sr' : 'Pronađi medij koristeći Mayflower', 'pl' : 'Wyszukaj media poprzez Mayflower', 'pt' : 'Procure conteúdos multimídia com Mayflower', 'ru' : 'Найти информацию с помощью системы Mayflower', 'vi' : 'Tìm tập tin phương tiện bằng Mayflower', 'zh' : '使用Mayflower搜索媒体文件', 'zh-hans' : '使用Mayflower搜索媒体文件', 'zh-hant' : '使用Mayflower搜尋媒體檔案', 'zh-cn' : '使用Mayflower搜索媒体文件', 'zh-sg' : '使用Mayflower搜索媒体文件', 'zh-tw' : '使用Mayflower搜尋媒體檔案', 'zh-hk' : '使用Mayflower搜尋媒體檔案' }; function SpecialSearchEnhanced() { function SearchForm(engine_name, engine_url, logo_url, search_action_url, search_field_name, add_search_field, field_array) { var span= document.createElement("span"); span.style.marginRight = "1em"; var form = document.createElement("form"); form.method = "get"; form.action = search_action_url; form.style.display = "inline"; span.appendChild(form); var input = document.createElement("input"); input.type = "hidden"; input.name = search_field_name; form.appendChild(input); for( var i in field_array){ var fld = document.createElement("input"); fld.type = "hidden"; fld.name = i; fld.value = field_array[i]; form.appendChild(fld); } var submit = document.createElement("input"); submit.type = "submit"; submit.value = sse_i18n[wgUserLanguage] || sse_i18n['en']; form.appendChild(submit); form.onsubmit = function() { if(add_search_field == ""){ input.value = document.getElementById("lsearchbox").value; }else{ input.value = document.getElementById("lsearchbox").value+add_search_field; } } if( !sse_i18n[wgUserLanguage] ) { var h = document.createElement("a"); h.href = "http://meta.wikimedia.org/w/index.php?title=User:Tangotango/Mayflower/Translation&action=edit§ion=3"; span.appendChild(h); h.appendChild( document.createTextNode( " [help translate this button]" ) ); } var a = document.createElement("a"); a.href = engine_url; span.appendChild(a); var img = document.createElement("img"); img.src = logo_url; img.alt = engine_name; img.style.borderWidth = "0"; img.style.padding = "5px"; img.style.width = "220px"; img.style.height = "53px"; a.appendChild(img); return span; } //honor user configuration if( !JSconfig.keys['specialSearchEnhanced'] ) return; if (wgCanonicalNamespace != "Special" || wgCanonicalSpecialPageName != "Search") return; if(skin == "monobook" || skin == "cologneblue" || skin == "simple") var mainNode = document.getElementsByTagName("form"); if (!mainNode) return; mainNode = mainNode[0]; mainNode.appendChild(document.createElement("center")); mainNode = mainNode.lastChild; var searchValue = document.getElementById("lsearchbox").value; var div = document.createElement("div"); div.style.width = "100%"; // ul.style.list-style-type = "none"; mainNode.appendChild(div); var engine; var mayflowero = new Object(); mayflowero["t"] = "n"; engine = SearchForm("MayFlower", "http://toolserver.org/~tangotango/mayflower/index.php", "http://toolserver.org/~tangotango/mayflower/images/mayflower-logo.png", "http://toolserver.org/~tangotango/mayflower/search.php", "q", "", mayflowero); div.appendChild(engine); } //JSconfig.registerKey('specialSearchEnhanced', true, ( sse_i18n[wgUserLanguage] || sse_i18n['en'] ) + ':', 6); // addOnloadHook(SpecialSearchEnhanced); // // Collapsible tables // importScript('MediaWiki:CollapsibleTables.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 }, 3); JSconfig.registerKey('UploadForm_newlayout', true, { 'bg': 'Използване на облика на новия формуляр за качвания', 'en': 'Use new form layout' // default }, 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... } // honor JSConfig user settings if( !JSconfig.keys['UploadForm_loadform'] ) return; importScript( 'MediaWiki:UploadForm.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 'eo': 'Subpaĝoj', 'es': 'Subpáginas', 'fi': 'Alasivut', 'fr': 'Sous-pages', 'gl': 'Subpáxinas', 'he': 'דפי משנה', 'hr': 'Podstranice', 'it': 'Sottopagine', 'is': 'Undirsíður', 'nl': "Subpagina's", 'no': 'Undersider', 'pl': 'Podstrony', 'ru': 'Подстраницы' }, install: function() { // honor user configuration if( !JSconfig.keys['subPagesLink'] ) return; if ( document.getElementById("t-whatlinkshere") && wgNamespaceNumber != -2 // Media: (upcoming) && wgNamespaceNumber != -1 // Special: && wgNamespaceNumber != 6 // Image: && wgNamespaceNumber != 14 // Category: ) { var subpagesText = subPagesLink.i18n[wgUserLanguage] || subPagesLink.i18n['en']; var subpagesLink ='/wiki/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 'pl': 'Pokaż w panelu bocznym link do podstron' }, 7); addOnloadHook(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 }, 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 <div class="dshuf"></div> * 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 ); } } } addOnloadHook(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"; } } } addOnloadHook(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', 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; } } } addOnloadHook(localizeSignature); // Load POTY gallery enhancements function POTYenhancements() { var g = document.getElementById('poty2008') if (g && wgUserName) { uri = wgScript + '?title=User:Kalan/poty.js&action=raw&ctype=text/javascript&go=' + g.className.match(/version-\d+/)[0] importScriptURI(uri) } } addOnloadHook(POTYenhancements) // // Add "Nominate for Deletion" to toolbar ([[MediaWiki talk:Quick-delete-code.js]]) // importScript('MediaWiki:Quick-delete-code.js'); // // Import usergroup-specific stylesheet, only for admins atm // for( var key in wgUserGroups ) { if (wgUserGroups[key] =="sysop") { importStylesheet("MediaWiki:Admin.css"); } } // SVG images: adds links to rendered PNG images in different resolutions addOnloadHook(function() { if (wgAction == "view" && wgNamespaceNumber == 6 && wgTitle.substring(wgTitle.lastIndexOf(".")).toLowerCase() == ".svg") { var file = document.getElementById("file"); if (!file) return; // might happen if MediaWiki can't render the SVG var div = document.createElement("div"); div.appendChild(document.createTextNode("SVG rendered as PNG images in different resolutions:")); div.appendChild(document.createElement("br")); var a200 = document.createElement("a"); a200.setAttribute("href", "http://commons.wikimedia.org/w/thumb.php?f=" + wgTitle + "&width=200px"); a200.appendChild(document.createTextNode("200px")); var a500 = document.createElement("a"); a500.setAttribute("href", "http://commons.wikimedia.org/w/thumb.php?f=" + wgTitle + "&width=500px"); a500.appendChild(document.createTextNode("500px")); var a1000 = document.createElement("a"); a1000.setAttribute("href", "http://commons.wikimedia.org/w/thumb.php?f=" + wgTitle + "&width=1000px"); a1000.appendChild(document.createTextNode("1000px")); var a2000 = document.createElement("a"); a2000.setAttribute("href", "http://commons.wikimedia.org/w/thumb.php?f=" + wgTitle + "&width=2000px"); a2000.appendChild(document.createTextNode("2000px")); div.appendChild(a200); div.appendChild(document.createTextNode(", ")); div.appendChild(a500); div.appendChild(document.createTextNode(", ")); div.appendChild(a1000); div.appendChild(document.createTextNode(", ")); div.appendChild(a2000); div.appendChild(document.createTextNode(".")); file.parentNode.insertBefore(div, document.getElementById("file").nextSibling.nextSibling); } }); //Language-specific JavaScript. //may be useful for renaming tab in main page in every language. importScript('MediaWiki:Common.js/' + wgUserLanguage); /* Quick-adding a command CommonsDelinker's command line */ /* Local maintainer: [[User:Kwj2772]] */ importScript('MediaWiki:CommonsDelinker.js'); /*Automatic language selection using javascript*/ importScript('MediaWiki:Common.js/LangSelect.js'); //</source>