MediaWiki:Common.js: Difference between revisions

From MediaWiki
Jump to navigationJump to search
mNo edit summary
Modernize upload preview to use mw.Api (drops dead MW 1.19 live-preview protocol)
 
(32 intermediate revisions by 4 users not shown)
Line 1: Line 1:
function loadsearchstuff() {
/* Blatantly based on Wookiepedia's ShowEras */
  // If you're reading this, I'm sorry. Messy code lies ahead.
function showTitles(className) {  
    if(typeof(SKIP_ERAS) != 'undefined' && SKIP_ERAS)
          return;
    var titleDiv = document.getElementById(className);
    if(titleDiv == null || titleDiv == undefined)
          return;
    var cloneNode = titleDiv.cloneNode(true);
    var firstHeading = getFirstHeading();
    firstHeading.insertBefore(cloneNode, firstHeading.childNodes[0]);
    cloneNode.style.display = "block";
}// END JavaScript title rewrite
function getFirstHeading(){
    //var a = getElementsByClassName(document.getElementById('content'), 'h1', 'firstHeading');
    var a = document.getElementById('content').getElementsByTagName('h1');
    return a[0];
}
 
/* Code for hiding segments */
function hide_block(id) {
    document.getElementById(id).style.display = "inline";
    document.getElementById(id + "-link").style.display = "none";
}
 
function replace_hides() {
    //var hide_blocks = getElementsByClassName(document, "div", "hide");
    var hide_blocks = document.getElementsByClassName('hide');
    for (var i=0;i<hide_blocks.length;i++) {
          var hide_link = document.createElement("div");
          hide_link.innerHTML = "<a href='javascript:hide_block(\"" + hide_blocks[i].getAttribute("id") + "\");' id='" + hide_blocks[i].getAttribute("id") + "-link'><i>Show hidden content.</i></a>";         
          //hide_link.innerHTML = "<a href='javascript:hide_block("" + hide_blocks[i].getAttribute("id") + "");' id='" + hide_blocks[i].getAttribute("id") + "-link'><i>Show hidden content.</i></a>";
          hide_blocks[i].parentNode.insertBefore(hide_link, hide_blocks[i]);
          hide_blocks[i].style.display = "none";
    }
}
 
function tfwiki_hooks() {
    showTitles('title-factionicons');
    replace_hides();
}


  if (document.implementation && document.implementation.createDocument)
$( document ).ready(tfwiki_hooks);
      xmlDoc=document.implementation.createDocument("","",null);
  else
      xmlDoc=new ActiveXObject("Microsoft.XMLDOM");


  xmlDoc.async=false;
/* ========== Upload preview ==========
  xmlDoc.load("/index.php?title=Template:Searchicons&action=raw");
  Trying mw.Api */


  // Establishing the various fragments of the search box.
$( function () {
  var randindex = Math.floor(Math.random()*xmlDoc.getElementsByTagName("item").length);
if ( mw.config.get( 'wgCanonicalSpecialPageName' ) !== 'Upload' ) { return; }
  var searchicon = "<a href='/wiki/" + xmlDoc.getElementsByTagName("name")[randindex].childNodes[0].nodeValue + "'><img src='" + xmlDoc.getElementsByTagName("url")[randindex].childNodes[0].nodeValue + "' style='margin-left: -16px; margin-top:-6px;' /></a>";
  var searchbox = document.getElementById('searchBody');
  var advancedsearchfields = '<div style="width: 80px; text-align: left; font-size: 84%; padding:0; margin:0;"><input type="checkbox" name="all" />All<br /><input type="checkbox" name="categories" />Categories<br /><input type="checkbox" name="templates" />Templates<br /><input type="checkbox" name="talk" />Talk pages</div>';


  // Throwing all the various fragments together.
var $desc = $( '#wpUploadDescription' );
  searchbox.innerHTML = searchicon + '<form id="searchform" name="searchform"><input type="image" src="http://images.wikia.com/transformers/images/e/e3/Go.png" name="go" class="searchButton" id="searchGoButton" value="Go" style="float: right; margin: 0; padding: 0;" onclick="return advancedsearch(false)" /><input id="searchInput" name="search" type="text" title="Search Teletraan I [f]" accesskey="f" value="" style="width: 70%;" /><input type="image" src="http://images.wikia.com/transformers/images/9/95/Search.png" name="fulltext" class="searchButton" id="mw-searchButton" value="Search" style="float: right;" onclick="return advancedsearch(true)" />' + advancedsearchfields + '</form>';
if ( !$desc.length ) { return; }


  // Finally, removing the redundant "search" title at the top.
var $btn = $( '<input>', { type: 'button', value: 'Preview' } );
  searchbox.parentNode.removeChild(searchbox.parentNode.getElementsByTagName("h5")[0]);
var $preview = $( '<div>', { id: 'wikiPreview' } ).hide();
}
$desc.after( $preview ).after( $btn );
 
var api = new mw.Api();
 
$btn.on( 'click', function () {
var dest = $( '#wpDestFile' ).val() || 'Example.png';
$btn.prop( 'disabled', true );
$preview.text( 'Loading…' ).show();


function advancedsearch(fulltext) {
api.post( {
  // This is what drives the advanced search. The URL is rewritten, since the parameters
action: 'parse',
  // do not actually match what the form expects. This should be fixed if there's a better
text: $desc.val(),
  // way of doing it, and there probably is.
title: 'File:' + dest,
contentmodel: 'wikitext',
prop: 'text|categorieshtml',
disablelimitreport: 1,
formatversion: 2
} ).then( function ( data ) {
var html = ( data.parse && data.parse.text ) || '';
var cats = ( data.parse && data.parse.categorieshtml ) || '';
$preview.html( html + cats );
}, function ( code, result ) {
$preview.text( 'Preview failed: ' + code +
( result && result.error ? ' — ' + result.error.info : '' ) );
} ).always( function () {
$btn.prop( 'disabled', false );
} );
} );
} );


  var advancedform = document.realform;
  var searchform = document.searchform;
  advancedform.action = "/wiki/Special:Search";
 
  advancedform.action += "?search=" + searchform.search.value;
 
  if (fulltext)  advancedform.action += "&fulltext=Search";
  else advancedform.action += "&go=Go";


  if (searchform.all.checked || searchform.categories.checked || searchform.templates.checked || searchform.talk.checked) searchform.action += "&searchx=Search";
/* Code for showing/hiding voice actor credits */  
  // This parameter isn't normally passed in the searchbox, but it seems to
  // make the checkboxes retain their values on the advanced search page.


  if (searchform.all.checked)
function showcredits(num) {
    for (var i=0; i<15; i++) advancedform.action += "&ns" + i + "=1";
var spantohide=document.getElementById("ocreditl"+num)
  else { // No need to look at the rest if "all" is checked
spantohide.style.display="none";
    if (searchform.categories.checked) advancedform.action += "&ns14=1";
var spantoshow=document.getElementById("ocredit"+num)
    if (searchform.templates.checked) advancedform.action += "&ns10=1";
spantoshow.style.display="inline";
    if (searchform.talk.checked) advancedform.action += "&ns1=1&ns3=1&ns5=1&ns7=1&ns9=1&ns11=1&ns13=1&ns15=1";
}
  }


  advancedform.submit();
function hidecredits(num) {
var spantohide=document.getElementById("ocreditl"+num);
spantohide.style.display="inline";
var spantoshow=document.getElementById("ocredit"+num);
spantoshow.style.display="none";
}


  return false;
function init_voiceactors(){
var list = document.getElementsByTagName("span");
for (var ii = 0; ii < list.length; ii++) {
if(list[ii].className=="ocreditspan") {
            list[ii].innerHTML="<span id=\"ocreditl"+ii+"\"><a href=\"#\" onclick=\"showcredits("+ii+"); return false;\">more&raquo;</a></span><span id=\"ocredit"+ii+"\" style=\"display: none\">"+list[ii].innerHTML+" <a href=\"#\" onclick=\"hidecredits("+ii+"); return false;\">&laquo;less</a></span>";
}
}
}
}


