﻿var flamenco_filterParams = {};
var flamenco_textboxParams = {};
var flamenco_pageNumber = 0;
var flamenco_totalNumberPages = 0;
var flamenco_sourceView;
var flamenco_sort;
var flamenco_sortDirection;
var flamenco_sessionKey;
var flamenco_pageSize;
var flamenco_targetObjectName;
var flamenco_persistFilters;
var flamenco_timeout = null;
var flamenco_query = $.query.get('s');

var searchSummaryItems;
var filtersActive = false;

$(window).load(function() {

    // Only wire up if there are flamenco controls on the page
    if ($("div._FlamencoCheckboxList").length > 0 || $("div._FlamencoTextbox").length > 0) {

        $("form").submit(function() { return false; });

        // Handle changes in an AutocompleteXtab 
        // Note - ".live" not supported with "change" event, so this can't handle dynamically generated AutocompleteXtabs - shouldn't be a problem
        $("._FlamencoCheckboxList div.AutocompleteXtab input._ValueHolder").bind("change", function(Event) {
            flamenco_pageNumber = 0;
            flamenco_performSearch();
        });

        // Handle key up on textbox inputs
        $("._FlamencoTextbox input:text").live("keyup", function(event) {
            event.preventDefault();
            if (this.value.length >= 3) {
                if (flamenco_timeout) clearTimeout(flamenco_timeout);
                flamenco_timeout = setTimeout(function() {
                    flamenco_pageNumber = 0;
                    flamenco_performSearch();
                }, 500);
            };
        });

        // Handle click on clear buttons in search summary
        $(".FlamencoSearchSummary a._ClearOneFlamencoSummaryFilter").live("click", function(event) {
            // Figure out how to clear this particular filter
            var targetElement = $("#" + $(this).attr("_TargetFilter"));
            var typeIdentifier = targetElement.attr("nodeName") + "_" + targetElement.attr("type");
            switch (typeIdentifier.toLowerCase()) {
                case 'p_AutocompleteXtab':
                    // AutocompleteXtab
                    var container = $('#' + targetElement.attr("_container"))[0];
                    var valueToRemove = targetElement.attr("_value");
                    Relational.AutocompleteXtab.remove(container, valueToRemove);
                case 'input_text':
                    // Textbox: clear out
                    targetElement.val('');
                case 'input_checkbox':
                    // Checkbox: 
                    targetElement[0].checked = false;
            }
            flamenco_pageNumber = 0;
            $(this).fadeOut('normal', function() {
                flamenco_performSearch();
            });
            event.preventDefault();
        });

        // CheckboxList: Handle "narrow by" button (populate checkboxlist if it was hidden)
        $("a._FlamencoShowFilterButton").bind("click", function(event) {
            var targetElement = $("#" + $(this).attr("_showtargetelement"))[0];
            flamenco_populateCheckboxList(targetElement);
        });

        // Watch tabpanels - when they become visible, populate any  flamenco checkboxlists they contain
        $(".TabPanel").watch("display,visibility", function() {
            if ($(this).is(":visible") == true) {
                $("._FlamencoCheckboxList", this).each(function() {
                    flamenco_populateCheckboxList(this);
                });
            };
        });

        // Checkboxlist: Handle click on clear button
        $("a._ClearOneFlamencoFilter").live("click", function(event) {
            var targetElement = $("#" + $(this).attr("_TargetElement"));
            flamenco_clearOneFilter(targetElement);
            event.preventDefault();
        });

        // Summary: Handle reset button
        $("a._ClearAllCheckboxLists").live("click", function(event) {
            $('._FlamencoCheckboxList input:checkbox').each(function(i) {
                this.checked = false;
            });
            $('._FlamencoTextbox input:text').each(function(i) {
                this.value = '';
            });
            flamenco_pageNumber = 0;
            $('.FlamencoSearchSummary a._ClearOneFlamencoSummaryFilter').fadeOut('normal');
            flamenco_performSearch();
            event.preventDefault();
        });

        // Pager: Handle "first" button
        $("a#flamenco_FirstButton").live("click", function(event) {
            flamenco_pageNumber = 0;
            flamenco_performSearch();
            event.preventDefault();
        });

        // Pager: Handle "back" button
        $("a#flamenco_BackButton").live("click", function(event) {
            flamenco_pageNumber = flamenco_pageNumber - 1;
            flamenco_performSearch();
            event.preventDefault();
        });

        // Pager: Handle "next" button
        $("a#flamenco_NextButton").live("click", function(event) {
            flamenco_pageNumber = flamenco_pageNumber + 1;
            flamenco_performSearch();
            event.preventDefault();
        });

        // Pager: Handle "last" button
        $("a#flamenco_LastButton").live("click", function(event) {
            flamenco_pageNumber = flamenco_totalNumberPages - 1;
            flamenco_performSearch();
            event.preventDefault();
        });

        flamenco_populateFilters();
        flamenco_performSearch(); // have to perform a search so we have results on first load
    };
});

