corExcluir = "#FFAEAE"
corSelecionada = "#FFFFCC"
corAntiga = ""
corDesabilitada = "#EBEBEB"

/** Retorna o diretorio da imagem **/
function getFolder(obj) {
	srcObj = new String(obj.src);
	posBarra = srcObj.lastIndexOf("/");
	return srcObj.substr(0, posBarra);
}

/** Retorna o ultimo filho da cadeia do obj **/
function getLastDesc(obj){
	last = obj.lastChild;
	while (last != null && last.lastChild != null) {
		last = last.lastChild;
	}
	return last;
}

/** Retorna o proximo node **/
function nextNode(node){
	currentNode = node;
	if (currentNode.hasChildNodes()) {
		return currentNode.childNodes[0];
	} else {
		if (currentNode.nextSibling == null) {
			pai = currentNode.parentNode;
			while (pai.nextSibling == null) {
				pai = pai.parentNode;
			}
			return pai.nextSibling;
		} else {
			return currentNode.nextSibling;
		}
	}
}

/** Seta a largura da borda do componente **/
function setLarguraBorda(obj, largura){
	obj.style.borderBottomWidth = largura;
	obj.style.borderTopWidth = largura;
	obj.style.borderLeftWidth = largura;
	obj.style.borderRightWidth = largura;
}

/** Retorna o nome do grid, passando como parametro qualquer objeto dentro da grid**/
function getNomeGrid(grid){
	return grid.nmGrid;
}

/** Retorna o objeto da grid, passando como parametro qualquer objeto dentro da grid **/
function getGrid(obj){
	while (obj != null && getNomeGrid(obj) == null) {
		obj = obj.parentNode
	}
	return obj;
}

/** Retorna TRUE se a grid for indexada **/
function gridIsIndexed(grid) {
    return (grid.indexed == "true");
}

/** Retorna TRUE se a grid utilizar um MAP **/
function gridIsMapped(grid) {
    return (grid.mapped == "true");
}

/** Retorna TRUE se for multiseleção **/
function gridIsMultiselection(grid){
	return (grid.multiselection == "true");
}

function isLinhaGrid(obj) {
    return (obj.linha == "true");
}

/** Funcao para retornar a linha da grid **/
function getLineGrid(obj){
	//procura pelos parents do obj até achar um que tenha atributo linha=true
	linhaSel = obj;
	while (!isLinhaGrid(linhaSel)) {
		if (linhaSel.nodeName == "BODY") {
			return null
		}
		linhaSel = linhaSel.parentNode;
	}
	return linhaSel;
}

/** Funcao para retornar o texto antes do _ **/
function getFieldName(idNode){
  	idNode = new String(idNode);
    posTraco = idNode.indexOf("_");
    if (posTraco < 0) {
        return idNode;
    } else {
      	return idNode.substr(0, posTraco);
    }
}

/** Funcao para retornar o texto depois do _ **/
function getFieldIndex(idNode){
   	idNode = new String(idNode);
    posTraco = idNode.indexOf("_");
  	return idNode.substr(posTraco + 1);
}

/** Funcao para retornar o ID do campo **/
function getColumnId(obj, colname, index) {
    grid = getGrid(obj);
    gridname = new String(getNomeGrid(grid)).toLowerCase();
    id = "";
    if (gridIsIndexed(grid)) {
        id=id+gridname+"["+index+"].";
    }
    if (gridIsMapped(grid)) {
        id=id+"value("+colname+")";
    } else {
        id=id+colname;
    }
    return id+"_"+index;
}

/** Funcao para retorna apenas o nome do campo,
    como se não fosse "mapped" e "indexed"  **/
function getInternalColName(obj, colname) {
    grid = getGrid(obj);
    if (gridIsIndexed(grid)) {
        colname = colname.substr(colname.indexOf(".")+1);
    }
    if (gridIsMapped(grid)) {
        lenValue = new String("value(").length;
        colname = colname.substr(lenValue, colname.length-lenValue-1);
    }
    return colname;
}

