/* java<script>document */

function ge(id){
	return document.getElementById(id);
}
function show(id){
	ge(id).style.display='block';
}
function hide(id){
	ge(id).style.display='none';
}
function getObjPos(obj){
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
		return {x:curleft,y:curtop};
	}else{
		return false;	
	}
}
function array_key_exists(key,arr){
	var keyexists=false;
	for( var skey in arr ){
		if( skey==key ){
			keyexists=true;
		};
	};
	return keyexists;
}


function Ajax(doneHandler,failHandler){
	newAjax=this;
	this.onDone=doneHandler;
	this.onFail=failHandler;
	this.transport=this.getTransport();
	this.transport.onreadystatechange = ajaxReadyState(this);
}
Ajax.prototype.getTransport = function(){
	var ajax=null;
	try{ ajax=new XMLHttpRequest(); }
	catch (e){
		var activeXObjs=['Msxml2.XMLHTTP','Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0','Microsoft.XMLHTTP'];
		for( i=0; i<activeXObjs.length; i++ ){
			try{ return new ActiveXObject(activeXObjs[i]); }
			catch(err){}
		}
	};
	return ajax;
}
Ajax.prototype.stateHandler = function (){
	try{
		if( this.transport.readyState == 4 ){
			if( this.transport.status >= 200 && this.transport.status < 300 && this.transport.responseText.length > 0 ){
				try{ if(this.onDone) this.onDone(this, this.transport.responseText); }
				catch(te){ console ? console.error(te) : false; }
			}else{
				try{ if(this.onFail) this.onFail(this); }
				catch(te){ console ? console.error(te) : false; }
			}
		}
	}catch(e){
		if( this.onFail ) this.onFail(this);
	}
}
Ajax.prototype.get = function (uri, query, force_sync)
{
	// Firefox doesn't call onDone and onFail handlers if you force_sync
	force_sync = force_sync || false;
	if( typeof query != 'string' )
		query = ajaxArrayToQueryString(query);
	fullURI = uri+(query ? ('?'+query) : '');
	this.transport.open('GET', fullURI, !force_sync );
	this.transport.send('');
}

Ajax.prototype.post = function (uri, data, force_sync)
{
	force_sync = force_sync || false;
	if( typeof data != 'string' ) {
		data = ajaxArrayToQueryString(data);
	}
	this.transport.open('POST', uri, !force_sync);
	this.transport.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	this.transport.send(data);
}

function ajaxReadyState(ajaxObj){
	return function(){ ajaxObj.stateHandler(); };	
}

function ajaxArrayToQueryString(query) {
	var params = [];
	for (var key in query) {
		if (typeof query[key] == 'object') {
			for (var i=0; i<query[key].length; i++) {
				params.push(encodeURIComponent(key)+'[]='+encodeURIComponent(query[key][i]));
			}
		} else {
			params.push(encodeURIComponent(key)+'='+encodeURIComponent(query[key]));
		}
	}
	return params.join('&');
}