flamenco_clearOneFilter = function(targetElement) {
    $('input:checkbox', targetElement).each(function(i) {
        this.checked = false;
    });
    $('input:text', targetElement).each(function(i) {
        this.value = '';
    });
    flamenco_pageNumber = 0;
    flamenco_performSearch();
}

flamenco_populateFilters = function() {
    // this only populates boxes that are visible. possibly search cookie to find filters that have values and set them to visible?
    flamenco_setStoredFilterCheckboxListsVisible();
    $("div._FlamencoCheckboxList:visible").each(function(i) {
        flamenco_populateCheckboxList(this);
    });
    var firstTextbox = true;
    $("div._FlamencoTextbox").each(function(i) {
        var targetfieldname = $(this).attr("_targetfieldname") || '';
        flamenco_registerTextbox(targetfieldname);
        if (flamenco_query != '' && firstTextbox) {
            $("input[type=text]", this).val(flamenco_query);
            firstTextbox = false; // the first textbox always gets the querystring value
        };
    });
    if (flamenco_persistFilters == true && flamenco_query == '') flamenco_restoreFilterStates();
}

flamenco_registerTextbox = function(targetFieldName) {
    var params = {};
    params["FlamencoSessionKey"] = flamenco_sessionKey;
    params["TargetObjectName"] = flamenco_targetObjectName;
    params["SourceView"] = flamenco_sourceView;
    params["TargetFieldName"] = targetFieldName;
    var paramsJson = JSON.stringify(params);
    $.ajax({
        url: "/Standard/Core/Services/Flamenco.svc/RegisterTextbox",
        async: false,
        type: "POST",
        data: paramsJson,
        dataType: "json",
        contentType: "application/json",
        success: function(msg) {
            // doesn't return a value so we don't care what gets returned
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            checkboxlist.html("Error: " + errorThrown + ' ' + textStatus);
        }
    });
}

flamenco_populateCheckboxList = function(el) {
    var targetXtabTable = $(el).attr("_targetxtabtable") || '';
    var sortBy = $(el).attr("_sortby") || '';
    var objectName = $(el).attr("_objectname") || '';
    var targetFieldName = $(el).attr("_targetfieldname") || '';
    var useInstance = $(el).attr("_useinstance") || false;
    var populateCheckbox = true;
    var strPopulateCheckbox = $(el).attr("_populateCheckbox") || '';
    if (strPopulateCheckbox.length > 0) populateCheckbox = (strPopulateCheckbox.toLowerCase() === 'true');
    var checkboxlist = $('div#' + objectName + '_CheckboxListTarget');
    var params = {};
    params["FlamencoSessionKey"] = flamenco_sessionKey;
    params["ID"] = el.id;
    params["ObjectName"] = objectName;
    params["TargetObjectName"] = flamenco_targetObjectName;
    params["TargetFieldName"] = targetFieldName;
    params["TargetXtabTable"] = targetXtabTable;
    params["SourceView"] = flamenco_sourceView;
    params["SortBy"] = sortBy;
    params["UseInstance"] = useInstance;
    var paramsJson = JSON.stringify(params);
    $.ajax({
        url: "/Standard/Core/Services/Flamenco.svc/PopulateCheckboxlist",
        async: false,
        type: "POST",
        data: paramsJson,
        dataType: "json",
        contentType: "application/json",
        success: function(msg) {
            if (!!msg.d) {
                if (populateCheckbox) checkboxlist.html(parseTemplate($("#" + objectName + "_CheckboxListTemplate").html(), msg));
                // Handle clicked checkboxes in a checkboxlist
                $("._FlamencoCheckboxList input:checkbox").unbind("click").bind("click", function(event) {
                    // Perform search
                    flamenco_pageNumber = 0;
                    $r.showProgress();
                    var t = setTimeout(flamenco_performSearch, 1); // Perform search asynchronously (so that other stuff, like the checkbox getting checked, happens without a delay)
                });
            } else {
                checkboxlist.html("No results.");
            }
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            checkboxlist.html("Error: " + errorThrown + ' ' + textStatus);
        }
    });
}

