MediaWiki:Common.js
From CruisersWiki
Note: After saving, you may have to bypass your browser's cache to see the changes. Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh); Konqueror: click Reload or press F5; Opera: clear the cache in Tools → Preferences; Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.
// <pre> // JavaScript is available document.documentElement.className += ' js'; addOnloadHook(function () { // ------------------------------------------------------------------------------- // Force Preview JavaScript code - Start // // To allow any group to bypass being forced to preview, // enter the group name in the permittedGroups array. // E.g. // var permittedGroups = []; // force everyone // var permittedGroups = [ "user"]; // permit logged-in users // var permittedGroups = [ "sysop", "bureaucrat"]; // permit sysop, bureaucrat // ------------------------------------------------------------------------------- var permittedGroups = { "sysop" : 1, }; if( wgAction != "edit") return; if( wgUserGroups === null) { wgUserGroups = []; } /* if( wgUserGroups.intersects(permittedGroups) ) { */ for(var i=0; i<wgUserGroups.length; i++){ if( permittedGroups[wgUserGroups[i]]) { return true; } } var saveButton = document.getElementById("wpSave"); if( !saveButton ) return; saveButton.disabled = true; saveButton.value = "Save page (use preview first)"; saveButton.style.fontWeight = "normal"; document.getElementById("wpPreview").style.fontWeight = "bold"; }); // ----------------------------------------------------- // Force Preview JavaScript code - End // --------------------------------------------- // prerequisites, fixes and workarounds (function () { // modify addOnloadHook from wikibits.js var onloadFunctsNew = onloadFuncts; // create new queue onloadFuncts = []; // clear old queue var doneOnloadHookNew = false; var addOnloadHookOld = addOnloadHook; addOnloadHook = function (callback) { var hookFunct = function () { // isolate ecach callback call setImmediate(callback); } // Allows add-on scripts to add onload functions if(!doneOnloadHookNew) { onloadFunctsNew[onloadFunctsNew.length] = hookFunct; } else { hookFunct(); // bug in MSIE script loading } }; // workaround for license badge src set to invalid host -- www.cruiserswiki.com: "http://www.cruiserswiki.com/images/f/fe/Creativecommons.png" var licenseBadgeFix = function () { console.log('licenseBadgeFix'); $('img[src*="reativecommons.png"]').attr('src', '/images/f/fe/Creativecommons.png' ); }; // fix for toolbar element is sometimes not available in edit mode var toolbarFix = function () { if ((window.wgAction == 'edit' || window.wgAction == 'submit') && $('#toolbar').length == 0) { $('<div id="toolbar">').insertBefore($('#editform')); } }; // rearrange toolbar buttons var editToolBarFix = function () { var toolbar = $('#toolbar')[0] if ( (wgAction == 'edit' || wgAction == 'submit') && toolbar ) { mwEditButtons = []; mwCustomEditButtons = []; $('#toolbar').empty(); addButton("/skins/common/images/button_sig.png","Your signature with timestamp","--~~"+"~~","","","mw-editbutton-signature"); addButton("/skins/common/images/button_bold.png","Bold text","'''","'''","Bold text","mw-editbutton-bold"); addButton("/skins/common/images/button_italic.png","Italic text","''","''","Italic text","mw-editbutton-italic"); addButton("/skins/common/images/button_link.png","Internal link","[[","]]","Link title","mw-editbutton-link"); addButton("/skins/common/images/button_extlink.png","External link (remember http:// prefix)","[","]","http://www.example.com link title","mw-editbutton-extlink"); addButton("/skins/common/images/button_headline.png","Level 2 headline","\n== "," ==\n","Headline text","mw-editbutton-headline"); addButton("/skins/common/images/button_image.png","Embedded file","[[File:","]]","Example.jpg","mw-editbutton-image"); addButton("/skins/common/images/button_media.png","File link","[[Media:","]]","Example.ogg","mw-editbutton-media"); // addButton("/skins/common/images/button_math.png","Mathematical formula (LaTeX)","\x3cmath\x3e","\x3c/math\x3e","Insert formula here","mw-editbutton-math"); addButton("/skins/common/images/button_nowiki.png","Ignore wiki formatting","\x3cnowiki\x3e","\x3c/nowiki\x3e","Insert non-formatted text here","mw-editbutton-nowiki"); // addButton("/skins/common/images/button_hr.png","Horizontal line (use sparingly)","\n----\n","","","mw-editbutton-hr"); addButton("/images/7/70/Button_POI.png","Add POI","{{poi\n| type=\n| name=","\n| lat= | lon=\n| url=\n| text=\n}}\n","","mw-editbutton-poi"); for (var i = 0; i < mwEditButtons.length; i++) { mwInsertEditButton(toolbar, mwEditButtons[i]); } mwEditButtons = []; } }; // load some prerequisites // no loadScript here as it uses addOnloadHook var loadCounter = 0; function prerequisitesReady (){ console.log('prerequisites ready'); $.ajaxSetup({ cache: true }); licenseBadgeFix(); toolbarFix(); editToolBarFix(); // process OnloadHookNew var cb; while (cb = onloadFunctsNew.shift()) { setImmediate(cb); } doneOnloadHookNew = true; }; function documentReady () { console.log('document.readyState ' + document.readyState); if (document.readyState == 'interactive' || document.readyState == 'complete') { setImmediate(prerequisitesReady); } else { setTimeout(documentReady, 100); } } function checkReady () { if (--loadCounter > 0) return; if ( document.readyState ) { documentReady(); } else { $(prerequisitesReady); } } function preload (url) { var elem = importScriptURI(url); if (!elem) { return; } loadCounter++; elem.onload = function () { checkReady(); } } // load Promises //if (window.Promise === undefined) preload("https://cdn.jsdelivr.net/bluebird/3.4.7/bluebird.min.js"); // load jQuery preload("https://code.jquery.com/jquery-1.12.4.min.js"); })(); // // utility functions // var Storage = { set: function(key, value) { var s = JSON.stringify(value) localStorage[key] = s return s }, get: function(key) { var s = localStorage[key] return s ? JSON.parse(s) : s }, } function setImmediate (callback) { return Promise.resolve().then(callback); } function format (str, col) { // http://stackoverflow.com/a/5341855 col = typeof col === 'object' ? col : Array.prototype.slice.call(arguments, 1); return str.replace(/\{\{|\}\}|\{(\w+)\}/g, function (m, n) { if (m == "{{") { return "{"; } if (m == "}}") { return "}"; } return col[n]; }); } function wikiUri(page, ctype) { return wgServer + wgScript + '?title=' + encodeURIComponent(page.replace(/ /g,'_')).replace('%2F','/').replace('%3A',':') + (ctype ? '&action=raw&ctype=' + ctype : ''); } function wikiScript(page) { return wikiUri(page, 'text/javascript'); } function wikiCss(page) { return wikiUri(page, 'text/css'); } var newLoadedScripts = {}; // included-scripts tracker function loadScript(url, callback) { var scriptQueue = newLoadedScripts[url]; if (!scriptQueue) { scriptQueue = newLoadedScripts[url] = []; var elem = document.createElement('script'); elem.setAttribute('src',url); elem.setAttribute('type','text/javascript'); document.getElementsByTagName('head')[0].appendChild(elem); elem.onload = function () { addOnloadHook( function () { elem.onload = null; newLoadedScripts[url] = true; for (var i=0; i < scriptQueue.length; i++ ) scriptQueue[i](); }); }; } if (callback) { if (scriptQueue === true) { callback(); } else { scriptQueue.push(callback); } } } function loadWikiScript(page, callback) { loadScript(wikiScript(page), callback); } var loadedMedia = {}; // loaded scripts, css function loadJs( url ) { var promised = loadedMedia[ url ]; if ( ! promised ) { promised = loadedMedia[ url ] = new Promise( function( resolve ) { var elem = document.createElement('script'); elem.setAttribute('src',url); elem.setAttribute('type','text/javascript'); document.getElementsByTagName('head')[ 0 ].appendChild(elem); elem.onload = function () { elem.onload = null; addOnloadHook( function () { resolve(); }) } }) } return promised } function loadWikiJs( page ) { return loadJs( wikiScript( page )) } /**/ function loadCss( url ) { var promised = loadedMedia[ url ]; if ( ! promised ) { promised = loadedMedia[ url ] = new Promise( function( resolve ) { var elem = document.createElement('link'); document.getElementsByTagName('head')[ 0 ].appendChild(elem); elem.setAttribute('type','text/css'); elem.setAttribute('rel','stylesheet'); elem.setAttribute('href',url); elem.onload = function () { elem.onload = null; resolve(); } }) } return promised } function loadWikiCss( page ) { return loadCss( wikiCss( page )) } /**/ /* var loadedCss = {}; // included-scripts tracker function loadCss(url, callback) { if (loadedCss[url]) { callback && callback(); return null; } loadedCss[url] = true; var elem = document.createElement('link'); document.getElementsByTagName('head')[0].appendChild(elem); elem.setAttribute('type','text/css'); elem.setAttribute('rel','stylesheet'); elem.setAttribute('href',url); if (callback) { elem.onload = callback; } return elem; } */ function loadWikiCss(page, callback) { loadCss(wikiCss(page), callback); } // loader css, js, img var load = (function() { // https://davidwalsh.name/javascript-loader function _load(tag) { return function(url) { // This promise will be used by Promise.all to determine success or failure return new Promise(function(resolve, reject) { var element = load.loadedUrls[url]; if (element) { resolve(element); return; } element = document.createElement(tag); var parent = 'body'; var attr = 'src'; // Important success and error for the promise element.onload = function() { load.loadedUrls[url] = element; resolve(element); }; element.onerror = function() { reject(element); }; // Need to set different attributes depending on tag type switch(tag) { case 'script': element.async = true; break; case 'link': element.type = 'text/css'; element.rel = 'stylesheet'; attr = 'href'; parent = 'head'; } // Inject into document to kick off loading element[attr] = url; document[parent].appendChild(element); }); }; } return { css: _load('link'), js: _load('script'), img: _load('img'), loadedUrls: {} } })(); // chartlets addOnloadHook(function () { if ( $( '.chartlet' ).length > 0 ) { if ($('.chartlet-test').length == 0) { loadWikiCss('CruisersWiki:Ol3chartlet.css'); loadWikiScript('CruisersWiki:Ol3chartlet.js'); } else { loadWikiCss('CruisersWiki:tOl3chartlet.css'); loadWikiScript('CruisersWiki:tOl3chartlet.js'); } } }); // add toggle poi sample link display to toolbox addOnloadHook(function () { if ($('.cw-poi').length > 0) { var $a = $('<a style="cursor:pointer">Show POI links</a>') .click(function () { $('body').toggleClass('cw-poi-sample-link-dislay'); }); $('#p-tb ul').append($('<li>').append($a)); } }); // add kml download link to toolbox addOnloadHook(function () { if ($('.h-geo').length > 0) { loadWikiScript('CruisersWiki:GetKml.js'); } }); // remove broken fckeditor addOnloadHook(function () { $('script[src*="fckeditor"]').remove(); $('#fckTools').remove(); }); // set image links' titles addOnloadHook(function () { $('a.image').each(function(i) { var $this = $(this); $this.attr('title', 'Click to view'); }); }); // after [[w:User:Rezonansowy/SimpleLightbox]] addOnloadHook(function () { // $('body').append( // '<div id="lightbox" style="display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.6);text-align:center;z-index:9999">' + // '<span style="display: inline-block; height: 100%; vertical-align: middle;" ></span>' + // http://stackoverflow.com/a/7310398 // '<img style="display:none;background:#fff;box-shadow: 0 0 25px #111;max-height:100%;max-width:100%;vertical-align:middle;cursor:pointer;" />' + // '</div>' // ); // $('#lightbox').on('click', function() { // $(this).fadeOut('fast', function () { // $('#lightbox img').hide(); // }); // }); // $('body').append('<div id="lightbox" style="display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.6);text-align:center;z-index:9999"></div>'); $('body').append( '<div id="cw-lightbox" style="display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.6);text-align:center;z-index:9999">' + '</div>' ); $('a.image').click( function(e) { e.preventDefault(); var src = $(this).find('img').attr('src'); var thumb = src.match(/^(.*)(\/thumb)(.*)(\/[^\/]*)$/,''); if (thumb) { src = thumb[1] + thumb[3]; } else if (src.match("/Special:Redirect/") ) { src = src.replace(/(\?.*)$/,''); // cut the tail } // $('#lightbox').show(); // $('#lightbox img') // .attr('src', src) // .load(function () { // $(this).fadeIn('fast'); // }); $('#cw-lightbox') // .html('<img src="'+src+'" style="background:#fff;box-shadow: 0 0 25px #111;max-height:100%;max-width:100%;vertical-align:middle;cursor:pointer;" />') // .css('line-height', $(window).height()+'px') .html( '<span style="display: inline-block; height: 100%; vertical-align: middle;" ></span>' + // http://stackoverflow.com/a/7310398 '<img style="background:#fff;box-shadow: 0 0 25px #111;max-height:100%;max-width:100%;cursor:pointer;"' + 'src="' + src + '" />' ) .fadeIn('fast') .on('click', function() { $(this).fadeOut('fast'); }); $(document).keyup(function(e) { if (e.keyCode == 27) { // esc keycode $('#cw-lightbox').hide(); } }); }); }); // custom edit toolbar buttons //~ function addCustomEditButton (imageFile, speedTip, tagOpen, tagClose, sampleText, imageId) { //~ mwCustomEditButtons[mwCustomEditButtons.length] = //~ {"imageId": imageId, //~ "imageFile": imageFile, //~ "speedTip": speedTip, //~ "tagOpen": tagOpen, //~ "tagClose": tagClose, //~ "sampleText": sampleText}; //~ } //~ addCustomEditButton("/images/7/70/Button_POI.png","Add POI","{{poi \n| lat= | lon=\n| type=\n| name=","\n| text=\n}}\n","","mw-editbutton-poi"); if (wgUserName) { importScript('User:' + wgUserName +'/common.js'); if (skin) importScript('User:' + wgUserName +'/' + skin + '.js'); } // </pre>