MediaWiki:Common.js

From CruisersWiki

(Difference between revisions)
Jump to: navigation, search
m (a comment added)
Line 62: Line 62:
//  Force Preview  JavaScript code - End
//  Force Preview  JavaScript code - End
// ---------------------------------------------
// ---------------------------------------------
 +
 +
/*  */
 +
 +
(function () {
 +
 +
    /* fix for toolbar element is sometimes not available in edit mode */
 +
 +
    var addLoadEventRev = function (func) {
 +
        var oldonload = window.onload;
 +
        if (typeof oldonload == 'function') {
 +
            window.onload = function() {
 +
                func();
 +
                oldonload();
 +
            };
 +
        } else {
 +
            window.onload = func;
 +
        }
 +
    };
 +
 +
    var fixToolbar = function () {
 +
        if ((wgAction == 'edit' || wgAction == 'submit') && !document.getElementById('toolbar') && document.getElementById('editform')) {
 +
            var toolbar = document.createElement('div');
 +
            toolbar.id = 'toolbar';
 +
       
 +
            var editform=document.getElementById('editform');
 +
       
 +
            editform.parentNode.insertBefore(toolbar, editform);
 +
        }
 +
    };
 +
   
 +
    // 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
 +
 +
    var licenseBadgeWorkaround = function () {
 +
        var images = document.getElementsByTagName('img');
 +
   
 +
        for (var i = 0; i < images.length; i++) {
 +
            var img = images[i];
 +
            if (img.src == "http://www.cruiserswiki.com/images/f/fe/Creativecommons.png") {
 +
               
 +
                // as per CruisersWiki:Copyrights
 +
                img.src = 'https://licensebuttons.net/l/by-nc-sa/3.0/88x31.png';
 +
                return;
 +
            }
 +
        }
 +
        // not found yet
 +
        if (doneOnloadHook)
 +
            return;
 +
        setTimeout(licenseBadgeWorkaround, 500);
 +
    };
 +
    licenseBadgeWorkaround();
 +
}) ();
 +
 +
// utility functions
 +
 +
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');
 +
}
 +
 +
function loadScript(url, callback) {
 +
    addOnloadHook( function () {
 +
    var elem = importScriptURI(url);
 +
    if (callback) {
 +
        if (elem) {
 +
                elem.onload = callback;
 +
            } else {
 +
                callback();
 +
            }
 +
    }
 +
    });
 +
}
 +
 +
function loadWikiScript(page, callback) {
 +
    loadScript(wikiScript(page), callback);
 +
}
 +
 +
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);
 +
}
 +
 +
// load jQuery
 +
 +
(function () {
 +
   
 +
    // modify addOnloadHook from wikibits.js
 +
   
 +
var onloadFunctsNew = onloadFuncts; // see wikibits.js
 +
onloadFuncts = [];
 +
var doneOnloadHookNew = false;
 +
 +
var addOnloadHookOld = addOnloadHook;
 +
addOnloadHook = function (hookFunct) {
 +
    // 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 = importScriptURI("https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js");
 +
if (elem) {
 +
    elem.onload = function() {
 +
        //console.log('onload jQuery ' + typeof jQuery  + ' ' + typeof $);
 +
        if (typeof jQuery === 'undefined') {
 +
            return;
 +
        }
 +
        $.ajaxSetup({
 +
            cache: true
 +
        });
 +
    $(document).ready(function(){
 +
        console.log('document ready');
 +
        if (!doneOnloadHookNew) {
 +
    doneOnloadHookNew = true;
 +
    doneOnloadHook = false;
 +
    onloadFuncts = onloadFunctsNew;
 +
    onloadFunctsNew = [];
 +
    runOnloadHook();
 +
        }
 +
    });
 +
        };
 +
}
 +
})();
 +
 +
// remove broken fckeditor
 +
 +
addOnloadHook(function () {
 +
        $('script[src*="fckeditor"]').remove();
 +
        $('#fckTools').remove();
 +
});
 +
 +
// rewrite image links' titles
 +
 +
addOnloadHook(function () {
 +
    $('a.image>img[alt]').each(function(i) {
 +
        var $this = $(this);
 +
        var alt = $this.attr('alt');
 +
        $this.attr('title', alt);
 +
        // console.log(''+i+' '+alt);
 +
    });
 +
});
 +
 +
// 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();
 +
        });
 +
    });
 +
    $('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(/(\?width=.*)$/,'');
 +
        }
 +
 +
        $('#lightbox').show();
 +
 +
        $('#lightbox img')
 +
            .attr('src', src)
 +
            .load(function () {
 +
                $(this).fadeIn('fast');
 +
            });
 +
    });
 +
});
 +
 +
// chartlets
 +
 +
addOnloadHook(function () {
 +
    if ($('.cw-chartlet, .cw-chartlet-standalone').length > 0) {
 +
        loadWikiScript('MediaWiki:Chartlet.js');
 +
    }
 +
});
 +
 +
// add kml download link
 +
 +
addOnloadHook(function () {
 +
    if ($('.h-geo').length > 0) {
 +
        loadWikiScript('MediaWiki:GetKml.js');
 +
    }
 +
});
 +
 +
// custom edit toolbar buttons
 +
 +
function addCustomEditButton (imageFile, speedTip, tagOpen, tagClose, sampleText, imageId) {
 +
mwCustomEditButtons[mwEditButtons.length] =
 +
{"imageId": imageId,
 +
"imageFile": imageFile,
 +
"speedTip": speedTip,
 +
"tagOpen": tagOpen,
 +
"tagClose": tagClose,
 +
"sampleText": sampleText};
 +
}
 +
 +
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') {
 +
    importScript('User:Vadim/common.js');
 +
}

