MediaWiki:Common.js

From Discovery Wiki
Revision as of 00:53, 17 March 2017 by Alex (talk | contribs) (fix JS - addOnloadHook is no longer defined, probably since we upgraded to MW 1.27 and $wgIncludeLegacyJavaScript got changed to default to false)
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Note: After saving, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
/* Any JavaScript here will be loaded for all users on every page load. */

/* Event attach functions. */
function DW_eventAttach (obj, event, handler) {
	if (obj.addEventListener) {
		obj.addEventListener(event, handler, false);
	} else if (obj.attachEvent) {
		var r = obj.attachEvent('on' + event, handler);
	} else {
		obj['on' + event] = handler;
	}
}

/* Functions for Template:SpoilerWindow */
function DW_createSpoilerLink () {
	var el_list = document.getElementsByTagName('div');
	var el_cur;
	for (var i = 0, l = el_list.length; i < l; i++){ 
		el_cur = el_list[i];
		
		if ((el_cur.className && el_cur.className == 'dwspoiler')) {
			var container = el_cur.getElementsByTagName('div');
			if (!container.item(1).style.display || container.item(1).style.display == 'block') {
				var text = document.createTextNode('Hide');
			} else {
				var text = document.createTextNode('Show');
			}
			
			var link = document.createElement('a');
			link.appendChild(text);
			link.setAttribute('href', 'javascript:void(0);');
			DW_eventAttach(link, 'click', function () { DW_toggleVisibility(this); });
			
			var toggle_element = el_cur.getElementsByTagName('span');
			toggle_element.item(0).appendChild(document.createTextNode('['));
			toggle_element.item(0).appendChild(link);
			toggle_element.item(0).appendChild(document.createTextNode(']'));
			
		}
	}
}
$(DW_createSpoilerLink);

function DW_toggleVisibility (obj) {
	var container = obj.parentNode.parentNode.parentNode.getElementsByTagName('div').item(1);
	if (!container.style.display || container.style.display == 'block') {
		container.style.display = 'none';
		obj.innerHTML = 'Show';
	} else {
		container.style.display = 'block';
		obj.innerHTML = 'Hide';
	}
}

/** Collapsible tables *********************************************************
 *
 *  Description: Allows tables to be collapsed, showing only the header. See
 *               [[**DOCUMENTATION LINK**]].
 *  Maintainers: [[**MAINTAINERS**]]
 */
 
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.className = "collapseButton";  //Styles are declared in Common.css
 
            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 );
        } 
    }
}
 
$( createCollapseButtons );
 
/** 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);
	};
})();

/* Overwrite mediawiki's default sort function for tables, fixing how numbers are sorted in table cells if they have a unit attached at the end */
function padnum(str, len) {
	if (len + 1 >= str.length && str.match(/^\d/)) {
		str = Array(len + 1 - str.length).join('0') + str;
	}
	return str;
}

function ts_sort_numeric(a,b) {
	var aa = padnum(ts_parseFloat(a[1]),50);
	var bb = padnum(ts_parseFloat(b[1]),50);
	return (aa != bb ? aa - bb : a[2] - b[2]);
}

// -------------------------------------------------------------------------------
//  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 = [ "trusted", "sysop", "bureaucrat" ];
 
