var iexplore = true;
/**
 * Esta funcion permite asignar un filtro a traves de un popUp
 */
function setFilter(formName,field,key,value,localWindow,ajax){
    var p = eval('document.forms.'+formName+'.'+ field);
    var old = p.value;
    p.value = key;
    eval('document.forms.'+formName+'.'+ field + '_Label').value = value;
    if (ajax && old != key){
        var async = true;
        if (!localWindow && navigator.family == 'gecko'){
            async = false;
        }
        recomputeDepending(field, key,value,async);
    }
}
/**
 * Método de recuperación del objeto HTTP
 */
function getHTTPRequestObject() {
    var xmlhttp = false;
    if(window.ActiveXObject) {
        try {
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (E) {
                xmlhttp = false;
            }
        }
    }
    if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
        try {
            xmlhttp = new XMLHttpRequest();
        } catch (e) {
            xmlhttp = false;
        }
    }
    return xmlhttp;
}

// Variable que indica las veces que se han inentado deshabilitar los campos,
var nDisabled = 0;

/**
 * Cambia el estado de habilitacíon de los campos del formulario en los que puede haber dependencias
 */
function changeDisabled(formName,newDisabled){
    if (newDisabled){
        nDisabled++;
    }else{
        nDisabled--;
    }
    var theForm = eval('document.forms.' + formName);
    if ((nDisabled == 1 && newDisabled) || (nDisabled == 0 && !newDisabled)){
        var formElements = theForm.elements;
        for (var i=0; i< formElements.length; i++){
            if (formElements[i].type != 'undefined'){
               formElements[i].disabled = newDisabled;
            }
        }
    }
}

/**
 * Esta función extrae todos los campos que hay seleccionados en el formulario de búsqueda
 */
function currentParamValues(formName){
    var result = "";

    var theForm = eval('document.forms.' + formName);
    var formElements = theForm.elements;
    for (var i=0; i< formElements.length; i++){
        if (formElements[i].name == 'idQuery' || formElements[i].name == 'field'){
            continue;
        }
        if (formElements[i].type == 'select-one'
                || formElements[i].type == 'text'
                || formElements[i].type == 'hiden'){
            if (formElements[i].value!= ''){
                result += '&' + formElements[i].name + '=' + escape(formElements[i].value);
            }

        }
    }
    return result;                                               
}


/**
 * Recomputa las opciones de un determinado campo de búsqueda
 */
function computeChoices(formName,idQuery,paramKey,async,url) {
    // Creamos un objeto
    var httpChoices  = getHTTPRequestObject(); // Creamos el objeto de conexión HTTP
    // No soportamos AJAX
    if(!httpChoices ) {
        changeDisabled(formName,false);
        return;
    }
    if (httpChoices.overrideMimeType){
        httpChoices.overrideMimeType('text/xml');
    }

    var parameters = "idQuery=" + escape(idQuery) + currentParamValues(formName) ;

    httpChoices.open("POST",url,async);
    httpChoices.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    if (async){
        httpChoices.onreadystatechange = function() {
            var xmlDoc;
            if (httpChoices.readyState == 4) {
                try {
                    if (httpChoices.status == 200) {
                        if (window.ActiveXObject) {
                            // Internet explorer
                            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                            xmlDoc.async = false;
                            xmlDoc.loadXML(httpChoices.responseText);
                        } else {
                            // Codigo para mozilla
                            xmlDoc = httpChoices.responseXML;
                        }
                    }
                } catch(ex) {
                }
            }else{
                return;
            }
            processChoicesDoc(formName,paramKey,xmlDoc,async);
        }
    }
    httpChoices.send(parameters);
    if (!async){
        var xmlDoc;
        if (httpChoices.readyState == 4) {
            try {
                if (httpChoices.status == 200) {
                    if (window.ActiveXObject) {
                        // Internet explorer
                        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                        xmlDoc.async = false;
                        xmlDoc.loadXML(httpChoices.responseText);
                    } else {
                        // Codigo para mozilla
                        xmlDoc = httpChoices.responseXML;
                    }
                }
            } catch(ex) {
            }
        }
        processChoicesDoc(formName,paramKey,xmlDoc,async);
    }
}