Revision as of 08:15, 4 February 2016

// -------------------------------------------------------------------------------
//  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() {

  // --------------------------------------------------------
  //  Returns true if any element in the argument array
  //  is the same as an element in this array
  // --------------------------------------------------------
  if( !arguments.length ){
    return false;
  }
  var array2 = arguments[0];
 
  var len1 = this.length;
  var len2 = array2.length;
  if( len2 == 0 ){
    return false;
  }
 
  for(var i=0; i<len1; i++){
    for(var j=0; j<len2; j++) {
      if( this[i] === array2[j] ) {
        return true;
      }
    }
  }
  return false;
};
 
function forcePreview() 
{
  if( wgAction != "edit") return;
  if( wgUserGroups === null) {
    wgUserGroups = [];
  }
/*  if( wgUserGroups.intersects(permittedGroups) ) { */
  if( array_intersects.call(wgUserGroups, permittedGroups) ) {
    return;
  }
  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
// ---------------------------------------------

/*  */

(function () { 

    /* fix for toolbar element is sometimes not available in edit mode */

    var addLoadEventRev = function (func) {
        var oldonload = window.onload;
        if (typeof oldonload == 'function') {
            window.onload = function() {
                func();
                oldonload();
            };
        } else {
            window.onload = func;
        }
    };

    var fixToolbar = function () {
        if ((wgAction == 'edit' || wgAction == 'submit') && !document.getElementById('toolbar') && document.getElementById('editform')) {
            var toolbar = document.createElement('div');
            toolbar.id = 'toolbar';
        
            var editform=document.getElementById('editform');
        
            editform.parentNode.insertBefore(toolbar, editform);
        }
    };
    
    // 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

    var licenseBadgeWorkaround = function () {
        var images = document.getElementsByTagName('img');
    
        for (var i = 0; i < images.length; i++) {
            var img = images[i];
            if (img.src == "http://www.cruiserswiki.com/images/f/fe/Creativecommons.png") {
                
                // as per CruisersWiki:Copyrights
                img.src = 'https://licensebuttons.net/l/by-nc-sa/3.0/88x31.png';
                return;
            }
        }
        // not found yet
        if (doneOnloadHook)
            return;
        setTimeout(licenseBadgeWorkaround, 500);
    };
    licenseBadgeWorkaround();
}) ();

// utility functions

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');
}

function loadScript(url, callback) {
    addOnloadHook( function () {
    	var elem = importScriptURI(url);
    	if (callback) {
        	if (elem) {
                elem.onload = callback;
            } else {
                callback();
            }
    	}
    });
}

function loadWikiScript(page, callback) {
    loadScript(wikiScript(page), callback);
}

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);
}

// load jQuery
	
(function () {
    
    // modify addOnloadHook from wikibits.js
    
	var onloadFunctsNew = onloadFuncts; // see wikibits.js
	onloadFuncts = [];
	var doneOnloadHookNew = false;

	var addOnloadHookOld = addOnloadHook;
	addOnloadHook = function (hookFunct) {
	    // 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 = importScriptURI("https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js");
	if (elem) {
    	elem.onload = function() {
	        //console.log('onload jQuery ' + typeof jQuery  + ' ' + typeof $);
	        if (typeof jQuery === 'undefined') {
	            return;
	        }
	        $.ajaxSetup({
	            cache: true
	        });
    		$(document).ready(function(){
    		    console.log('document ready');
    		    if (!doneOnloadHookNew) {
    			doneOnloadHookNew = true;
    			doneOnloadHook = false;
    			onloadFuncts = onloadFunctsNew;
    			onloadFunctsNew = [];
    			runOnloadHook();
    		    }
    		});
        };
	}
})();

// remove broken fckeditor

addOnloadHook(function () { 
        $('script[src*="fckeditor"]').remove();
        $('#fckTools').remove();
});

// rewrite image links' titles

addOnloadHook(function () { 
    $('a.image>img[alt]').each(function(i) {
        var $this = $(this);
        var alt = $this.attr('alt');
        $this.attr('title', alt);
        // console.log(''+i+' '+alt);
    });
});

// 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();
        });
    });
    $('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(/(\?width=.*)$/,'');
        }

        $('#lightbox').show();

        $('#lightbox img')
            .attr('src', src)
            .load(function () {
                $(this).fadeIn('fast');
            });
    });
});

// chartlets

addOnloadHook(function () { 
    if ($('.cw-chartlet, .cw-chartlet-standalone').length > 0) {
        loadWikiScript('MediaWiki:Chartlet.js');
    }
});

// add kml download link

addOnloadHook(function () { 
    if ($('.h-geo').length > 0) {
        loadWikiScript('MediaWiki:GetKml.js');
    }
});

// custom edit toolbar buttons

function addCustomEditButton (imageFile, speedTip, tagOpen, tagClose, sampleText, imageId) {
mwCustomEditButtons[mwEditButtons.length] =
	{"imageId": imageId,
	 "imageFile": imageFile,
	 "speedTip": speedTip,
	 "tagOpen": tagOpen,
	 "tagClose": tagClose,
	 "sampleText": sampleText};
}

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') {
    importScript('User:Vadim/common.js');
}
Personal tools
advertisement
Friends of Cruisers Wiki