User:Zocky/utils.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
///////////
// Notes
//////////

var active_note, active_note_top, active_note_left;
var mouse_x, mouse_y;
var note_top=100;

function new_note(x,y,w,h,t,content)
{
  note_top++;

  var note = el("div",
                "id", "note_" + note_top,
                "class", "toc",
                "style","background:#FFFF88; border:solid black 1px; padding:2px; z-index:" + note_top 
                  + "; position:fixed; display:block; minimum-width:"+w+"px; left:" + x + "px; top:" + y + "px",
                "onMouseDown", "active_note=this;",
                tx('[ '), el("a","href","javascript:close_note('note_"+note_top+"')",tx("×")), tx(' ] '),
                tx('[ '), el("a","href","javascript:toggle_note('note_"+note_top+"')",tx("-")), tx(' ] '),
                el("b",t),
                el("div",
                    "id", "note_" + note_top + "_content",
                    "style", "background:#FFFFCC; minimum-height:"+h+"px; border:solid silver 1px; ",
                    "onMouseDown" , "return 0",
                    content
                ));

  note.addEventListener("mousedown", pick_note, false);
  add_stuff('globalWrapper',note);
  active_note=note;
}
  
function close_note(n)
{
  document.getElementById('globalWrapper').removeChild(document.getElementById(n));
}

function toggle_note(n)
{
  var c=document.getElementById(n+"_content");
  c.style.display = c.style.display=='none' ? 'block' : 'none';
}

function pick_note(e)
{
  if (typeof(active_note)!='object') return;
  active_note.style.zIndex = note_top++;
  mouse_x = e.clientX;	mouse_y = e.clientY;
  
  active_note_top = parseInt(active_note.style.top); active_note_left = parseInt(active_note.style.left);
  document.addEventListener("mousemove", drag_note, false);
  document.addEventListener("mouseup", drop_note, false);
  e.preventDefault();
}

function drag_note(e)
{
  var x = e.clientX;
  var y = e.clientY;
  
  active_note.style.top = (y - mouse_y + active_note_top) + "px"; active_note.style.left = (x - mouse_x + active_note_left) + "px";
}

function drop_note(e)
{
  document.removeEventListener("mousemove", drag_note, false);
  document.removeEventListener("mouseup", drop_note, false);
  
  active_note=false;
}









///Get user name

function get_user_name()
{
  return document.getElementById("pt-userpage").firstChild.innerHTML;
}

///Make a new option
function new_option(n,v)
{
 if (window[n]== undefined) { window[n] = v }
}


//XML searcher by ID
function findDescendantById(node, id)
{
  if (node.id == id)
  {
    return node;
  }

  var i, c;
  for (i = node.firstChild; i != null; i=i.nextSibling) {
    c = findDescendantById(i,id);

    if (c != null)
      return c;
  }
  return null;
}

//XML searcher by class
function findDescendantByClass(node, cl)
{
  if (node.nodeType==1 && node.getAttribute('class') == cl)
  {
    return node;
  }

  var i, c;
  for (i = node.firstChild; i != null; i=i.nextSibling) {
    c = findDescendantByClass(i,cl);

    if (c != null)
      return c;
  }
  return null;
}


///////////////
//Easy XML insertion
////////////////

//// el (tagname, arg1,val1,arg2,val2,...,child1,child2...)

  function el ()
  {
    var res;
    var i;

    if (el.arguments.length>0)
    {
      res = document.createElement(el.arguments[0]);
      i=1;
      while (i < el.arguments.length)
      {
        if ( typeof(el.arguments[i]) == "string" )
        {
          i++;
          if ( typeof(el.arguments[i])== "string" || typeof(el.arguments[i])=="number")
          {
            res.setAttribute(el.arguments[i-1],el.arguments[i]);
            i++;
          }
          else
          {
            alert ("el: Argument "+ el.arguments[i-1] +" specified, but no value provided.")
            return undef;
          }
        }
        else break;
      }
      
      while (i < el.arguments.length)
      {
        if (typeof(el.arguments[i])=='object')
        {
          res.appendChild(el.arguments[i]);
          i++
        }
        else
        {
          alert ("el: Useless argument "+ el.arguments[i-1] +" provided.")
          return undef;
        }
      }
    }
    else
    {
      alert ("el: Missing element name.")
      return undef;
    }
    return res;
  }

  function tx(s)
  {
    return document.createTextNode(s);
  }

  function add_stuff(p,e)
  {
    document.getElementById(p).appendChild(e);
  }


