// Classe que realiza as requisições
var Solicitacao = function(url, listaCampos, funcao) {
	this.URL = url;
	this.callBack = funcao;
	this.request = null;
	this.campos = listaCampos;
}

Solicitacao.prototype.getForm = function() {
	var dados = "";
	var cmps = this.campos;
	for(var i = 0; i < cmps.length; i++)
		dados += (dados != "" ? "&":"") + cmps[i].nome + "=" + escape(cmps[i].valor);
	return dados;
}

// Criar objeto xml para fazer solicitação
Solicitacao.prototype.solicitar = function() {
	this.request = this.getXMLHTTPRequest();
	if(this.request) {	
		//set the var so we can scope the callback
		var _this = this;
		this.request.onreadystatechange = this.callBack;
		//this.request.open("GET", this.URL, true);
		//this.request.setRequestHeader("Content-Type", "text/plain;charset=ISO-8859-1");
		//this.request.send(null);

		var dados = this.getForm();
		this.request.open("POST", this.URL, true); //Abre a url.
		this.request.setRequestHeader('Content-Type','text/xml'); 
		this.request.setRequestHeader('encoding','ISO-8859-1'); 
		this.request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
		this.request.setRequestHeader('Content-length', dados.length); 
		this.request.send(dados); //Envia dados ao documento da url.
	}
}

Solicitacao.prototype.abortar = function() {
	if(this.request) {
		this.request.abort();
	}
}

//returns an XMLHTTPRequest instance (based on browser)
Solicitacao.prototype.getXMLHTTPRequest = function() {
	var xmlHttp;
	try	{
		xmlHttp = new ActiveXObject("Msxml2.XMLHttp");
	}
	catch(e) {
		try	{
			xmlHttp = new ActiveXObject("Microsoft.XMLHttp");
		}
		catch(e2) {	}
	}
	if(xmlHttp == undefined && (typeof XMLHttpRequest != 'undefined')) {
		xmlHttp = new XMLHttpRequest();
	}
	return xmlHttp;
}

// Funções para processar solicitação
function ajaxConverteTextToList(textJSON) {
	var lst = eval(textJSON);
	return lst;
}

// Preencher elemento select com dados de uma lista
function ajaxAtualizarSelect(combo, list) {
	var len = combo.options.length-1;
	for(var o = len;o >= 0;o--)
		combo.options[o] = null;
	if(list) {
		for(var i = 0; i < list.length; i++) {
			var opt = new Option(list[i].text, list[i].cod);
			combo.options.add(opt);
		}
	}
}
function ajaxAtualizarSelectFiltro(combo, list, funFiltro) {
	var len = combo.options.length-1;
	for(var o = len;o >= 0;o--)
		combo.options[o] = null;
	if(list)
		for(var i = 0; i < list.length; i++)
			if(funFiltro(list[i])) {
				var opt = new Option(list[i].text, list[i].cod);
				combo.options.add(opt);
			}
}


// Funções comuns
function ajaxGetClienteRect(elem) {
	if(elem) {
		var pai = elem.offsetParent;
		var px = elem.offsetLeft;
		var py = elem.offsetTop;
		while(pai) {
			px += pai.offsetLeft;
			py += pai.offsetTop;
			pai = pai.offsetParent;
		}
		return {left:px, top:py, right:px + elem.offsetWidth, bottom:py + elem.offsetHeight, width:elem.clientWidth, height:elem.clientHeight};
	} else {
		return null;
	}
}

function ajaxPixels(vlr) {
	if(vlr.toString().indexOf("px") > 0)
		return vlr;
	else
		return vlr.toString() + "px";
}

function ajaxBrowser() {
	var re = new RegExp("(msie|firefox|opera|safari|netscape|seamonkey|galeon|iceweasel|konqueror|granparadiso|minefield|epiphany|camino|debian|iceape)[\\s|/](\\d+).?(\\d+)", "i");
	var m = re.exec(navigator.userAgent);
	if(m)
		return {nome: m[1], maior: parseInt(m[2]), menor: parseInt(m[3])}
	else
		return null;
}

function ajaxRetanguloDaAreaJanela() {
	// Dimensões da área da janela
	var area = {left: document.body.scrollLeft, 
				top: document.body.scrollTop,
				width: document.body.clientWidth,
				height: document.body.clientHeight};
	return area;
}

var FillCombo = function(url, comboId){
	this.solicitacao = null;
	this.url = url;
	this.combo = document.getElementById(comboId);
	this.params = [];
	this.divMsgAguarde = null;
}

FillCombo.prototype.consultar = function() {
	var _this = this;
	var funcao = function(){_this.processarRetorno()};
	this.solicitacao = new Solicitacao(this.url, this.params, funcao);
	this.solicitacao.solicitar();
	this.exibirMsgAguarde();
}

FillCombo.prototype.processarRetorno = function() {
	// falta: esconder mensagem de aguarde
	var req = this.solicitacao.request;
	if(req && req.readyState == 4) {
		if(req.status == 200) {
			var dataList = ajaxConverteTextToList(req.responseText);
			ajaxAtualizarSelect(this.combo, dataList);
		}
		else {
			//alert("Erro: " + req.status);
		}
	}
	this.esconderMsgAguarde();
}

FillCombo.prototype.exibirMsgAguarde = function() {
	if(!this.divMsgAguarde) {
		var divAguarde = document.createElement("DIV");
		divAguarde.style.position = "absolute";
		divAguarde.style.border = "solid 1px #C0C0C0";
		divAguarde.style.backgroundColor = "#FFFFFF";
		divAguarde.innerHTML = "<img src=\"util/aguarde18x18.gif\" align=\"absmiddle\" width=\"18\" height=\"18\" border=\"0\">" + 
			"<span style=\"font-family:tahoma;font-size:11px;color:#666666\">&nbsp;" + rot_aguarde + "</span>";
		document.body.appendChild(divAguarde);
		this.divMsgAguarde = divAguarde;
	}	
	var rect = ajaxGetClienteRect(elem);
	this.divMsgAguarde.style.left = rect.left;
	this.divMsgAguarde.style.top = rect.top;
	if(elem.clientWidth > 80)
		this.divMsgAguarde.style.width = elem.clientWidth;
	else
		this.divMsgAguarde.style.width = 80;
	if(elem.clientHeight > 19)
		this.divMsgAguarde.style.height = elem.clientHeight;
	else
		this.divMsgAguarde.style.height = 19;
	elem.style.visibility = "hidden";
	this.divMsgAguarde.style.visibility = "visible";
	this.divMsgAguarde.setAttribute("idelem", elem.id);
}

FillCombo.prototype.esconderMsgAguarde = function() {
	if(this.divMsgAguarde) {
		this.divMsgAguarde.style.visibility = "hidden";
		var elem = document.getElementById(this.divMsgAguarde.getAttribute("idelem"));
		if(elem) elem.style.visibility = "visible";
	}
}