MediaWiki:Common.js
De WikiEducator
Revisión a fecha de 19:40 11 oct 2012; JimTittsler (Discusión | contribuciones)
Nota: después de guardar, quizás necesites refrescar la caché de tu navegador para ver los cambios.
- Firefox / Safari: Mantén presionada Mayús mientras pulsas el botón Actualizar, o presiona Ctrl+F5 o Ctrl+R (⌘+R en Mac)
- Google Chrome: presiona Ctrl+Shift+R (⌘+Mayús+R en Mac)
- Internet Explorer: mantén presionada Ctrl mientras pulsas Actualizar, o presiona Ctrl+F5
- Opera: vacía la caché en Herramientas → Preferencias
/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página. */ /* Any JavaScript here will be loaded for all users on every page load. */ /* Scripts specific to Internet Explorer */ /*if ($.client.profile().name == 'msie') { */ if ($.browser.msie) { /** Internet Explorer bug fix ************************************************** * * Description: Fixes IE horizontal scrollbar bug * Maintainers: [[User:Tom-]]? */ var oldWidth; var docEl = document.documentElement; var fixIEScroll = function() { if (!oldWidth || docEl.clientWidth > oldWidth) { doFixIEScroll(); } else { setTimeout(doFixIEScroll, 1); } oldWidth = docEl.clientWidth; }; var doFixIEScroll = function () { docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : ""; }; document.attachEvent("onreadystatechange", fixIEScroll); document.attachEvent("onresize", fixIEScroll); // In print IE (7?) does not like line-height //mw.util.addCSS('@media print { sup, sub, p, .documentDescription { line-height: normal; } }'); // IE overflow bug //mw.util.addCSS('div.overflowbugx { overflow-x: scroll !important; overflow-y: hidden !important; } ' // + 'div.overflowbugy { overflow-y: scroll !important; overflow-x: hidden !important; }'); // IE zoomfix // Use to fix right floating div/table inside tables //mw.util.addCSS('.iezoomfix div, .iezoomfix table { zoom: 1; }'); // Import scripts specific to Internet Explorer 6 //if ($.client.profile().versionBase == '6') { if ($.browser.msie && (parseInt($.browser.version, 10) === 6)) { importScript('MediaWiki:Common.js/IE60Fixes.js'); } } /* Fixes for Windows XP font rendering */ if (navigator.appVersion.search(/windows nt 5/i) != -1) { //mw.util.addCSS('.IPA {font-family: "Lucida Sans Unicode", "Arial Unicode MS";} ' + // '.Unicode {font-family: "Arial Unicode MS", "Lucida Sans Unicode";}'); } /* Helper script for .hlist class in Common.css * Last updated: September 3, 2012 * Maintainer: [[User:Edokter]] */ //if ( $.client.profile().name == 'msie' ) { if ( $.browser.msie ) { /* Add pseudo-selector class to last-child list items in IE 8 */ if ( parseInt($.browser.version, 10) === 8 ) { $( '.hlist' ).find( 'dd:last-child, dt:last-child, li:last-child' ) .addClass( 'hlist-last-child' ); } /* Generate interpuncts and parens for IE < 8 */ if ( parseInt($.browser.version, 10) < 8 ) { $( '.hlist' ).find( 'dt' ).not( ':last-child' ) .append( ': ' ); $( '.hlist' ).find( 'dd, li' ).not( ':last-child' ) .append( '<b>·</b> ' ); $( '.hlist' ).find( 'dl dl, ol ol, ul ul' ) .prepend( '( ' ).append( ') ' ); } } /** 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 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() { var expdate = new Date(); expdate.setTime(expdate.getTime()+1000*60*60*24*3650); // expires in 3560 days for( var key in JSconfig.keys ) document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=' + expdate.toUTCString(); }, evaluateForm : function() { var w_ctrl,wt; //alert('about to save JSconfig'); for( var key in JSconfig.meta ) { w_ctrl = document.getElementById( JSconfig.prefix + key ) if( w_ctrl ) { wt = typeof JSconfig.meta[key].default_value; switch( wt ) { case 'boolean' : JSconfig.keys[key] = w_ctrl.checked; break; case 'string' : JSconfig.keys[key] = w_ctrl.value; break; } } } JSconfig.writeCookies(); return true; }, prefsTabs : false, setUpForm : function() { var prefChild = document.getElementById('preferences'); if( !prefChild ) return; prefChild = prefChild.childNodes; // // make a list of all preferences sections // var tabs = new Array; var len = prefChild.length; for( var key = 0; key < len; key++ ) { if( prefChild[key].tagName && prefChild[key].tagName.toLowerCase() == 'fieldset' ) tabs.push(prefChild[key]); } JSconfig.prefsTabs = tabs; // // Create Widgets for all registered config keys // for( var key in JSconfig.meta ) JSconfig.addPrefsInput(key); addEvent(document.getElementById('preferences').parentNode, 'submit', JSconfig.evaluateForm ); }, addPrefsInput : function( key ) { var w_div = document.createElement( 'DIV' ); var w_label = document.createElement( 'LABEL' ); var wt = typeof JSconfig.meta[key].default_value; switch ( wt ) { case 'boolean': JSconfig.meta[key].description = " " + JSconfig.meta[key].description; break; case 'string': default: JSconfig.meta[key].description += ": "; break; } w_label.appendChild( document.createTextNode( JSconfig.meta[key].description ) ); w_label.htmlFor = JSconfig.prefix + key; var w_ctrl = document.createElement( 'INPUT' ); w_ctrl.id = JSconfig.prefix + key; // before insertion into the DOM tree switch( wt ) { case 'boolean': w_ctrl.type = 'checkbox'; w_div.appendChild( w_ctrl ); w_div.appendChild( w_label ); break; case 'string': default: w_ctrl.type = 'text'; w_div.appendChild( w_label ); w_div.appendChild( w_ctrl ); break; } JSconfig.prefsTabs[JSconfig.meta[key].page].appendChild( w_div ); // after insertion into the DOM tree switch( wt ) { case 'boolean' : w_ctrl.defaultChecked = w_ctrl.checked = JSconfig.keys[key]; break; case 'string' : w_ctrl.defaultValue = w_ctrl.value = JSconfig.keys[key]; break; } } }; JSconfig.readCookies(); /* Test if an element has a certain class ************************************** * * Description: Uses regular expressions and caching for better performance. * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]] */ var hasClass = (function () { var reCache = {}; return function (element, className) { return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className); }; })(); /** Collapsible tables ********************************************************* * * Description: Allows tables to be collapsed, showing only the header. See * [[Wikipedia:NavFrame]]. * Maintainers: [[User:R. Koot]] */ var autoCollapse = 2; var collapseCaption = "hide"; var expandCaption = "show"; function collapseTable( tableIndex ) { var Button = document.getElementById( "collapseButton" + tableIndex ); var Table = document.getElementById( "collapsibleTable" + tableIndex ); if ( !Table || !Button ) { return false; } var Rows = Table.rows; if ( Button.firstChild.data == collapseCaption ) { for ( var i = 1; i < Rows.length; i++ ) { Rows[i].style.display = "none"; } Button.firstChild.data = expandCaption; } else { for ( var i = 1; i < Rows.length; i++ ) { Rows[i].style.display = Rows[0].style.display; } Button.firstChild.data = collapseCaption; } } function createCollapseButtons() { var tableIndex = 0; var NavigationBoxes = new Object(); var Tables = document.getElementsByTagName( "table" ); for ( var i = 0; i < Tables.length; i++ ) { if ( hasClass( Tables[i], "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 ); 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", "javascript:collapseTable(" + tableIndex + ");" ); ButtonLink.appendChild( ButtonText ); Button.appendChild( document.createTextNode( "[" ) ); Button.appendChild( ButtonLink ); Button.appendChild( document.createTextNode( "]" ) ); Header.insertBefore( Button, Header.childNodes[0] ); tableIndex++; } } for ( var i = 0; i < tableIndex; i++ ) { if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) { collapseTable( i ); } } } addOnloadHook( createCollapseButtons ); /***** subPagesLink ******** * Adds a link to subpages of current page * * Maintainers: [[:he:משתמש:ערן]], [[User:Dschwen]] * * JSconfig items: bool JSconfig.subPagesLink * (true=enabled (default), false=disabled) ****/ var subPagesLink = { // // Translations of the menu item // i18n : { 'bg': 'Подстраници', 'ca': 'Subpàgines', 'cs': 'Podstránky', 'de': 'Unterseiten', 'en': 'Subpages', // default 'et': 'Alamlehed', 'eo': 'Subpaĝoj', 'eu': 'Azpiorrialdeak', 'es': 'Subpáginas', 'fi': 'Alasivut', 'fr': 'Sous-pages', 'gl': 'Subpáxinas', 'he': 'דפי משנה', 'hr': 'Podstranice', 'it': 'Sottopagine', 'is': 'Undirsíður', 'ko': '하위 문서 목록', '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 = wgArticlePath.replace('$1','Special:Prefixindex/' + wgPageName +'/'); addPortletLink( 'p-tb', subpagesLink, subpagesText, 't-subpages' ); } } } JSconfig.registerKey('subPagesLink', true, { 'bg': 'Показване на връзката Подстраници в менюто с инструменти', 'cs': 'Zobrazovat v panelu nástrojů odkaz Podstránky', 'en': 'Show a Subpages link in the toolbox', // default 'pl': 'Pokaż w panelu bocznym link do podstron', 'ru': 'Показывать ссылку на подстраницы в меню инструментов' }, 7); addOnloadHook(subPagesLink.install); 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); } addOnloadHook(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 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']; for (var i=0; i<removals.length; i++) { var g = document.getElementById(removals[i]) if (g) { g.style.display = 'none'; } } document.body.style.background='none'; 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; } var foot = document.getElementById('f-list') || document.getElementById('footer-info'); if (foot) { var li = document.createElement('li'); g = wgServer + '/' + wgPageName; li.innerHTML = 'Fuente: <a href="' + g + '">' + g + '</a>'; li.style.display = 'block'; foot.insertBefore(li, document.getElementById('copyright') || document.getElementById('footer-info-copyright')); } var q = {}; var qs = document.location.search; qs = qs.substring(1).toLowerCase().split('&'); for (i=0; i<qs.length; i++) { g = qs[i].split('='); if (g[0] == 'links') { var largs = g[1].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 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, "*"); } } }); /* add Links button with permanent link, short link, and iframe snippets for each * 2010-12-21 http://WikiEducator.org/User:JimTittsler * short links derived from [[commons:Bugzilla:021572]] -- [[commons:meta:user:Platonides]] */ function weSelectMe(node) { var selection, range, doc, win; if ((doc = node.ownerDocument) && (win=doc.defaultView) && typeof win.getSelection != 'undefined' && typeof doc.createRange != 'undefined' && (selection = window.getSelection()) && typeof selection.removeAllRanges != 'undefined') { range = doc.createRange(); range.selectNode(node); selection.removeAllRanges(); selection.addRange(range); } else if (document.body && typeof document.body.createTextRange != 'undefined' && (range = document.body.createTextRange())) { /* IE */ range.moveToElementText(node); range.select(); } } addOnloadHook( function() { var plink = document.getElementById("t-permalink"); if (wgArticleId && plink) { var permanent_link = wgScript + '?oldid=' + wgCurRevisionId; var short_url = wgScript + '?curid=' + wgArticleId; plink.innerHTML = ['<a href="#" title="Permanent and short URLs, IFrame snippets for this page" onClick="var weLinks=document.getElementById(\'weLinks\'); if (weLinks.style.display == \'none\') { weLinks.style.display = \'block\'; weSelectMe(document.getElementById(\'we_page_iframe\'));} else { weLinks.style.display = \'none\'; } return false;">Links</a>' , '<ul id="weLinks" style="display:none;">' , '<li><a href="' + permanent_link + '" title="Permanent link to this revision">Permanent Link</a></li>' , '<li>IFrame snippet to this revision:<br>' , '<span onClick="weSelectMe(this);"><iframe src="' + wgServer + permanent_link + '" width="100%" height="300"></iframe></span></li>' , '<li><a href="' + short_url + '" title="Reference page by article id">Short URL</a></li>' , '<li>IFrame snippet to this page:<br>' , '<span id="we_page_iframe" onClick="weSelectMe(this);"><iframe src="' + wgServer + short_url + '" width="100%" height="300"></iframe></span></li>' , '</ul>' ].join(''); } } ); // 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); } } } addOnloadHook(createNavigationBarToggleButton);