/** Funcao para retornar o nome do novo campo criado **/
function getNewFieldName(obj, fieldname, index){
    grid = getGrid(obj);
    gridname = new String(getNomeGrid(grid)).toLowerCase();
    id = getFieldName(fieldname);
    if (gridIsIndexed(grid)) {
        posPonto = id.indexOf(".");
        id = gridname+"["+index+"]."+id.substring(posPonto+1);
    }
    return id+"_"+index;
}


/** Funcao para escurecer uma cor **/
function escurecerCor(cor) {
	fatorEsc = 2;
	if(cor == "") {
		return "";
    } else {
    	caracHex = "0123456789ABCDEF";
        novaCor = "#";
    	for (i = 1; i < cor.length; i++) {
        	posCarac = caracHex.indexOf(cor.substr(i,1).toUpperCase());
            if (posCarac - fatorEsc < 0) {
    			novaCor += "0";
        	} else {
    			novaCor += caracHex.substr(posCarac - fatorEsc, 1);
        	}
    	}
    }
	return novaCor;
}

//muda a cor de todos os objetos text dentro da hierarquia do "obj"
function mudarCorLinha(obj, nmEvento){
    ehBotaoDel = (obj.className == "spwImagemExcluirGrid");
	ehNovaLinha = (nmEvento == "new");
    linhaSel = getLineGrid(obj);
	if (ehNovaLinha) {
		cor = corAntiga;
	} else if (ehBotaoDel) {
        grid = getGrid(obj);
        idAcao = getColumnId(grid, "status", index);   
        acaoLinha = document.getElementById(idAcao);
        if (new String(acaoLinha.value).charAt(0) == 'D') {
            cor = corExcluir;
        } else {
            cor = corAntiga;
        }
    } else {
        if (nmEvento == "focus") {
            cor = corSelecionada;
        } else {
            cor = corAntiga;
        }
    }
    linhaSel.style.backgroundColor = cor;
    //Varre todas os campos da linha mudando a cor
    lastDesc = getLastDesc(linhaSel);
    currentNode = linhaSel;
	if (lastDesc != null && currentNode != null) {
		do {
			currentNode = nextNode(currentNode);
			if (currentNode.nodeName == "TD" || 
						currentNode.tagName == "INPUT" || 
						currentNode.tagName == "SELECT" ||
						currentNode.tagName == "TEXTAREA") {
				if (ehNovaLinha || ehBotaoDel || currentNode.style.backgroundColor.toUpperCase() != corExcluir) {
					if (currentNode.readOnly == true || currentNode.className.indexOf("GridDesab") != -1) {
						if (cor == corSelecionada) {
							currentNode.style.backgroundColor = escurecerCor(cor);
						} else if (cor == corExcluir) {
							currentNode.style.backgroundColor = corExcluir;
						} else {
							currentNode.style.backgroundColor = corDesabilitada;
						}
					} else {
						currentNode.style.backgroundColor = cor;
					}
				}
			} 
		} while (lastDesc != currentNode);
	}
    //Muda o fundo do objeto selecionado
    if (!ehBotaoDel && obj.style.backgroundColor.toUpperCase() != corExcluir) {
        obj.style.backgroundColor = "#FFFFFF";
    }
}

