Difference between revisions of "MediaWiki:Common.js"

From EntropiaPlanets Wiki - Entropia Universe Guides Wiki Info
(Created page with '→‎Any JavaScript here will be loaded for all users on every page load.: /** Collapsible tables ********************************************************* * * Description: A…')
 
m
 
(13 intermediate revisions by 2 users not shown)
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
/* Any JavaScript here will be loaded for all users on every page load. */


/** Collapsible tables *********************************************************
 
/* Analytics */
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-63377680-1', 'auto');
ga('send', 'pageview');
 
 
/** ImageMapEdit *********************************************************
* http://meta.wikimedia.org/wiki/User_talk:Dapete/ImageMapEdit
  *
  *
  * Description: Allows tables to be collapsed, showing only the header. See
  * Currently disabled, toolserver seems to have issues, for re-enabling uncomment the importScriptURI line. -Tass
  *               http://www.mediawiki.org/wiki/Manual:Collapsible_tables.
*
  * Maintainers: [[**MAINTAINERS**]]
  * importScriptURI('http://toolserver.org/~dapete/ime/ime.js');
  */
 
/**
* Tab/Panel right slide
* @author mwjames
  */
  */
var autoCollapse = 2;
 
var collapseCaption = 'hide';
$("#panel-tab").click( function (event) {
var expandCaption = 'show';
event.stopPropagation();
showIfNotVisible( "#panel-content" );
} );
 
function showIfNotVisible( element ) {
var width = $( '#panel' ).find( 'table').width() + 8;
if ( $(element).css( "width" ) == width + 'px' )
$(element).animate( { width: 4 }, 500);
else
$(element).animate( { width: width }, 500);
};
 
$(function(){
var element = $("#panel-content");
var width = element.find( 'table').width() + 8;
 
element
.width( width )
.animate( { width: 4 }, 1200);
});
 
 
 
 
/** Popup links
* Use <span class="pops">[http://www.entropiaplanets.com EntropiaPlanets]</span>
* or <span class="pops">[[EntropiaPlanets Wiki|Home]]</span>
**/
 
addOnloadHook( function() {
    var pops = function( elems ) {
        for (var i=0; i<elems.length; i++) {
            if ( !(' '+elems[i].className+' ').match( / pops / ) ) continue;
            var anchs = elems[i].getElementsByTagName('a');
            for (var j=0; j<anchs.length; j++) anchs[j].target = '_blank';
        }
    };
    var bc = document.getElementById('bodyContent');
    var tags = ['span', 'div', 'table', 'td', 'th'];
    for (var i=0; i<tags.length; i++) pops( bc.getElementsByTagName( tags[i] ) );
} );
 
 
 
