/*
 * @author: Marcelo Linhares
 * @data: 01/11/2005
 * Faz uma requisi??o ao script que retorna um xml com o seguinte DTD:
 *
 * <!ELEMENT select (option)> 
 * <!ELEMENT option (value,text)> 
 * <!ELEMENT value (#PCDATA)>
 * <!ELEMENT text (#PCDATA)>
 */
function getObjectXML(){
    var xmlHttp;
    try{
        xmlHttp = new XMLHttpRequest(); // funciona mozilla, op?ra, konqueror...
    }
    catch(e){
        try{
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); // funciona na Microsoft
        }
        catch(e){ // I.E5
            try{
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }catch(E){
                xmlHttp = false;
            }
        }
    }
    return xmlHttp;
}


//Objeto principal (global) para tratar as requisiï¿½ï¿½es de ajax
var objectXML = getObjectXML();

function clearCombo(id){
    //var nOptions = document.getElementById(id).options;
	
	//jQuery("#"+id+" option:selected").remove();
	
	jQuery('#'+id).empty();
    
    //nOptions.length = 0;
}


/**
 * Função utilizada para popuar um campo de select utilizando outro como base
 */
function populateSelect(idObject,idObjectPopulate,url,parametro){
    url+="?"+parametro+"=";

    // recebendo o valor do objeto select
    var inputSelect = document.getElementById(idObject);
    var inputSelectPopulate = document.getElementById(idObjectPopulate);
	
    // ao alterar o valor do inputSelect, chama esta fun??o
    inputSelect.onchange = function(){
			
        var urlSend = url + this.value; // concatena a url com o valor do campo atual
        var nOptions = 0;
        var result = 1;
        clearCombo(idObjectPopulate); // limpa o combo novamente
        objectXML.open("GET",urlSend,true);

        objectXML.onreadystatechange=function() {
            if (objectXML.readyState==4){
                var optionsSelect = objectXML.responseXML;
                result = optionsSelect.getElementsByTagName('option');
                // preenche o combo de acordo com o resultado
                for(y=0;y<result.length;y++){
                    valor =result[y].getElementsByTagName('value')[0].firstChild.nodeValue;
                    resultado = result[y].getElementsByTagName('text')[0].firstChild.nodeValue;
                    inputSelectPopulate.options[nOptions++] = new Option(resultado,valor);
                }
            }
        }
        objectXML.send(null);
    }; // fim do inputSelect
} // fim do populateSelect

/** Esta função permite carregar um combo dinamicamente via ajax assim como a função
 * "populateSelect". No entanto, quando nenhuma operacao for retornada no arquivo XML, além de se esvaziar o conteúdo do
 * combo, desabilita-se o mesmo.
 * Assim como na função "populateSelect":
 * @param idObject id do primeiro combo;
 * @param idObjectPopulate id do segundo combo;
 * @param url url que seria chamada para retorno do XML com os dados utilizados para popular;
 * @param parametros lista de nomes de parâmetros que seria enviada para a URL com os valores necessários para popular o segundo combo;
 * @param msgPadrao texto do item padrão a ser inserido junto com o conteúdo do XML.
 * @param msgPadraoSempreVisivel indicador para definir se o item padrão (mensagem) estaria sempre visível.
 **/
function populateSelectWithDisabling(idObject, idObjectPopulate, url, parametros, msgPadrao, msgPadraoSempreVisivel){
	
    // recebendo o valor do objeto select
    var inputSelect =  document.getElementById(idObject); //jQuery('#'+idObject);
    var inputSelectPopulate = document.getElementById(idObjectPopulate); //jQuery('#'+idObjectPopulate); 

    
    
    if(msgPadrao != null && msgPadraoSempreVisivel){
       //inputSelectPopulate.options[0] = new Option(msgPadrao,"-1"); //adiciona item padrao msgPadrao///
    	 
    	jQuery('#'+idObjectPopulate).append("<option value='-1' >"+msgPadrao+"</option>");
	
    }        
    
    //modifica o evento "onchange" do objeto select (principal) para chamar esta funï¿½ï¿½o
    inputSelect.onchange = function(){
        //PARA FUNCIONAR NO FIREFOX, O CODIGO DA LINHA ABAIXO Nï¿½O PODE SER MOVIDO
        inputSelectPopulate.disabled = false;
			
        var params = parametros.split(",");
        var urlSend = url+"?";
        for(i=0;i<params.length;i++){
            param = document.getElementById(params[i]);
                          
            if(param.selectedIndex != null)
                urlSend+=params[i]+"="+param.options[param.selectedIndex].value+"&";
            else
                urlSend+=params[i]+"="+param.value+"&";
        }        

        var nOptions = 0;
        var result = 1;
        clearCombo(idObjectPopulate); // limpa o combo novamente

        objectXML.open("GET",urlSend,true);
                                                
        objectXML.onreadystatechange=function() {
            if (objectXML.readyState==4){
                var optionsSelect = objectXML.responseXML;
                if(optionsSelect != null){
                    result = optionsSelect.getElementsByTagName('option');

                    // preenche o combo de acordo com o resultado
                                            
                    if(result.length>0){             
                        if(msgPadrao != null){
                           ////inputSelectPopulate.options[nOptions++] = new Option(msgPadrao,"-1"); //adiciona item padrao/////
                            jQuery('#'+idObjectPopulate).append("<option value='-1' >"+msgPadrao+"</option>");                            
                        }

                        for(y=0;y<result.length;y++){
                            valor = result[y].getElementsByTagName('value')[0].firstChild.nodeValue;
                            resultado = result[y].getElementsByTagName('text')[0].firstChild.nodeValue;
                            
                            ////inputSelectPopulate.options[nOptions++] = new Option(resultado,valor);/////
                            
                            nOptions++;
                            
                            jQuery('#'+idObjectPopulate).append("<option value='"+valor+"' >"+resultado+"</option>");
                            
                            
                            if(result[y].getElementsByTagName('selected').length>0){
                                ////inputSelectPopulate.options[nOptions-1].selected = result[y].getElementsByTagName('selected')[0].firstChild.nodeValue;////
                            	//jQuery('#'+idObjectPopulate).append("<option value='"+valor+"' >"+resultado+"</option>");
                            }
                        }
                        fireEvent(inputSelectPopulate,'change');                
                    }
                    else{
                        if(msgPadrao != null && msgPadraoSempreVisivel){
                            ////inputSelectPopulate.options[nOptions++] = new Option(msgPadrao,"-1"); //adiciona item padrao////
                            jQuery('#'+idObjectPopulate).append("<option value='-1' >"+msgPadrao+"</option>");
                        }
                        fireEvent(inputSelectPopulate,'change');
                        inputSelectPopulate.disabled = true;
                    }
                }
                else{
                    if(msgPadrao != null && msgPadraoSempreVisivel){
                        //inputSelectPopulate.options[nOptions++] = new Option(msgPadrao,"-1"); //adiciona item padrao//
                    	jQuery('#'+idObjectPopulate).append("<option value='-1' >"+msgPadrao+"</option>");
                        
                    }
                    fireEvent(inputSelectPopulate,'change');
                    inputSelectPopulate.disabled = true;
                }
            }
        }
        objectXML.send(null);
    }; // fim do inputSelect
    
}

function fireEvent(element,event) {
    var evt = null;
    if (document.createEventObject){
        // dispatch for IE
        evt = document.createEventObject();
        return element.fireEvent('on'+event,evt);
    }
    else{
        // dispatch for firefox + others
        evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable 
        return !element.dispatchEvent(evt);
    }
}
