﻿$(function () {
    initAutoComplete('input#searchBox', 300);
    initAutoComplete('input#centerSearch', 300);
    $.ui.autocomplete.prototype._renderItem = function (ul, item) {
        item.label = RedHighlight(item.label,$.trim(this.term));
        return $("<li></li>").data("item.autocomplete", item).append("<a>" + item.label + "</a>").appendTo(ul);
    };
});


function initAutoComplete(selector,maxresults)
{
    $(function () {

        //EnterKeypress event bind
        $(selector).bind('keypress', function (e) {
            var code = (e.keyCode ? e.keyCode : e.which);
            if (code == 13) { //Enter keycode
                var searchBox = $(selector);
                var value = searchBox.val();
                searchBox.val('');
                result(null, null, value);
            }
        });

        function result(item, value, term) {

            if (item) {
                window.location = '/controls/searchengine/guidedsearch.aspx?field.' + item.field + '=' + encodeURIComponent(value) + '&actual=' + encodeURIComponent(term);
                $(selector).unbind('keypress');
            }
            else {
                if (!term || !$.trim(term))
                    return false;
                window.location = '/search.aspx?keyword=' + term;
                $(selector).unbind('keypress');
            }
        }

        function callbackFunc(Result) {
        }
        
        $(selector).autocomplete({
            source: function (request, response) {
                $.ajax({
                    jsonp:false,
                    jsonpCallback: "callbackFunc",
                    cache: false,
                    url: (autocompleteJsonpRequestUrl != null && autocompleteJsonpRequestUrl != undefined && autocompleteJsonpRequestUrl!='') ? autocompleteJsonpRequestUrl : "http://www.plaisio.gr/controls/searchengine/solrjson.aspx",
                    dataType: "jsonp",
                    data: {
                        mode: "autocomplete",
                        q: $.trim(request.term),
                        callbackFunc:"callbackFunc"
                    },
                    success: function (data) {
                        if (!request.term || !$.trim(request.term)) {
                            response();
                            return;
                        }
                        var parsedresults = resultsParse(data.response, $.trim(request.term), maxresults);
                        response($.map(parsedresults,
                        function (item) {
                            return {
                                label: item.data.label,
                                value: item.data.label,
                                field: item.data.field,
                                rterm: request.term
                            }
                        }
                        ));
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        console.log(errorThrown);
                        response();
                    }
                });
            },
            minLength: 2,
            select: function (event, ui) {
                result(ui.item, ui.item.value, ui.item.rterm);
                return false;
            },
            focus: function (e, ui) {
                return false;
            },
            open: function () {
                $(this).removeClass("ui-corner-all").addClass("ui-corner-top");
            },
            close: function () {
                $(this).removeClass("ui-corner-top").addClass("ui-corner-all");
            }
        }); //autocomplete_ends
   });
}//InitAutoComplete

var termcache = {};
function addAccentSupport(term) {
    if (termcache[term])
        return termcache[term];
    var ret = term;
    var vowels = ["[ιίϊ]", "[αά]", "[οό]", "[υύϋ]", "[ηή]", "[ωώ]", "[εέ]"];
    for (var i in vowels) {
        ret = ret.replace(new RegExp(vowels[i], "gi"), vowels[i])
    }
    termcache[term] = ret;
    return ret;
};

function highlightRegex(token) {
    //escape the search term so that any regex-meaningful terms in the text typed by the user are treated as plain text. For example, the dot (.) is meaningful to regex.
    var escapedTerm = token.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1");
    return new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + addAccentSupport(escapedTerm) + ")(?![^<>]*>)(?![^&;]+;)", "gi");
};

/**
* counts the number of token matches in the result's value
*/
function assignMatchCount(result, term) {
    if (result.matchCount == undefined) {
        result.matchCount = countMatches(result.value, term);
    }
    return result.matchCount;
};

function countMatches(value, term) {
    var count = 0;
    var tokens = term.split(" ");
    for (var i in tokens) {
        if (highlightRegex(tokens[i]).test(value))
            count++;
    }
    return count;
}

function resultsParse(response, term,maxresults) {
    var listresults = [];
    
    var valueMatchesTerm = function (value) {
        var tokens = term.split(" ");
        for (var i in tokens) {
            if (!highlightRegex(tokens[i]).test(value))
                return false; //all tokens should match
        }
        return true;
    };
    
    var manageValues = function (values) {
        //for each result, only get first matching term
        //from field, discard the rest
        for (var i in values) {
            if (valueMatchesTerm(values[i])) {
                listresults.push({
                    data: { field:field , value: values[i], label: values[i] }
                });
                return;
            }
        }
    };
    var docs = response.docs.slice(0,maxresults);
    for (var i in docs) {
        for (var field in docs[i]) {
            if (docs[i][field] instanceof Array) {
                var values = docs[i][field];
                manageValues(values);
            }
            else {
                //field not an array
                var value = docs[i][field];
                manageValues([value]);
            }
        }
    }
    return listresults;
};

function setFocusBehaviour(hiddenTxt, searchBox, searchButton, focusNow) {
    var hiddenVal = hiddenTxt.val();
    searchButton.click(function () {
        if (searchBox.val() != hiddenVal)
            window.location = '/search.aspx?keyword=' + searchBox.val();
    });
    searchBox.val(hiddenVal);
    searchBox.focus(function () {
        if (searchBox.val() == hiddenVal)
            searchBox.val('');
    });
    searchBox.blur(function () {
        if (!searchBox.val())
            searchBox.val(hiddenVal);
    });
    //<%-- on page load set focus to search box--%>
    if (focusNow)
        searchBox.focus();
}

function RedHighlight(value, term) {
         var tokens = term.split(" ");
            var ret = value;
            for (var i in tokens) {
                ret = ret.replace(highlightRegex(tokens[i]), "<strong style=\"color:#d50000\">$1</strong>");
            }
            return ret;
}


