User:Zocky/utils.js

///////////

// 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);

};