/** dragable stuff**/
   
   
function collapseTable( tableIndex ) {
function Position(x, y)
var Button = document.getElementById( 'collapseButton' + tableIndex );
{
var Table = document.getElementById( 'collapsibleTable' + tableIndex );
  this.X = x;
   
  this.Y = y;
if ( !Table || !Button ) {
 
return false;
  this.Add = function(val)
}
  {
    var newPos = new Position(this.X, this.Y);
var Rows = Table.rows;
    if(val != null)
    {
if ( Button.firstChild.data == collapseCaption ) {
      if(!isNaN(val.X))
for ( var i = 1; i < Rows.length; i++ ) {
        newPos.X += val.X;
Rows[i].style.display = 'none';
      if(!isNaN(val.Y))
}
        newPos.Y += val.Y
Button.firstChild.data = expandCaption;
    }
} else {
    return newPos;
for ( var i = 1; i < Rows.length; i++ ) {
  }
Rows[i].style.display = Rows[0].style.display;
 
}
  this.Subtract = function(val)
Button.firstChild.data = collapseCaption;
  {
}
    var newPos = new Position(this.X, this.Y);
    if(val != null)
    {
      if(!isNaN(val.X))
        newPos.X -= val.X;
      if(!isNaN(val.Y))
        newPos.Y -= val.Y
    }
    return newPos;
  }
 
  this.Min = function(val)
  {
    var newPos = new Position(this.X, this.Y)
    if(val == null)
      return newPos;
   
    if(!isNaN(val.X) && this.X > val.X)
      newPos.X = val.X;
    if(!isNaN(val.Y) && this.Y > val.Y)
      newPos.Y = val.Y;
   
    return newPos;  
  }
 
  this.Max = function(val)
  {
    var newPos = new Position(this.X, this.Y)
    if(val == null)
      return newPos;
   
    if(!isNaN(val.X) && this.X < val.X)
      newPos.X = val.X;
    if(!isNaN(val.Y) && this.Y < val.Y)
      newPos.Y = val.Y;
   
    return newPos; 
  } 
 
  this.Bound = function(lower, upper)
  {
    var newPos = this.Max(lower);
    return newPos.Min(upper);
  }
 
  this.Check = function()
  {
    var newPos = new Position(this.X, this.Y);
    if(isNaN(newPos.X))
      newPos.X = 0;
    if(isNaN(newPos.Y))
      newPos.Y = 0;
    return newPos;
  }
 
  this.Apply = function(element)
  {
    if(typeof(element) == "string")
      element = document.getElementById(element);
    if(element == null)
      return;
    if(!isNaN(this.X))
      element.style.left = this.X + 'px';
    if(!isNaN(this.Y))
      element.style.top = this.Y + 'px';
  }
}
 
function hookEvent(element, eventName, callback)
{
  if(typeof(element) == "string")
    element = document.getElementById(element);
  if(element == null)
    return;
  if(element.addEventListener)
  {
    element.addEventListener(eventName, callback, false);
  }
  else if(element.attachEvent)
    element.attachEvent("on" + eventName, callback);
}
 
function unhookEvent(element, eventName, callback)
{
  if(typeof(element) == "string")
    element = document.getElementById(element);
  if(element == null)
    return;
  if(element.removeEventListener)
    element.removeEventListener(eventName, callback, false);
  else if(element.detachEvent)
    element.detachEvent("on" + eventName, callback);
}
 
function cancelEvent(e)
{
  e = e ? e : window.event;
  if(e.stopPropagation)
    e.stopPropagation();
  if(e.preventDefault)
    e.preventDefault();
  e.cancelBubble = true;
  e.cancel = true;
  e.returnValue = false;
  return false;
}
 
function getMousePos(eventObj)
{
  eventObj = eventObj ? eventObj : window.event;
  var pos;
  if(isNaN(eventObj.layerX))
    pos = new Position(eventObj.offsetX, eventObj.offsetY);
  else
    pos = new Position(eventObj.layerX, eventObj.layerY);
  return correctOffset(pos, pointerOffset, true);
}
 
function getEventTarget(e)
{
  e = e ? e : window.event;
  return e.target ? e.target : e.srcElement;
}
 
function absoluteCursorPostion(eventObj)
{
  eventObj = eventObj ? eventObj : window.event;
 
  if(isNaN(window.scrollX))
    return new Position(eventObj.clientX + document.documentElement.scrollLeft + document.body.scrollLeft,
      eventObj.clientY + document.documentElement.scrollTop + document.body.scrollTop);
  else
    return new Position(eventObj.clientX + window.scrollX, eventObj.clientY + window.scrollY);
}
}
 
