MediaWiki:Common.js

From CruisersWiki

(Difference between revisions)
Jump to: navigation, search
(don't use GetKml)
 
(123 intermediate revisions not shown)
Line 1: Line 1:
-
// -------------------------------------------------------------------------------
+
// <pre>
-
//  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 = [];
+
-
+
-
/* Array.prototype.intersects = function() { */ // avoid an assignment to Array.prototype due to a bug in Navionics webapi
+
-
var array_intersects = function() {
+
-
  // --------------------------------------------------------
+
// JavaScript is available
-
  //  Returns true if any element in the argument array
+
document.documentElement.className = (document.documentElement.className + ' js').trim();
-
  //  is the same as an element in this array
+
-
  // --------------------------------------------------------
+
-
  if( !arguments.length ){
+
-
    return false;
+
-
  }
+
-
  var array2 = arguments[0];
+
   
   
-
  var len1 = this.length;
+
addOnloadHook(function () {
-
  var len2 = array2.length;
+
     // -------------------------------------------------------------------------------
-
  if( len2 == 0 ){
+
    //  Force Preview  JavaScript code - Start
-
     return false;
+
    //
-
  }
+
    // To allow any group to bypass being forced to preview,
-
   
+
    //  enter the group name in the permittedGroups array.
-
  for(var i=0; i<len1; i++){
+
    //  E.g.
-
     for(var j=0; j<len2; j++) {
+
    //    var permittedGroups = [];                       // force everyone
-
      if( this[i] === array2[j] ) {
+
    //    var permittedGroups = [ "user"];               // permit logged-in users
-
         return true;
+
     //    var permittedGroups = [ "sysop", "bureaucrat"]; // permit sysop, bureaucrat
-
      }
+
    // -------------------------------------------------------------------------------
 +
    var permittedGroups = {
 +
            "sysop" : 1,
 +
        };
 +
    if( wgAction != "edit")
 +
        return;
 +
    if( wgUserGroups === null) {
 +
         wgUserGroups = [];
     }
     }
-
  }
+
     /*  if( wgUserGroups.intersects(permittedGroups) ) { */
-
  return false;
+
    for(var i=0; i<wgUserGroups.length; i++){
-
};
+
        if( permittedGroups[wgUserGroups[i]]) {
-
+
            return true;
-
function forcePreview()
+
        }
-
{
+
    }
-
  if( wgAction != "edit") return;
+
    var saveButton = document.getElementById("wpSave");
-
  if( wgUserGroups === null) {
+
    if( !saveButton )
-
     wgUserGroups = [];
+
        return;
-
  }
+
    saveButton.disabled = true;
-
/*  if( wgUserGroups.intersects(permittedGroups) ) { */
+
    saveButton.value = "Save page (use preview first)";
-
  if( array_intersects.call(wgUserGroups, permittedGroups) ) {
+
    saveButton.style.fontWeight = "normal";
-
    return;
+
    document.getElementById("wpPreview").style.fontWeight = "bold";
-
  }
+
});
-
  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";
+
-
}
+
-
+
-
addOnloadHook(forcePreview);
+
// -----------------------------------------------------
// -----------------------------------------------------
//  Force Preview  JavaScript code - End
//  Force Preview  JavaScript code - End
// ---------------------------------------------
// ---------------------------------------------
-
/* end of the original code*/
+
// prerequisites, fixes and workarounds
-
// define setZeroTimeout
+
(function () {
 +
    // modify addOnloadHook from wikibits.js
 +
    var onloadFunctsNew = onloadFuncts; // create new queue
 +
    onloadFuncts = []; // clear old queue
 +
    var doneOnloadHookNew = false;
-
(function() { // see http://dbaron.org/log/20100309-faster-timeouts
+
    var addOnloadHookOld = addOnloadHook;
-
    // Only add setZeroTimeout to the window object, and hide everything
+
    addOnloadHook = function (callback) {
-
    // else in a closure.
+
        var hookFunct = function () { // isolate ecach callback call
-
    var timeouts = [];
+
            setImmediate(callback);
-
     var messageName = "zero-timeout-message";
+
        }
 +
        // Allows add-on scripts to add onload functions
 +
        if(!doneOnloadHookNew) {
 +
                onloadFunctsNew[onloadFunctsNew.length] = hookFunct;
 +
        } else {
 +
                hookFunct();  // bug in MSIE script loading
 +
        }
 +
     };
-
     // Like setTimeout, but only takes a function argument. There's
+
     // workaround for license badge src set to invalid host -- www.cruiserswiki.com: "http://www.cruiserswiki.com/images/f/fe/Creativecommons.png"
-
    // no time argument (always zero) and no arguments (you have to
+
     var licenseBadgeFix = function () {
-
    // use a closure).
+
         console.log('licenseBadgeFix');
-
     function setZeroTimeout(fn) {
+
         $('img[src*="reativecommons.png"]').attr('src', '/images/f/fe/Creativecommons.png' );
-
         timeouts.push(fn);
+
     };
-
         window.postMessage(messageName, "*");
+
-
     }
+
-
     function handleMessage(event) {
+
     // fix for toolbar element is sometimes not available in edit mode
-
         if (event.source == window && event.data == messageName) {
+
    var toolbarFix = function () {
-
            event.stopPropagation();
+
         if ((window.wgAction == 'edit' || window.wgAction == 'submit') && $('#toolbar').length == 0) {
-
            if (timeouts.length > 0) {
+
            $('<div id="toolbar">').insertBefore($('#editform'));
-
                var fn = timeouts.shift();
+
-
                fn();
+
-
            }
+
         }
         }
-
     }
+
     };
-
     window.addEventListener("message", handleMessage, true);
+
     // rearrange toolbar buttons
-
     // Add the one thing we want added to the window object.
+
     var editToolBarFix = function () {
-
    window.setZeroTimeout = window.postMessage ? setZeroTimeout :
+
        var toolbar = $('#toolbar')[0]
-
        function (cb) {
+
         if ( (wgAction == 'edit' || wgAction == 'submit') && toolbar ) {
-
            setTimeout(cb, 0);
+
            mwEditButtons = [];
-
         };
+
            mwCustomEditButtons = [];
-
})();
+
-
(function () {
+
            $('#toolbar').empty();
-
    /* fix for toolbar element is sometimes not available in edit mode */
+
            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");
-
    var addLoadEventRev = function (func) {
+
            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");
-
        var oldonload = window.onload;
+
 
-
        if (typeof oldonload == 'function') {
+
             for (var i = 0; i < mwEditButtons.length; i++) {
-
             window.onload = function() {
+
                    mwInsertEditButton(toolbar, mwEditButtons[i]);
-
                func();
+
             }
-
                oldonload();
+
             mwEditButtons = [];
-
             };
+
-
        } else {
+
-
             window.onload = func;
+
         }
         }
     };
     };
-
     var fixToolbar = function () {
+
    // load some prerequisites
-
         if ((wgAction == 'edit' || wgAction == 'submit') && !document.getElementById('toolbar') && document.getElementById('editform')) {
+
    // no loadScript here as it uses addOnloadHook
-
            var toolbar = document.createElement('div');
+
 
-
            toolbar.id = 'toolbar';
+
     var loadCounter = 0;
-
          
+
 
-
            var editform=document.getElementById('editform');
+
    function prerequisitesReady (){
-
       
+
         console.log('prerequisites ready');
-
             editform.parentNode.insertBefore(toolbar, editform);
+
 
 +
        $.ajaxSetup({ cache: true });
 +
        licenseBadgeFix();
 +
        toolbarFix();
 +
        editToolBarFix();
 +
 
 +
         // process OnloadHookNew
 +
        var cb;
 +
        while (cb = onloadFunctsNew.shift()) {
 +
             setImmediate(cb);
         }
         }
 +
        doneOnloadHookNew = true;
     };
     };
-
   
 
-
    // see wikibits.js
 
-
    onloadFuncts.splice(0, 0, fixToolbar); // execute first
 
-
     //      workaround for license badge src set to invalid host (www.cruiserswiki.com); skin agnostic version
+
     function documentReady () {
 +
        console.log('document.readyState ' + document.readyState);
 +
        if (document.readyState == 'interactive' || document.readyState == 'complete') {
 +
            setImmediate(prerequisitesReady);
 +
        } else {
 +
            setTimeout(documentReady, 100);
 +
        }
 +
    }
-
     var licenseBadgeWorkaround = function () {
+
     function checkReady () {
-
         var images = document.getElementsByTagName('img');
+
         if (--loadCounter > 0)
-
   
+
            return;
-
         for (var i = 0; i < images.length; i++) {
+
         if ( document.readyState ) {
-
             var img = images[i];
+
             documentReady();
-
             if (img.src == "http://www.cruiserswiki.com/images/f/fe/Creativecommons.png") {
+
        } else {
-
                img.src = '/images/f/fe/Creativecommons.png';
+
             $(prerequisitesReady);
-
                return;
+
-
            }
+
         }
         }
-
         // not found yet
+
    }
-
         if (doneOnloadHook) {
+
 
 +
    function preload (url) {
 +
         var elem = importScriptURI(url);
 +
         if (!elem) {
             return;
             return;
         }
         }
-
         console.log('licenseBadgeWorkaround');
+
         loadCounter++;
-
        setZeroTimeout(licenseBadgeWorkaround);
+
        elem.onload = function () {
-
    };
+
            checkReady();
-
     setZeroTimeout(licenseBadgeWorkaround);
+
        }
-
}) ();
+
     }
 +
    // 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
// 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) {
function wikiUri(page, ctype) {
-
return wgServer + wgScript + '?title=' +
+
        return wgServer + wgScript + '?title=' +
-
encodeURIComponent(page.replace(/ /g,'_')).replace('%2F','/').replace('%3A',':') +
+
                encodeURIComponent(page.replace(/ /g,'_')).replace('%2F','/').replace('%3A',':') +
-
(ctype ? '&action=raw&ctype=' + ctype : '');
+
                (ctype ? '&action=raw&ctype=' + ctype : '');
}
}
function wikiScript(page) {
function wikiScript(page) {
-
return wikiUri(page, 'text/javascript');
+
        return wikiUri(page, 'text/javascript');
}
}
function wikiCss(page) {
function wikiCss(page) {
-
return wikiUri(page, 'text/css');
+
        return wikiUri(page, 'text/css');
}
}
 +
 +
var newLoadedScripts = {}; // included-scripts tracker
function loadScript(url, callback) {
function loadScript(url, callback) {
-
     addOnloadHook( function () {
+
     var scriptQueue = newLoadedScripts[url];
-
    var elem = importScriptURI(url);
+
    if (!scriptQueue) {
-
    if (callback) {
+
        scriptQueue = newLoadedScripts[url] = [];
-
        if (elem) {
+
        var elem = document.createElement('script');
-
                 elem.onload = callback;
+
        elem.setAttribute('src',url);
-
            } else {
+
        elem.setAttribute('type','text/javascript');
-
                 callback();
+
        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);
 +
        }
 +
    }
}
}
Line 185: Line 243:
}
}
 +
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
var loadedCss = {}; // included-scripts tracker
function loadCss(url, callback) {
function loadCss(url, callback) {
-
if (loadedCss[url]) {
+
        if (loadedCss[url]) {
-
    callback && callback();
+
            callback && callback();
-
return null;
+
                return null;
-
}
+
        }
-
loadedCss[url] = true;
+
        loadedCss[url] = true;
-
var elem = document.createElement('link');
+
        var elem = document.createElement('link');
-
document.getElementsByTagName('head')[0].appendChild(elem);
+
        document.getElementsByTagName('head')[0].appendChild(elem);
-
elem.setAttribute('type','text/css');
+
        elem.setAttribute('type','text/css');
-
elem.setAttribute('rel','stylesheet');
+
        elem.setAttribute('rel','stylesheet');
-
elem.setAttribute('href',url);
+
        elem.setAttribute('href',url);
-
+
 
-
if (callback) {
+
        if (callback) {
         elem.onload = callback;
         elem.onload = callback;
-
}
+
        }
-
return elem;
+
        return elem;
}
}
-
 
+
*/
function loadWikiCss(page, callback) {
function loadWikiCss(page, callback) {
     loadCss(wikiCss(page), callback);
     loadCss(wikiCss(page), callback);
}
}
-
// load jQuery
+
// loader css, js, img
-
+
var load = (function() { // https://davidwalsh.name/javascript-loader
-
(function () {
+
  function _load(tag) {
-
   
+
     return function(url) {
-
     // modify addOnloadHook from wikibits.js
+
      // This promise will be used by Promise.all to determine success or failure
-
   
+
      return new Promise(function(resolve, reject) {
-
var onloadFunctsNew = onloadFuncts; // see wikibits.js
+
        var element = load.loadedUrls[url];
-
onloadFuncts = [];
+
        if (element) {
-
var doneOnloadHookNew = false;
+
            resolve(element);
 +
            return;
 +
        }
 +
        element = document.createElement(tag);
 +
        var parent = 'body';
 +
        var attr = 'src';
-
var addOnloadHookOld = addOnloadHook;
+
        // Important success and error for the promise
-
addOnloadHook = function (callback) {
+
        element.onload = function() {
-
    var hookFunct = function () { // isolate ecach callback call
+
          load.loadedUrls[url] = element;
-
        setZeroTimeout(callback);
+
          resolve(element);
-
    }
+
-
    // Allows add-on scripts to add onload functions
+
-
    if(!doneOnloadHookNew) {
+
-
    onloadFunctsNew[onloadFunctsNew.length] = hookFunct;
+
-
    } else {
+
-
    hookFunct();  // bug in MSIE script loading
+
-
    }
+
-
};
+
-
+
-
// don't use loadScript here as it uses addOnloadHook
+
-
var elem = importScript("MediaWiki:jquery-1.12.0.min.js");
+
-
// var elem = importScriptURI("https://code.jquery.com/jquery-1.12.0.min.js");
+
-
if (elem) {
+
-
    elem.onload = function () { // isolate ecach callback call
+
-
        setZeroTimeout( function() {
+
-
            //console.log('onload jQuery ' + typeof jQuery  + ' ' + typeof $);
+
-
            if (typeof jQuery === 'undefined') {
+
-
                return;
+
-
            }
+
-
            $.ajaxSetup({
+
-
                cache: true
+
-
            });
+
-
        $(function(){
+
-
            console.log('document ready');
+
-
            if (!doneOnloadHookNew) {
+
-
        doneOnloadHookNew = true;
+
-
        doneOnloadHook = false;
+
-
        onloadFuncts = onloadFunctsNew;
+
-
        onloadFunctsNew = [];
+
-
        runOnloadHook();
+
-
            }
+
-
        });
+
-
    });
+
         };
         };
-
}
+
        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
// chartlets
-
addOnloadHook(function () {  
+
addOnloadHook(function () {
-
     if ($('.cw-chartlet, .cw-chartlet-standalone').length > 0) {
+
     if ( $( '.chartlet' ).length > 0 ) {
-
         loadWikiScript('MediaWiki:Chartlet.js');
+
        if ($('.chartlet-test').length == 0) {
 +
            loadWikiCss('CruisersWiki:Ol3chartlet.css');
 +
            loadWikiScript('CruisersWiki:Ol3chartlet.js');
 +
         } else {
 +
            loadWikiCss('CruisersWiki:tOl3chartlet.css');
 +
            loadWikiScript('CruisersWiki:tOl3chartlet.js');
 +
        }
     }
     }
});
});
-
// add kml download link
+
// add toggle poi sample link display to toolbox
-
addOnloadHook(function () {  
+
addOnloadHook(function () {
-
     if ($('.h-geo').length > 0) {
+
     if ($('.cw-poi').length > 0) {
-
         loadWikiScript('MediaWiki:GetKml.js');
+
         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));
     }
     }
});
});
Line 277: Line 393:
// remove broken fckeditor
// remove broken fckeditor
-
addOnloadHook(function () {  
+
addOnloadHook(function () {
         $('script[src*="fckeditor"]').remove();
         $('script[src*="fckeditor"]').remove();
         $('#fckTools').remove();
         $('#fckTools').remove();
});
});
-
// rewrite image links' titles
+
// set image links' titles
-
addOnloadHook(function () {  
+
addOnloadHook(function () {
-
     $('a.image>img[alt]').each(function(i) {
+
     $('a.image').each(function(i) {
         var $this = $(this);
         var $this = $(this);
-
        var alt = $this.attr('alt');
+
         $this.attr('title', 'Click to view');
-
         $this.attr('title', alt);
+
-
        // console.log(''+i+' '+alt);
+
     });
     });
});
});
// after [[w:User:Rezonansowy/SimpleLightbox]]
// after [[w:User:Rezonansowy/SimpleLightbox]]
-
   
+
 
-
addOnloadHook(function () {  
+
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(
     $('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 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">' +
-
            '<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>'
         '</div>'
     );
     );
-
    $('#lightbox').on('click', function() {
+
 
-
        $(this).fadeOut('fast', function () {
+
     $('a.image').click( function(e) {
-
            $('#lightbox img').hide();
+
-
        });
+
-
    });
+
-
     $('a.image').click(function(e) {
+
         e.preventDefault();
         e.preventDefault();
         var src = $(this).find('img').attr('src');
         var src = $(this).find('img').attr('src');
         var thumb = src.match(/^(.*)(\/thumb)(.*)(\/[^\/]*)$/,'');
         var thumb = src.match(/^(.*)(\/thumb)(.*)(\/[^\/]*)$/,'');
         if (thumb) {
         if (thumb) {
-
          src = thumb[1] + thumb[3];
+
            src = thumb[1] + thumb[3];
         } else if (src.match("/Special:Redirect/") ) {
         } else if (src.match("/Special:Redirect/") ) {
-
             src = src.replace(/(\?width=.*)$/,'');
+
             src = src.replace(/(\?.*)$/,''); // cut the tail
         }
         }
-
         $('#lightbox').show();
+
         // $('#lightbox').show();
 +
        // $('#lightbox img')
 +
        //    .attr('src', src)
 +
        //    .load(function () {
 +
        //        $(this).fadeIn('fast');
 +
        //    });
-
         $('#lightbox img')
+
         $('#cw-lightbox')
-
             .attr('src', src)
+
             // .html('<img src="'+src+'" style="background:#fff;box-shadow: 0 0 25px #111;max-height:100%;max-width:100%;vertical-align:middle;cursor:pointer;" />')
-
             .load(function () {
+
             // .css('line-height', $(window).height()+'px')
-
                $(this).fadeIn('fast');
+
        .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();
 +
             }
 +
        });
 +
       
     });
     });
});
});
Line 329: Line 469:
// custom edit toolbar buttons
// custom edit toolbar buttons
-
function addCustomEditButton (imageFile, speedTip, tagOpen, tagClose, sampleText, imageId) {
+
//~ function addCustomEditButton (imageFile, speedTip, tagOpen, tagClose, sampleText, imageId) {
-
mwCustomEditButtons[mwEditButtons.length] =
+
//~ mwCustomEditButtons[mwCustomEditButtons.length] =
-
{"imageId": imageId,
+
        //~ {"imageId": imageId,
-
"imageFile": imageFile,
+
        //~ "imageFile": imageFile,
-
"speedTip": speedTip,
+
        //~ "speedTip": speedTip,
-
"tagOpen": tagOpen,
+
        //~ "tagOpen": tagOpen,
-
"tagClose": tagClose,
+
        //~ "tagClose": tagClose,
-
"sampleText": sampleText};
+
        //~ "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");
-
addCustomEditButton("/images/7/70/Button_POI.png","Add POI","{{poi | lat= | lon=\n| type=\n| name=","\n| text=\n}}\n","","mw-editbutton-poi");
+
-
if (wgUserName == 'Vadim') {
+
if (wgUserName) {
-
     importScript('User:Vadim/common.js');
+
     importScript('User:' + wgUserName +'/common.js');
 +
    if (skin)
 +
        importScript('User:' + wgUserName +'/' + skin + '.js');
}
}
 +
// </pre>

Latest revision as of 14:54, 30 October 2017

// <pre>

// JavaScript is available
document.documentElement.className = (document.documentElement.className + ' js').trim();
 
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));
    }
});

// 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>
Personal tools
advertisement
Friends of Cruisers Wiki