// Basic functions. These are required backbone!
function get_id(i){return(typeof(i)=="string")?document.getElementById(i):i}
function css_get(i,c){return eval("get_id('"+i+"').style."+c)}
function css_get_int(i,c){return parseInt(css_get(i,c))};
function css_set(i,c,v){eval("get_id('"+i+"').style."+c+"='"+v+"'")}
function enable_id(i){get_id(i).disabled=false}
function disable_id(i){get_id(i).disabled=true}
function html(i,h){get_id(i).innerHTML=h}
function get_html(i){return get_id(i).innerHTML}

// Visibility functions. Show or Hide elements!
function hide_id(i){get_id(i).style.display='none'}
function show_id(i,t){if(!t)t='block';get_id(i).style.display=t}
function toggle_display(i,t){(css_get(i,'display')=="none")?show_id(i,t):hide_id(i)}
function visible_on(i){css_set(i,'visibility','visible')}
function visible_off(i){css_set(i,'visibility','hidden')}
function is_displayed(i){return css_get(i,"display")=="none"}

// Position get/set!
function get_pos(i){var o=get_id(i),ret={left:0,top:0};while(o.offsetParent){ret.left+=o.offsetLeft;ret.top+=o.offsetTop;o=o.offsetParent;}ret.left+=o.offsetLeft;ret.top+=o.offsetTop;return ret}
function get_dim(i){var o=get_id(i);return{width:parseInt(o.offsetWidth),height:parseInt(o.offsetHeight )}}
function set_pos(i,l,t,u){if(!u)u="px";if(l)css_set(i,'left',l+u);if(t)css_set(i,'top',t+u)}
function set_dim(i,w,h,u){if(!u)u="px";if(w)css_set(i,'width',w+u);if(h)css_set(i,'height',h+u)}

// Main Window functions!
function get_wnd_dim(){return {width:document.body.clientWidth,height:document.body.clientHeight}}
function get_viewport_dim(){var e = window,a='inner';if(!('innerWidth'in window)){a='client';e=document.documentElement||document.body;}return{width:e[a+'Width'],height:e[a+'Height']}}

// Cookie management!
function set_cookie(n,v,ed,em,ey ){var s= n+"="+escape(v);if ( ey ){var x=new Date(ey,em,ed);s+="; expires="+x.toGMTString();}document.cookie=s}
function get_cookie(n){var r = document.cookie.match('(^|;) ?'+n+'=([^;]*)(;|$)');return (r)?(unescape(r[2])):null}
function delete_cookie(n){var d=new Date();  d.setTime(d.getTime()-1);document.cookie=n+="=; expires="+d.toGMTString()}

// Input management!
function get_mouse(e){e=get_event(e);return (e.pageX||e.pageY)?{left:e.pageX,top:e.pageY}:({ left:e.clientX+document.body.scrollLeft-document.body.clientLeft,top:e.clientY+document.body.scrollTop-document.body.clientTop})}

// Event management
function get_event(e){return e||window.event;}//IE compat
function addEvent(i,t,f){var o=(i=="document")?document:get_id(i);return(o.addEventListener)?o.addEventListener(t,f,false):o.attachEvent('on'+t,f)}
function get_caller(e){if (!e)e=event;return e.target?e.target:e.srcElement?e.srcElement:null}

// Selection helpers!
function sel_all(i,a,n){var c=get_id(a).checked;for(var j=0;j<n;j++)get_id(i+j).checked=c}

// Select control functions...
function select_clear(s){var o=get_id(s);if(!o||(o.length<1))return null;var z=o.options[0];while (o.options.length>0)o.options[0]=null;return z}
function select_add(s,v,t){var o=v;if(t){o=document.createElement("OPTION");o.text=t;o.value=v}get_id(s).options.add(o);}
function select_get(s,v){var s=get_id(s);var o=s.options;var i=s.selectedIndex;if(v){for(var x=0;x < o.length;x++)if(o[x].value==v)return o[x];return null}else return i>-1?o[i]:null}
function select_get_v(s){return(x=select_get(s))?x.value:null}
function select_get_t(s,v){return(x=select_get(s,v))?x.text:null}
function select_len(s){return get_id(s).options.length}
function select_select(s,v){var o=get_id(s).options;for(var i=0;i<o.length;i++)if(o[i].value==v)return o[i].selected=true;get_id(s).selectedIndex=-1}
function select_set(s,v,t){var o=get_id(s).options;for(var i=0;i<o.length;i++)if(o[i].value==v)return o[i].text=t;return null}
function select_del(s,v){var o=get_id(s).options;for(var i=0;i<o.length;i++)if(o[i].value==v) get_id(s).remove(i)}
function select_edit(s,v,t){var o=get_id(s).options;for(var i=0;i<o.length;i++)if(o[i].value==v) o[i].text = t}
function select_populate(s,a,d){select_clear(s);for(var i in a)select_add(s,i,a[i]);select_select(s,d)}
function select_index(s,i){var o=get_id(s);if(i)o.selectedIndex=i;else;return o.selectedIndex}
function select_splice(s,p,c){var o=get_id(s).options;var t=o.length;for(var x=p;x<(t-c);x++)o[x]=o[x+c];while(c>0){get_id(s).remove(o.length-1);c--}}
function select_swap(s,a,b){var o=get_id(s).options,av=o[a].value,at=o[a].text;o[a].value=o[b].value;o[a].text=o[b].text;o[b].value=av;o[b].text=at}

// nodes and attributes!
function new_text(x){return document.createTextNode(x)}
function new_elem(x){return document.createElement(x)}
function set_attr(o,a,v){o.setAttribute(a,v)}
function create_elem(e,a){var r=new_elem(e);for(var i in a)set_attr(r,i,a[i]);return r}
function clearNodes(a){var d=get_id(a);while(d.childNodes[0])d.removeChild(d.childNodes[0])}

// other stuff..
function serialize( x )
{
	var t=typeof x,v;
	switch(t){
	case "undefined":
		v="N";
		break;
	case "boolean":
		v="b:"+(x?"1":"0");
		break;
	case "number":
		v=(Math.round(x)==x?"i":"d")+":"+x;
		break;
	case "string":
		v="s:"+x.length+':"'+x+'"';
/*		alert(x)
		alert(v)*/
		break;
	case "array":
	case "object":
		var c=0,vs="",ok;
		for(k in x){
			ok=(k.match(/^[0-9]+$/)?parseInt(k):k);
			vs+=serialize(ok)+serialize(x[k]);
			c++
		}
		v="a:"+c+":{"+vs+"}";
		break
	}
	if(t!="object"&&t!="array")
		v+=";";return v
}
Array.prototype.in_array=function(p){for(var i=0,l=this.length;i<l;i++)if(this[i]==p)return true;return false;}
Array.prototype.swap=function(a,b){var tmp=this[a];this[a]=this[b];this[b]=tmp;}
function Array2Object(a){var r={};for(var i in a)if(typeof(a[i])!="function")r[i]=a[i];return r}
function Object2Array(o){var r=[];for(var i in o)r.push(o[i]);return r}
function count(a){var t=0;for (var x in a)t++;return t}
function splice(a,p,c){var t=count(a);for(var x=p;x<(t-c);x++)a[x]=a[x+c];while(c>0){delete a[count(a)-1];c--}return a}
function iterateObject(o,f){for(var i in o)f(o[i])}