flamenco_surveyFilters = function() {
    flamenco_filterParams = {};
    flamenco_textboxParams = {};
    searchSummaryItems = {};
    filtersActive = false;
    $("div._FlamencoCheckboxList").each(function(i) {
        var filterName = this.id;
        var filterTitle = $(this).attr('title');
        var filterSummaryGroup = $(this).attr('_summarygroup') || 'Default';
        var filterIsNarrowingOnly = $(this).hasClass('_NarrowingOnly'); // e.g. Security Groups (don't constitute a search in themselves, but are used to narrow other filters).
        flamenco_filterParams[filterName] = new Array();
        // Cycle through checked checkboxes
        $("input:checkbox:checked", this).each(function() {
            if (!filterIsNarrowingOnly) filtersActive = true;
            flamenco_filterParams[filterName].push(this.value);
            // Add to summary items
            if (!searchSummaryItems[filterSummaryGroup]) searchSummaryItems[filterSummaryGroup] = new Array();
            this._label = String.format('{0}: <strong>{1}</strong>', filterTitle, $(this).attr("title"));
            searchSummaryItems[filterSummaryGroup].push(this);
        });
        // Add AutocompleteXtab values
        $(".AutocompleteXtabItem", this).each(function() {
            if (!filterIsNarrowingOnly) filtersActive = true;
            filtersActive = true;
            flamenco_filterParams[filterName].push($(this).attr("_value"));
            // Add to summary items
            if (!searchSummaryItems[filterSummaryGroup]) searchSummaryItems[filterSummaryGroup] = new Array();
            this._label = String.format('{0}: <strong>{1}</strong>', filterTitle, $(this).attr("title"));
            searchSummaryItems[filterSummaryGroup].push(this);
        });
    });
    $("div._FlamencoTextbox").each(function(i) {
        var filterName = this.id;
        var filterField = $(this).attr('_targetfieldname');
        var filterSummaryGroup = $(this).attr('summaryGroup') || 'Default';
        $("input:text", this).each(function() {
            var filterTitle = $(this).attr('_title');
            var filterValue = $(this).val() || '';
            if (filterValue == $(this).attr("title")) filterValue = '';
            flamenco_textboxParams[filterField] = filterValue;
            if (filterValue.length > 0) {
                filtersActive = true;
                if (!searchSummaryItems[filterSummaryGroup]) searchSummaryItems[filterSummaryGroup] = new Array();
                this._label = String.format('{0}: &ldquo;<strong>{1}</strong>&rdquo;', filterTitle, filterValue);
                searchSummaryItems[filterSummaryGroup].push(this);
            }
        });
    });
}

flamenco_bindSearchSummary = function() {
    $(".flamenco_SummaryGroup").html(''); // Clear out summary
    for (var summaryGroup in searchSummaryItems) {
        var summaryPlaceholder = $(".flamenco_SummaryGroup_" + summaryGroup);
        // Bind summary
        var parsedTemplate = parseTemplate($("#flamenco_SearchSummaryTemplate").html(), { d: searchSummaryItems[summaryGroup] });
        summaryPlaceholder.html(parsedTemplate);
    }
}

