﻿$(function () {

    /* Initialization */
    var inputID = "txtSearch";
    var containerID = "autosuggestionBox";
    var oldPattern = "";
    var minLength = 1;
    var duration = 350; //delay (ms)
    var cookieName = "autoCompleteState";
    var lastSerchCookieName = "lastSearch";
    var autoCompleteStateControlId = 'autosuggestionShow';
    var isActive = true;
    var navFormId = 'FormNav';
    var selIndex = -1;
    var resultLength = 0; 
    var timer;

    function initialize() {
        isActive = getStateFromCookie();
        bindHandler(isActive);
        if (!isActive) {
            addActivationBox(isActive);
        }
        $(document).click(function () {
            clearList();
        });
        $('#' + inputID).click(function (event) {
            event.stopPropagation();
        });
        $('#' + navFormId).submit(addSearchQueryToCookie);
    };

    function addSearchQueryToCookie(a, b, c, d) {
        var searchValue = $('#' + inputID).val();
        var cookieTemp0, cookieTemp1, cookieTemp2, temp;
        cookieTemp0 = GetCookie(lastSerchCookieName + '0');
        cookieTemp1 = GetCookie(lastSerchCookieName + '1');
        cookieTemp2 = GetCookie(lastSerchCookieName + '2');
        if (!cookieTemp0 || (cookieTemp0 && cookieTemp0 === searchValue)) {
            cookieTemp0 = searchValue;
            SetCookie(lastSerchCookieName + '0', cookieTemp0, 86400);
            return;
        } else if (!cookieTemp1 || (cookieTemp1 && cookieTemp1 === searchValue)) {
            temp = cookieTemp0;
            cookieTemp0 = searchValue;
            cookieTemp1 = temp;
            SetCookie(lastSerchCookieName + '0', cookieTemp0, 86400);
            SetCookie(lastSerchCookieName + '1', cookieTemp1, 86400);
        } else if (!cookieTemp2 || (cookieTemp2 && cookieTemp2 === searchValue)) {
            temp = cookieTemp0;
            cookieTemp0 = searchValue;
            cookieTemp2 = cookieTemp1;
            cookieTemp1 = temp;
            SetCookie(lastSerchCookieName + '0', cookieTemp0, 86400);
            SetCookie(lastSerchCookieName + '1', cookieTemp1, 86400);
            SetCookie(lastSerchCookieName + '2', cookieTemp2, 86400);
        } else {
            temp = cookieTemp0;
            cookieTemp0 = searchValue;
            cookieTemp2 = cookieTemp1;
            cookieTemp1 = temp;
            SetCookie(lastSerchCookieName + '0', cookieTemp0, 86400);
            SetCookie(lastSerchCookieName + '1', cookieTemp1, 86400);
            SetCookie(lastSerchCookieName + '2', cookieTemp2, 86400);
        }
    };

    function addHistoricalItems() {
        var cookie = GetCookie(lastSerchCookieName + '0');
        if (!cookie) {
            return;
        }
        var historyTitle = $('#HistoryItemsTitle').val();
        $('#autosuggestionHide').before($('<h2>' + historyTitle + '</h2>'));
        $('#autosuggestionHide').before($('<ol class="history">'));
        var li = $('<li>' + cookie + '</li>');
        li.click(mouseClick);
        li.mouseover(mouseHandler);
        $(".history").append(li);
        resultLength += 1;
        for (var i = 1; i < 3; i += 1) {
            cookie = GetCookie(lastSerchCookieName + i);
            if (cookie) {
                li = $('<li>' + cookie + '</li>');
                li.click(mouseClick);
                li.mouseover(mouseHandler);
                $(".history").append(li);
                resultLength += 1;
            }
        }
    };

    function addActivationBox() {
        var activateTitle = $('#ActivateSuggestionsLink').val();
        var activationBox = $('<a href="#" id="' + autoCompleteStateControlId + '" title="' + activateTitle + '"> <span class="icon autosuggestion"/></a>');
        activationBox.click(changeState);
        activationBox.insertAfter($("#" + containerID));
    };

    function removeActivationBox() {
        $('#' + autoCompleteStateControlId).remove();
    };

    var changeState = function () {
        isActive = !isActive;
        saveStateToCookie(isActive);
        bindHandler(isActive);
        if (isActive === false) {
            addActivationBox();
            clearList(isActive);
        } else {
            removeActivationBox();
            callAutocomplete(isActive);
        }
    };

    var abortSuggestion = function () {
        if (oldPattern != "") {
            clearSelection();
            $("#" + inputID)[0].value = oldPattern;
        }
    };

    function saveStateToCookie(state) {
        SetCookie(cookieName, state, 10000000);
    };

    function getStateFromCookie() {
        var cookie = GetCookie(cookieName);
        if (!cookie || cookie === 'true') {
            return true;
        } else {
            return false;
        }
    };

    function callAutocomplete(forceCall) {
        var pattern = $("#" + inputID).val();
        if (pattern.length >= minLength) {
            if (pattern != oldPattern || forceCall) {
                selIndex = -1;
                getAutocompleteItems(pattern, countryNr, partnerNr);
            }
        } else {
            clearList();
        }
    };

    // Bind the debounced handler to the keyup event.

    function bindHandler(value) {
        var input = $("#" + inputID);
        if (value) {
            input.mouseover(abortSuggestion);
            input.keyup(keyupHandler);
        } else {
            input.unbind('keyup');
            input.unbind('mouseover');
        }
    };

    function addStateLink() {
        var highlightWord = $('#RemoveSuggestionsListLink').val();
        var li = $('<a href="#" id="autosuggestionHide"><span class="icon delete"/>' + highlightWord + '</a>');
        li.click(changeState);
        li.mouseover(clearSelection);
        li.insertAfter($("#" + containerID + " ol"));
    };

    function addWord(pattern, word) {
        var insensitiveRegEx = new RegExp(pattern, "i");
        var highlightWord = word.replace(insensitiveRegEx, "<span class='user'>" + pattern + "</span>");
        var li = $('<li class="autosuggestionUnsel">' + highlightWord + '</li>');
        li.click(mouseClick);
        li.mouseover(mouseHandler);
        li.appendTo($("#" + containerID + " ol"));
    };

    function clearList() {
        $("#" + containerID).empty();
        $("#" + containerID).hide();
    };

    function keyupHandler(evt) {
        // Release scheduled timer
        var result = true;
        switch (evt.which) {
            case 40:
                {
                    if (selIndex < resultLength - 1) {
                        clearSelection();
                        setSelection(++selIndex);
                    }
                    result = false;
                    break;
                }
            case 38:
                {
                    if (selIndex > 0) {
                        clearSelection();
                        setSelection(--selIndex);
                    }
                    result = false;
                    break;
                }
            case 27:
                {
                    clearList();
                    result = false;
                    break;
                }
            case 13:
                {
                    mouseClick();
                    result = false;
                    break;
                }
            default:
                {
                    if (timer) {
                        clearTimeout(timer);
                    }
                    timer = setTimeout(function () { callAutocomplete(); }, duration);
                    result = false;
                }
        }

        // allow default event model execution.
        return result;
    }

    function clearSelection() {
        $("#" + containerID + " li").removeClass("autosuggestionSel");
        $("#" + containerID + " li").attr("class", "autosuggestionUnsel");
    }

    function setSelection(index) {
        $("#" + inputID)[0].value = $("#" + containerID + " li:eq(" + index + ")").text().replace("<span class='user'>", '').replace("</span>", '');
        $("#" + containerID + " li:eq(" + index + ")").removeClass("autosuggestionUnsel");
        $("#" + containerID + " li:eq(" + index + ")").addClass("autosuggestionSel");
    }

    //Mouse Events
    var mouseHandler = function () {
        selIndex = $(this).index() + ($(this).parent().hasClass('history') ? 10 : 0);
        clearSelection();
        setSelection(selIndex);
    };

    var mouseClick = function () {
        if ('pageTracker' in window && pageTracker) {
            pageTracker._trackEvent("Search", "AutoComplete", $("#" + inputID).val());
        } else if ('_gaq' in window && _gaq) {
            _gaq.push(['_trackEvent', 'Search', 'AutoComplete', $("#" + inputID).val()]);
        }
        $('#' + navFormId).submit();
    };

    //Call WCF Search Service

    function getAutocompleteItems(searchpattern, countryNr, partnerNr) {
        $.ajax({
            type: "GET",
            url: "/SearchProvider/AutoComplete/GetItems?searchPattern=" + searchpattern + "&countryNr=" + countryNr + "&partnerNr=" + partnerNr,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            processdata: true,
            success: function (result) {
                if (result.length > 0) {
                    clearList();
                    $("<ol>").appendTo($("#" + containerID));
                    resultLength = result.length;
                    for (var i = 0; i < resultLength; i++) {
                        addWord(searchpattern, result[i].SearchWord);
                    }
                    addStateLink();
                    $("#" + containerID).show();
                    oldPattern = $("#" + inputID).val();
                    addHistoricalItems();
                } else {
                    clearList();
                }
            }
        });
    }

    initialize();
});

/******************* END SCRIPT Auto Completion *********************/