/** Copia a linha e percorre todos os seus filhos para alterar seus atributos **/
function novaLinha(obj, index, nmGrid){
    //Faz o clone do objeto "obj"
	objNovo = obj.cloneNode(true);
	objNovo.id = "linha"+nmGrid+"_"+index;
    objNovo.style.display="block";
    lastDesc = getLastDesc(objNovo);
    currentNode = objNovo;
	if (lastDesc != null && currentNode != null) {
		do {
			currentNode = nextNode(currentNode);
			if ((currentNode.nodeName == "INPUT" || 
					 currentNode.nodeName == "SELECT" ||
					 currentNode.nodeName == "TEXTAREA" ||
					 currentNode.className == "spwImagemExcluirGrid") || 
					 currentNode.estado == "true") {
	
				newId = getNewFieldName(obj,currentNode.id,index);
				currentNode.id = newId;
				currentNode.name = getFieldName(newId);
				
				if(currentNode.type == "text" || 
						currentNode.type == "hidden" ||
						currentNode.nodeName == "TEXTAREA"){
					currentNode.value = "";
				}
				if (currentNode.id == getColumnId(obj, "status", index)) {
					currentNode.value = "I";
				}
				if (currentNode.id == getColumnId(obj, "estado"+nmGrid, index)) {
					currentNode.src = getFolder(currentNode) + "/estadoI.gif";
				}
				if (new String(currentNode.id).substr(0, 8) == "spwCheck" ) {
					currentNode.value = "false";
				}
			}
			// faz com que o botao excluir volte ao estado normal
			if ( currentNode.className == "spwImagemExcluirGrid" ) {
				currentNode.valor = "";
				srcNode = new String(currentNode.src);
				posBarra = srcNode.lastIndexOf("/");
				currentNode.src = srcNode.substr(0, posBarra) + "/" + "botExcluirGrid.gif";
			}	
		} while (lastDesc != currentNode)
	}
	return objNovo;
}

/** Cria uma linha da grid **/
function criarLinha(obj, canfocus){
    return criarNovaLinha(obj, canfocus);
}

/** Cria uma linha da grid **/
function criarNovaLinha(obj, canfocus){

    grid = getGrid(obj);
	nmGrid = getNomeGrid(grid);
	//pega o numero de linhas da grid
	textQtLinhas = document.getElementById("textQtLinhas"+nmGrid).childNodes[0];
	nuLinha = new Number(textQtLinhas.nodeValue);

	//pega a tabela principal que contem a linha a ser duplicada
	TBprincipal = document.getElementById("tabela"+nmGrid).lastChild;
	TRprincipal = TBprincipal.childNodes[0];

	//copia a linha 
	TRcopia = novaLinha(TRprincipal, nuLinha, nmGrid);
	TBprincipal.appendChild(TRcopia);
    mudarCorLinha(TRcopia, "new");	

	//coloca o foco
	if(canfocus){
        if (obj.fieldFocus != null) {
            objFocus = document.getElementById(getNewFieldName(obj,obj.fieldFocus,nuLinha));
            if (!objFocus.readOnly && !objFocus.disabled) {
                objFocus.focus();
                mudarCorLinha(objFocus, "focus");
//                setLarguraBorda(objFocus, 2);
            }
        } else {
            bDeuFoco = false;
            n = 0;
            proxCtrl = document.all[n];
            while (proxCtrl != null && !bDeuFoco) {
                if (proxCtrl.nodeName == "INPUT" && proxCtrl.type != "hidden" && proxCtrl.type != "radio" &&
                        proxCtrl.type != "button" && !proxCtrl.readOnly && !proxCtrl.disabled) {
                    proxCtrl.focus();
                    bDeuFoco = true;
                }
                n++;
                proxCtrl = document.all[n];
            }
        }
	}
    
    //Seta o numero de linhas da grid
	textQtLinhas.nodeValue = nuLinha+1;

	return TRcopia
}

function changeAction(obj, acao) {
    grid = getGrid(obj);
    index = getFieldIndex(obj.id);
    changeActionGrid(grid, index, acao);
}