Array.prototype.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 ( mw.config.get( 'wgNamespaceNumber' ) == 10 || mw.config.get( 'wgNamespaceNumber' ) == 8 ) return; // No point forcing preview in the Template or MediaWiki namespaces
	if ( mw.config.get( "wgAction" ) != "edit" ) return;
	if ( mw.config.get( "wgUserGroups" ).intersects( 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";
}

jQuery(document).ready( forcePreview );
// -----------------------------------------------------
//  Force Preview  JavaScript code - End
// -----------------------------------------------------

/* Scroll Gallery JS start */
jQuery( document ).ready(function() {
  if (document.URL.match(/printable/g)) return;
 
  function toggleImageFunction(group,  remindex, shwindex) {
    return function() {
      document.getElementById("ImageGroupsGr" + group + "Im" + remindex).style["display"] = "none";
      document.getElementById("ImageGroupsGr" + group + "Im" + shwindex).style["display"] = "block";
      return false;
    };
  }
 
  var divs = document.getElementsByTagName("div");
  var i = 0, j = 0;
  var units, search;
  var currentimage;
  var UnitNode;
  for (i = 0; i < divs.length; i++) {
    if (divs[i].className !== "ImageGroup") { continue; }
    UnitNode = undefined;
    search = divs[i].getElementsByTagName("div");
    for (j = 0; j < search.length; j++) {
      if (search[j].className !== "ImageGroupUnits") { continue; }
      UnitNode=search[j];
      break;
    }
    if (UnitNode === undefined) { continue; }
    units = [];
    for (j = 0 ; j < UnitNode.childNodes.length ; j++ ) {
      var temp = UnitNode.childNodes[j];
      if (temp.className === "center") { units.push(temp); }
    }
    var rightlink = undefined;
    var commentText = undefined;
    for (j = 0; j < units.length; j++) {
      currentimage = units[j];
      currentimage.id = "ImageGroupsGr" + i + "Im" + j;
      var leftlink = document.createElement("a");
      if (commentText !== undefined) {
        leftlink.setAttribute("title", commentText);
      }
      var comment;
      if (typeof(currentimage.getAttribute("title")) !== "string") {
        commentText = (j+1) + "/" + units.length;
        comment = document.createElement("tt").appendChild(document.createTextNode("("+ commentText + ")"));
      } else {
        commentText = currentimage.getAttribute("title");
        comment = document.createElement("span").appendChild(document.createTextNode(commentText));
        currentimage.removeAttribute("title");
      }
      if(rightlink !== undefined) {
        rightlink.setAttribute("title", commentText);
      }
      var imghead = document.createElement("div");
      rightlink = document.createElement("a");
      if (j !== 0) {
        leftlink.href = "#";
        leftlink.onclick = toggleImageFunction(i, j, j-1);
        leftlink.appendChild(document.createTextNode("◀"));
      }
      if (j !== units.length - 1) {
        rightlink.href = "#";
        rightlink.onclick = toggleImageFunction(i, j, j+1);
        rightlink.appendChild(document.createTextNode("▶"));
      }
      imghead.style["fontSize"] = "110%";
      imghead.style["fontweight"] = "bold";
      imghead.appendChild(leftlink);
      imghead.appendChild(document.createTextNode("\xA0"));
      imghead.appendChild(comment);
      imghead.appendChild(document.createTextNode("\xA0"));
      imghead.appendChild(rightlink);
      if (units.length > 1) {
        currentimage.insertBefore(imghead,currentimage.childNodes[0]);
      }
      if (j !== 0) {
        currentimage.style["display"] = "none";
      }
    }
  }
});
/* Scroll Gallery JS end */

/* ActiveUsers embed plugin start */
function sortList(ul){
    var new_ul = ul.cloneNode(false);

    // Add all li objects to an array
    var lis = [];
    for(var i = ul.childNodes.length; i--;){
        if(ul.childNodes[i].nodeName === 'LI')
            lis.push(ul.childNodes[i]);
    }

    // Sort li objects by user edit count
    lis.sort(function(b, a) {
             a = a.innerHTML;
             b = b.innerHTML;
             editCount = /(\d+)(?= edits in the last 30 days| edit in the last 30 days)/g;
             var compA = parseInt(String(a).match(editCount));
             var compB = parseInt(String(b).match(editCount));
             return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
        });

    var userCount = parseInt(document.getElementById("activeUsersEmbed").getAttribute("data-usercount"));
    if (userCount>0) {
        lis = lis.slice(0,userCount);
    }

    // Add li objects to ul in order
    for(var i = 0; i < lis.length; i++)
        new_ul.appendChild(lis[i]);
    ul.parentNode.replaceChild(new_ul, ul);
}

function getActiveUsers() {
    if(!!document.getElementById("activeUsersEmbed")) {
        // Alright, some container somewhere wants to contain a list of active users. Cool.
        jQuery("#activeUsersEmbed").load("http://discoverygc.com/wiki/index.php?title=Special:ActiveUsers .mw-activeusers-intro~ul", function() {
            sortList(document.querySelector('#activeUsersEmbed ul'));
        });
    }
}

jQuery( document ).ready(function() {
    getActiveUsers();
});
/* ActiveUsers embed plugin end */

/* disableEditing plugin start */
/* Call the disableEditing function with an appropriate reason at page load to remove the editing form. */
/* Will allow users in editPermitted to edit as usual, and will obviously do nothing if JavaScript is   */
/* disabled, but that's not really an issue. */

var editPermitted = [ "sysop", "bureaucrat" ];

function disableEditing(reason) {
    if ( mw.config.get( "wgUserGroups" ).intersects( editPermitted ) ) return;
    jQuery("#editform").html(reason);
}

// jQuery( document ).ready(function() {
//     disableEditing("Editing has been temporarily disabled.");
// });
/* disableEditing plugin end */

/* code generator plugin start      */
jQuery.expr[':'].textEquals = function(el, i, m) {
    var searchText = m[3];
    var match = jQuery(el).text().trim().match("^" + searchText + "$")
    return match && match.length > 0;
}

function showBaseDiff(internalNickname) {
    jQuery.ajax({
        data: { basenick: internalNickname, disptype: "wiki", submit: "Get+Base+Info"},
        type: "POST",
        url: "http://discoverygc.com/wikigen/basegen.php?itemtype=bases",
        success: function(response) {
            var wCode = jQuery(response).filter("#content").text().trim();
            var imageStr = jQuery("textarea#wpTextbox1").text().match(/(\| *(image|Image|IMAGE) *=.*\.\w*)/g);
            if (imageStr !== null) {
                wCode = wCode.replace(/(\| *(image|Image|IMAGE) *= *.*)/g, imageStr);
            }
            jQuery("input#wpSummary").val("Default message: Importing autogenerated base page from code generator.");
            jQuery("textarea#wpTextbox1").val(wCode);
            jQuery("input#wpDiff").click();
           }
    });
}

function showPlanetDiff(internalNickname) {
    jQuery.ajax({
        data: { planetnick: internalNickname, disptype: "wiki", submit: "Get+Base+Info"},
        type: "POST",
        url: "http://discoverygc.com/wikigen/basegen.php?itemtype=planets",
        success: function(response) {
            var wCode = jQuery(response).filter("#content").text().trim();
            var imageStr = jQuery("textarea#wpTextbox1").text().match(/(\| *(image|Image|IMAGE) *=.*\.\w*)/g);
            if (imageStr !== null) {
                wCode = wCode.replace(/(\| *(image|Image|IMAGE) *= *.*)/g, imageStr);
            }
            jQuery("input#wpSummary").val("Default message: Importing autogenerated planet page from code generator.");
            jQuery("textarea#wpTextbox1").val(wCode);
            jQuery("input#wpDiff").click();
           }
    });
}

function showShieldDiff(internalNickname) {
    jQuery.ajax({
        data: { shieldselect: internalNickname, disptype: "wiki", submit: "Shield+Info"},
        type: "POST",
        url: "http://discoverygc.com/wikigen/sell_loc.php?itemtype=shield",
        success: function(response) {
            var wCode = jQuery(response).filter("#content").text().trim();
            var imageStr = jQuery("textarea#wpTextbox1").text().match(/(\| *(image|Image|IMAGE) *=.*\.\w*)/g);
            if (imageStr !== null) {
                wCode = wCode.replace(/(\| *(image|Image|IMAGE) *= *.*)/g, imageStr);
            }
            jQuery("input#wpSummary").val("Default message: Importing autogenerated shield page from code generator.");
            jQuery("textarea#wpTextbox1").val(wCode);
            jQuery("input#wpDiff").click();
           }
    });
}

function showShipDiff(internalNickname) {
    jQuery.ajax({
        data: { shipselect: internalNickname, disptype: "wiki", submit: "Get+Ship+Info"},
        type: "POST",
        url: "http://discoverygc.com/wikigen/sell_loc.php?itemtype=ship",
        success: function(response) {
            var wCode = jQuery(response).filter("#content").text().trim();
            var imageStr = jQuery("textarea#wpTextbox1").text().match(/(\| *(image|Image|IMAGE) *=.*\.\w*)/g);
            if (imageStr !== null) {
                wCode = wCode.replace(/(\| *(image|Image|IMAGE) *= *.*)/g, imageStr);
            }
            var reviewStr = jQuery("textarea#wpTextbox1").text().match(/({{[R|r](eview|EVIEW)([\s\S]*?)}})/gm);
            if (reviewStr !== null) {
                reviewStr = reviewStr.join("\n") + "\n==Hardpoints=="
                wCode = wCode.replace(/==Hardpoints==/g, reviewStr);
            }
            jQuery("input#wpSummary").val("Default message: Importing autogenerated ship page from code generator.");
            jQuery("textarea#wpTextbox1").val(wCode);
            jQuery("input#wpDiff").click();
           }
    });
}

function showWeapDiff(internalNickname) {
    jQuery.ajax({
        data: { weapselect: internalNickname, disptype: "wiki", submit: "Weapon+Detail+Info"},
        type: "POST",
        url: "http://discoverygc.com/wikigen/sell_loc.php?itemtype=weapon",
        success: function(response) {
            var wCode = jQuery(response).filter("#content").text().trim();
            jQuery("input#wpSummary").val("Default message: Importing autogenerated weapon page from code generator.");
            jQuery("textarea#wpTextbox1").val(wCode);
            jQuery("input#wpDiff").click();
           }
    });
}

function showIDDiff(internalNickname) {
    jQuery.ajax({
        data: { idselect: internalNickname, disptype: "wiki", submit: "ID+Sell+Locations"},
        type: "POST",
        url: "http://discoverygc.com/wikigen/sell_loc.php?itemtype=ID",
        success: function(response) {
            var wCode = jQuery(response).filter("#content").text().trim();
            wCode = wCode.replace(/(\*\ \-\ )/g, "*"); // Remove double "bullet points"
            wCode = wCode.replace(/(\*\s*\n)/g, ""); // Remove blank list items
            jQuery("input#wpSummary").val("Default message: Importing autogenerated ID page from code generator.");
            jQuery("textarea#wpTextbox1").val(wCode);
            jQuery("input#wpDiff").click();
           }
    });
}


function generateGeneratorQuery(pageName) {
// is the page a ship? if so, generate a button
    jQuery.ajax({
        data: { shipselect: "", disptype: "wiki", submit: "Get+Ship+Info"},
        type: "POST",
        url: "http://discoverygc.com/wikigen/sell_loc.php?itemtype=ship",
        success: function(response) {
            var internalNickname = jQuery(response).find("option:contains('"+pageName+"')").attr("value");
            if (!internalNickname == 0 && jQuery("textarea#wpTextbox1").text().match(/({{[S|s]hip|HIP)/g) !== null) {
                jQuery("<form style=\"display: inline;\"><input onclick=\"showShipDiff('"+internalNickname+"')\" type=\"button\" value=\"Generate code (ship)\"></form><span> Remember to add reviews, links and images when using the <a href=\"http://discoverygc.com/wiki/Code_generator_guide\">code generator</a>. |</span>").insertAfter("#wpDiff");
                return;
            }
        }
    });

// is the page a base? if so, generate a button
    jQuery.ajax({
        data: { basenick: "", disptype: "wiki", submit: "Get+Base+Info"},
        type: "POST",
        url: "http://discoverygc.com/wikigen/basegen.php?itemtype=bases",
        success: function(response) {
            var internalNickname = jQuery(response).find("option:textEquals('"+pageName+"')").attr("value");
            if (!internalNickname == 0) {
                jQuery("<form style=\"display: inline;\"><input onclick=\"showBaseDiff('"+internalNickname+"')\" type=\"button\" value=\"Generate code (base)\"></form><span> Remember to add links and images when using the <a href=\"http://discoverygc.com/wiki/Code_generator_guide\">code generator</a>. |</span>").insertAfter("#wpDiff");
                return;
            }
        }
    });

// is the page a planet? if so, generate a button
    jQuery.ajax({
        data: { planetnick: "", disptype: "wiki", submit: "Get+Base+Info"},
        type: "POST",
        url: "http://discoverygc.com/wikigen/basegen.php?itemtype=planets",
        success: function(response) {
            var internalNickname = jQuery(response).find("option:textEquals('"+pageName+"')").attr("value");
            if (!internalNickname == 0) {
                jQuery("<form style=\"display: inline;\"><input onclick=\"showPlanetDiff('"+internalNickname+"')\" type=\"button\" value=\"Generate code (planet)\"></form><span> Remember to add links and images when using the <a href=\"http://discoverygc.com/wiki/Code_generator_guide\">code generator</a>. |</span>").insertAfter("#wpDiff");
                return;
            }
        }
    });

// is the page a gun? if so, generate a button
    jQuery.ajax({
        data: { weapselect: "", disptype: "wiki", submit: "Weapon+Detail+Info"},
        type: "POST",
        url: "http://discoverygc.com/wikigen/sell_loc.php?itemtype=weapon",
        success: function(response) {
            var internalNickname = jQuery(response).find("option:textEquals('"+pageName+"')").attr("value");
            if (!internalNickname == 0) {
                jQuery("<form style=\"display: inline;\"><input onclick=\"showWeapDiff('"+internalNickname+"')\" type=\"button\" value=\"Generate code (gun)\"></form><span> Remember to add links and images when using the <a href=\"http://discoverygc.com/wiki/Code_generator_guide\">code generator</a>. |</span>").insertAfter("#wpDiff");
                return;
            }
        }
    });

// is the page a shield? if so, generate a button
    jQuery.ajax({
        data: { shieldselect: "", disptype: "wiki", submit: "Shield+Info"},
        type: "POST",
        url: "http://discoverygc.com/wikigen/sell_loc.php?itemtype=shield",
        success: function(response) {
            var internalNickname = jQuery(response).find("option:textEquals('"+pageName+"')").attr("value");
            if (!internalNickname == 0) {
                jQuery("<form style=\"display: inline;\"><input onclick=\"showShieldDiff('"+internalNickname+"')\" type=\"button\" value=\"Generate code (gun)\"></form><span> Remember to add links and images when using the <a href=\"http://discoverygc.com/wiki/Code_generator_guide\">code generator</a>. |</span>").insertAfter("#wpDiff");
                return;
            }
        }
    });

// is the page an ID? if so, generate a button
  if (wgTitle.indexOf("ID") != -1) {
    jQuery.ajax({
        data: { idselect: "", disptype: "wiki", submit: "ID+Sell+Locations"},
        type: "POST",
        url: "http://discoverygc.com/wikigen/sell_loc.php?itemtype=ID",
        success: function(response) {
            var internalNickname = jQuery(response).find("option:textEquals('"+pageName+"')").attr("value");
            if (!internalNickname == 0) {
                jQuery("<form style=\"display: inline;\"><input onclick=\"showIDDiff('"+internalNickname+"')\" type=\"button\" value=\"Generate code (ID)\"></form><span> Remember to add links when using the <a href=\"http://discoverygc.com/wiki/Code_generator_guide\">code generator</a>. |</span>").insertAfter("#wpDiff");
                return;
            }
        }
    });
  }
}

jQuery( document ).ready(function() {
    if(!!document.getElementById("editform") && !!!wgCanonicalNamespace) {
        generateGeneratorQuery(wgTitle);
    }
});
/* code generator plugin end */