function createCollapseButtons() {
function dragObject(element, attachElement, lowerBound, upperBound, startCallback, moveCallback, endCallback, attachLater)
var tableIndex = 0;
{
var NavigationBoxes = new Object();
  if(typeof(element) == "string")
var Tables = document.getElementsByTagName( 'table' );
    element = document.getElementById(element);
  if(element == null)
for ( var i = 0; i < Tables.length; i++ ) {
      return;
if ( hasClass( Tables[i], 'collapsible' ) ) {
 
/* only add button and increment count if there is a header row to work with */
  var cursorStartPos = null;
var HeaderRow = Tables[i].getElementsByTagName( 'tr' )[0];
  var elementStartPos = null;
if( !HeaderRow ) continue;
  var dragging = false;
var Header = HeaderRow.getElementsByTagName( 'th' )[0];
  var listening = false;
if( !Header ) continue;
  var disposed = false;
 
NavigationBoxes[tableIndex] = Tables[i];
  function dragStart(eventObj)
Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex );
  {
    if(dragging || !listening || disposed) return;
var Button     = document.createElement( 'span' );
    dragging = true;
var ButtonLink = document.createElement( 'a' );
 
var ButtonText = document.createTextNode( collapseCaption );
    if(startCallback != null)
      startCallback(eventObj, element);
Button.className = 'collapseButton'; // Styles are declared in MediaWiki:Common.css
 
    cursorStartPos = absoluteCursorPostion(eventObj);
ButtonLink.style.color = Header.style.color;
 
ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );
    elementStartPos = new Position(parseInt(element.style.left), parseInt(element.style.top));
ButtonLink.setAttribute( 'href', "javascript:collapseTable(" + tableIndex + ");" );
 
ButtonLink.appendChild( ButtonText );
    elementStartPos = elementStartPos.Check();
 
Button.appendChild( document.createTextNode( '[' ) );
    hookEvent(document, "mousemove", dragGo);
Button.appendChild( ButtonLink );
    hookEvent(document, "mouseup", dragStopHook);
Button.appendChild( document.createTextNode( ']' ) );
 
    return cancelEvent(eventObj);
Header.insertBefore( Button, Header.childNodes[0] );
  }
tableIndex++;
 
}
  function dragGo(eventObj)
}
  {
    if(!dragging || disposed) return;
for ( var i = 0;  i < tableIndex; i++ ) {
 
if ( hasClass( NavigationBoxes[i], 'collapsed' ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], 'autocollapse' ) ) ) {
    var newPos = absoluteCursorPostion(eventObj);
collapseTable( i );
    newPos = newPos.Add(elementStartPos).Subtract(cursorStartPos);
}
     newPos = newPos.Bound(lowerBound, upperBound)
}
    newPos.Apply(element);
    if(moveCallback != null)
      moveCallback(newPos, element);
 
    return cancelEvent(eventObj);
  }
 
  function dragStopHook(eventObj)
  {
    dragStop();
    return cancelEvent(eventObj);
  }
 
  function dragStop()
  {
    if(!dragging || disposed) return;
    unhookEvent(document, "mousemove", dragGo);
    unhookEvent(document, "mouseup", dragStopHook);
    cursorStartPos = null;
    elementStartPos = null;
    if(endCallback != null)
      endCallback(element);
    dragging = false;
  }
 
  this.Dispose = function()
  {
    if(disposed) return;
    this.StopListening(true);
    element = null;
    attachElement = null
    lowerBound = null;
    upperBound = null;
    startCallback = null;
    moveCallback = null
    endCallback = null;
    disposed = true;
  }
 
  this.GetLowerBound = function()
  { return lowerBound; }
 
  this.GetUpperBound = function()
  { return upperBound; }
 
  this.StartListening = function()
  {
    if(listening || disposed) return;
    listening = true;
    hookEvent(attachElement, "mousedown", dragStart);
  }
 
  this.StopListening = function(stopCurrentDragging)
  {
    if(!listening || disposed) return;
    unhookEvent(attachElement, "mousedown", dragStart);
    listening = false;
 
    if(stopCurrentDragging && dragging)
      dragStop();
  }
 
  this.IsDragging = function(){ return dragging; }
  this.IsListening = function() { return listening; }
  this.IsDisposed = function() { return disposed; }
 
  if(typeof(attachElement) == "string")
    attachElement = document.getElementById(attachElement);
  if(attachElement == null)
    attachElement = element;
 
  if(!attachLater)
    this.StartListening();
}
}
  var el = document.getElementById('draggableElement');
addOnloadHook( createCollapseButtons );
  var leftEdge = el.parentNode.clientWidth - el.clientWidth;
  var topEdge = el.parentNode.clientHeight - el.clientHeight;
/** Test if an element has a certain class **************************************
  var dragObj = new dragObject(el, null, new Position(leftEdge, topEdge), new Position(0, 0));
*
 
* Description: Uses regular expressions and caching for better performance.
/** end of dragable stuff**/
* 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);
};
})();

Latest revision as of 03:42, 26 November 2021

/* Any JavaScript here will be loaded for all users on every page load. */


/* Analytics */
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-63377680-1', 'auto');
ga('send', 'pageview');


/** ImageMapEdit *********************************************************
 * http://meta.wikimedia.org/wiki/User_talk:Dapete/ImageMapEdit
 *
 * Currently disabled, toolserver seems to have issues, for re-enabling uncomment the importScriptURI line. -Tass
 *
 * importScriptURI('http://toolserver.org/~dapete/ime/ime.js');
 */

