try{
	xmlhttp = new XMLHttpRequest();
}catch(ee){
	try{
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	}catch(e){
		try{
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		}catch(E){
			xmlhttp = false;
		}
	}
}
fila=[]
ifila=0
function ajaxHTML(id,url, tipo, parametros, mostra){
	if(mostra)
		document.getElementById(id).innerHTML=mostra;
	fila[fila.length]=[id,url,tipo, parametros]
	if((ifila+1)==fila.length)
		ajaxRun()
}
function ajaxRun(){	
	if(fila[ifila][2] != "POST"){
		fila[ifila][2] = "GET";
		parametros = null;
	}else{
		parametros = fila[ifila][3];
	}
	xmlhttp.open(fila[ifila][2],fila[ifila][1],true);
	if(fila[ifila][2] == "POST"){
		xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    	xmlhttp.setRequestHeader("Content-length", parametros.length);
    	xmlhttp.setRequestHeader("Connection", "close");
	}
	xmlhttp.onreadystatechange= OnReadyStateChange;	
	xmlhttp.send(parametros);	
}
function OnReadyStateChange(){
	if (xmlhttp.readyState==4){
		retorno=unescape(xmlhttp.responseText.replace(/\+/g," "))	
		extraiScript(retorno);
		document.getElementById(fila[ifila][0]).innerHTML=retorno
		ifila++
		if(ifila<fila.length)
			setTimeout("ajaxRun()",20)
	}
}
function extraiScript(texto){
	var ini = 0;
	while (ini!=-1){
		ini = texto.indexOf('<script', ini);
		if (ini >=0){
		ini = texto.indexOf('>', ini) + 1;
		var fim = texto.indexOf('</script>', ini);
		codigo = texto.substring(ini,fim);
		eval(codigo);
		}
	}
}

Function.prototype.bind = function(context){
	var closure = this;
	var tmp_fnc = function(){
		return closure.apply(context, arguments);
	}
	return tmp_fnc;
}
Object.prototype.merge = function(object){
	for(attr in object){
		this[attr] = object[attr];
	}
}
document.navigators = {
	settings: {
		interval: 50,
		helper: true,
		iframe_src: "control.html"
	},
	initialize: function(){
		this.is_ie = (navigator.userAgent.toLowerCase().indexOf("msie") > -1) ? true : false;
		if(this.is_ie){
			this.settings.iframe_src = this.settings.iframe_src.replace(/(\?|#).*$/, "");
			window.attachEvent("onload", (function(){
				this.iframe = document.createElement("iframe");
				this.iframe.setAttribute("src", this.settings.iframe_src);
				this.iframe.style.display = "none";
				document.getElementsByTagName("body")[0].appendChild(this.iframe);
			}).bind(this));
		} else {this.running = true;}
	},
	helper: function(data, force){
		var navs = document.navigators; 
		var data = this.id + "/" + data;
		
		if(force){navs.data_buffer = "";}
		if(navs.is_ie){navs.iframe.src = navs.settings.iframe_src + "?id=" + data;}
		else{window.location.hash = "#" + data;}
	},
	called: false,
	history: [],
	data_buffer: ""
};
function onnavigate(id, callback){
	var navs = document.navigators; navs[id] = {};
	if(!navs.running){navs.initialize();}
	setInterval(function(){if(navs.running){
		var url = window.location.href;
		var hash = window.location.hash.replace(/#/, "");
		var theid = "#" + id + "/";
		if(url.indexOf(theid) > -1){
			var data = url.split(theid)[1] || "";
			var new_data = theid + data;
			if(navs.data_buffer != new_data){
				callback(data);
				navs.called = true;
				navs.history.push(new_data);
				navs.data_buffer = new_data;
			}
		} else if (!hash && navs.called){
			navs.running = false;
			window.location = ((url.indexOf("#") > -1) ? url.split("#")[0] : url) + "#";
			window.location.reload();
		}
	}}, navs.settings.interval);
	navs[id].merge({callback: callback});
	if(navs.settings.helper){
		navs[id].helper = navs.helper.bind({id: id}); return navs[id].helper;
	}
}