function showFilterableLayers(pObjDiv, pNumMapID, pScale)
{
    if ((pObjDiv == null) || (pObjDiv == undefined))
        return;

    var strUrl = "./jsp/showSliderFilters.jsp";
    var strUrlParams = "mapID=" + pNumMapID + "&scale=" + pScale + "&lang=" + strLang;

    // Create a new XML HTTP object for AJAX operation.
    var oTempXmlHttp = getNewXmlHTTPObject();

    // Get layers that are filterable.
    if (!isXmlHTTPNull(oTempXmlHttp))
    {
        logMsg("Retrieving filterable layers. url: " + encodeURIComponent(strUrl + "?" + strUrlParams), "info", "sliderFilters.js (showFilterableLayers)");
        doXMLRequest(oTempXmlHttp, strUrl, strUrlParams, "post", false, "application/x-www-form-urlencoded");
    }

    // Show the output in the div.
    pObjDiv.innerHTML = oTempXmlHttp.responseText;

    oTempXmlHttp = null;
}

function updateFilters(pStrLayersChecked, pStrLayersUnchecked)
{
    if (!document.getElementById("frmFilters"))
        return;

    var objHidFilterDataLayer = document.getElementById("frmFilters").hidFilterDataLayer;

    var strLayersChecked = "," + pStrLayersChecked + ",";
    var strLayersUnchecked = "," + pStrLayersUnchecked + ",";

    // Ensure that there are data layers.
    if (objHidFilterDataLayer)
    {
        // Get a count of data layer checkboxes.
        var intCheckCount = ((objHidFilterDataLayer.length == null) || (objHidFilterDataLayer.length == undefined)) ? 1 : objHidFilterDataLayer.length;

        // Loop through the hidden filter boxes.
        for (intCounter = 0; intCounter < intCheckCount; intCounter ++)
        {
            // Check to see if there is only 1 data layer row (1 data layer row gives an undefined length count).
            var objTempHidden = (intCheckCount == 1) ? objHidFilterDataLayer : objHidFilterDataLayer[intCounter];

            // Check to see if the layer is to be filterable.
            if (strLayersChecked.toUpperCase().indexOf("," + objTempHidden.value.split("|")[1].toUpperCase() + ",") >= 0)
            {
                // Show the layer as filterable.
                document.getElementById("tblRowFilterData" + intCounter).className = "enabledText";

                // Enable the filter field.
                document.getElementById("hidFilter_" + intCounter).disabled = false;

                // Check to see if a filter has been added for the layer. If so, display the edit and clear buttons.
                // Otherwise, show the add button.
                if (document.getElementById("hidFilter_" + intCounter).value.trim().length == 0)
                {
                    document.getElementById("lnkFilterAdd_" + intCounter).style.display = "";
                    document.getElementById("divEditClear_" + intCounter).style.display = "none";

                    // Show the filter icon next to the layer.
                    //Temp fix for now, testing db
                    if(document.getElementById("imgFilterData" + intCounter) != null)
                        document.getElementById("imgFilterData" + intCounter).style.display = "none";
                }
                else
                {
                    document.getElementById("lnkFilterAdd_" + intCounter).style.display = "none";
                    document.getElementById("divEditClear_" + intCounter).style.display = "";

                    // Show the filter icon next to the layer.
                    document.getElementById("imgFilterData" + intCounter).style.display = "";
                }
            }
            else if (strLayersUnchecked.toUpperCase().indexOf("," + objTempHidden.value.split("|")[1].toUpperCase() + ",") >= 0)
            {
                // Show the layer as non-filterable.
                if (document.getElementById("tblRowFilterData" + intCounter))
                    document.getElementById("tblRowFilterData" + intCounter).className = "disabledText";

                if (document.getElementById("lnkFilterAdd_" + intCounter))
                    document.getElementById("lnkFilterAdd_" + intCounter).style.display = "none";

                if (document.getElementById("divEditClear_" + intCounter))
                    document.getElementById("divEditClear_" + intCounter).style.display = "none";

                // Hide the filter icon next to the layer.
                if (document.getElementById("imgFilterData" + intCounter))
                    document.getElementById("imgFilterData" + intCounter).style.display = "none";

                // Disable the filter field.
                if (document.getElementById("hidFilter_" + intCounter))
                    document.getElementById("hidFilter_" + intCounter).disabled = true;
            }
        }
    }
}

function showFilterForm(pStrPopUpTitle, pNumLayerID, pStrAction, pStrHiddenID, pStrDivEditClear)
{
    var strUrl = "./jsp/showFilterForm.jsp";
    var strUrlParams = "layerID=" + pNumLayerID + "&fields=" + pStrHiddenID + "&lang=" + strLang;

    // Create a new XML HTTP object for AJAX operation.
    var oTempXmlHttp = getNewXmlHTTPObject();

    // Process the AJAX request.
    if (!isXmlHTTPNull(oTempXmlHttp))
        doXMLRequest(oTempXmlHttp, strUrl, strUrlParams, "post", false, "application/x-www-form-urlencoded");

    // Show the popup div.
    var objDivFiltersPopUp = createDivPopUp(pStrPopUpTitle, oTempXmlHttp.responseText, "divFiltersPopUp", "popUpDefaultModal popUpFilter", true, true);

    oTempXmlHttp = null;

    // Display the current filter in the filter pop up.
    if (pStrAction.toUpperCase() == "EDIT")
        document.getElementById("txtAreaWhere").value = document.getElementById(pStrHiddenID).value + " ";

    // Position the div.
    centerObjectWithin(objDivFiltersPopUp, (document.body || window));

    if (document.getElementById("txtSQLValue"))
        document.getElementById("txtSQLValue").focus();
}

