Diferencia entre revisiones de «MediaWiki:Common.js»
De WikiEducator
(add JSconfig) |
(move "Links" functionality to a Gadget for MW 1.23+) |
||
Línea 1: | Línea 1: | ||
− | /* | + | /** |
− | + | * Keep code in MediaWiki:Common.js to a minimum as it is unconditionally | |
+ | * loaded for all users on every wiki page. If possible create a gadget that is | ||
+ | * enabled by default instead of adding it here (since gadgets are fully | ||
+ | * optimized ResourceLoader modules with possibility to add dependencies etc.) | ||
+ | **/ | ||
− | /* | + | /** |
− | + | * JSconfig | |
− | + | * | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
* Global configuration options to enable/disable and configure | * Global configuration options to enable/disable and configure | ||
− | * specific script features from [[MediaWiki:Common.js]] and | + | * specific script features from [[MediaWiki:Common.js]] and [[MediaWiki:Monobook.js]] |
− | + | ||
* This framework adds config options (saved as cookies) to [[Special:Preferences]] | * This framework adds config options (saved as cookies) to [[Special:Preferences]] | ||
− | * For a more permanent change you can override the default settings in your | + | * For a more permanent change you can override the default settings in your |
* [[Special:Mypage/monobook.js]] | * [[Special:Mypage/monobook.js]] | ||
* for Example: JSconfig.keys[loadAutoInformationTemplate] = false; | * for Example: JSconfig.keys[loadAutoInformationTemplate] = false; | ||
* | * | ||
− | * | + | * Maintainer: [[User:Dschwen]] |
*/ | */ | ||
− | + | var JSconfig = { | |
− | var JSconfig = | + | prefix: 'jsconfig_', |
− | { | + | keys: {}, |
− | prefix : 'jsconfig_', | + | meta: {}, |
− | keys : {}, | + | |
− | meta : {}, | + | |
− | + | ||
− | + | ||
// Register a new configuration item | // Register a new configuration item | ||
− | // * name | + | // * name : String, internal name |
// * default_value : String or Boolean (type determines configuration widget) | // * default_value : String or Boolean (type determines configuration widget) | ||
− | // * description | + | // * 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 | + | // * 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] | // Access keys through JSconfig.keys[name] | ||
− | + | registerKey: function (name, default_value, description, prefpage) { | |
− | registerKey : function( name, default_value, description, prefpage ) | + | if (typeof JSconfig.keys[name] == 'undefined') { |
− | + | ||
− | if( typeof JSconfig.keys[name] == 'undefined' ) | + | |
JSconfig.keys[name] = default_value; | JSconfig.keys[name] = default_value; | ||
− | else { | + | } else { |
− | // all cookies are read as strings, | + | // all cookies are read as strings, |
// convert to the type of the default value | // convert to the type of the default value | ||
− | switch( typeof 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] = { | |
− | JSconfig.meta[name] = { | + | 'description': description[wgUserLanguage] || description.en || (typeof description == 'string' && description) || '<i>en</i> translation missing', |
− | 'description' : | + | 'page': prefpage || 0, |
− | + | 'default_value': default_value | |
− | + | }; | |
− | + | ||
− | 'page' : prefpage || 0, 'default_value' : default_value }; | + | |
− | + | ||
// if called after setUpForm(), we'll have to add an extra input field | // if called after setUpForm(), we'll have to add an extra input field | ||
− | if( JSconfig.prefsTabs ) JSconfig.addPrefsInput( name ); | + | if (JSconfig.prefsTabs) { |
+ | JSconfig.addPrefsInput(name); | ||
+ | } | ||
}, | }, | ||
− | + | readCookies: function () { | |
− | readCookies : function() | + | var cookies = document.cookie.split('; '); |
− | + | var p = JSconfig.prefix.length; | |
− | var cookies = document.cookie.split( | + | |
− | var p =JSconfig.prefix.length; | + | |
var i; | var i; | ||
− | + | for (var key = 0; cookies && key < cookies.length; key++) { | |
− | for( var key | + | if (cookies[key].substring(0, p) == JSconfig.prefix) { |
− | + | ||
− | if( cookies[key].substring(0,p) == JSconfig.prefix ) | + | |
− | + | ||
i = cookies[key].indexOf('='); | i = cookies[key].indexOf('='); | ||
//alert( cookies[key] + ',' + key + ',' + cookies[key].substring(p,i) ); | //alert( cookies[key] + ',' + key + ',' + cookies[key].substring(p,i) ); | ||
− | JSconfig.keys[cookies[key].substring(p,i)] = cookies[key].substring(i+1); | + | JSconfig.keys[cookies[key].substring(p, i)] = cookies[key].substring(i + 1); |
} | } | ||
} | } | ||
}, | }, | ||
− | + | writeCookies: function () { | |
− | writeCookies : function() | + | |
− | + | ||
var expdate = new Date(); | var expdate = new Date(); | ||
− | expdate.setTime(expdate.getTime()+1000*60*60*24*3650); | + | expdate.setTime(expdate.getTime() + 1000 * 60 * 60 * 24 * 3650); // expires in 3560 days |
− | for( var key in JSconfig.keys ) | + | for (var key in JSconfig.keys) { |
document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=' + expdate.toUTCString(); | document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=' + expdate.toUTCString(); | ||
+ | } | ||
}, | }, | ||
− | + | evaluateForm: function () { | |
− | evaluateForm : function() | + | var w_ctrl, wt; |
− | + | ||
− | var w_ctrl,wt; | + | |
//alert('about to save JSconfig'); | //alert('about to save JSconfig'); | ||
− | for( var key in JSconfig.meta ) { | + | for (var key in JSconfig.meta) { |
− | w_ctrl = document.getElementById( JSconfig.prefix + key ) | + | w_ctrl = document.getElementById(JSconfig.prefix + key); |
− | if( w_ctrl ) | + | if (w_ctrl) { |
− | + | ||
wt = typeof JSconfig.meta[key].default_value; | wt = typeof JSconfig.meta[key].default_value; | ||
− | switch( wt ) { | + | switch (wt) { |
− | + | case 'boolean': | |
− | + | JSconfig.keys[key] = w_ctrl.checked; | |
+ | break; | ||
+ | case 'string': | ||
+ | JSconfig.keys[key] = w_ctrl.value; | ||
+ | break; | ||
} | } | ||
} | } | ||
} | } | ||
− | |||
JSconfig.writeCookies(); | JSconfig.writeCookies(); | ||
return true; | return true; | ||
}, | }, | ||
− | + | prefsTabs: false, | |
− | prefsTabs : false, | + | setUpForm: function () { |
− | + | ||
− | setUpForm : function() | + | |
− | + | ||
var prefChild = document.getElementById('preferences'); | var prefChild = document.getElementById('preferences'); | ||
− | if( !prefChild ) return; | + | if (!prefChild) { |
+ | return; | ||
+ | } | ||
prefChild = prefChild.childNodes; | prefChild = prefChild.childNodes; | ||
− | |||
// | // | ||
// make a list of all preferences sections | // make a list of all preferences sections | ||
// | // | ||
− | var tabs = | + | var tabs = []; |
var len = prefChild.length; | var len = prefChild.length; | ||
− | for( var key = 0; key < len; key++ ) { | + | for (var key = 0; key < len; key++) { |
− | if( prefChild[key].tagName && | + | if (prefChild[key].tagName && prefChild[key].tagName.toLowerCase() == 'fieldset') { |
− | + | ||
tabs.push(prefChild[key]); | tabs.push(prefChild[key]); | ||
+ | } | ||
} | } | ||
JSconfig.prefsTabs = tabs; | JSconfig.prefsTabs = tabs; | ||
− | |||
// | // | ||
// Create Widgets for all registered config keys | // Create Widgets for all registered config keys | ||
// | // | ||
− | for( var | + | for (var wkey in JSconfig.meta) { |
− | + | JSconfig.addPrefsInput(wkey); | |
− | addEvent(document.getElementById('preferences').parentNode, 'submit', JSconfig.evaluateForm ); | + | } |
+ | addEvent(document.getElementById('preferences').parentNode, 'submit', JSconfig.evaluateForm); | ||
}, | }, | ||
− | + | addPrefsInput: function (key) { | |
− | addPrefsInput : function( key ) { | + | var w_div = document.createElement('DIV'); |
− | var w_div = document.createElement( 'DIV' ); | + | var w_label = document.createElement('LABEL'); |
− | + | ||
− | var w_label = document.createElement( 'LABEL' ); | + | |
var wt = typeof JSconfig.meta[key].default_value; | var wt = typeof JSconfig.meta[key].default_value; | ||
− | switch ( wt ) { | + | switch (wt) { |
− | + | case 'boolean': | |
− | + | JSconfig.meta[key].description = ' ' + JSconfig.meta[key].description; | |
− | + | break; | |
− | case 'string': | + | default: |
− | + | //case 'string': | |
− | + | JSconfig.meta[key].description += ': '; | |
+ | break; | ||
} | } | ||
− | w_label.appendChild( document.createTextNode( JSconfig.meta[key].description ) ); | + | w_label.appendChild(document.createTextNode(JSconfig.meta[key].description)); |
w_label.htmlFor = JSconfig.prefix + key; | w_label.htmlFor = JSconfig.prefix + key; | ||
− | + | var w_ctrl = document.createElement('INPUT'); | |
− | var w_ctrl = document.createElement( 'INPUT' ); | + | |
w_ctrl.id = JSconfig.prefix + key; | w_ctrl.id = JSconfig.prefix + key; | ||
− | |||
// before insertion into the DOM tree | // before insertion into the DOM tree | ||
− | switch( wt ) { | + | switch (wt) { |
− | + | case 'boolean': | |
− | + | w_ctrl.type = 'checkbox'; | |
− | + | w_div.appendChild(w_ctrl); | |
− | + | w_div.appendChild(w_label); | |
− | + | break; | |
− | case 'string' | + | default: |
− | + | //case 'string': | |
− | + | w_ctrl.type = 'text'; | |
− | + | w_div.appendChild(w_label); | |
− | + | w_div.appendChild(w_ctrl); | |
+ | break; | ||
} | } | ||
− | + | JSconfig.prefsTabs[JSconfig.meta[key].page].appendChild(w_div); | |
− | JSconfig.prefsTabs[JSconfig.meta[key].page].appendChild( w_div ); | + | |
− | + | ||
// after insertion into the DOM tree | // after insertion into the DOM tree | ||
− | switch( wt ) { | + | 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(); | JSconfig.readCookies(); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if (wgCanonicalSpecialPageName == 'Preferences') { | |
− | + | $(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 | + | 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. | ||
+ | addOnloadHook (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; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Collapsible tables | ||
+ | * | ||
+ | * @version 2.0.2 (2014-03-14) | ||
+ | * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js | ||
+ | * @author [[User:R. Koot]] | ||
+ | * @author [[User:Krinkle]] | ||
+ | * @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which | ||
+ | * is supported in MediaWiki core. | ||
+ | */ | ||
+ | /*global $, mw */ | ||
+ | var autoCollapse = 2; | ||
+ | var collapseCaption = '▲'; | ||
+ | var expandCaption = '▼'; | ||
− | + | function collapseTable( tableIndex ) { | |
− | + | var Button = document.getElementById( 'collapseButton' + tableIndex ); | |
− | + | var Table = document.getElementById( 'collapsibleTable' + tableIndex ); | |
− | + | if ( !Table || !Button ) { | |
+ | return false; | ||
+ | } | ||
− | + | var Rows = Table.rows; | |
− | + | var i; | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | if ( Button.firstChild.data === collapseCaption ) { | |
− | + | for ( i = 1; i < Rows.length; i++ ) { | |
− | + | Rows[i].style.display = 'none'; | |
− | + | } | |
− | + | Button.firstChild.data = expandCaption; | |
+ | } else { | ||
+ | for ( i = 1; i < Rows.length; i++ ) { | ||
+ | Rows[i].style.display = Rows[0].style.display; | ||
+ | } | ||
+ | Button.firstChild.data = collapseCaption; | ||
+ | } | ||
+ | } | ||
− | + | function createClickHandler( tableIndex ) { | |
− | + | return function ( e ) { | |
+ | e.preventDefault(); | ||
+ | collapseTable( tableIndex ); | ||
+ | }; | ||
+ | } | ||
− | + | function createCollapseButtons() { | |
− | + | var tableIndex = 0; | |
− | + | var NavigationBoxes = {}; | |
− | + | var Tables = document.getElementsByTagName( 'table' ); | |
− | + | var i; | |
− | + | for ( i = 0; i < Tables.length; i++ ) { | |
− | + | if ( $( Tables[i] ).hasClass( 'collapsible' ) ) { | |
+ | /* only add button and increment count if there is a header row to work with */ | ||
+ | var HeaderRow = Tables[i].getElementsByTagName( 'tr' )[0]; | ||
+ | if ( !HeaderRow ) { | ||
+ | continue; | ||
+ | } | ||
+ | var Header = HeaderRow.getElementsByTagName( 'th' )[0]; | ||
+ | if ( !Header ) { | ||
+ | continue; | ||
+ | } | ||
− | + | NavigationBoxes[tableIndex] = Tables[i]; | |
− | + | Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex ); | |
− | + | ||
− | + | var Button = document.createElement( 'span' ); | |
− | + | var ButtonLink = document.createElement( 'a' ); | |
− | + | var ButtonText = document.createTextNode( collapseCaption ); | |
− | + | // TODO: Declare styles in [[MediaWiki:Gadget-collapsibleTables.css]] | |
− | + | // Button.className = 'collapseButton'; | |
+ | Button.style.styleFloat = 'right'; | ||
+ | Button.style.cssFloat = 'right'; | ||
+ | Button.style.fontWeight = 'normal'; | ||
+ | Button.style.textAlign = 'right'; | ||
+ | Button.style.width = '6em'; | ||
− | + | ButtonLink.style.color = Header.style.color; | |
− | + | ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex ); | |
− | + | ButtonLink.setAttribute( 'href', '#' ); | |
− | + | $( ButtonLink ).on( 'click', createClickHandler( tableIndex ) ); | |
+ | ButtonLink.appendChild( ButtonText ); | ||
− | + | Button.appendChild( document.createTextNode( '[' ) ); | |
− | + | Button.appendChild( ButtonLink ); | |
− | + | Button.appendChild( document.createTextNode( ']' ) ); | |
− | + | Header.insertBefore( Button, Header.firstChild ); | |
− | + | tableIndex++; | |
− | + | } | |
− | + | } | |
− | + | for ( i = 0; i < tableIndex; i++ ) { | |
− | + | if ( $( NavigationBoxes[i] ).hasClass( 'collapsed' ) || | |
− | + | ( tableIndex >= autoCollapse && $( NavigationBoxes[i] ).hasClass( 'autocollapse' ) ) | |
− | + | ) { | |
− | + | collapseTable( i ); | |
− | + | } | |
+ | } | ||
+ | } | ||
− | + | mw.hook( 'wikipage.content' ).add( createCollapseButtons ); | |
− | /**** | + | /**** Special:Upload enhancements ****** |
− | * | + | * moved to [[MediaWiki:Upload.js]] |
− | * | + | * |
− | * | + | * Maintainer: [[User:Lupo]] |
− | + | ||
− | + | ||
− | + | ||
****/ | ****/ | ||
− | + | JSconfig.registerKey('UploadForm_loadform', true, | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
{ | { | ||
− | 'bg': ' | + | 'bg': 'Използване на логиката на новия формуляр за качвания', |
− | + | 'en': 'Use new upload form logic', // default | |
− | + | 'ru': 'Использовать новую логику формы загрузки' | |
− | + | }, 3); | |
− | 'en': ' | + | JSconfig.registerKey('UploadForm_newlayout', true, |
− | ' | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
{ | { | ||
− | // | + | 'bg': 'Използване на облика на новия формуляр за качвания', |
− | + | 'en': 'Use new form layout', // default | |
− | + | '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... | |
− | + | ||
− | + | ||
− | + | ||
} | } | ||
− | + | ||
+ | // 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 (); | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
function WEAddStyles(a) { | function WEAddStyles(a) { | ||
Línea 436: | Línea 405: | ||
} | } | ||
− | + | $(function() { | |
/* hide some navigation and other unnecessary elements if displayed in an iFrame */ | /* hide some navigation and other unnecessary elements if displayed in an iFrame */ | ||
if (window.self != window.top) { | if (window.self != window.top) { | ||
Línea 444: | Línea 413: | ||
content.style.borderStyle = 'none'; | content.style.borderStyle = 'none'; | ||
} | } | ||
− | var removals = ['column-one', 'siteNotice', 'contentSub', 'siteSub', 'catlinks', 'page-base', 'head-base', 'head', 'panel', 'footer-info-lastmod', 'footer-info-viewcount', 'footer-places', 'footer-icon-poweredby', 'f-poweredbyico', 'lastmod', 'viewcount', 'privacy', 'about', 'disclaimer']; | + | var reva = /(\d+:\d+, \d+ \w+ \d+)/.exec($('#mw-revision-info').text()); |
+ | var revinfo = reva ? reva[0] : ''; | ||
+ | reva = /oldid=(\d+)/.exec($('#mw-revision-nav').find('a').attr('href')); | ||
+ | var oldid = reva ? reva[1] : ''; | ||
+ | var removals = ['column-one', 'siteNotice', 'contentSub', 'siteSub', 'catlinks', 'page-base', 'head-base', 'head', 'panel', 'firstHeading', 'footer-info-lastmod', 'footer-info-viewcount', 'footer-places', 'footer-icon-poweredby', 'f-poweredbyico', 'lastmod', 'viewcount', 'privacy', 'about', 'disclaimer', 'notiframe']; | ||
for (var i=0; i<removals.length; i++) { | for (var i=0; i<removals.length; i++) { | ||
var g = document.getElementById(removals[i]) | var g = document.getElementById(removals[i]) | ||
Línea 451: | Línea 424: | ||
} | } | ||
} | } | ||
+ | $('.editsection,.mw-editsection').css('visibility', 'hidden'); | ||
+ | $('#content, #footer').css('background-image', 'none'); | ||
document.body.style.background='none'; | document.body.style.background='none'; | ||
− | var divs = document.getElementsByTagName('div'); | + | $('.iframeonly').removeClass('iframeonly'); |
− | + | var q = {}; | |
− | + | var qs = document.location.search; | |
− | + | qs = qs.substring(1).toLowerCase().split('&'); | |
+ | for (i=0; i<qs.length; i++) { | ||
+ | g = qs[i].split('='); | ||
+ | q[g[0]] = (g.length === 1) ? true : g[1]; | ||
+ | } | ||
+ | if (q.nonav) { | ||
+ | var divs = document.getElementsByTagName('div'); | ||
+ | for (i=0; i<divs.length; i++) { | ||
+ | if (divs[i].className.match(/navigation/i)) { | ||
+ | divs[i].style.display = 'none'; | ||
+ | } | ||
} | } | ||
} | } | ||
Línea 461: | Línea 446: | ||
if (g) { | if (g) { | ||
g.style.marginLeft = 0; | g.style.marginLeft = 0; | ||
+ | /* g.style.position = 'absolute'; | ||
+ | g.style.bottom = 0; | ||
+ | g.style.width = "98%"; */ | ||
} | } | ||
var foot = document.getElementById('f-list') || document.getElementById('footer-info'); | var foot = document.getElementById('f-list') || document.getElementById('footer-info'); | ||
if (foot) { | if (foot) { | ||
var li = document.createElement('li'); | var li = document.createElement('li'); | ||
− | g = | + | g = "http://WikiEducator.org/" + wgPageName; |
− | + | var footerfrom; | |
+ | if (revinfo) { | ||
+ | footerfrom = 'Revision of ' + revinfo + ' retrieved from <a href="' + g + '?oldid=' + oldid; | ||
+ | } else { | ||
+ | footerfrom = 'Retrieved from <a href="' + g; | ||
+ | } | ||
+ | li.innerHTML = footerfrom + '">' + g + '</a>'; | ||
li.style.display = 'block'; | li.style.display = 'block'; | ||
foot.insertBefore(li, document.getElementById('copyright') || document.getElementById('footer-info-copyright')); | foot.insertBefore(li, document.getElementById('copyright') || document.getElementById('footer-info-copyright')); | ||
} | } | ||
− | + | if ((wgCanonicalNamespace == 'Special') && (wgCanonicalSpecialPageName == 'Userlogin')) { | |
− | + | $('#footer-icon-copyright').hide(); | |
− | + | } | |
− | + | if (q.links) { | |
− | + | var largs = q.links.split('|'); | |
− | + | for (var j=0; j<largs.length; j++) { | |
− | + | q[largs[j]] = true; | |
− | + | } | |
− | + | var hilight = q.highlight ? ' background: yellow;' : ''; | |
− | + | var hover = q.hover ? ' background: yellow;' : ''; | |
− | + | if (q.none || q.highlight || q.hover) { | |
− | + | WEAddStyles('a.link {text-decoration: none; padding: 0px; background: none; ' + hilight + '} a.visited {text-decoration: none;' + hilight +'} a:active {text-decoration: none;' + hilight + '} a:hover {text-decoration: none;' + hilight + hover + '}'); | |
− | + | } | |
− | + | var as = document.getElementsByTagName('a'); | |
− | + | for (j=0; j<as.length; j++) { | |
− | + | var href = as[j].getAttribute('href'); | |
− | + | if (href) { | |
− | + | if (q.none || q.show || q.hover || q.highlight) { | |
− | + | as[j].setAttribute('onclick', 'return false;'); | |
− | + | } | |
− | + | if (q.window) { | |
− | + | as[j].setAttribute('target', '_WE'); | |
− | + | ||
− | + | ||
− | + | ||
} | } | ||
} | } | ||
} | } | ||
+ | } | ||
+ | if (q.editable) { | ||
+ | $('.editsection,.mw-editsection').css('visibility', 'visible'); | ||
+ | } | ||
+ | if (q.noheading) { | ||
+ | $('#firstHeading').css('display', 'none'); | ||
} | } | ||
// if postMessage is supported, try to let the parent know our size | // if postMessage is supported, try to let the parent know our size | ||
Línea 509: | Línea 506: | ||
} | } | ||
}); | }); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// BEGIN Dynamic Navigation Bars | // BEGIN Dynamic Navigation Bars | ||
Línea 652: | Línea 614: | ||
} | } | ||
− | + | $(createNavigationBarToggleButton); | |
+ | |||
+ | // if logged in, and visiting an existing File: page with no description | ||
+ | if (wgAction === 'edit' && wgUserName && (wgNamespaceNumber === 6) && wgArticleId) { | ||
+ | $.getScript('/skins/common/we/file_information.js'); | ||
+ | } |
Revisión de 19:11 1 sep 2014
/** * Keep code in MediaWiki:Common.js to a minimum as it is unconditionally * loaded for all users on every wiki page. If possible create a gadget that is * enabled by default instead of adding it here (since gadgets are fully * optimized ResourceLoader modules with possibility to add dependencies etc.) **/ /** * 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 }; // 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 = []; 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 wkey in JSconfig.meta) { JSconfig.addPrefsInput(wkey); } 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; default: //case 'string': 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; default: //case 'string': 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 (wgCanonicalSpecialPageName == 'Preferences') { $(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. addOnloadHook (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; } } /** * Collapsible tables * * @version 2.0.2 (2014-03-14) * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js * @author [[User:R. Koot]] * @author [[User:Krinkle]] * @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which * is supported in MediaWiki core. */ /*global $, mw */ var autoCollapse = 2; var collapseCaption = '▲'; var expandCaption = '▼'; function collapseTable( tableIndex ) { var Button = document.getElementById( 'collapseButton' + tableIndex ); var Table = document.getElementById( 'collapsibleTable' + tableIndex ); if ( !Table || !Button ) { return false; } var Rows = Table.rows; var i; if ( Button.firstChild.data === collapseCaption ) { for ( i = 1; i < Rows.length; i++ ) { Rows[i].style.display = 'none'; } Button.firstChild.data = expandCaption; } else { for ( i = 1; i < Rows.length; i++ ) { Rows[i].style.display = Rows[0].style.display; } Button.firstChild.data = collapseCaption; } } function createClickHandler( tableIndex ) { return function ( e ) { e.preventDefault(); collapseTable( tableIndex ); }; } function createCollapseButtons() { var tableIndex = 0; var NavigationBoxes = {}; var Tables = document.getElementsByTagName( 'table' ); var i; for ( i = 0; i < Tables.length; i++ ) { if ( $( Tables[i] ).hasClass( 'collapsible' ) ) { /* only add button and increment count if there is a header row to work with */ var HeaderRow = Tables[i].getElementsByTagName( 'tr' )[0]; if ( !HeaderRow ) { continue; } var Header = HeaderRow.getElementsByTagName( 'th' )[0]; if ( !Header ) { continue; } NavigationBoxes[tableIndex] = Tables[i]; Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex ); var Button = document.createElement( 'span' ); var ButtonLink = document.createElement( 'a' ); var ButtonText = document.createTextNode( collapseCaption ); // TODO: Declare styles in [[MediaWiki:Gadget-collapsibleTables.css]] // Button.className = 'collapseButton'; Button.style.styleFloat = 'right'; Button.style.cssFloat = 'right'; Button.style.fontWeight = 'normal'; Button.style.textAlign = 'right'; Button.style.width = '6em'; ButtonLink.style.color = Header.style.color; ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex ); ButtonLink.setAttribute( 'href', '#' ); $( ButtonLink ).on( 'click', createClickHandler( tableIndex ) ); ButtonLink.appendChild( ButtonText ); Button.appendChild( document.createTextNode( '[' ) ); Button.appendChild( ButtonLink ); Button.appendChild( document.createTextNode( ']' ) ); Header.insertBefore( Button, Header.firstChild ); tableIndex++; } } for ( i = 0; i < tableIndex; i++ ) { if ( $( NavigationBoxes[i] ).hasClass( 'collapsed' ) || ( tableIndex >= autoCollapse && $( NavigationBoxes[i] ).hasClass( 'autocollapse' ) ) ) { collapseTable( i ); } } } mw.hook( 'wikipage.content' ).add( createCollapseButtons ); /**** Special:Upload enhancements ****** * moved to [[MediaWiki:Upload.js]] * * Maintainer: [[User:Lupo]] ****/ JSconfig.registerKey('UploadForm_loadform', true, { 'bg': 'Използване на логиката на новия формуляр за качвания', 'en': 'Use new upload form logic', // default 'ru': 'Использовать новую логику формы загрузки' }, 3); JSconfig.registerKey('UploadForm_newlayout', true, { 'bg': 'Използване на облика на новия формуляр за качвания', 'en': 'Use new form layout', // default '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... } // 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 (); } function WEAddStyles(a) { var ss = document.createElement('style'); ss.type = 'text/css'; ss.media = 'screen'; ss.title = 'WE'; if (ss.stylesheet) ss.stylesheet.cssText = a; //IE else ss.appendChild(document.createTextNode(a)); document.getElementsByTagName('head')[0].appendChild(ss); } $(function() { /* hide some navigation and other unnecessary elements if displayed in an iFrame */ if (window.self != window.top) { var content = document.getElementById('content'); if (content) { content.style.margin = 0; content.style.borderStyle = 'none'; } var reva = /(\d+:\d+, \d+ \w+ \d+)/.exec($('#mw-revision-info').text()); var revinfo = reva ? reva[0] : ''; reva = /oldid=(\d+)/.exec($('#mw-revision-nav').find('a').attr('href')); var oldid = reva ? reva[1] : ''; var removals = ['column-one', 'siteNotice', 'contentSub', 'siteSub', 'catlinks', 'page-base', 'head-base', 'head', 'panel', 'firstHeading', 'footer-info-lastmod', 'footer-info-viewcount', 'footer-places', 'footer-icon-poweredby', 'f-poweredbyico', 'lastmod', 'viewcount', 'privacy', 'about', 'disclaimer', 'notiframe']; for (var i=0; i<removals.length; i++) { var g = document.getElementById(removals[i]) if (g) { g.style.display = 'none'; } } $('.editsection,.mw-editsection').css('visibility', 'hidden'); $('#content, #footer').css('background-image', 'none'); document.body.style.background='none'; $('.iframeonly').removeClass('iframeonly'); var q = {}; var qs = document.location.search; qs = qs.substring(1).toLowerCase().split('&'); for (i=0; i<qs.length; i++) { g = qs[i].split('='); q[g[0]] = (g.length === 1) ? true : g[1]; } if (q.nonav) { var divs = document.getElementsByTagName('div'); for (i=0; i<divs.length; i++) { if (divs[i].className.match(/navigation/i)) { divs[i].style.display = 'none'; } } } g = document.getElementById('footer'); if (g) { g.style.marginLeft = 0; /* g.style.position = 'absolute'; g.style.bottom = 0; g.style.width = "98%"; */ } var foot = document.getElementById('f-list') || document.getElementById('footer-info'); if (foot) { var li = document.createElement('li'); g = "http://WikiEducator.org/" + wgPageName; var footerfrom; if (revinfo) { footerfrom = 'Revision of ' + revinfo + ' retrieved from <a href="' + g + '?oldid=' + oldid; } else { footerfrom = 'Retrieved from <a href="' + g; } li.innerHTML = footerfrom + '">' + g + '</a>'; li.style.display = 'block'; foot.insertBefore(li, document.getElementById('copyright') || document.getElementById('footer-info-copyright')); } if ((wgCanonicalNamespace == 'Special') && (wgCanonicalSpecialPageName == 'Userlogin')) { $('#footer-icon-copyright').hide(); } if (q.links) { var largs = q.links.split('|'); for (var j=0; j<largs.length; j++) { q[largs[j]] = true; } var hilight = q.highlight ? ' background: yellow;' : ''; var hover = q.hover ? ' background: yellow;' : ''; if (q.none || q.highlight || q.hover) { WEAddStyles('a.link {text-decoration: none; padding: 0px; background: none; ' + hilight + '} a.visited {text-decoration: none;' + hilight +'} a:active {text-decoration: none;' + hilight + '} a:hover {text-decoration: none;' + hilight + hover + '}'); } var as = document.getElementsByTagName('a'); for (j=0; j<as.length; j++) { var href = as[j].getAttribute('href'); if (href) { if (q.none || q.show || q.hover || q.highlight) { as[j].setAttribute('onclick', 'return false;'); } if (q.window) { as[j].setAttribute('target', '_WE'); } } } } if (q.editable) { $('.editsection,.mw-editsection').css('visibility', 'visible'); } if (q.noheading) { $('#firstHeading').css('display', 'none'); } // if postMessage is supported, try to let the parent know our size if (parent.postMessage) { var ht = content.offsetHeight; var ftr = document.getElementById('footer'); if (ftr) { ht = ht + ftr.offsetHeight; } var loc = document.location.href; parent.postMessage('height^' + ht + '^' + loc, "*"); } } }); // BEGIN Dynamic Navigation Bars // NEEDS Enable multiple onload functions // set up the words in your language var NavigationBarHide = 'Collapse'; var NavigationBarShow = 'Expand'; // set up max count of Navigation Bars on page, // if there are more, all will be hidden // NavigationBarShowDefault = 0; // all bars will be hidden // NavigationBarShowDefault = 1; // on pages with more than 1 bar all bars will be hidden var NavigationBarShowDefault = 0; // shows and hides content and picture (if available) of navigation bars // Parameters: // indexNavigationBar: the index of navigation bar to be toggled function toggleNavigationBar(indexNavigationBar) { var NavToggle = document.getElementById("NavToggle" + indexNavigationBar); var NavFrame = document.getElementById("NavFrame" + indexNavigationBar); if (!NavFrame || !NavToggle) { return false; } // if shown now if (NavToggle.firstChild.data == NavigationBarHide) { for ( var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) { if (NavChild.className == 'NavPic') { NavChild.style.display = 'none'; } if (NavChild.className == 'NavContent') { NavChild.style.display = 'none'; } if (NavChild.className == 'NavToggle') { NavChild.firstChild.data = NavigationBarShow; } } // if hidden now } else if (NavToggle.firstChild.data == NavigationBarShow) { for ( var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) { if (NavChild.className == 'NavPic') { NavChild.style.display = 'block'; } if (NavChild.className == 'NavContent') { NavChild.style.display = 'block'; } if (NavChild.className == 'NavToggle') { NavChild.firstChild.data = NavigationBarHide; } } } } // adds show/hide-button to navigation bars function createNavigationBarToggleButton() { var indexNavigationBar = 0; // iterate over all < div >-elements for( var i=0; NavFrame = document.getElementsByTagName("div")[i]; i++ ) { // if found a navigation bar if (NavFrame.className == "NavFrame") { indexNavigationBar++; var NavToggle = document.createElement("a"); NavToggle.className = 'NavToggle'; NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar); NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');'); var NavToggleText = document.createTextNode(NavigationBarHide); NavToggle.appendChild(NavToggleText); // add NavToggle-Button as first div-element // in < div class="NavFrame" > NavFrame.insertBefore( NavToggle, NavFrame.firstChild ); NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar); } } // if more Navigation Bars found than Default: hide all if (NavigationBarShowDefault < indexNavigationBar) { for( var i=1; i<=indexNavigationBar; i++ ) { toggleNavigationBar(i); } } } $(createNavigationBarToggleButton); // if logged in, and visiting an existing File: page with no description if (wgAction === 'edit' && wgUserName && (wgNamespaceNumber === 6) && wgArticleId) { $.getScript('/skins/common/we/file_information.js'); }