/**
 * Tab/Panel right slide
 * @author mwjames
 */

$("#panel-tab").click( function (event) {
	event.stopPropagation();
	showIfNotVisible( "#panel-content" );
} );

function showIfNotVisible( element ) {
	var width = $( '#panel' ).find( 'table').width() + 8; 
	if ( $(element).css( "width" ) == width + 'px' )
		$(element).animate( { width: 4 }, 500);
	else
		$(element).animate( { width: width }, 500);
};

$(function(){
	var element = $("#panel-content");
	var width = element.find( 'table').width() + 8;

	element
	.width( width )
	.animate( { width: 4 }, 1200);
});




/** Popup links
* Use <span class="pops">[http://www.entropiaplanets.com EntropiaPlanets]</span>
* or <span class="pops">[[EntropiaPlanets Wiki|Home]]</span>
**/ 

addOnloadHook( function() {
     var pops = function( elems ) {
         for (var i=0; i<elems.length; i++) {
             if ( !(' '+elems[i].className+' ').match( / pops / ) ) continue;
             var anchs = elems[i].getElementsByTagName('a');
             for (var j=0; j<anchs.length; j++) anchs[j].target = '_blank';
         }
     };
     var bc = document.getElementById('bodyContent');
     var tags = ['span', 'div', 'table', 'td', 'th'];
     for (var i=0; i<tags.length; i++) pops( bc.getElementsByTagName( tags[i] ) );
 } );



/** dragable stuff**/
 
function Position(x, y)
{
  this.X = x;
  this.Y = y;
  
  this.Add = function(val)
  {
    var newPos = new Position(this.X, this.Y);
    if(val != null)
    {
      if(!isNaN(val.X))
        newPos.X += val.X;
      if(!isNaN(val.Y))
        newPos.Y += val.Y
    }
    return newPos;
  }
  
  this.Subtract = function(val)
  {
    var newPos = new Position(this.X, this.Y);
    if(val != null)
    {
      if(!isNaN(val.X))
        newPos.X -= val.X;
      if(!isNaN(val.Y))
        newPos.Y -= val.Y
    }
    return newPos;
  }
  
  this.Min = function(val)
  {
    var newPos = new Position(this.X, this.Y)
    if(val == null)
      return newPos;
    
    if(!isNaN(val.X) && this.X > val.X)
      newPos.X = val.X;
    if(!isNaN(val.Y) && this.Y > val.Y)
      newPos.Y = val.Y;
    
    return newPos;  
  }
  
  this.Max = function(val)
  {
    var newPos = new Position(this.X, this.Y)
    if(val == null)
      return newPos;
    
    if(!isNaN(val.X) && this.X < val.X)
      newPos.X = val.X;
    if(!isNaN(val.Y) && this.Y < val.Y)
      newPos.Y = val.Y;
    
    return newPos;  
  }  
  
  this.Bound = function(lower, upper)
  {
    var newPos = this.Max(lower);
    return newPos.Min(upper);
  }
  
  this.Check = function()
  {
    var newPos = new Position(this.X, this.Y);
    if(isNaN(newPos.X))
      newPos.X = 0;
    if(isNaN(newPos.Y))
      newPos.Y = 0;
    return newPos;
  }
  
  this.Apply = function(element)
  {
    if(typeof(element) == "string")
      element = document.getElementById(element);
    if(element == null)
      return;
    if(!isNaN(this.X))
      element.style.left = this.X + 'px';
    if(!isNaN(this.Y))
      element.style.top = this.Y + 'px';  
  }
}

function hookEvent(element, eventName, callback)
{
  if(typeof(element) == "string")
    element = document.getElementById(element);
  if(element == null)
    return;
  if(element.addEventListener)
  {
    element.addEventListener(eventName, callback, false);
  }
  else if(element.attachEvent)
    element.attachEvent("on" + eventName, callback);
}

function unhookEvent(element, eventName, callback)
{
  if(typeof(element) == "string")
    element = document.getElementById(element);
  if(element == null)
    return;
  if(element.removeEventListener)
    element.removeEventListener(eventName, callback, false);
  else if(element.detachEvent)
    element.detachEvent("on" + eventName, callback);
}