function appendAttribFilter(pStrValue, pStrValueID, pStrObjSQLID, pStrObjOpID, pStrObjAttribID)
{
    var objSelOp = document.getElementById(pStrObjOpID);
    var objSelAttrib = document.getElementById(pStrObjAttribID);
    var objTxtSQL = document.getElementById(pStrObjSQLID);
    var objTxtValue = document.getElementById(pStrValueID);

    // Check to see if the user is adding a bracket.
    if ((pStrObjOpID == null) && (pStrObjAttribID == null))
       objTxtSQL.value += pStrValue + " ";
    else
    {
        // Compose the filter with the attribute, assignment operator and assignment value.
        var strFilter = "";
        if (objSelAttrib.options[objSelAttrib.selectedIndex].value.split("|")[0].toUpperCase().indexOf("VARCHAR") >= 0)
            strFilter = objSelAttrib.options[objSelAttrib.selectedIndex].value.split("|")[1] + " " + objSelOp.options[objSelOp.selectedIndex].value + " '" + objTxtValue.value + "' "
        else
            strFilter = objSelAttrib.options[objSelAttrib.selectedIndex].value.split("|")[1] + " " + objSelOp.options[objSelOp.selectedIndex].value + " " + objTxtValue.value + " "

        // If and "AND" or "OR" has been selected, check to see if the text field is empty.
        // If so, add the filter without the logical operands. Otherwise add the logical operand
        // and write the filter.
        if ((pStrValue == null) || (objTxtSQL.value.length == 0))
            objTxtSQL.value += strFilter;
        else
            objTxtSQL.value += pStrValue + " " + strFilter;
    }
}

function clearFilter(pStrFields)
{
    // Apply an empty filter.
    applyFilter(pStrFields, "");
}

function applyFilter(pStrField, pStrFilter)
{
    var objHidFilter = document.getElementById(pStrField);

    // Store the filter.
    objHidFilter.value = pStrFilter.trim();

    // Loop through all the hidden filters to hide/show the add/edit/clear buttons.
    var intCounter = 0
    while (document.getElementById("hidFilter_" + intCounter) != undefined)
    {
        if (document.getElementById("hidFilter_" + intCounter).value != "")
        {
            // Hide the add button, show the edit and clear buttons.
            if (document.getElementById("lnkFilterAdd_" + intCounter).style.display == "")
            {
                document.getElementById("lnkFilterAdd_" + intCounter).style.display = "none";
                document.getElementById("divEditClear_" + intCounter).style.display = "";

                // Show the filter icon next to the layer.
                if (document.getElementById("imgFilterData" + intCounter))
                    document.getElementById("imgFilterData" + intCounter).style.display = "";
            }
        }
        else
        {
            // Show the add button, hide the edit and clear buttons.
            if ((document.getElementById("lnkFilterAdd_" + intCounter).style.display.toUpperCase() == "NONE") && (!document.getElementById("hidFilter_" + intCounter).disabled))
            {
                document.getElementById("lnkFilterAdd_" + intCounter).style.display = "";
                document.getElementById("divEditClear_" + intCounter).style.display = "none";

                // Hide the filter icon next to the layer.
                if (document.getElementById("imgFilterData" + intCounter))
                    document.getElementById("imgFilterData" + intCounter).style.display = "none";
            }
        }

        intCounter ++;
    }

    // Close the filter pop up.
    closeFilterPopUp();

    // Refresh the map to reflect the filters.
    refreshMap(numMapID, getExcludedLayers().join(","), false);
}

function getFilters()
{
    if (!document.getElementById("frmFilters"))
        return "";

    var intCounter = 0
    var objHidFilterDataLayer = document.getElementById("frmFilters").hidFilterDataLayer;

    // Loop through the filter fields and compose filter string for the WMS.
    var strFilters = "";

    // Ensure that there are data layers.
    if (objHidFilterDataLayer)
    {
        // Get a count of data layer checkboxes.
        var intCheckCount = ((objHidFilterDataLayer.length == null) || (objHidFilterDataLayer.length == undefined)) ? 1 : objHidFilterDataLayer.length;

        // Loop through the hidden filter boxes.
        for (intCounter = 0; intCounter < intCheckCount; intCounter ++)
        {
            // Check to see if there is only 1 data layer row (1 data layer row gives an undefined length count).
            var objTempHidden = (intCheckCount == 1) ? objHidFilterDataLayer : objHidFilterDataLayer[intCounter];

            var objHidFilter = document.getElementById("hidFilter_" + intCounter);

            if (objHidFilter)
                if ((!objHidFilter.disabled) && (objHidFilter.value.length > 0))
                   strFilters += objTempHidden.value.split("|")[1] + ":" + objHidFilter.value + "|";
        }
    }

    // Return the filter string for the WMS.
    return strFilters.substring(0, strFilters.length - 1).trim();
}

function doAttributeChange(pObjSelect, pStrImgID)
{
    var objImgDateSelect = document.getElementById(pStrImgID);

    // Check to see if the attribute selected is a date data type. If so, show the calendar image.
    if (pObjSelect.options[pObjSelect.selectedIndex].value.split("|")[0].toUpperCase().indexOf("DATE") >= 0)
       objImgDateSelect.style.display = "";
    else
       objImgDateSelect.style.display = "none";
}

function showAttributeCalendar(pStrValueID)
{
    var objCalendar = new CalendarPopup("divCalendar");
    objCalendar.showNavigationDropdowns();

    // Show the calendar.
    objCalendar.select(document.getElementById(pStrValueID), "imgDateSelect", "yyyy-MM-dd");
}

function closeFilterPopUp()
{
    // Remove the div.
    removePopUp("divFiltersPopUp");
}
