﻿var jsonSearch_timeouts = [];
var jsonSearch_timeout = undefined;
var search_timeout = undefined;
var jsonSearch_Url = "Admin/Moduler/OLA/Services/JsonSuperSearch.svc/";
var jsonSearchObjects = new Array();
var jsonSearchObjects_last = 0;
var jsonCacheSize = 999;

function jsonSearch_delayed(jsonSearch_id, query, delay) {
    if (jsonSearch_timeouts[jsonSearch_id])
        window.clearTimeout(jsonSearch_timeouts[jsonSearch_id]);

    jsonSearch_timeouts[jsonSearch_id] = window.setTimeout('jsonSearch(' + jsonSearch_id + ', "' + query.replace('"', '\\"') + '")', delay);
}

function jsonSearch_clearTimeouts() {
    for (var jsonSearch_id = 0; jsonSearch_id < jsonSearch_timeouts.length; jsonSearch_id++) {
        if (jsonSearch_timeouts[jsonSearch_id]) {
            window.clearTimeout(jsonSearch_timeouts[jsonSearch_id]);
        }
    }
}

function jsonSearch(jsonSearch_id, query) {
    if (jsonSearch_id == 0)
        getTitles(query);

    if (jsonSearch_id == 1)
        getAuthors(query);

    if (jsonSearch_id == 2)
        getGenres(query);
}

function ignore(keyCode) {
    switch (keyCode) {
        case 8:
            if ($("#query").val().length < 3) {
                jsonSearch_clearTimeouts();
                $("#mainsearch .CS_searchresults").hide();
                return true;
            }

            break;
        case 46:
        case 27:
        case 13:
            jsonSearch_clearTimeouts();
            $("#mainsearch .CS_searchresults").hide();
            return true;
            break;

        case 40:
        case 38:
        case 37:
        case 39:
        case 33:
        case 34:
        case 36:
        case 35:
        case 45:
        case 44:
        case 9:
        case 16:
        case 17:
        case 18:
        case 19:
        case 20:
        case 144:
        case 145:
        case 112:
        case 113:
        case 114:
        case 115:
        case 116:
        case 117:
        case 118:
        case 119:
        case 120:
        case 121:
        case 122:
        case 123:
        case 91:
        case 92:
        case 93:
            return true;
            break;
    }
    return false;
}

function search(query) {
    if (search_timeout)
        window.clearTimeout(search_timeout);

    var cacheData = getCacheSearchObject(query, 0);

    if (cacheData != null) {
        parseTitle(query, cacheData);
    }
    else {
        jsonSearch_delayed(0, query, 200);
    }

    cacheData = getCacheSearchObject(query, 1);
    if (cacheData != null) {
        parseAuthors(query, cacheData);
    }
    else {
        jsonSearch_delayed(1, query, 220);
    }

    cacheData = getCacheSearchObject(query, 2);
    if (cacheData != null) {
        parseGenres(query, cacheData);
    }
    else {
        jsonSearch_delayed(2, query, 240);
    }
}

$(document).ready(function() {

    $("#query").attr("autocomplete", "off");
    $("#mainsearch").append('<div class="CS_searchresults" style="display: none;"><div class="CS_inner"/>');
    $("#mainsearch .CS_inner").append('<h2><span class="CS_status">Sökförslag</span> <span>Du kan fortsätta skriva för att avgränsa sökningen</span><span class="CS_close" title="Stäng ner sökresultat"/></h2>');
    $("#mainsearch .CS_inner").append('<div class="CS_body CS_clearfix"><div class="CS_left"><div class="CS_titles"/></div><div class="CS_right"><div class="CS_authors"/><div class="CS_genres"/></div></div>');
    $("#mainsearch .CS_inner").append('<div class="CS_foot"><ul><li><a href="search?" class="CS_showAll">Visa alla träffar</a></li>| <li class="CS_advancedDirectorySearch"><a href="/utokadsok">Utökad katalogsökning</a></li></ul></div>');
    $("#mainsearch .CS_inner .CS_titles").append('<h3>Titlar</h3>');
    $("#mainsearch .CS_inner .CS_authors").append('<h3>Författare</h3>');
    $("#mainsearch .CS_inner .CS_genres").append('<h3>Ämnesord</h3><div class="CS_words"/>');

    $("#query").keyup(function(event) {
        if (($(this).val().length > 2) && ($("#searchtype").val() == "Biblioteket")) {
            if (ignore(event.keyCode))
                return false;

            $("#mainsearch .CS_searchresults:hidden").show();

            var query = $(this).val();
            search_timeout = window.setTimeout('search("' + query.replace('"', '\\"') + '")', 30);
        } else {
            jsonSearch_clearTimeouts();
            $(".CS_titles ul li").remove();
            $(".CS_authors ul li").remove();
            $(".CS_genres div").html("");
            $("#mainsearch .CS_searchresults").hide();
        }
    });

    $("#mainsearch .CS_searchresults .CS_close").click(function() {
        $("#mainsearch .CS_searchresults").hide();
        jsonSearch_clearTimeouts();
    });

    $("#mainsearch .CS_searchresults .CS_showAll").click(function() {
        jsonSearch_clearTimeouts();
        $("#mainsearch .CS_searchresults").hide();
        $("#mainsearch form").trigger('submit');
        return false;
    });

});