flamenco_bindPagedSearchResults = function() {
    var searchResultsTarget = $("div#flamenco_SearchResultsTarget")
    if (filtersActive == true || flamenco_showAllByDefault == true) {
        // Perform search
        $("._FlamencoFilterJsonHolder").val(JSON.stringify(flamenco_filterParams));
        $("._FlamencoTextboxFilterJsonHolder").val(JSON.stringify(flamenco_textboxParams));
        // Result count
        var resultCount = flamenco_getResultCount();
        $("span#flamenco_ResultCount").html(parseInt(resultCount).format("N0"));
        // Result sums
        $("span.flamenco_ResultSum").each(function() {
            var sumField = $(this).attr("_sumfield");
            if (!!sumField) {
                var resultSum = flamenco_getResultSum(sumField);
                $(this).html(parseInt(resultSum).format("N0"));
            }
        });
        // Hide instructions
        $("div#flamenco_SearchInstructions").hide();
        // Show search results
        if (searchResultsTarget.length > 0) {
            searchResultsTarget.show();
            var data = flamenco_getResults();
            if (!data) {
                searchResultsTarget.html("<div class='NoResults'>No results. Please try a different search.</div>");
            } else {
                searchResultsTarget.html(parseTemplate($("#flamenco_SearchResultsTemplate").html(), data));
                $(".Alternate table tr:odd, table.Alternate tr:odd").addClass("Alternate");
                $r.applyNupStyles();
                $r.applyDisplayStars();
                if (typeof (flamenco_resultsPopulated) != 'undefined') flamenco_resultsPopulated(); // Handle custom logic on page - DEPRECATED - USE DATABOUND EVENT
                $("div#flamenco_Pager").trigger("dataBound", { data: data });
            }
            $r.hideProgress();
            if (flamenco_persistFilters == true) flamenco_storeFilterStates();
            flamenco_configurePager(resultCount);
        } else {
            $r.hideProgress();
        }
    } else {
        // No search - show instructions
        $("span#flamenco_ResultCount").html("0");
        $("span#flamenco_ResultSum").html("0");
        $("div#flamenco_SearchInstructions").show();
        $("div#flamenco_SearchResultsTarget").hide();
        $("div#flamenco_Pager").hide();
        if (flamenco_persistFilters == true) flamenco_storeFilterStates();
        $r.hideProgress();
    }
    if (filtersActive == true) {
        $("div.FlamencoSearchSummary").show();
    } else {
        if ($("div.FlamencoSearchSummary").is("div.AlwaysShow") == false) $("div.FlamencoSearchSummary").hide();
    };
};

flamenco_performSearch = function() {
    $r.showProgress();
    flamenco_surveyFilters();
    flamenco_bindSearchSummary();
    flamenco_bindPagedSearchResults();
    flamenco_addWatermarks();
};

flamenco_getResultCount = function() {
    var resultCount = 0;
    var params = {};
    params["Filters"] = JSON.stringify(flamenco_filterParams);
    params["TextBoxFilters"] = JSON.stringify(flamenco_textboxParams);
    params["TargetObjectName"] = flamenco_targetObjectName;
    params["CustomCriteria"] = flamenco_customCriteria;
    params["FlamencoSessionKey"] = flamenco_sessionKey;
    params["SourceView"] = flamenco_sourceView;
    var paramsJson = JSON.stringify(params);
    $.ajax({
        url: "/Standard/Core/Services/Flamenco.svc/GetResultCount",
        async: false, // this is important - need to get a value back before continuing
        type: "POST",
        data: paramsJson,
        dataType: "json",
        contentType: "application/json",
        success: function(msg) {
            if (!!msg.d) {
                resultCount = msg.d;
            } else {
                resultCount = 0;
            }
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            debugger;
            resultCount = ("Error: " + errorThrown + ' ' + textStatus);
        }
    });
    return resultCount;
};

flamenco_getResultSum = function(sumField) {
    var resultSum = 0;
    var params = {};
    params["Filters"] = JSON.stringify(flamenco_filterParams);
    params["TextBoxFilters"] = JSON.stringify(flamenco_textboxParams);
    params["TargetObjectName"] = flamenco_targetObjectName;
    params["CustomCriteria"] = flamenco_customCriteria;
    params["FlamencoSessionKey"] = flamenco_sessionKey;
    params["SourceView"] = flamenco_sourceView;
    params["SumField"] = sumField;
    var paramsJson = JSON.stringify(params);
    $.ajax({
        url: "/Standard/Core/Services/Flamenco.svc/GetResultSum",
        async: false, // this is important - need to get a value back before continuing
        type: "POST",
        data: paramsJson,
        dataType: "json",
        contentType: "application/json",
        success: function(msg) {
            if (!!msg.d) {
                resultSum = msg.d;
            } else {
                resultSum = 0;
            }
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            debugger;
            resultSum = ("Error: " + errorThrown + ' ' + textStatus);
        }
    });
    return resultSum;
};

flamenco_allParamsJson = function() {
    var params = {};
    params["Filters"] = JSON.stringify(flamenco_filterParams);
    params["TextBoxFilters"] = JSON.stringify(flamenco_textboxParams);
    params["TargetObjectName"] = flamenco_targetObjectName;
    params["FlamencoSessionKey"] = flamenco_sessionKey;
    params["PageSize"] = flamenco_pageSize;
    params["CustomCriteria"] = flamenco_customCriteria;
    params["PageNumber"] = flamenco_pageNumber;
    params["SourceView"] = flamenco_sourceView;
    params["Sort"] = flamenco_sort;
    params["SortDirection"] = flamenco_sortDirection;
    return JSON.stringify(params);
}