function processChoicesDoc(formName,paramKey,xmlDoc,async){
    if (!xmlDoc){
        changeDisabled(formName,false);
        return;
    }

    var main = xmlDoc.getElementsByTagName('root');

    // Una vez recuperado el xml, se parsea y se actualizan los datos
    var select = eval('document.forms.'+formName+'.'+ paramKey);

    var oldValue = select[select.selectedIndex].value;

    // Se deja unicamente el valor vacío, para después ir rellenando
    select.options.length = 1;


    var choices = main[0].getElementsByTagName('choice');
    if(choices.length == 0) {
        recomputeDepending(formName,paramKey,'',async);
        changeDisabled(formName,false);
        return;
    }
    // Se recorre la lista de choices
    for (var i=0; i< choices.length; i++){
        if (choices[i].nodeType == 1){
            var option = document.createElement('OPTION')
            option.value = choices[i].getElementsByTagName("choiceKey")[0].firstChild.nodeValue;
            option.text = choices[i].getElementsByTagName("choiceValue")[0].firstChild.nodeValue;
            select.options[select.options.length]= option;
        }
    }
    if (oldValue ==''){
        changeDisabled(formName,false);
        return;
    }
    // por último se intenta restaurar el valor antiguo, si es que todavía existe.
    var exists = false;
    for (var i=0; i< select.options.length; i++){
        if (select.options[i].value == oldValue){
            select.options[i].selected = true;
            exists = true;
        }
    }
    if (!exists){
        recomputeDepending(formName,paramKey,'',async);
    }
    changeDisabled(formName,false);
}


/**
 * Chequea si el valor indicado en un campo es válido una vez cambiados parametros de los que depende
 */
function checkSelectedValue(formName,idQuery,paramKey,async,url) {
    var input = eval('document.forms.'+formName+'.'+ paramKey);
    if (!input){
        changeDisabled(formName,false);
        return;
    }
    if (!input.value){
        changeDisabled(formName,false);
        return;
    }
    if (input.value == ''){
        changeDisabled(formName,false);
        return;
    }
    // Creamos un objeto
    var httpChoices  = getHTTPRequestObject(); // Creamos el objeto de conexión HTTP
    // No soportamos AJAX
    if(!httpChoices ) {
        changeDisabled(formName,false);
        return;
    }
    if (httpChoices.overrideMimeType){
        httpChoices.overrideMimeType('text/xml');
    }

    var parameters = "idQuery=" + escape(idQuery) + currentParamValues(formName) ;

    httpChoices.open("POST",url,async);
    httpChoices.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    if (async){
        httpChoices.onreadystatechange = function() {
            var xmlDoc;
            if (httpChoices.readyState == 4) {
                if (httpChoices.status == 200) {
                    if (window.ActiveXObject) {
                        // Internet explorer
                        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                        xmlDoc.async=false;
                        xmlDoc.loadXML(httpChoices.responseText);
                    } else {
                        // Codigo para mozilla
                        xmlDoc = httpChoices.responseXML;
                    }
                }
            }else{
                return;
            }
            processCheckDoc(formName,paramKey,xmlDoc,async);
        }
    }
    httpChoices.send(parameters);
    if (!async){
        var xmlDoc;
        if (httpChoices.readyState == 4) {
            if (httpChoices.status == 200) {
                if (window.ActiveXObject) {
                    // Internet explorer
                    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                    xmlDoc.async=false;
                    xmlDoc.loadXML(httpChoices.responseText);
                } else {
                    // Codigo para mozilla
                    xmlDoc = httpChoices.responseXML;
                }
            }
        }
        processCheckDoc(formName,paramKey,xmlDoc,async);
    }
}

function processCheckDoc(formName,paramKey,xmlDoc,async){
    if (!xmlDoc){
        changeDisabled(formName,false);
        return;
    }
    var rootNode = xmlDoc.getElementsByTagName('checkResult');

    // Una vez recuperado el xml, se parsea y se actualizan los datos
    var select = eval('document.forms.'+formName+'.'+ paramKey);
    var label =  eval('document.forms.'+formName+'.'+ paramKey + "_Label");


    var choices = rootNode[0].getElementsByTagName('choice');
    if(choices.length == 0) {
        select.value = '';
        if (label){
            label.value =''
        }
        recomputeDepending(formName,paramKey,'',async);
    }else{
        // Se recorre la lista de choices
        for (var i=0; i< choices.length; i++){
            if (choices[i].nodeType == 1){
                select.value  = choices[i].getElementsByTagName("choiceKey")[0].firstChild.nodeValue;
                label.value = choices[i].getElementsByTagName("choiceValue")[0].firstChild.nodeValue;
                recomputeDepending(formName,paramKey,select.value,async);
                break;
            }
        }
    }
    changeDisabled(formName,false);
}

