function is_node(o,of_type)
{
	if(typeof(Node)=='undefined')
	{
		Node=null;
	}
	try
	{
		if(!o||!((Node!=undefined&&o instanceof Node)||o.nodeName))
		{
			return false;
		}
	}
	catch(ignored)
	{
		return false;
	}
	if(typeof(of_type)!=="undefined")
	{
		if(!(of_type instanceof Array))
		{
			of_type=[of_type];
		}
		var name;
		try
		{
			name=new String(o.nodeName).toUpperCase();
		}
		catch(ignored)
		{
			return false;
		}
		for(var ii=0;ii<of_type.length;ii++)
		{
			try{if(name==of_type[ii].toUpperCase())
			{
				return true;
			}
			}
			catch(ignored)
			{}
		}
		return false;
	}
	return true;
}
function implodeQuery(obj,name)
{
	name=name||'';
	var r=[];
	if(obj instanceof Array)
	{
		for(var ii=0;ii<obj.length;ii++)
		{
			try
			{
				r.push(implodeQuery(obj[ii],name?name+'['+ii+']':ii));
			}
			catch(ignored)
			{}
		}
	}
	else if(typeof(obj)=='object')
	{
		if(is_node(obj))
		{
			r.push('{node}');
		}
		else
		{
			for(var k in obj)
			{
				try
				{
					r.push(implodeQuery(obj[k],name?name+'['+k+']':k));
				}
				catch(ignored)
				{}
			}
		}
	}
	else if(name&&name.length)
	{
		r.push(encodeURIComponent(name)+'='+encodeURIComponent(obj));
	}
	else
	{
		r.push(encodeURIComponent(obj));
	}
	return r.join('&');
}

function Ajx(doneHandler,failHandler){
	newAjax=this;
	this.onDone=doneHandler;
	this.onFail=failHandler;
	this.transport=this.getTransport();
	this.transport.onreadystatechange=ajaxTrampoline(this);
}
Ajx.prototype.get=function(uri,query,force_sync){
	force_sync=force_sync||false;
	if(query&&(typeof query!='string')){query=implodeQuery(query);}
	fullURI=uri+(query?('?'+query):'');
	this.transport.open('GET',fullURI,!force_sync);
	this.transport.send('');
}
Ajx.prototype.post=function(uri,data,force_sync,no_post_form_id){
	force_sync=force_sync||false;
	no_post_form_id=no_post_form_id||false;
	if(data&&(typeof data!='string')){data=implodeQuery(data);}
	if(data) 
		data+="&fb_sig="+fb_sig+"&fb_sig_api_key="+fb_sig_api_key+"&fb_sig_network="+fb_sig_network+"&fb_sig_user="+fb_sig_user+"&fb_sig_session_key="+fb_sig_session_key+"&fb_sig_time="+fb_sig_time+"&fb_sig_in_canvas="+fb_sig_in_canvas+"&fb_sig_added="+fb_sig_added;
	else
		data = "fb_sig="+fb_sig+"&fb_sig_api_key="+fb_sig_api_key+"&fb_sig_network="+fb_sig_network+"&fb_sig_user="+fb_sig_user+"&fb_sig_session_key="+fb_sig_session_key+"&fb_sig_time="+fb_sig_time+"&fb_sig_in_canvas="+fb_sig_in_canvas+"&fb_sig_added="+fb_sig_added;
	if(!no_post_form_id){
		var post_form_id=document.getElementById('post_form_id');
		if(post_form_id){data+='&post_form_id='+post_form_id.value;}
	}
	this.transport.open('POST',"/mock_ajax_proxy.php?canvasurl_mock="+encodeURIComponent(uri),!force_sync);
	this.transport.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	this.transport.send(data);
}
Ajx.prototype.stateDispatch=function(){
	try{
		if(this.transport.readyState==4){
			if(this.transport.status>=200&&this.transport.status<300&&this.transport.responseText.length>0){
				try{
					fbml_response=new fbjs_fbml_string(this.transport.responseText);
					//if(this.onDone)this.onDone(this,this.transport.responseText);
					if(this.onDone)this.onDone(fbml_response);
					if(this.ondone)this.ondone(fbml_response);
					
				}catch(tempError){
					console?console.error(tempError):false;
				}
			}else{
				try{if(this.onFail)this.onFail(this);
				}catch(tempError){console?console.error(tempError):false;}
			}
		}
	}catch(error){if(this.onFail)this.onFail(this);}
}
Ajx.prototype.getTransport=function(){
	var ajax=null;
	try{
		ajax=new XMLHttpRequest();
	}catch(e){ajax=null;}
	
	try{if(!ajax)ajax=new ActiveXObject("Msxml2.XMLHTTP");}
	catch(e){ajax=null;}
	try{if(!ajax)ajax=new ActiveXObject("Microsoft.XMLHTTP");}
	catch(e){ajax=null;}
	return ajax;
}
function ajaxTrampoline(ajaxObject){return function(){ajaxObject.stateDispatch();};}
