Difference between revisions of "MediaWiki:Common.js"

From Discovery Wiki
Jump to: navigation, search
(hasClass seems broken, modern browsers provide Element#classList anyway - https://developer.mozilla.org/en/docs/Web/API/Element/classList)
(hasClass seems broken, modern browsers provide Element#classList anyway - https://developer.mozilla.org/en/docs/Web/API/Element/classList)
 
(No difference)

Latest revision as of 00:58, 17 March 2017

/* 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 ( Tables[i].classList.contains( "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 ( NavigationBoxes[i].classList.contains( "collapsed" ) || ( tableIndex >= autoCollapse && NavigationBoxes[i].classList.contains( "autocollapse" ) ) ) {
            collapseTable( i );
        } 
    }
}
 
$( createCollapseButtons );

/* 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 */