var ajax_debug_mode = false;
var ajax_request_type = 'GET';
var ajax_frm = null;
var ajax_uri = '';
var ajax_target_id = '';
var ajax_xsl = {};
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.6.0',
		'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_load_xsl(dir, xsl){
	if(ajax_xsl[xsl]){
		return(ajax_xsl[xsl]);
	}else{
		var x = ajax_init_object();
		if(x != null){
			x.open('GET', '/webservice/' + (dir ? dir + '/' : '') + xsl + '_xsl.php', false);
			x.onreadystatechange = function(){
				if(x.readyState != 4)
					return;
				ajax_xsl[xsl] = x.responseText;
			}
			x.send(null);
			delete(x);
		}
	}
}
function ajax_xslt(xmlText, xmlPath, xmlStyle){
	ajax_debug('ajax_load_xslt() called..');
	var doc = null, xml = null;
	ajax_load_xsl(xmlPath, xmlStyle);
	var msxmldocument = new Array(
		'Msxml2.DOMDocument.6.0',
		'Msxml2.DOMDocument.5.0',
		'Msxml2.DOMDocument.4.0',
		'Msxml2.DOMDocument.3.0',
		'Msxml2.DOMDocument',
		'Microsoft.XmlDom'
	);
	for(var i = 0; i < msxmldocument.length; i++){
		try{
			doc = new ActiveXObject(msxmldocument[i]);
			xml = new ActiveXObject(msxmldocument[i]);
		}catch(e){}
	}
	if(!ajax_xsl[xmlStyle]){
		alert('Erro ao carregar: ' + xmlStyle);
	return '';
	}

	ajax_debug('XML:\n' + xmlText);
	ajax_debug('XSL:\n' + ajax_xsl[xmlStyle]);

	if(doc){
		doc.async = false;
		doc.loadXML(xmlText);
		xml.async = false;
		xml.loadXML(ajax_xsl[xmlStyle]);
	return(doc.transformNode(xml));
	}else if(typeof XSLTProcessor != 'undefined'){
		doc = new XSLTProcessor();
		xml = new DOMParser();
		doc.importStylesheet(xml.parseFromString(ajax_xsl[xmlStyle], 'text/xml'));
		var htm = new XMLSerializer();
	return(htm.serializeToString(doc.transformToFragment(xml.parseFromString(xmlText, 'text/xml'), document)));
	}
	ajax_debug('Could not create xslt object.');
return(xslt);
}
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, xsl){
	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);
		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);
			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{
				var data, text;
				if(status == '<'){
					data = ajax_xslt(x.responseText, xsl, func_name);
				}else{
					eval('data = ' + x.responseText.substring(2) + ';');
					text = x.responseText.replace(/^\s*|\s*$/g, '');
				}
				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];
						callback(data, 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);
	}
}
function ajax_config(frm, uri){ if(frm) ajax_frm = frm; if(uri) ajax_uri = uri; }
function ajax_attach_widget(hook, id){ if(hook.length > 0 && id.length > 0) eval(hook + ' = document.getElementById("' + id + '");'); }