var ajax_debug_mode = false;
var ajax_request_type = 'GET';
var ajax_frm = null;
var ajax_uri = '';
var ajax_target_id = '';
var ajax_requests = new Array();
function urlencode(str){ return(escape(str).replace(/\+/g,'%2B').replace(/\//g,'%2F').replace(/\?/g,'%3F').replace(/=/g,'%3D').replace(/&/g,'%26').replace(/@/g,'%40')); }
function urldecode(str){ return(unescape(str).replace(/%2B/g,'+').replace(/%2F/g,'/').replace(/%3F/g,'?').replace(/%3D/g,'=').replace(/%26/g,'&').replace(/%40/g,'@')); }
function ajax_debug(text){ if(ajax_debug_mode) alert('RSD: ' + text); }
function ajax_init_object(){
	ajax_debug('ajax_init_object() called..');
	var ajax = null;
	var msxmlhttp = new Array(
		'Msxml2.XMLHTTP.5.0',
		'Msxml2.XMLHTTP.4.0',
		'Msxml2.XMLHTTP.3.0',
		'Msxml2.XMLHTTP',
		'Microsoft.XMLHTTP'
	);
	for(var i = 0; i < msxmlhttp.length; i++){
		try{ ajax = new ActiveXObject(msxmlhttp[i]); }catch(e){ ajax = null; }
	}
	if(!ajax && typeof XMLHttpRequest != 'undefined') ajax = new XMLHttpRequest();
	if(!ajax) ajax_debug('Could not create connection object.');
return(ajax);
}
function ajax_cancel(){ for(var i = 0; i < ajax_requests.length; i++) ajax_requests[i].abort(); }
function ajax_do_call(func_name, args){ ajax_do_call_uri(func_name, ajax_uri, args); }
function ajax_do_call_uri(func_name, uri, args){
	var i, x, post_data;
	ajax_debug('in ajax_do_call()..' + ajax_request_type + '/' + ajax_target_id);
	if(ajax_request_type == 'GET'){
		post_data = null;
		uri += ((uri.indexOf('?') == -1) ? '?' : '&') + 'rs=' + urlencode(func_name);
		for(i = 0; i < args.length - 1; i++)
			uri += '&rsargs[]=' + urlencode(args[i]);
		uri += '&rst=' + urlencode(ajax_target_id) + '&rsrnd=' + new Date().getTime();
	}else{
		post_data = 'rs=' + urlencode(func_name) + '&rst=' + urlencode(ajax_target_id) + '&rsrnd=' + new Date().getTime();
		for(i = 0; i < args.length - 1; i++)
			post_data += '&rsargs[]=' + urlencode(args[i]);
	}
	x = ajax_init_object();
	if(x == null){
		if(ajax_failure_redirect != ''){
			location.href = ajax_failure_redirect;
		return(false);
		}else{
			ajax_debug('NULL sajax object for user agent:\n' + navigator.userAgent);
		return(false);
		}
	}else{
		x.open(ajax_request_type, uri, true);
		//window.open(uri);
		ajax_requests[ajax_requests.length] = x;
		if(ajax_request_type == 'POST'){
			x.setRequestHeader('Method', 'POST ' + uri + ' HTTP/1.1');
			x.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		}
		x.onreadystatechange = function(){
			if(x.readyState != 4)
				return;
			try{ ajax_debug('received ' + x.responseText); }catch(e){}
			var status = x.responseText.charAt(0);
			var text = x.responseText.replace(/^\s*|\s*$/g, '');
			var data = x.responseText.substring(2);
			if(status == ''){
				// let's just assume this is a pre-response bailout and let it slide for now
			}else if(status == '-'){
				ajax_debug('Error: ' + data);
			}else{
				if(ajax_target_id && ajax_target_id != '')
					document.getElementById(ajax_target_id).innerHTML = eval(data);
				else{
					try{
						var callback = null, extra_data = false;
						if(typeof(args[args.length - 1]) == 'object'){
							callback = args[args.length - 1].callback;
							extra_data = args[args.length - 1].extra_data;
						}else
							callback = args[args.length - 1];
						eval('var code = ' + data.replace(/.+\{/, '{') + ';');
						callback(code, extra_data);
					}catch(exception){ ajax_debug('Caught error ' + exception + ': Could not eval ' + data); }
				}
			}
		}
		x.send(post_data);
		ajax_debug(func_name + ' uri = ' + uri + '/post = ' + post_data);
		ajax_debug(func_name + ' waiting...');
		delete(x);
	return(true);
	}
}