﻿// Developer: Ryan Bernard

var searchsuggestajax;
var searchsuggestget;
var searchsuggestscroll;
$(document).ready(function () {
    var form = $('#SearchForm');
    var kw = $('#SearchForm input[name=keyword]');
    $(form).submit(function () {
        closeSearchSuggetionsBox();
    });
    $(kw).attr('autocomplete', 'off');
    $(kw).keypress(function (event) {
        if (event.keyCode == 13) {
            enterKeyPressed();
        }
    });
    $(kw).keydown(function (event) {
        if (event.keyCode == 13) {
            enterKeyPressed();
        }
    });
    $(kw).keyup(function (event) {
        getKeyPress(event);
    });
    $(document).keypress(function (event) {
        return ignoreScroll(event);
    });
    $(document).keydown(function (event) {
        return ignoreScroll(event);
    });
    $(document).keyup(function (event) {
        return ignoreScroll(event);
    });
    function setCurrentScroll() {
        searchsuggestscroll = $(window).scrollTop();
    }
    function getCurrentScroll() {
        if (searchsuggestscroll && searchsuggestscroll >= 0 && $(window).scrollTop() != searchsuggestscroll) {
            $(window).scrollTop(searchsuggestscroll);
        }
    }
    function ignoreScroll(event) {
        if ($('.search-suggestions .search-suggestions-select').length > 0 && (event.keyCode == 38 || event.keyCode == 40)) {
            // don't scroll the page with arrows when search suggestions box is open
            event.preventDefault();
            return false;
        }
        return true;
    }
    function enterKeyPressed() {
        var hasSelected = false;
        if ($('.search-suggestions .search-suggestions-select').length > 0) {
            hasSelected = true;
        }
        if (hasSelected) {
            selectSearchSuggestion();
        }
        return false;
    }
    function backspaceKeyPressed() {
        unhighlightAllSearchSuggestions();
        //setCurrentScroll();
        $(kw).focus();
        //getCurrentScroll();
    }
    function closeSearchSuggetionsBox() {
        $('.search-suggestions').remove();
        $('#search-suggestions-anchor').remove();
        //setCurrentScroll();
        $(kw).focus();
        //getCurrentScroll();
    }
    function unhighlightAllSearchSuggestions() {
        $('.search-suggestions li').removeClass('search-suggestions-select');
    }
    function highlightSearchSuggestion(num) {
        unhighlightAllSearchSuggestions();
        $('.search-suggestions li:eq(' + num + ')').addClass('search-suggestions-select');
        //setCurrentScroll();
        $('#search-suggestions-anchor').focus();
        //getCurrentScroll();
    }
    function highlightThisSearchSuggestion(obj) {
        unhighlightAllSearchSuggestions();
        $(obj).addClass('search-suggestions-select');
        //setCurrentScroll();
        $('#search-suggestions-anchor').focus();
        //getCurrentScroll();
    }
    function selectSearchSuggestion() {
        var keyword = $('.search-suggestions .search-suggestions-select a').html();
        keyword = stripHTML(keyword);
        $(kw).attr('value', keyword);
        if (keyword != null && keyword != undefined && keyword != '') {
            closeSearchSuggetionsBox();
            $(form).submit();
        }
    }
    function selectThisSearchSuggestion(obj) {
        var keyword = $(obj).html();
        keyword = stripHTML(keyword);
        $(kw).attr('value', keyword);
        if (keyword != null && keyword != undefined && keyword != '') {
            closeSearchSuggetionsBox();
            $(form).submit();
        }
    }
    function getKeyPress(event) { // also called from anchor
        //alert(event.keyCode);

        var keywordList = [];
        var matchesFound = false;
        var i = 0;

        var arrowPressed = false;
        if (event.keyCode == 38 || event.keyCode == 40) {
            arrowPressed = true;
        }

        var suggestionsVisible = false;
        if ($('.search-suggestions').length > 0) {
            suggestionsVisible = true;
        }

        if (searchsuggestget) {
            clearTimeout(searchsuggestget);
        }
        searchsuggestget = setTimeout(function () {
            if (event.keyCode != 13 && event.keyCode != 27 && (!arrowPressed || !suggestionsVisible)) {
                // get results
                if (searchsuggestajax) {
                    searchsuggestajax.abort();
                }
                searchsuggestajax = $.ajax({
                    url: '/ajax_searchsuggestions.asp',
                    data: 'keyword=' + escape($(kw).attr('value')),
                    type: 'GET',
                    dataType: 'xml',
                    success: function (returnedXMLResponse) {
                        //alert('success');
                        $('suggestion', returnedXMLResponse).each(function () {
                            keywordList.push($(this).text());
                        });
                        if (keywordList.length > 0) {
                            for (var i = 0, len = keywordList.length; i < len; ++i) {
                                //alert(keywordList[i]);
                                matchesFound = true;
                            }
                        }
                        else {
                            //alert('no items');
                            matchesFound = false;
                        }
                    },
                    complete: function (returnedXMLResponse) {
                        //alert('complete');
                        if (matchesFound) {
                            //alert('matches found');
                            if ($('.search-suggestions').length == 0) {
                                $(kw).parent().append('<input type="button" id="search-suggestions-anchor" /><ul class="search-suggestions"></ul>');
                                var anchor = $('#search-suggestions-anchor');
                                $(anchor).keyup(function (event) {
                                    if (event.keyCode != 8 && event.keyCode != 13) {
                                        getKeyPress(event);
                                    }
                                });
                                $(anchor).keypress(function (event) {
                                    if (event.keyCode == 8) {
                                        backspaceKeyPressed();
                                    }
                                    else if (event.keyCode == 13) {
                                        enterKeyPressed()
                                    }
                                });
                                $(anchor).keydown(function (event) {
                                    if (event.keyCode == 8) {
                                        backspaceKeyPressed();
                                    }
                                });
                                $(anchor).blur(function () {
                                    //closeSearchSuggetionsBox();
                                });
                            }
                            var suggestionsHTML = $('.search-suggestions');
                            $(suggestionsHTML).children().remove();
                            for (var i = 0, len = keywordList.length; i < len; ++i) {
                                $(suggestionsHTML).append('<li><a>' + keywordList[i] + '</a></li>');
                            }
                            $('.search-suggestions a').each(function () {
                                $(this).highlight($(kw).attr('value'));
                            });
                            $('.search-suggestions a').click(function () {
                                selectThisSearchSuggestion(this);
                            });
                            $(".search-suggestions li").hover(
                                function () {
                                    // mouse enter
                                    highlightThisSearchSuggestion(this);
                                },
                                function () {
                                    // mouse leave
                                }
                            );
                            if (arrowPressed && !suggestionsVisible && $('.search-suggestions .search-suggestions-select').length == 0) {
                                // if ajax finished and we just opened a new search suggestion window and nothing has been selected, then select something
                                if (event.keyCode == 38) {
                                    // up arrow
                                    var bottom = $('.search-suggestions li').length - 1;
                                    highlightSearchSuggestion(bottom);
                                }
                                else if (event.keyCode == 40) {
                                    // down arrow
                                    highlightSearchSuggestion(0);
                                }
                            }
                        }
                        else {
                            closeSearchSuggetionsBox();
                        }
                    }
                });
            }
        }, 100);

        updateSearchSuggestions();

        function updateSearchSuggestions() {
            if (event.keyCode == 27) {
                // escape key
                closeSearchSuggetionsBox();
            }
            else if (event.keyCode == 13) {
                // enter key
                enterKeyPressed();
            }
            else if (arrowPressed) {
                // down arrow or up arrow
                if ($('.search-suggestions li').length > 0) {

                    // de-select textbox
                    //setCurrentScroll();
                    $('#search-suggestions-anchor').focus();
                    //getCurrentScroll();

                    var hasSelected = false;
                    if ($('.search-suggestions .search-suggestions-select').length > 0) {
                        hasSelected = true;
                    }
                    var selectedNum = null;
                    if (hasSelected) {
                        var i = 0;
                        $('.search-suggestions li').each(function () {
                            if ($(this).hasClass('search-suggestions-select')) {
                                selectedNum = i;
                            }
                            i++;
                        });
                    }
                    if (event.keyCode == 40) {
                        // down arrow
                        if (selectedNum == null) {
                            selectedNum = 0;
                        }
                        else {
                            selectedNum++;
                            if (selectedNum > $('.search-suggestions li').length - 1) {
                                selectedNum = 0;
                            }
                        }
                    }
                    else if (event.keyCode == 38) {
                        // up arrow
                        if (selectedNum == null) {
                            selectedNum = $('.search-suggestions li').length - 1;
                        }
                        else {
                            selectedNum--;
                            if (selectedNum < 0) {
                                selectedNum = $('.search-suggestions li').length - 1;
                            }
                        }
                    }
                    highlightSearchSuggestion(selectedNum);
                }
            }
        }
    }
});