flamenco_getResults = function(paged) {
    if (paged == null) { paged = true };
    var serviceMethod = paged ? "GetResults" : "GetAllResults"
    var data;
    $.ajax({
        url: "/Standard/Core/Services/Flamenco.svc/" + serviceMethod,
        async: false,
        type: "POST",
        data: flamenco_allParamsJson(paged),
        dataType: "json",
        contentType: "application/json",
        success: function(msg) {
            if (!!msg && !!msg.d && msg.d.length > 0) {
                msg.d = eval(msg.d); // Contents come back as JSON-string-within-JSON (only way I know to return a datatable) so we need to expand it
                data = msg;
            } else {
                return null;
            }
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            $r.hideProgress();
            searchResultsTarget.html("Error: " + errorThrown + ' ' + textStatus);
        }
    });
    return data;
}

flamenco_configurePager = function(numberResults) {
    if (numberResults > 0) {
        $("div#flamenco_Pager").show();
        $("span#flamenco_CurrentPage").html(flamenco_pageNumber + 1);
        flamenco_totalNumberPages = 0;
        if (numberResults > 0) {
            flamenco_totalNumberPages = parseInt((numberResults - 1) / flamenco_pageSize) + 1;
        }
        $("span#flamenco_TotalPages").html(flamenco_totalNumberPages);
        if ((flamenco_pageNumber + 1) > 1) {
            $("a#flamenco_BackButton").show();
            $("a#flamenco_FirstButton").show();
        }
        else {
            $("a#flamenco_BackButton").hide();
            $("a#flamenco_FirstButton").hide();
        }
        if ((flamenco_pageNumber + 1) < flamenco_totalNumberPages) {
            $("a#flamenco_NextButton").show();
            $("a#flamenco_LastButton").show();
        }
        else {
            $("a#flamenco_NextButton").hide();
            $("a#flamenco_LastButton").hide();
        }
        $("div#flamenco_Pager").show();
    }
    else {
        // no results - nothing to show
        $("div#flamenco_Pager").hide();
    }
}

flamenco_restoreFilterStates = function() {
    var lastSearchCookie = $.cookie(flamenco_id + "filterValues");
    if (!!lastSearchCookie) {
        var lastSearch = JSON.parse(lastSearchCookie);
        if (lastSearch != null) {
            flamenco_pageNumber = parseInt(lastSearch["PageNumber"]);
            var filters = JSON.parse(lastSearch["Filters"]);
            $.each(filters, function(filterName, filterValues) {
                var filter = $("div#" + filterName)[0];
                $.each(filterValues, function(j, value) {
                    // find the checkbox wit that value and check it
                    var thisCheckbox = $("input:checkbox[value=" + value + "]", filter);
                    if (thisCheckbox.length > 0) { thisCheckbox[0].checked = true; };// thisCheckbox.parents(".FlamencoCheckboxListContainer").find("._HideMeAndShowTargetButton").click(); };
                });
            });
            var textboxfilters = JSON.parse(lastSearch["TextBoxFilters"]);
            $.each(textboxfilters, function(filterName, filterValue) {
                var filterId = filterName.replace("\.", "_");
                if (filterValue.length > 0) $("div#" + filterId + " input:text").val(filterValue);
            });
        }
    }
}

flamenco_storeFilterStates = function() {
    $.cookie(flamenco_id + "filterValues", flamenco_allParamsJson(), { path: null });
}

flamenco_addWatermarks = function() {
    $("._FlamencoTextbox input:text").each(function(i) {
        // temporarily disabled watermarks in the adminsearchtoolbar, because they don't play nice with updatepanel 
        watermarkText = $(this).attr("title");
        if (!!watermarkText && watermarkText.length > 0) $(this).watermark(watermarkText, { className: 'Watermark' });
    });

}

flamenco_setStoredFilterCheckboxListsVisible = function() {
    var lastSearchCookie = $.cookie(flamenco_id + "filterValues");
    if (!!lastSearchCookie) {
        var lastSearch = JSON.parse(lastSearchCookie);
        if (lastSearch != null) {
            flamenco_pageNumber = parseInt(lastSearch["PageNumber"]);
            var filters = JSON.parse(lastSearch["Filters"]);
            $.each(filters, function(filterName, filterValues) {
                if (filterValues.length > 0) {
                    var $filter = $("div#" + filterName);
                    $filter.show();
                    var $showFilterButton = $filter.parent().find("a._FlamencoShowFilterButton");
                    $showFilterButton.hide();
                    
                }
            });
        }
    }
}