function cacheSearchObject(query, data, type) {
    var jsonSearchObject = new Array(query, data, type);
    if (jsonSearchObjects.length == jsonCacheSize) {
        if (jsonSearchObjects_last >= (jsonSearchObjects.length - 1))
            jsonSearchObjects_last = 0;

        jsonSearchObjects.splice(jsonSearchObjects_last, 1, jsonSearchObject);
        jsonSearchObjects_last++;
    } else {
        jsonSearchObjects.push(jsonSearchObject);
    }
}

function getCacheSearchObject(query, type) {
    if (jsonSearchObjects == null || jsonSearchObjects.length == 0)
        return null;

    for (var i = 0; i < jsonSearchObjects.length; i++) {
        if (jsonSearchObjects[i][0] == query && jsonSearchObjects[i][2] == type)
            return jsonSearchObjects[i][1];
    }

    return null;
}

function getTitles(query) {
    if ($(".CS_titles ul").length == 0) {
        $(".CS_titles").append("<ul/>");
    }

    $("#mainsearch .CS_searchresults .CS_status").text("Sökning pågår..");

    $.getJSON(jsonSearch_Url + "SearchWorks?query=" + encodeUTF8(query), function(data) {
        cacheSearchObject(query, data, 0);
        parseTitle(query, data);
    });
}

function parseTitle(query, data) {
    if (data.d.Query == $("#query").val()) {
        $(".CS_titles ul li").remove();

        if (data.d.Objects.length > 0) {
            $.each(data.d.Objects, function(i, item) {
                $(".CS_titles ul").append('<li><a href="/work_details?workid=' + item.Id + '" id="' + item.Id + '">' + item.TitleHighlighted + '</a><div class="CS_info" /></li>');

                if (i == 10) return false;
            });
        } else {
            $(".CS_titles ul").append('<li><span>Hittade inga titlar</span></li>');
        }

        $(".CS_titles ul li:even").addClass("CS_odd");

        $("#mainsearch .CS_searchresults .CS_status").text("Sökresultat");

        $(".CS_titles ul li a").hover(function() {
            if (!$(this).parent().find(".CS_info").hasClass("CS_loaded")) {
                $(this).parent().find(".CS_info").show();

                var pos = $(this).parent().offset();

                $(this).parent().find(".CS_info").css({
                    top: (pos.top + 40) + "px",
                    left: (pos.left + 10) + "px"
                });

                var url = "/speed_search?workid=" + $(this).attr("id") + "&random=" + Math.random() * 99999;

                $(this).parent().find(".CS_info").load(url, function() {
                    $(this).addClass("CS_loaded");
                });
            } else {
                $(this).parent().find(".CS_info").show();
            }
        },
        function() {
            $(this).parent().find(".CS_info").hide();
        });
    }
}

function getAuthors(query) {
    if ($(".CS_authors ul").length == 0) {
        $(".CS_authors").append("<ul/>");
    }

    $.getJSON(jsonSearch_Url + "SearchContributors?query=" + encodeUTF8(query), function(data) {
        cacheSearchObject(query, data, 1);
        parseAuthors(query, data);
    });
}

function parseAuthors(query, data) {
    if (data.d.Query == $("#query").val()) {
        $(".CS_authors ul li").remove();

        if (data.d.Objects.length != 0) {
            $.each(data.d.Objects, function(i, item) {
                var sAuthor = item.Name;
                if (sAuthor.length > 0)
                    $(".CS_authors ul").append('<li><a href="search?contributor=' + encodeUTF8(sAuthor) + '">' + item.NameHighlighted + '</a></li>');

                if (i == 5) return false;
            });
        } else {
            $(".CS_authors ul").append('<li><span>Hittade inga författare</span></li>');
        }

        $(".CS_authors ul li:even").addClass("CS_odd");
    }
}

function getGenres(query) {
    $(".CS_genres div").addClass("CS_odd").html('<span>Hittade inga ämnesord</span>');

    $.getJSON(jsonSearch_Url + "SearchGenres?query=" + encodeUTF8(query), function(data) {
        cacheSearchObject(query, data, 2);
        parseGenres(query, data);
    });
}

function parseGenres(query, data) {
    if (data.d.Query == $("#query").val()) {
        $(".CS_genres div").html("");

        if (data.d.Objects.length != 0) {
            $.each(data.d.Objects, function(i, item) {
                if ($(".CS_genres div").html() != "")
                    $(".CS_genres div").append(', ');

                $(".CS_genres div").append('<a href="search?genre=' + item.Name + '">' + item.NameHighlighted + '</a>');

                if (i == 5) return false;
            });

            $(".CS_genres div").addClass("CS_odd");

            //Om tom --> inga träffar
            $(".CS_genres div:empty").html('<span>Hittade inga ämnesord</span>');
        } else {
            $(".CS_genres div").addClass("CS_odd").html('<span>Hittade inga ämnesord</span>');
        }
    }
}