/////////////////
// DOWNLOADING //
/////////////////

//////////////
//
// downloader
//
//

function downloader(url) {
  // Source: http://jibbering.com/2002/4/httprequest.html
  this.http = false;

  /*@cc_on @*/
  /*@if (@_jscript_version >= 5)
  // JScript gives us Conditional compilation,
  // we can cope with old IE versions.
  // and security blocked creation of the objects.
  try {
  this.http = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
  try {
  this.http = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (E) {
  // this.http = false;
  }
  }
  @end @*/

  if (! this.http && typeof XMLHttpRequest!='undefined') this.http = new XMLHttpRequest();

  this.url = url; this.id=null;
  this.lastModified = null;
  this.callbackFunction = null;
};

new downloader();

downloader.prototype.send = function (x) {if (!this.http) return null; return this.http.send(x);};
downloader.prototype.abort = function () {if (!this.http) return null; return this.http.abort();};
downloader.prototype.runCallback = function () {this.callbackFunction(this);};
downloader.prototype.getData = function () {if(!this.http) return null; return this.http.responseText;};
downloader.prototype.setTarget = function () {if(!this.http) return null; this.http.open("GET", this.url, true);this.setRequestHeader('Accept','text/html');};
downloader.prototype.start=function () {if(!this.http) return null; return this.http.send(null);};
downloader.prototype.getReadyState=function () {if(!this.http) return null; return this.http.readyState;};
downloader.prototype.setRequestHeader=function (a,b) {if(!this.http) return null; return };


downloader.prototype.getLastModifiedDate=function () {
  if(!this.http) return null;
  var lastmod=null;
  try {
    lastmod=this.http.getResponseHeader('Last-Modified');
  } catch (err) {}
  if (lastmod) return new Date(lastmod);
  return null;
}

downloader.prototype.setCallback = function (f) {
  if(!this.http) return;
  this.http.onreadystatechange = f;
  this.callbackFunction = f;
};


function newDownload(url, id, callback) {
  var d=new downloader(url);
  if (!d.http) return 'ohdear';
  d.id=id;
  d.setTarget();
  var f = function () {
    var stctl=1;
    if (stctl && d.getReadyState() == 4) {
      stctl=0;
      d.data=d.getData();
      d.lastModified=d.getLastModifiedDate();
      callback(d);
    }
  };
  d.setCallback(f);
  return d;//d.start();
};

function fakeDownload(url, id, callback, data, lastModified) {
  var d=newDownload(url,callback);
  d.id=id; d.data=data;
  d.lastModified=lastModified;
  return callback(d);
};

function startDownload(url, id, callback) {
  var d=newDownload(url, id, callback);
  if (typeof d == typeof '' ) return d;
  return d.start();
};

//
//
// downloader
//
//////////////

//Download a part of a page by ID or class (what) into an element by ID (where)

function downloadChunkById(url, where, what)
{
  var callback=function(d)
  {
    var ch;
    var dldoc = document.createElement("div");
    var dlwhere= document.getElementById(where);

    dldoc.innerHTML=d.data;

    try
    {  
      var dlwhat=findDescendantById(dldoc, what);
      while (ch=dlwhere.firstChild) {dlwhere.removeChild(ch);}
      dlwhere.appendChild(dlwhat);
    } catch(e){};
  };
  return startDownload(url, where, callback);
  delete dldoc;
};

function downloadChunkByClass(url, where, what)
{
  var callback=function(d)
  {
    var ch;
    var dldoc = document.createElement("div");
    var dlwhere= document.getElementById(where);

    dldoc.innerHTML=d.data;

    while (ch=dlwhere.firstChild) {dlwhere.removeChild(ch);}
    document.getElementById(where).appendChild(findDescendantByClass(dldoc, what))
  };
  return startDownload(url, where, callback);
};