﻿function searchEngine() {
    var defaultAutoStartTime = 1500;
    var autoStartTime = defaultAutoStartTime;
    var timerDelay = 100;
    var timerActive = false;
    var timerID;

    var search_query;
    var current_request;
    var ajaxRequestInProgress;

    var rootCategoryToExpand;
    var subCategoryToExpand;
    
    var ajaxUrlsContainer = new Object();

    var isJavaScript = false;

    this.runSearch = runSearch;
    this.selectTab = selectTab;
    this.searchQueryChanged = searchQueryChanged;
    this.loadTreeRootLevelToDiv = loadTreeRootLevelToDiv;
    this.registerAjaxActionUrl = registerAjaxActionUrl;
    this.loadTreeSubLevelToDiv = loadTreeSubLevelToDiv;
    this.loadTreePartsLevelToDiv = loadTreePartsLevelToDiv;
    this.runSearchByParams = runSearchByParams;
    this.closeSearchBox = closeSearchBox;
    
    //**********************public functions****************************//

    function runSearchByParams(searchQuery, catalogId, chapterId, categoryId) {
        searchQuery = TrimSearchQuery(decodeURIComponent(searchQuery));
        
        if (!searchQuery || (searchQuery.length == 0)) {
            return;
        }

        search_query = searchQuery;
        
        $("#query").val(search_query).removeClass("watermark-text");

        rootCategoryToExpand = chapterId;
        subCategoryToExpand = categoryId;
        
        initSearchBox();
        resetSearchResults(); //reset previous search results

        initTabs(catalogId);
    }    
   
    function registerAjaxActionUrl(ajaxMethod, url) {
        ajaxUrlsContainer["ajax_" + ajaxMethod + "_ActionUrl"] = url;        
    }

    function runSearch(searchQuery) {
        blockSearch();

        searchQuery = TrimSearchQuery(decodeURIComponent(searchQuery));

        if (!searchQuery || (searchQuery.length == 0)) {
            return;
        }

        search_query = searchQuery;

        $("#query").val(search_query).removeClass("watermark-text");
        
        updateSearchQueryUrlParam(search_query);
        updateLangUrlParam();

        initSearchBox();
        resetSearchResults(); //reset previous search results
        initTabs();
    }

    function blockSearch() {
        $("#btnSearch").attr('disabled', 'disabled');        
        $("#btnSearch").click(
            function() {
                    return; 
                });        
        stopTimer();
    }

    function unblockSearch() {
        $("#btnSearch").click(
            function() {
                searchEngineObj.runSearch(encodeURIComponent($('#query').val())); return false;
            });

        $("#btnSearch").removeAttr('disabled');
    }
        
    //Update query String
    function updateSearchQueryUrlParam(query) {
        var urlParams = {};
        urlParams["query"] = query;
        saveToSearchHidden(urlParams);
    }

    function searchQueryChanged(e) {
        var chr = e.keyCode;
        var val = jQuery.trim(encodeURIComponent($("#query").val()));

        //user pressed enter
        //or query string length equals or more than 3 characters
        if ((val != '' && val.length > 2 && val != search_query) || (chr == 13)) {
            startTimer();
        }
        else {
            stopTimer();
        }
    }

    function loadTreeRootLevelToDiv(catalogId, catalogDivId) {
       
        $("#" + catalogDivId).css("height", "40px");
        showLoader(catalogDivId, "center");

        current_request = $.ajax({
            url: getAjaxActionUrl("GetRootLevelCategories"),
            data: ({ searchQuery: search_query, catalogName: catalogId }),
            dataType: "html",
            success: function(data) {
               
                var errData = getErrorMockUpIfErrorData(data);
                if (errData != "") {
                    data = errData;
                }

                hideLoader();

                $("#" + catalogDivId).css("height", "auto");
                $("#" + catalogDivId).html(data);

                if (rootCategoryToExpand) {
                    rootCategoryToExpand = rootCategoryToExpand.replace(/%20/g, " ");
                    $("#" + catalogDivId + " div[level='1'][category_name='" + rootCategoryToExpand + "']").click();
                    rootCategoryToExpand = null;
                }
            }
        });
    }

    function loadTreeSubLevelToDiv(sender) {
        var mode = $(sender).attr("mode");
        var catalogId = $(sender).attr("catalog_name");
        var categoryId = $(sender).attr("category_oid");
        var categoryName = $(sender).attr("category_name");

        /*Update Name param*/
        var queryParams = getUrlParamsAsArray($("#queryhidden").val(), true);
        queryParams["name"] = categoryName;
        queryParams["oid"] = null;
        saveToSearchHidden(queryParams);
        /*End Update Name param*/

        $(".validation-summary-errors-search").remove();
        $(".error_message_row").remove();
        
        switch (mode) {
            case "collapsed":
                if ($('div[mode="expanding"]').size() > 0) return;

                resetBreadCrumbs();
                collapseTreeNodes(1);

                $(sender).toggleClass("div-search-collapse");
                $(sender).toggleClass("div-search-expand");
                $(sender).attr("mode", "expanding");
                //$(sender).parents("td:first").append("<img style=\"float:left\" src=\"/Content/images/icons/loader_trans.gif\">");
                $(sender).parents("td:first").append("<div class=\"search-loader-trans\" />");

                current_request = $.ajax({
                    url: getAjaxActionUrl("GetSubLevelCategories"),
                    data: ({ searchQuery: search_query, catalogName: catalogId, chapterOid: categoryId }),
                    dataType: "html",
                    success: function(data) {

                        var errData = getErrorMockUpIfErrorData(data);
                        if (errData != "") {
                            $(sender).parents("tr:first").after(
		                        "<tr class=\"error_message_row\"><td colspan=\"2\" padding-left=\"20px\">"
		                            + errData + "</td></tr>");
                        }
                        else {
                            $(sender).parents("tr:first").after(data);
                        }

                        $("div.search-loader-trans", $(sender).parents("td:first")).remove();
                        $(sender).attr("mode", "expanded");
                        if (subCategoryToExpand) {
                            $("#" + getCatalogDivId(catalogId) + " div[level='2'][category_oid='" + subCategoryToExpand + "']").click();
                            subCategoryToExpand = null;
                        }
                    }
                });
                break;

            case "expanded":
                collapseTreeNodes(1);
                break;
                
            default:
                //do nothing
                break;
        }
    }

    function loadTreePartsLevelToDiv(sender) {
        var mode = $(sender).attr("mode");
        var catalogId = $(sender).attr("catalog_name");
        var categoryId = $(sender).attr("category_oid");
        var chapterId = $(sender).attr("chapter_oid") ? $(sender).attr("chapter_oid") : -1;

        /*Update OID param*/
        var queryParams = getUrlParamsAsArray($("#queryhidden").val(), true);
        queryParams["oid"] = categoryId;
        saveToSearchHidden(queryParams);
        /*End Update OID param*/

        var parentLevel = getParentLevelForParts(catalogId);

        $(".validation-summary-errors-search").remove();
        $(".error_message_row").remove();
        
        switch (mode) {
            case "collapsed":
                if ($('div[mode="expanding"]').size() > 0) return;

                resetBreadCrumbs();
                collapseTreeNodes(parentLevel);

                $(sender).toggleClass("div-search-collapse");
                $(sender).toggleClass("div-search-expand");

                $(sender).attr("mode", "expanding");
                //$(sender).parents("td:first").append("<img style=\"float:left\" src=\"/Content/images/icons/loader_trans.gif\">");
                $(sender).parents("td:first").append("<div class=\"search-loader-trans\" />");

                current_request = $.ajax({
                    url: getAjaxActionUrl("GetPartsList"),
                    data: ({ searchQuery: search_query, catalogName: catalogId, chapterOid: chapterId, categoryOid: categoryId }),
                    dataType: "html",
                    success: function(data) {

                        var errData = getErrorMockUpIfErrorData(data);
                        if (errData != "") {
                            $(sender).parents("tr:first").after(
                                "<tr class=\"error_message_row\"><td colspan=\"2\" padding-left=\"" +
                                    (parentLevel == 1 ? "20px" : "40px") + "\">" + errData + "</td></tr>");
                        }
                        else {
                            $(sender).parents("tr:first").after(data);
                            $(sender).parents("tr:first").next("tr").children("td:first")
                                .css("padding-left", (parentLevel == 1 ? "20px" : "40px"));
                            initBreadCrumbs(catalogId, categoryId);
                        }

                        $("div.search-loader-trans", $(sender).parents("td:first")).remove();
                        $(sender).attr("mode", "expanded");
                    }
                });
                break;

            case "expanded":
                collapseTreeNodes(parentLevel);
                break;

            default:
                //do nothing
                break;
        }
    }

    function selectTab(catalogId) {

        $(".validation-summary-errors-search").remove();

        /*Update Catalog param*/
        var queryParams = getUrlParamsAsArray($("#queryhidden").val(), true);
        if (isJavaScript) {
            queryParams["catalog"] = catalogId;
            isJavaScript = false;
        } else {
            queryParams["catalog"] = catalogId;
            queryParams["name"] = null;
            queryParams["oid"] = null;
        }
        saveToSearchHidden(queryParams);
        /*End Update Catalog param*/
        
        resetBreadCrumbs();
        
        var parentCatalogDivId = getCatalogParentDivId();
        var catalogDivId = getCatalogDivId(catalogId);

        //hide current catalog with search results
        $("#" + parentCatalogDivId).children("div").hide();

        //make active necessary tab
        $("#ulTabsHeaders li.tabs-selected:first").toggleClass("tabs-selected");
        $("#ulTabsHeaders li[catalog_id=" + catalogId + "]").toggleClass("tabs-selected");

        //make active necessary div
        if ($("#" + catalogDivId).length == 0) { //no element found
            createCatalogDiv(catalogDivId);
            loadTreeRootLevelToDiv(catalogId, catalogDivId);
        }
        $("#" + catalogDivId).show();
    }

    function closeSearchBox() {
        resetSearchResults();
        $("#divSearchHeaderTabs").removeAttr('style').empty();
        $("#divSearchResultsContainer").empty();
        $("#divSearchResultsTarget").removeAttr('style');
    }

    //**********************private functions****************************//

    function TrimSearchQuery(searchQuery) {
        
        searchQuery = jQuery.trim(searchQuery);

        if (searchQuery.length > 255) {
            searchQuery = searchQuery.substring(0, 255);
        }

        return searchQuery;
    }
    
    function getAjaxActionUrl(ajaxMethod) {
        return ajaxUrlsContainer["ajax_" + ajaxMethod + "_ActionUrl"];
    }

    function collapseTreeNodes(level) {
        if (level == 1 || level == 2) {
            $("#searchResultRows div[level=\"" + (level + 1) + "\"]").parents("tr").remove();
            $("#searchResultRows div[level=\"" + (level + 2) + "\"]").parents("tr").remove();
            var roots = $("#searchResultRows div[level=\"" + level + "\"][mode=\"expanded\"]");
            roots.attr("mode", "collapsed");
            roots.toggleClass("div-search-expand");
            roots.toggleClass("div-search-collapse");
        }
    }

    function resetBreadCrumbs() {
        $("#divBreadCrumb").html("");
        $("#divBreadCrumb").hide();
    }

    function initBreadCrumbs(catalogId, categoryId) {
        var crumbUrls = $("#divBreadCrumbUrls_" + catalogId + "_" + categoryId).html();
        if (crumbUrls != "") {
            $("#divBreadCrumb").html(crumbUrls);
            $("#divBreadCrumb").show();
        }
        else {
            $("#divBreadCrumb").html("");
            $("#divBreadCrumb").hide();
        }
        var crumbParts = $("#divBreadCrumb_" + catalogId + "_" + categoryId).html();
        if (crumbParts != "") {
            $("#divPartsBreadCrumb").html(crumbParts);
        }
        else {
            $("#divPartsBreadCrumb").parents("tr:first").remove();
        }
    }

    function initTabs(catalogToSelect) {

        $(".validation-summary-errors-search").remove();
        
        showLoader("divSearchResultsTarget", "center");

        current_request = $.ajax({
            url: getAjaxActionUrl("GetSearchTabsControlView"),
            data: ({ searchQuery: search_query }),
            dataType: "html",
            success: function(data) {

                var errData = getErrorMockUpIfErrorData(data);
                if (errData != "") {
                    data = "<li style=\"list-style-type:none\">" + errData + "</li>";
                }

                $('#divSearchHeaderTabs').html(data);

                expandSearchBox();
                hideLoader();

                if ($("ul#ulTabsHeaders li").filter("[catalog_id]").length > 0) {
                    var catalogId = null;
                    if (catalogToSelect) {
                        catalogId = catalogToSelect;
                    }
                    else {
                        catalogId = $("ul#ulTabsHeaders li.tabs-selected:first", data).attr("catalog_id");
                    }
                    isJavaScript = true;
                    selectTab(catalogId);
                }

                unblockSearch();
            }
        });
    }
    
    function startTimer() {
        if (timerActive) {
            stopTimer();
        }
        timerActive = true;
        tickTimer();
    }

    function stopTimer() {
        if (timerActive) {
            clearTimeout(timerID);
            timerActive = false;
            autoStartTime = defaultAutoStartTime;
        }
    }

    function tickTimer() {
        if (autoStartTime <= 0) {
            stopTimer();
            runSearch(encodeURIComponent($("#query").val()));
        }
        else {
            autoStartTime -= timerDelay;
            timerID = setTimeout(function() { tickTimer(); }, timerDelay);
        }
    }

    function getCatalogParentDivId() {
        return "divSearchResultsContainer";
    }

    function getCatalogDivId(catalogId) {
        return "div" + catalogId + "Content";
    }

    function abortSearch() {
        if (current_request) {
            current_request.abort(); 
        }
        this.searchQuery = "";
    }

    function resetSearchResults() {
        abortSearch();
        resetBreadCrumbs();
        collapseSearchBox();
        var parentDivId = getCatalogParentDivId();
        if ($("#" + parentDivId + " div").length > 0) {
            $("#" + parentDivId + " div").remove();
        }
    }

    function createCatalogDiv(catalogDivId) {
        var catalogParentDivId = getCatalogParentDivId();
        $("#" + catalogParentDivId).append("<div id=\"" + catalogDivId + "\"></div>");
    }

    function initSearchBox() {
        collapseSearchBox();
    }

    function expandSearchBox() {
        $("#divSearchResultsTarget").css("height", "auto");
        $("#divSearchResultsTarget").show();
        $("#searchResultTable").show();
        $("#searchResultsClose").show();
        $("#divSearchResultsContainer").show();
        $("#divSearchHeaderTabs").css("visibility", "visible");
        $("#divSearchHeaderTabs").css("height", "auto");
    }

    function collapseSearchBox() {
        $("#divSearchResultsTarget").css("height", "auto");
        $("#divSearchResultsTarget").show();
        $("#searchResultTable").hide();
        $("#searchResultsClose").hide();
        $("#divSearchResultsContainer").hide();
        $("#divSearchHeaderTabs").css("visibility", "hidden");
        $("#divSearchHeaderTabs").css("height", "40px");
    }
     
    function getParentLevelForParts(catalogId) {
        if (catalogId.toUpperCase() == 'PENTAPARTSLIST'){
            return 1;
        }
        else {
            return 2;
        }
    }

    function createErrorBox(message) {
        var html =
		"<ul class=\"validation-summary-errors-search\" style=\"margin-top:10px;margin-left:5px;margin-right:5px;\"><li>"
		    + message + "</li></ul>";
        return html;
    }

    function getErrorMockUpIfErrorData(data) {
        try {
            if (isJson(data)) {
                var obj = jQuery.parseJSON(data);
                if (obj.error != null && obj.error) {
                    return createErrorBox(obj.errorMessage);
                }
            }
        } catch (e) {
        }
        return "";
    }
}

var searchEngineObj = new searchEngine();

$(document).ready(function() {
    $("#query").keyup(searchEngineObj.searchQueryChanged);

    var searchQuery = queryString("query");
    var catalogId = queryString("catalog");
    var chapterId = queryString("name");
    var categoryId = queryString("oid");
    if (searchQuery != null) {
        var array = {};
        array["query"] = searchQuery;
        array["catalog"] = catalogId;
        array["name"] = chapterId;
        array["oid"] = categoryId;
        array["query"] = decodeURIComponent(array["query"]);

        saveToSearchHidden(array);
    }
    
    if (searchQuery != null && catalogId == null && chapterId == null && categoryId == null) {
        searchEngineObj.runSearch(searchQuery);
    }

    if (searchQuery != null && catalogId != null && chapterId == null && categoryId == null) {
        searchEngineObj.runSearchByParams(searchQuery, catalogId, null, null);
    }

    if (searchQuery && catalogId && chapterId) {
        searchEngineObj.runSearchByParams(searchQuery, catalogId, chapterId, categoryId);
    }
});

$(function() {
    if ($.browser.msie && $.browser.version == "6.0") {
        $("#searchResultTable").removeClass("table-search-results").addClass("table-search-results-ie6");
    }
})
