ajaxob = function(){
	return (window.XMLHttpRequest) ?
	new XMLHttpRequest() :
	new ActiveXobject('Microsoft.XMLHTTP'); 
}
/*This function not complete yet .. cmon Lloyd sort it out young man ... */
ajupload = function(i){
	var ifm = document.createElement('iframe');
	with(ifm){
		setAttribute('id','uploadframe');
		setAttribute('src','savedata.php');
	}
}
/* should this be abstracted a bit more using the 'then' prototype? */
callserver = function(url, box, f){
	var f = f || function(x){return x;};
	give(box,'');
	var ob = ajaxob();
	ob.onreadystatechange = function(){
		if(ob.readyState < 4) box.innerHTML = "loading...";
		if(ob.readyState == 4){
			if(ob.status == 200){
				if(box) box.innerHTML = f(ob.responseText);
			} else alert('ajax problem')
		}
	}
	ob.open("GET", url, true);
	ob.send(null) 
}

Function.prototype.then = function(g){ 
	return function(){
		(this)();
		g()
	} 
}	

onebefore = function(n){
	return ((p=n.previousSibling) == null) ? false : (p.nodeType == 1 ? p : onebefore(p))
}	
oneafter = function(n){
	return ((p=n.nextSibling) == null) ? false : (p.nodeType == 1 ? p : oneafter(p))
}	
make = function(type,atts){
	var tmp = document.createElement(type);
	return setAtts(tmp,atts);
}
swap = function(a,b){
	var tmp=a.src;
	a.src=b.src;
	b.src=tmp;
}
setAtts = function(ob, atts){
	for(var x in atts){
		ob.setAttribute(x,atts[x]);
	}
	return ob;
}
createElms = function(pairs){
	for(var x in pairs){
		x = document.creatElement(pairs[x]);
	}
}
getxmouse = function(evt){
	if(!evt) evt = window.event;
	if(evt.pageX) return evt.pageX;
	if(!evt.clientX) return false;
	extra = (document.documentElement.scrollLeft) ?  documentElement.scrollLeft : document.body.scrollLeft
	return extra + evt.clientX
}
getymouse = function(evt){
	if(!evt) evt = window.event;
	if(evt.pageY) return evt.pageY;
	if(!evt.clientY) return false;
	extra = (document.documentElement.scrollTop) ?  documentElement.scrollTop : document.body.scrollTop
	return extra + evt.clientY
}
flatten = function(lst){
	if(!lst.length) return; 
	var h = lst[0];
	var t = lst.slice(1);
	if(typeof(h) != typeof([])) return h;
	else
		return [flatten(h), flatten(t)];
}

trackmouse = function(elm,offx,offy,contents){
	contents = contents || '';
	return function(evt){
		var obj = elm;
		obj.style.visibility = 'visible';
		obj.style.left = (parseInt(getxmouse(evt)) + offx);
		obj.style.top = (parseInt(getymouse(evt)) + offy);
		contents = (contents =='') ? elm.innerHTML : contents;
	}
}
showonly = function(chosen, rest){
	rest.map(function(x){ x.style.display='none'} );
	chosen.style.display='';
}

tooltip = function(id,w,h,content){
	var tipwindow = document.createElement('div');
	tipwindow.setAttribute('id',id);
	tipwindow.style.visibility='hidden';
	tipwindow.style.position = 'absolute';
	tipwindow.style.width = w;
	tipwindow.style.height = h;
	tipwindow.innerHTML = content;
	document.body.appendChild(tipwindow);
	return tipwindow;
}

give = function(ctnr, stf){ ctnr.innerHTML = stf; }

$ = function(x){ return	document.getElementById(x);	}

$A = function(x){
	var ns = []; var i = -1;
	while(++i < x.length) ns.push(x[i]);
	return ns; 
}

$T = function(tag, root){
	var root = $(root) || document;
	var lst = $A(root.getElementsByTagName(tag));
	if (!lst) return;
	return $A(lst);
}


Array.prototype.head = function(){
    return (!this.length) ? false : this[0]; 
}

Array.prototype.tail = function(){
    if (this.length < 1) return;
    return (this.slice(1));
}
Array.prototype.map = function(f){
	var i = -1; var acc = [];
	while(++i < this.length) acc.push(f(this[i]));
	return acc;
}
Array.prototype.shift = function(){
	var i = 0; var l = this.length;
	var b = this[i];
	while(i < l) this[i] = this[++i];
	this.length && this.length--;
	return b;
}
Array.prototype.filter = function(f){
	var i = -1; var acc = [];
	while(++i < this.length) if(f(this[i]))acc.push(this[i]);
	return acc;
}
Array.prototype.reduce = function(f,acc){
	this.map(function(x){acc.push(f(x))});
	return acc;
}
Array.prototype.union = function(lst,cmp){
	var l=lst;
	var f = function(x,y){return x[cmp] == y[cmp]} || false;
	var set = [];
	while(cur = l.shift()){
		this.map(function(x){
			if(f && f(x,cur)) set.push(x);
			else if(x==cur) set.push(x);
		})
	}
	return set;
}
Array.prototype.member = function(x){
	var state=false;
	this.map(function(m){ if(x==m)state |= true;});
	return state;
}
Array.prototype.set = function(){
	var newset=[];
	this.map(function(x){(!newset.member(x)) && newset.push(x)})
	return newset;
}

String.prototype.humanize = function(){
	var cap = this.charAt(0).toUpperCase();
	var rest = this.substring(1).replace(/_/, ' ');
	return cap + rest;
}
basename = function(s){
	if(s == '')return;
	var bits = String.split('\\');
	return bits[bits.length-1];
}
toggle = function(thing){
	if(thing) thing.style.display = (thing.style.display == '') ? 'none' : '';
}
addLoadEvent = function(func){
	var	oldonload =	window.onload;
	window.onload = (typeof window.onload != 'function') ? 
	func : function(){if(oldonload)oldonload(); func();}	
}