function stripHTML(html) {
    return $('<div>' + html + '</div>').text();
}

// jquery.highlight-1.1.js (modified by ryan)
// http://www.unwrongest.com/projects/highlight/
(function ($) { $.fn.extend({ highlight: function (h) { function findText(a, b) { if (a.nodeType == 3) return searchText(a, b); else if (a.nodeType == 1 && a.childNodes && !(/(script|style)/i.test(a.tagName))) { for (var i = 0; i < a.childNodes.length; ++i) { i += findText(a.childNodes[i], b) } } return 0 } function searchText(a, b) { /* begin ryan's mod */ /* var c = a.data.toUpperCase().indexOf(b); */var c = -1; if (a.data) { c = a.data.toUpperCase().indexOf(b); } /* end ryan's mod */if (c >= 0) return highlight(a, c, b); else return 0 } function highlight(a, b, c) { var d = document.createElement('span'); d.className = 'highlight'; var e = a.splitText(b); var f = e.splitText(c.length); var g = e.cloneNode(true); d.appendChild(g); e.parentNode.replaceChild(d, e); return 1 } return this.each(function () { if (typeof h == 'string') findText(this, h.toUpperCase()); else for (var i = 0; i < h.length; ++i) findText(this, h[i].toUpperCase()) }) } }) })(jQuery);