addOnloadHook(loadsearchstuff);
$( document ).ready( init_voiceactors);
 
/* End of code for showing/hiding voice actor credits */
/* === TOC collapse/expand animation === */
$( document ).ready( function () {
var $ul = $( '#toc > ul' );
var $checkbox = $( '#toc .toctogglecheckbox' );
if ( !$ul.length || !$checkbox.length ) { return; }
 
if ( $checkbox.prop( 'checked' ) ) { $ul.hide(); }
 
$checkbox.on( 'change', function () {
if ( $checkbox.prop( 'checked' ) ) {
$ul.stop( true, false ).slideUp( 250 );
} else {
$ul.stop( true, false ).slideDown( 250 );
}
} );
} );

Latest revision as of 03:35, 27 May 2026

/* Blatantly based on Wookiepedia's ShowEras */ 
function showTitles(className) { 
     if(typeof(SKIP_ERAS) != 'undefined' && SKIP_ERAS) 
          return; 
 
     var titleDiv = document.getElementById(className); 
 
     if(titleDiv == null || titleDiv == undefined) 
          return; 
 
     var cloneNode = titleDiv.cloneNode(true); 
     var firstHeading = getFirstHeading(); 
     firstHeading.insertBefore(cloneNode, firstHeading.childNodes[0]); 
     cloneNode.style.display = "block"; 
}// END JavaScript title rewrite 
 
