function AJAXMM_findObj(n, d) { //v4.01
 var p,i,x;  if(!d) d=document; if((p=n.indexOf("?")) > 0&&parent.frames.length) {
   d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
 if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i < d.forms.length;i++) x=d.forms[i][n];
 for(i=0;!x&&d.layers&&i < d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
 if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function AJAXMM_setTextOfLayer(objName,x,newText) { //v4.01
  if ((obj=AJAXMM_findObj(objName))!=null) with (obj)
	if (document.layers) {document.write(unescape(newText)); document.close();}
	else innerHTML = unescape(newText);
}

function AJAXInteraction(url, callback, returnParam) {

    var req = init();
    req.onreadystatechange = processRequest;
        
    function init() {
		try {
			return new XMLHttpRequest();
		} catch (trymicrosoft) {
			try {
		    	return new ActiveXObject("Msxml2.XMLHTTP");
			} catch (othermicrosoft) {
		    	try {
					return new ActiveXObject("Microsoft.XMLHTTP");
				} catch (failed) {
					alert("Error initializing XMLHttpRequest!");
				}
			}
		}
    }
    
    function processRequest () {
		// readyState of 4 signifies request is complete
		if (req.readyState == 4) {
			// status of 200 signifies sucessful HTTP call
			if (req.status == 200) {
				if (callback && !returnParam){
					callback(req.responseText);
				}else if(callback && returnParam){
					callback(req.responseText,returnParam);
				}
			}
		}
	}

	this.doGet = function() {
		// make a HTTP GET request to the URL asynchronously
		req.open("GET", url, true);
		req.send(null);
	}
    
	this.doPost = function(str) {
		req.open("POST",url,true); 
		req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
		req.setRequestHeader("Content-length", str.length);
		req.send(str);
    }
}

function findFormElements(idForm) {
    var elementosFormulario = document.getElementById(idForm).elements;
    var qtdElementos = elementosFormulario.length;
    var queryString = "";
    var elemento;

    //Cria uma funcao interna para concatenar os elementos do form
    this.ConcatenaElemento = function(nome,valor) { 
                                if (queryString.length>0) { 
                                    queryString += "&";
                                }
                                queryString += encodeURIComponent(nome) + "=" + encodeURIComponent(valor);
                             };

    //Loop para percorrer todos os elementos
    for (var i=0; i<qtdElementos; i++) {
        //Pega o elemento
        elemento = elementosFormulario[i];
        if (!elemento.disabled) {
            //Trabalha com o elemento caso ele nao esteja desabilitado
            switch(elemento.type) {
                //Realiza a acao dependendo do tipo de elemento
                case 'text': case 'password': case 'hidden': case 'textarea': 
                    this.ConcatenaElemento(elemento.name,elemento.value);
                    break;
                case 'select-one':
                    if (elemento.selectedIndex>=0) {
                        this.ConcatenaElemento(elemento.name,elemento.options[elemento.selectedIndex].value);
                    }
                    break;
                case 'select-multiple':
                    for (var j=0; j<elemento.options.length; j++) {
                        if (elemento.options[j].selected) {
                            this.ConcatenaElemento(elemento.name,elemento.options[j].value);
                        }
                    }
                    break;
                case 'checkbox': case 'radio':
                    if (elemento.checked) {
                        this.ConcatenaElemento(elemento.name,elemento.value);
                    }
                    break;
            }
        }
    }
    return queryString;
}
function get(formName) {
	var getstr = "";
	for (i=0; i<formName.childNodes.length; i++) {
		if (formName.childNodes[i].tagName == "INPUT" || formName.childNodes[i].tagName == "input") {
			if (formName.childNodes[i].type == "text") {
				getstr += formName.childNodes[i].name + "=" + formName.childNodes[i].value + "&";
			}
			if (formName.childNodes[i].type == "checkbox") {
				if (formName.childNodes[i].checked) {
					getstr += formName.childNodes[i].name + "=" + formName.childNodes[i].value + "&";
				} else {
					getstr += formName.childNodes[i].name + "=&";
				}
			}
			if (formName.childNodes[i].type == "radio") {
				if (formName.childNodes[i].checked) {
					getstr += formName.childNodes[i].name + "=" + formName.childNodes[i].value + "&";
				}
			}
		}   
		if (formName.childNodes[i].tagName == "SELECT" || formName.childNodes[i].tagName == "select") {
			var sel = formName.childNodes[i];
			getstr += sel.name + "=" + sel.options[sel.selectedIndex].value + "&";
		}
	}
	return getstr;
}
      
function AjaxTable(layerName){

	var layerAtivado = false;
	this.desativarLayer = desativarLayer;
	this.hideLayer = hideLayer;
	this.ativarLayer = ativarLayer;
	this.buildTable = buildTable;

	//Atualizacoes para suportar teclas
	var key;
	var contadorLinha = 0;

	function desativarLayer(now){
		layerAtivado = false;	
		if(now){
			document.getElementById(layerName).style.display = "none";
		}else{
			setTimeout(layerName + '.hideLayer()', 5000);
		}
	}
	function hideLayer(){
		if(layerAtivado == false){
			document.getElementById(layerName).style.display = "none";
		}
	}
	function ativarLayer(){
		var layer = document.getElementById(layerName);
		layer.style.display = "";
		layerAtivado = true;
		
		//Atualizacoes para suportar teclas
		document.onkeydown = keygetter; //needed for Opera...
		document.onkeyup = keyHandler;
		
	}
	function buildTable(width,columns,response,methodSelectName,indexCompositeKey2,indexCompositeKey3){
		var layer = document.getElementById(layerName);	
		var count = 1;
		var texto = '';
		var linhaEscura = true;
		texto += '<table id="tabelaExterna" class="tabelaExterna" cellpadding="0" cellspacing="0">';
		texto += '	 <tr>';
		texto += '		<td>';
		texto += '			<table width="'+width+'" border="0" cellpadding="0" cellspacing="0" class="tabelaInterna" id="tabelaInterna" bgcolor="#FFFFFF">';
		texto += '				<tr bgcolor="#AAAAAA">';
		for(var i = 0 ; i < columns.length ; i++){
			texto += '				<td width="'+columns[i++]+'">'+columns[i]+'</td>';
		}
		texto += '			  	</tr>';
		while(count < response.length){
			if(linhaEscura){
				texto += '		<tr bgcolor="#FFFFFF">';
				linhaEscura = false;
			}else{
				texto += '		<tr bgcolor="#CCCCCC">';
				linhaEscura = true;		
			}
			var key = 0;
			for(var i = 0 ; i < columns.length/2 ; i++){
				if(i == 0){
					key = response[count];
					if(indexCompositeKey2){
						key += '|' + response[count+indexCompositeKey2];
					}
					if(indexCompositeKey3){
						key += '|' + response[count+indexCompositeKey3];
					}
				}
				texto += '			<td><a href="javascript:'+methodSelectName+'(\''+key+'\');" class="coluna">'+response[count++]+'</a></td>';
			}
			texto += '			</tr>';
		}
		texto += '			</table>';
		texto += '		</td>';
		texto += '	 </tr>';
		texto += '</table>';
		AJAXMM_setTextOfLayer(layerName,'',texto);

		//Criando com objetos DOM
		/*
		Element table = document.createElement('table');
		table.setAttribute('id','tabelaExterna');
		table.setAttribute('class','tabelaExterna');
		table.setAttribute('cellpadding','0');
		table.setAttribute('cellspacing','0');
		var row = tabela.insertRow(1);
		var cell = document.createElement('td'); 
		row.appendChild(cell);
		layer.appendChild(table);
		*/
		
		ativarLayer();
		setTimeout(layerName + '.desativarLayer()', 10000);
	}

	function setColor (_posi, _color, _forg){
	    var layer = document.getElementById(layerName);
	    var tabelaExterna = layer.childNodes[0]; //Tabela externa
	    /*
	    alert(tabelaExterna);
	    alert(tabelaExterna.childNodes.length);
	    var td = tr.childNodes[0];
	    alert(td);
	    var tabelaInterna = td.childNodes[0];
	    alert(tabelaInterna);
	   	alert(tabelaInterna.id);
	    alert(tabelaInterna.rows.length);
	    for(var k = 0 ; k < tabela.rows[_posi].childNodes.length ; k++){
			tabela.rows[_posi].childNodes[k].backgroundColor = _color;
		}
		*/
	}

	function keygetter(event){
		if (!event && window.event) event = window.event;
		if (event) key = event.keyCode;
		else key = event.which;
	}
	
	function keyHandler(event){
		if (layerAtivado){
			if (key == 40){ //Key down
				contadorLinha++;
				setColor(contadorLinha, "blue", "white");
				if(contadorLinha > 1){
					if(contadorLinha % 2 == 0){
						setColor(contadorLinha - 1, "#FFFFFF", "black");
					}else{
						setColor(contadorLinha - 1, "#CCCCCC", "black");
					}
				}
			}
			else if (key == 38){ //Key up
				alert('Key up');
				/*
				if (words.length > 0 && posi >= 0){
					if (posi >=1){
						setColor(posi, "#fff", "black");
						setColor(--posi, "blue", "white");
						textfield.value = outp.childNodes[posi].firstChild.nodeValue;
					}
					else{
						setColor(posi, "#fff", "black");
						textfield.value = input;
						textfield.focus();
						posi--;
					}
				}
				*/
			}
			else if (key == 27){ // Esc
				desativarLayer(true);
			}
		}
	}
}

function salvarItem(metodoRemover,metodoEditar,tabelaId,itemId,descricao1,descricao2,descricao3,descricao4){

    var tabela = document.getElementById(tabelaId);
    for( var i = 0 ; i < tabela.rows.length ; i++){
    
    	//Verificar se ja existe elemento com este id na tabela
    	if(tabela.rows[i].id == (tabelaId+''+itemId)){
	    	tabela.deleteRow(i);
			break;
    	}
    }

	//Se nao existir elemento entao inserir na ultima linha
	var row = tabela.insertRow(1);
	adicionarItemNaLinha(row,metodoRemover,metodoEditar,tabelaId,itemId,descricao1,descricao2,descricao3,descricao4);
}

function adicionarItemNaLinha(row,metodoRemover,metodoEditar,tabelaId,itemId,descricao1,descricao2,descricao3,descricao4){

	row.id = '' + tabelaId + itemId;

	//Adicionar uma coluna na linha contendo as descricoes
	if(descricao1){
		adicionarColuna(row,descricao1);
	}
	if(descricao2){
		adicionarColuna(row,descricao2);
	}
	if(descricao3){
		adicionarColuna(row,descricao3);
	}
	if(descricao4){
		adicionarColuna(row,descricao4);
	}

	//Adicionar a coluna contendo o metodo remover	
	if(metodoRemover){
		var url = 'javascript:'+metodoRemover+'(\''+itemId+'\');';
		adicionarColunaComLink(row,url,'Remover');
	}

	if(metodoEditar){
		var url = 'javascript:'+metodoEditar+'(\''+itemId+'\');';
		adicionarColunaComLink(row,url,'Editar');
	}
}

function removerItem(tabelaId,itemId){
    var tabela = document.getElementById(tabelaId);
    for( var i = 0 ; i < tabela.rows.length ; i++){
    	if(tabela.rows[i].id == (tabelaId+''+itemId)){
	    	tabela.deleteRow(parseInt(i));
	    	break;
    	}
    }
}

function removerItems(tabelaId){
    var tabela = document.getElementById(tabelaId);
    var total = tabela.rows.length;
    for( i = 1 ; i < total ; i++){
    	tabela.deleteRow(1);
    }
}

function adicionarColuna(linha,conteudo){
	var cell = document.createElement('td'); 
	var cellText = document.createTextNode(conteudo);
	cell.appendChild(cellText);
	linha.appendChild(cell);
}

function adicionarColunaComLink(linha,url,conteudo){
	var cell2 = document.createElement('td');
	var cell21 = document.createElement('a');
	cell21.setAttribute('href',url);
	var cell211 = document.createTextNode(conteudo);
	cell21.appendChild(cell211);
	cell2.appendChild(cell21);
	linha.appendChild(cell2);
}
function callbackPreencherCombo(responseAJAX,token,comboId){
	var response = responseAJAX.split(token);
	var combo = document.getElementById(comboId);
	combo.disabled = false;
	combo.options.length = 0;
	if(response[0] == '200'){
		var contador = 0;
		for(i = 1 ; i < response.length ; i += 2 ){
			combo.options[contador++] = new Option(response[i+1],response[i]);
		}
	}else if(response[0] == '201'){
		var contador = 0;
		for(i = 2 ; i < response.length ; i += 2 ){
			combo.options[contador++] = new Option(response[i+1],response[i]);
		}
		for(i = 0; i < combo.options.length; i++ ){
			if(combo.options[i].value == response[1]){
	            combo.options[i].selected = true;
			}else{
	            combo.options[i].selected = false;
			}
	    }
	}
}

function selectComboItem(comboComponent, value){
	for (var i = 0; i < comboComponent.length; i++) {
		if (comboComponent.options[i].value == value) {
			comboComponent.options[i].selected = true;
		}
	}
}

function buildCombo(entity,filterProperty,filterPropertyValue,labelProperty,destinationComboId,labelPropertyValue){
	var comboId = '';
	if(labelPropertyValue){
		comboId = '&labelPropertyValue='+labelPropertyValue;
	}
	var url = '../servlet/ajax?metodo=pesquisarCombo&entity='+entity+'&filterProperty='+filterProperty+'&filterPropertyValue='+filterPropertyValue+'&labelProperty='+labelProperty + comboId;
    var ajax = new AJAXInteraction(url, callbackBuildCombo, destinationComboId);
    ajax.doGet();
}
function callbackBuildCombo(responseAJAX,destinationComboId){
	var combo = document.getElementById(destinationComboId);
	combo.options.length = 0;
	combo.options[0] = new Option('Selecionar...','0');
	if (responseAJAX.search(/^EXC/) == -1) {
		var xmldoc = parseXml(responseAJAX);
		for(var i = 0 ; i < xmldoc.childNodes.length ; i++ ){
			for(var j = 0 ; j < xmldoc.childNodes[i].childNodes.length ; j++ ){
				var no = xmldoc.childNodes[i].childNodes[j];
				combo.options[j + 1] = new Option(readChildValue(no,'text'),readChildValue(no,'id'));
			}
		}
	}
}
function getSingleValue(responseAJAX,property){
	if (responseAJAX.search(/^EXC/) == -1) {
		var xmldoc = parseXml(responseAJAX);
		if(xmldoc.childNodes.length > 0){
			var no = xmldoc.childNodes[0];
			return readChildValue(no,property);
		}
	}
}
