var __ic = {} ;
function Elem(id) { if(typeof id == 'object') return id; else return document.getElementById(id); } // no cache
function $(id) { if(typeof id == 'object') return id; else return __ic[id]?__ic[id]:__ic[id]=document.getElementById(id); } //inspired by prototype.js
function $I(id,value) { if(value!=null) $(id).innerHTML = value ; return $(id).innerHTML; }
function $V(id,value) { if(value!=null) $(id).value = value ; return $(id).value; }
function $S(id) { return $(id).style; }
function Style(id) { return document.getElementById(id).style; }
function SetInner(id,msg) { document.getElementById(id).innerHTML = msg ; }
function AddInner(id,msg) { document.getElementById(id).innerHTML += msg ; }

function MouseRel(ev) {
	if(window.event){ x = event.offsetX ; y = event.offsetY ; b = event.button}
	else {x = ev.layerX; y = ev.layerY ; b = ev.which}
	if(isNaN(x)) x = 0 ;
	if(isNaN(y)) y = 0 ;
	return {'x':x,'y':y, 'b':b}
}
function MouseAbs(ev) {
	if(window.event)  {x = event.clientX+document.documentElement.scrollLeft ; y = event.clientY+document.documentElement.scrollTop ; b = event.button}
	else {x = ev.pageX; y = ev.pageY ; b = ev.which}
	return {'x':x,'y':y,'b':b}
}
function windowHeight() {
	if(window.innerHeight) {  //ff
		return window.innerHeight ;
	} else { //ie
		return document.documentElement.clientHeight ;
	}
}

function dumpJSON(dat) {
	var str="" ;
	function _d(d,pf) {
		var i;
		if(typeof d == "object") {
			if(d.constructor == Array ) {   //array
				for(i = 0;i < d.length; i++ ) {
					if(str!="") str+="\n" ;
					str += pf+"["+i+"]";
					_d(d[i],pf+"-") ;
				}
			} else {//obj
				for(i in d) {
					if(str!="") str+="\n" ;
					str += pf+"{"+i+"}";
					_d(d[i],pf+"-") ;
				}
			}
		} else {
			str += "="+d ;
		}
	}
	_d(dat,"") ;
	return str ;
}

function mkTag(tag,params) {
	var t = [] ;
	for(p in params) {
		if(params[p]!="") t.push( p+'="'+params[p]+'"' ) ;
		else t.push( p ) ;
	}
	return "<"+tag+" "+t.join(" ")+" >" ;
}

//nl to <br>
String.prototype.nl2br = function () {
	return this.replace(/\n|\r/g,"<br>\n");
}
function nl2br(s) {
	return s.replace(/\n|\r/g,"<br>\n");
}
//htmlspecialchars
String.prototype.htmlspecialchars=function (){
	var s ;
	s = this.replace(/&/g,"&amp;" ) ;
	s = s.replace(/</g,"&lt;" ) ;
	s = s.replace(/>/g,"&gt;" ) ;
	return s ;
}

//addslash
function addslashes(s) {
	s = s.replace(/\\/g,"\\\\" ) ;
	s = s.replace(/\"/g,'\\\"' ) ;
	s = s.replace(/\'/g,"\\\'" ) ;
	return s ;
}
String.prototype.addslashes = function() {
	return addslashes(this) ;
}
//strip slash
function stripslashes(s) {
	return s.replace(/\\/g,"" ) ;
}
String.prototype.stripslashes = function() {
	return this.replace(/\\/g,"" ) ;
}
