var ajax = {
	'sync' : {
		'get' : function(url, args, resp_filter){
			var req = ajax.misc.get_httpxmlrequest()	
			var x = ajax.misc.escape_args(args)
			if (x){
				url += '?'+x
			}	
			req.open('GET', url, false)
			req.send(null)	
			if ( req.status != "200" ) {
				return null; // todo error handling
			}	
			if (resp_filter !== undefined){
				return resp_filter(req)
			}else{
				return req
			}
		}
		, 'post' : function(url, args, resp_filter){
			var req = ajax.misc.get_httpxmlrequest()	
			var x = ajax.misc.escape_args(args)
			req.open('POST', url, false)
			req.setRequestHeader("Content-type","application/x-www-form-urlencoded")
			req.send(x)	
			if ( req.status != "200" ) {
				return null; // todo error handling
			}	
			if (resp_filter !== undefined){
				return resp_filter(req)
			}else{
				return req
			}
		}
	}
	, 'async' : {
		'get' : {}
		, 'post' : {}
		, 'script' : function (url, args){
			url = new String(url)
			url = url.slice(0, url.indexOf('?'))
			var x = ajax.misc.escape_args(args)
			if (x) {
				url += '?'+x
			}
			var s = document.createElement('script')
			s.src = url
			document.body.appendChild(s)
		}
	}
	, 'misc' : {
		'get_httpxmlrequest' : function(){
			var req = null
			if (window.XMLHttpRequest){
				req = new XMLHttpRequest();
				req.onload = null;
			}else if(window.ActiveXObject){
				req = new ActiveXObject("Microsoft.XMLHTTP");
			} else{
				return null; // todo error handling
			}
			return req			
		}
		, 'escape_args' : function (x){
			var items = Array();
			for (var i in x){
				items.push(escape(i)+'='+escape(x[i]))
			}
			return items.join('&')
		}
	}
	, 'response' : {
		'filter' : {
			'text' : function(x){
				return x.responseText
			}
			, 'eval_text' : function(x){
				return eval('('+x.responseText+')')
			}
		}
	}
}
