﻿LabelHandler.initialize("ScriptResource");

(function() {
    var self = this;
    self._serviceUrl = "Admin/Moduler/OLA/Services/JsonSuperSearch.svc/Search?query=";
    self._currentQuery = undefined;
    self._cache = [];
    self._minLength = 3;
    self.ResultBox = undefined;

    self.GetClearedList = function(container) {
        // Retrieve the <ul> contained within the container. Only one is supposed
        // to exist. If none exist, one will be created. If one exists it will be
        // cleared of any <li>.

        container = $(container);
        var ul = container.find("ul");
        if (ul.length == 0) {
            ul = $('<ul>');
            container.append(ul);
        } else
            ul.find("li").remove();
        return ul;
    }

    self.SetStatusText = function(text) {
        self.ResultBox.find(".CS_status").text(text);
    };

    self.RenderWorks = function(works) {
        var list = self.GetClearedList(".CS_worksets");

        if (works.length > 0) {
            $.each(works, function(i, item) {
                var liHtml = '<a href="/work_details?workId=' + item.WorkId + '" id="' + item.Id + '"><span class="title">' + item.Title.Highlighted + '</span></a>';
                $.each(item.PartTitles, function(i, partTitle) { liHtml += ' <span class="partTitle">' + partTitle.Highlighted + '</span>'; });

                var li = $('<li></li>').append(liHtml).append('<div class="CS_info" />');
                list.append(li);
            });
        } else {
        list.append('<li><span>' + LabelHandler.ScriptResource.SuperSearch_Titles_NotFound + '</span></li>');
        }

        list.find("li:even").addClass("CS_odd");

        list.find("li a").hover(function() {
            var csInfo = $(this).parent().find(".CS_info");
            csInfo.show();

            if (!csInfo.hasClass("CS_loaded")) {
                var pos = $(this).parent().offset();
                var setId = $(this).attr("id");

                csInfo.css({
                    top: (pos.top + 40) + "px",
                    left: (pos.left + 10) + "px"
                });

                var url = "/Partials/RenderWorkSetHit.aspx?setId=" + setId;
                csInfo.load(url, function() { $(this).addClass("CS_loaded"); });
            }
        },
        function() {
            $(this).parent().find(".CS_info").hide();
        });
    };

    self.RenderContributors = function(contributors) {
        var list = self.GetClearedList(".CS_authors");

        if (contributors.length > 0) {
            $.each(contributors, function(i, item) {
                list.append('<li><a href="search?fContrib=' + encodeUTF8(item.Value.Value) + '">' + item.Value.Highlighted + '</a></li>');
            });
        } else {
            list.append('<li><span>' + LabelHandler.ScriptResource.SuperSearch_Authors_NotFound + '</span></li>');
        }

        list.find("li:even").addClass("CS_odd");
    };

    self.RenderGenres = function(genres) {
        var list = self.GetClearedList(".CS_genres");

        if (genres.length > 0) {
            $.each(genres, function(i, item) {
                var newText = $('<a href="search?fGenre=' + item.Value.Value + '">' + item.Value.Highlighted + '</a>');
                var newItem = $('<li></li>').append(newText);

                if (i < genres.length - 1)
                    newItem = newItem.append(', ');

                list.append(newItem);
            });
        } else {
            list.append('<li><span>' + LabelHandler.ScriptResource.SuperSearch_Subjects_NotFound + '</span></li>');
        }

        list.find("li:even").addClass("CS_odd");
    };

    self.RenderResult = function(result) {
        result = result.d;

        var currentQuery = $("#query").val();
        if (currentQuery == result.Query) {
            self.RenderWorks(result.Works);
            self.RenderContributors(result.Contributors);
            self.RenderGenres(result.Genres);
        }

        self.SetStatusText(LabelHandler.ScriptResource.SuperSearch_Search_Results);
    };

    self.ExecSearch = function(query) {
        if (self._currentQuery == query)
            return;

        self.ResultBox.show();
        self.SetStatusText(LabelHandler.ScriptResource.SuperSearch_Search_InProgress);

        var cacheKey = "__" + query;
        if (self._cache[cacheKey]) {
            self.RenderResult(self._cache[cacheKey]);
        } else {
            self._currentQuery = query;
            $.getJSON(this._serviceUrl + encodeUTF8(query), function(result) {
                self._cache["__" + result.d.Query] = result;
                self.RenderResult(result);
            });
        }
    };

    self.Attach = function() {
        self.ResultBox =
            $('<div class="CS_supersearch-result" style="display: none;" />')
                .append($('<div class="CS_inner CS_clearfix">')
                    .append($('<h2>')
                        .append('<span class="CS_status">' + LabelHandler.ScriptResource.SuperSearch_Search_Suggestions + '</span>')
                        .append('&nbsp;')
                        .append('<span>' + LabelHandler.ScriptResource.SuperSearch_Search_LimitSearch + '</span>')
                        .append('<span class="CS_close" title="' + LabelHandler.ScriptResource.SuperSearch_Close + '"></span>')
                            .click(function() { self.ResultBox.hide() })
                    )
                    .append($('<div class="CS_body CS_clearfix">')
                        .append('<div class="CS_worksets"><h3>' + LabelHandler.ScriptResource.SuperSearch_Titles +  '</h3></div>')
                        .append('<div class="CS_authors"><h3>' + LabelHandler.ScriptResource.SuperSearch_Authors + '</h3></div>')
                        .append('<div class="CS_genres"><h3>' + LabelHandler.ScriptResource.SuperSearch_Subjects + '</h3></div>')
                    )
                    .append($('<div class="CS_foot">')
                        .append($('<ul>')
                            .append('<li><a href="search?" class="CS_showAll">' + LabelHandler.ScriptResource.SuperSearch_ShowAll + '</a></li>')
                                .click(function() {
                                    self.ResultBox.hide();
                                    $("#mainsearch form").trigger('submit');
                                    return false;
                                })
                            .append('<li class="CS_advancedDirectorySearch"><a href="/utokadsok">' + LabelHandler.ScriptResource.SuperSearch_AdvancedSearch + '</a></li>')
                        )
                    )
                );
        $("#mainsearch").append(self.ResultBox);

        $("#query")
            .attr("autocomplete", "off")
            .keyup(function(event) {
                var DOM_VK_ENTER = 14;
                var DOM_VK_ESCAPE = 27;

                if (event.which == DOM_VK_ENTER || event.which == DOM_VK_ESCAPE) {
                    self.HideResultBox();
                    return;
                }

                var searchQuery = $(this).val();
                var searchType = $("#searchtype").val();

                if ((searchQuery.length >= self._minLength) && (searchType == "Biblioteket")) {
                    self.ExecSearch(searchQuery);
                } else {
                    self.GetClearedList(".CS_worksets");
                    self.GetClearedList(".CS_authors");
                    self.GetClearedList(".CS_genres");
                    self.ResultBox.hide();
                }
            });
    };

    $(document).ready(self.Attach);
})();