function cancelEvent(e)
{
  e = e ? e : window.event;
  if(e.stopPropagation)
    e.stopPropagation();
  if(e.preventDefault)
    e.preventDefault();
  e.cancelBubble = true;
  e.cancel = true;
  e.returnValue = false;
  return false;
}

function getMousePos(eventObj)
{
  eventObj = eventObj ? eventObj : window.event;
  var pos;
  if(isNaN(eventObj.layerX))
    pos = new Position(eventObj.offsetX, eventObj.offsetY);
  else
    pos = new Position(eventObj.layerX, eventObj.layerY);
  return correctOffset(pos, pointerOffset, true);
}

function getEventTarget(e)
{
  e = e ? e : window.event;
  return e.target ? e.target : e.srcElement;
}

function absoluteCursorPostion(eventObj)
{
  eventObj = eventObj ? eventObj : window.event;
  
  if(isNaN(window.scrollX))
    return new Position(eventObj.clientX + document.documentElement.scrollLeft + document.body.scrollLeft, 
      eventObj.clientY + document.documentElement.scrollTop + document.body.scrollTop);
  else
    return new Position(eventObj.clientX + window.scrollX, eventObj.clientY + window.scrollY);
}

function dragObject(element, attachElement, lowerBound, upperBound, startCallback, moveCallback, endCallback, attachLater)
{
  if(typeof(element) == "string")
    element = document.getElementById(element);
  if(element == null)
      return;

  var cursorStartPos = null;
  var elementStartPos = null;
  var dragging = false;
  var listening = false;
  var disposed = false;

  function dragStart(eventObj)
  {
    if(dragging || !listening || disposed) return;
    dragging = true;

    if(startCallback != null)
      startCallback(eventObj, element);

    cursorStartPos = absoluteCursorPostion(eventObj);

    elementStartPos = new Position(parseInt(element.style.left), parseInt(element.style.top));

    elementStartPos = elementStartPos.Check();

    hookEvent(document, "mousemove", dragGo);
    hookEvent(document, "mouseup", dragStopHook);

    return cancelEvent(eventObj);
  }

  function dragGo(eventObj)
  {
    if(!dragging || disposed) return;

    var newPos = absoluteCursorPostion(eventObj);
    newPos = newPos.Add(elementStartPos).Subtract(cursorStartPos);
    newPos = newPos.Bound(lowerBound, upperBound)
    newPos.Apply(element);
    if(moveCallback != null)
      moveCallback(newPos, element);

    return cancelEvent(eventObj);
  }

  function dragStopHook(eventObj)
  {
    dragStop();
    return cancelEvent(eventObj);
  }

  function dragStop()
  {
    if(!dragging || disposed) return;
    unhookEvent(document, "mousemove", dragGo);
    unhookEvent(document, "mouseup", dragStopHook);
    cursorStartPos = null;
    elementStartPos = null;
    if(endCallback != null)
      endCallback(element);
    dragging = false;
  }

  this.Dispose = function()
  {
    if(disposed) return;
    this.StopListening(true);
    element = null;
    attachElement = null
    lowerBound = null;
    upperBound = null;
    startCallback = null;
    moveCallback = null
    endCallback = null;
    disposed = true;
  }
  
  this.GetLowerBound = function()
  { return lowerBound; }
  
  this.GetUpperBound = function()
  { return upperBound; }

  this.StartListening = function()
  {
    if(listening || disposed) return;
    listening = true;
    hookEvent(attachElement, "mousedown", dragStart);
  }

  this.StopListening = function(stopCurrentDragging)
  {
    if(!listening || disposed) return;
    unhookEvent(attachElement, "mousedown", dragStart);
    listening = false;

    if(stopCurrentDragging && dragging)
      dragStop();
  }

  this.IsDragging = function(){ return dragging; }
  this.IsListening = function() { return listening; }
  this.IsDisposed = function() { return disposed; }

  if(typeof(attachElement) == "string")
    attachElement = document.getElementById(attachElement);
  if(attachElement == null)
    attachElement = element;

  if(!attachLater)
    this.StartListening();
}
   var el = document.getElementById('draggableElement');
   var leftEdge = el.parentNode.clientWidth - el.clientWidth;
   var topEdge = el.parentNode.clientHeight - el.clientHeight;
   var dragObj = new dragObject(el, null, new Position(leftEdge, topEdge), new Position(0, 0));

/** end of dragable stuff**/