function getFirstHeading(){ 
     //var a = getElementsByClassName(document.getElementById('content'), 'h1', 'firstHeading'); 
     var a = document.getElementById('content').getElementsByTagName('h1');
     return a[0]; 
}

/* Code for hiding segments */
function hide_block(id) {
     document.getElementById(id).style.display = "inline";
     document.getElementById(id + "-link").style.display = "none";
}

function replace_hides() {
     //var hide_blocks = getElementsByClassName(document, "div", "hide");
     var hide_blocks = document.getElementsByClassName('hide');
     for (var i=0;i<hide_blocks.length;i++) { 
          var hide_link = document.createElement("div"); 
          hide_link.innerHTML = "<a href='javascript:hide_block(\"" + hide_blocks[i].getAttribute("id") + "\");' id='" + hide_blocks[i].getAttribute("id") + "-link'><i>Show hidden content.</i></a>";          
          //hide_link.innerHTML = "<a href='javascript:hide_block("" + hide_blocks[i].getAttribute("id") + "");' id='" + hide_blocks[i].getAttribute("id") + "-link'><i>Show hidden content.</i></a>"; 
          hide_blocks[i].parentNode.insertBefore(hide_link, hide_blocks[i]);
          hide_blocks[i].style.display = "none";
     }
}

function tfwiki_hooks() {
     showTitles('title-factionicons');
     replace_hides();
}

$( document ).ready(tfwiki_hooks);

/* ========== Upload preview ==========
   Trying mw.Api */

$( function () {
	if ( mw.config.get( 'wgCanonicalSpecialPageName' ) !== 'Upload' ) { return; }

	var $desc = $( '#wpUploadDescription' );
	if ( !$desc.length ) { return; }

	var $btn = $( '<input>', { type: 'button', value: 'Preview' } );
	var $preview = $( '<div>', { id: 'wikiPreview' } ).hide();
	$desc.after( $preview ).after( $btn );

	var api = new mw.Api();

	$btn.on( 'click', function () {
		var dest = $( '#wpDestFile' ).val() || 'Example.png';
		$btn.prop( 'disabled', true );
		$preview.text( 'Loading…' ).show();

		api.post( {
			action: 'parse',
			text: $desc.val(),
			title: 'File:' + dest,
			contentmodel: 'wikitext',
			prop: 'text|categorieshtml',
			disablelimitreport: 1,
			formatversion: 2
		} ).then( function ( data ) {
			var html = ( data.parse && data.parse.text ) || '';
			var cats = ( data.parse && data.parse.categorieshtml ) || '';
			$preview.html( html + cats );
		}, function ( code, result ) {
			$preview.text( 'Preview failed: ' + code +
				( result && result.error ? ' — ' + result.error.info : '' ) );
		} ).always( function () {
			$btn.prop( 'disabled', false );
		} );
	} );
} );


/* Code for showing/hiding voice actor credits */ 

function showcredits(num) {
	var spantohide=document.getElementById("ocreditl"+num)
	spantohide.style.display="none";
	var spantoshow=document.getElementById("ocredit"+num)
	spantoshow.style.display="inline";
}

function hidecredits(num) {
	var spantohide=document.getElementById("ocreditl"+num);
	spantohide.style.display="inline";
	var spantoshow=document.getElementById("ocredit"+num);
	spantoshow.style.display="none";
}

function init_voiceactors(){
	var list = document.getElementsByTagName("span");
	for (var ii = 0; ii < list.length; ii++) {
		if(list[ii].className=="ocreditspan") {
            list[ii].innerHTML="<span id=\"ocreditl"+ii+"\"><a href=\"#\" onclick=\"showcredits("+ii+"); return false;\">more&raquo;</a></span><span id=\"ocredit"+ii+"\" style=\"display: none\">"+list[ii].innerHTML+" <a href=\"#\" onclick=\"hidecredits("+ii+"); return false;\">&laquo;less</a></span>";
		}
	}
}

$( document ).ready( init_voiceactors);

/* End of code for showing/hiding voice actor credits */
/* === TOC collapse/expand animation === */
$( document ).ready( function () {
	var $ul = $( '#toc > ul' );
	var $checkbox = $( '#toc .toctogglecheckbox' );
	if ( !$ul.length || !$checkbox.length ) { return; }

	if ( $checkbox.prop( 'checked' ) ) { $ul.hide(); }

	$checkbox.on( 'change', function () {
		if ( $checkbox.prop( 'checked' ) ) {
			$ul.stop( true, false ).slideUp( 250 );
		} else {
			$ul.stop( true, false ).slideDown( 250 );
		}
	} );
} );