/** Coloca o "name" em  todos campos da linha do obj baseado nos seus id's **/
function changeActionGrid(grid, index, acao) {
    nmGrid = getNomeGrid(grid);
	idAcao = getColumnId(grid, "status", index);   
	acaoLinha = document.getElementById(idAcao);
    acaoOld = acaoLinha.value;
	
	idEstado = 	idAcao = getColumnId(grid, "estado"+nmGrid, index);  
	estadoLinha = document.getElementById(idEstado);
	dirEstado = getFolder(estadoLinha);
	
    if (acao == "U" && acaoOld == "I") { 
        acao = "I"; 
		estadoLinha.src = dirEstado + "/estadoI.gif";
    } else if ((acao == "D" && acaoOld == "U") || 
               (acao == "U" && (acaoOld == "DU" || acaoOld == "D"))) { 
        acao = "DU"; 
		estadoLinha.src = dirEstado + "/estadoD.gif";
    } else if (acao == "D" && acaoOld == "D") { 
        acao = ""; 
		estadoLinha.src = dirEstado + "/estado.gif";
    } else if (acao == "D" && acaoOld == "DU") { 
        acao = "U"
		estadoLinha.src = dirEstado + "/estadoU.gif";
    } else if ((acao == "D" && acaoOld == "I") || 
               (acao == "U" && acaoOld == "DI")) {
        acao = "DI";
		estadoLinha.src = dirEstado + "/estadoD.gif";
    } else if (acao == "D" && acaoOld == "DI") {
        acao = "I";
		estadoLinha.src = dirEstado + "/estadoI.gif";
    } else if (acao == "U") {
		estadoLinha.src = dirEstado + "/estadoU.gif";
	} else if (acao == "D") {
		estadoLinha.src = dirEstado + "/estadoD.gif";
	} else if (acao == "") {
		estadoLinha.src = dirEstado + "/estado.gif";
	}
	acaoLinha.value = acao;

	//percorre todo os objetos da linha, alterando o "name" deles
	linhaSel = getLineGrid(estadoLinha);
    lastDesc = getLastDesc(linhaSel);
    currentNode = linhaSel;
	if (lastDesc != null && currentNode != null) {
		do {
			currentNode = nextNode(currentNode);
			//verifica se o node corrente é um input e troca seus atributos
			if (currentNode.nodeName == "INPUT" || 
					currentNode.nodeName == "SELECT" ||
					currentNode.nodeName == "TEXTAREA") {
				if( acao == "" || acao == "DI" ) {
					currentNode.name = ""
				} else {
					currentNode.name = getFieldName(currentNode.id);
				}
			}		
		} while (lastDesc != currentNode);
	}
}

function excluirRegistro(link) {
    if (confirm("Confirma a exclusão do registro?")) {
        window.location.href = link;
    }
}

function focoNoObjId(id) {
    obj = document.getElementById(id);
    obj.focus();
}


/** Pega o número de linhas da grid **/
function getNuLinhas(doc, gridname) {
	textQtLinhas = doc.getElementById("textQtLinhas"+gridname).childNodes[0];
	return new Number(textQtLinhas.nodeValue);
}

/** Verifica se os dados da grid foram modificados **/
function dadosModificados(doc, grid) {
    nuLinhas = getNuLinhas(doc, grid);
    modificou = false;
    for (i = 0; i < nuLinhas; i++) {
        modificou = modificou || 
            !((doc.getElementById(grid+"["+i+"].status_"+i).value == "") ||
            (doc.getElementById(grid+"["+i+"].status_"+i).value == "DI"));
    }
    return modificou;
}

/** Verifica se a grid possui alguma linha que não está excluída **/
function possuiAlgumaLinhaNaoExcluida(doc, grid) {
    nuLinhas = getNuLinhas(doc, grid);
    for (i = 0; i < nuLinhas; i++) {
        if ((doc.getElementById(grid+"["+i+"].status_"+i).value.indexOf("D") == -1)) {
            return true
        }
    }
    return false;
}

/** Marca todos os campos no grid **/
function selecionaTodosNaGrid(ctrl, inputName, checked) {
    grid = getGrid(ctrl);
    nuLinhas = getNuLinhas(document, getNomeGrid(grid));
    for (iFld30734=0; iFld30734 < nuLinhas; iFld30734++) {
        colid = getColumnId(grid, inputName, iFld30734);
        col = document.getElementById(colid);
        if (col.nodeName.toUpperCase() == "INPUT") {
            if (col.type.toUpperCase() == "CHECKBOX") {
                col.checked = checked;
            } else {
                col.value = checked;
            }
        }
        changeActionGrid(grid, iFld30734, "U"); 
    }
}