﻿

var selectedListItem = null;
var KEY_UP = 38;
var KEY_DOWN = 40;
var KEY_ENTER = 13;
var KEY_TAB = 9;
var KEY_ESC = 27;

var searchBoxArr = [];
var resultsDivArr = [];

function SetupPredictiveSearch(searchUrl, sBox, rDiv, maxResults) {
    var searchBox;
    var resultsDiv;
    var sBoxFound = false;
    var rDivFound = false;
    searchBox = sBox;
    resultsDiv = rDiv;
    var sBoxParts = [];
    var sBoxSelector = sBox.selector;
    sBoxParts = sBoxSelector.split("#");
    var sBoxName = sBoxParts[1];


    for (var i = 0; i < searchBoxArr.length; i++) {
        if (searchBoxArr[i] == sBoxName) {
            sBoxFound = true;
        }
    }
    if (!sBoxFound) {
        searchBoxArr[searchBoxArr.length] = sBoxName;
    }
    for (var i = 0; i < resultsDivArr.length; i++) {
        if (resultsDivArr[i] == rDiv) {
            rDivFound = true;
        }
    }
    if (!rDivFound) {
        resultsDivArr[resultsDivArr.length] = rDiv;
    }

    $(searchBox).attr('autocomplete', 'off');

    $(searchBox).keyup(function(e) {
        switch (e.keyCode) {
            case KEY_DOWN:
            case KEY_UP:
            case KEY_ESC:
                return;

            case KEY_ENTER:
                SubmitPredictiveSearch(searchBox);
                return false;

            case KEY_TAB:
                return false;

            default:
                var searchId = e.currentTarget.name;
                var searchStr = e.currentTarget.value;
                if (searchStr.length > 1) {
                    var searchArgs = "?s=" + searchStr;
                    if (maxResults) {
                        searchArgs = searchArgs + "&max=" + maxResults;
                    }
                    $.get(searchUrl + searchArgs, function(data) {
                        var html = "";

                        $(data).find("result").each(function() {
                            html = html + "<li><a href=\"#\"><span>";
                            html = html + AddSearchStringMarkers($(this).text(), searchStr);
                            html = html + "<span class=\"hidden\">" + $(this).attr("FullName") + "</span></span></a></li>"
                        });
                        if (html != "") {
                            var useDiv;
                            for (var i = 0; i < searchBoxArr.length; i++) {
                                var sBoxSelector = searchBoxArr[i].selector;
                                if (searchBoxArr[i] == e.currentTarget.id) {
                                    useDiv = resultsDivArr[i];
                                }
                            }
                        }
                        ShowSearchResults(html, useDiv, searchBox);
                    });
                }
                break;
        }
    });

    // Populates main search text box from selected item in predictive drop-down list
    function GetSelectedItemText(searchBox) {
        if (selectedListItem == null) return;
        else {
            var selectedText = $(selectedListItem).find("a").find(".hidden").text(); // get un-truncated condition name from hidden span
            if ((selectedText != null) && (selectedText != "")) {
                SelectText(selectedText, searchBox);
            }
        }
    }

    function AddSearchStringMarkers(text, searchStr) {

        var openingMarker = "<strong>";
        var closingMarker = "</strong>";

        var pos = 0;
        var pieceLength = searchStr.length;

        var returnText = "";

        var lowerSearchStr = searchStr.toLowerCase();
        while (pos < text.length) {

            if (text.substr(pos, pieceLength).toLowerCase() == lowerSearchStr) {

                returnText += text.substr(0, pos);
                returnText += openingMarker;
                returnText += text.substr(pos, pieceLength);
                returnText += closingMarker;
                text = text.substring(pos + pieceLength, text.length);
                pos = 0;
            }
            else {
                pos++;
            }
        }
        return returnText + text;
    }

    //keydown event looks for up and down arrows and moves the selection up and down the list
    $(searchBox).keydown(function(e) {
        if (e.keyCode == KEY_UP) {
            if (selectedListItem == null) {
                //select the first item in the list.
                selectedListItem = $("#results li:last");
                $(selectedListItem).addClass("selected");
            }
            else {
                //take off the currently selected item
                $(selectedListItem).removeClass("selected");

                //find the previous item in the list

                //we've reached the top, start from the bottom again.
                var firstItem = $("#results li:first");
                if ($(selectedListItem).text() == $(firstItem).text()) {
                    selectedListItem = $("#results li:last");
                }
                else {
                    selectedListItem = $(selectedListItem).prev();
                }
                $(selectedListItem).addClass("selected");
            }

            GetSelectedItemText(searchBox)
        }

        if (e.keyCode == KEY_DOWN) {
            if (selectedListItem == null) {
                //select the first item in the list.
                selectedListItem = $("#results li:first");
                $(selectedListItem).addClass("selected");
            }
            else {
                //take off the currently selected item
                $(selectedListItem).removeClass("selected");

                //find the next item in the list.

                //we've reached the end, start from the top again.
                var lastItem = $("#results li:last");
                if ($(selectedListItem).text() == $(lastItem).text()) {
                    selectedListItem = $("#results li:first");
                }
                else {
                    selectedListItem = $(selectedListItem).next();
                }
                $(selectedListItem).addClass("selected");
            }

            GetSelectedItemText(searchBox)
        }

        if (e.keyCode == KEY_ENTER)
            return false;

        if (e.keyCode == KEY_TAB && selectedListItem != null) {
            GetSelectedItemText(searchBox)
            CloseResultBox();
            return false;
        }

        if (e.keyCode == KEY_ESC) {
            CloseResultBox();
            selectedListItem = null;
        }
    });
}

function ShowSearchResults(results,useDiv,searchBox)
{
    //make it appear!
    //create container elements
    var oResults = document.createElement("div");
    oResults.id = "results";

    selectedListItem = null;

    if ($("#results") != null)
    {
        CloseResultBox(); //remove the box, if it exists
    }

    //if (IE6) {
    //    oResults.style.left=sLeft;
    //    oResults.style.top=sTop;
    //}
    var oPar = { type: 'p' };
    oPar = fCreateElement(oPar);
    var oLink = { type: 'a', id: 'hide-link', title: 'hide search suggestions' };
    oLink = fCreateElement(oLink);
    oLink.setAttribute('href', '#'); //Enables tabbing to 'Hide' link
    var sText = document.createTextNode('hide');
    oLink.appendChild(sText);
    var oSpan = { type: 'span', className: 'hidden' };
    oSpan = fCreateElement(oSpan);
    hideLinkHiddenText = ' search suggestions';
    sText = document.createTextNode(hideLinkHiddenText);
    oSpan.appendChild(sText);
    oLink.appendChild(oSpan);
    oPar.appendChild(oLink);
    oList = document.createElement("ul");
    oList.id = "pred-terms";
    oList.innerHTML = results;
    //construct object */
    oResults.appendChild(oList);
    oResults.appendChild(oPar);
    //add to page */
    $(useDiv).append(oResults);

    $(useDiv).find("a").click(function(e) {
        var newselectedText = $(e.currentTarget).find('.hidden').text(); // get un-truncated condition name from hidden span
        if (newselectedText == hideLinkHiddenText)
        {
            CloseResultBox();
        }
        if (newselectedText != hideLinkHiddenText)
        {
            SelectText(newselectedText, searchBox);
            SubmitPredictiveSearch(searchBox);
        }
        return false;
    });
}

// submit the search term!
function SubmitPredictiveSearch(searchBox)
{
    CloseResultBox();
    $(searchBox).parents('fieldset').find('input:submit').click();
}

function SelectText(selectedText,searchBox)
{
    $(searchBox).val(selectedText);
}

function CloseResultBox() {
    $("#results").remove(); //remove the box
}

//taken from choices.js
// Create and return a DOM element.
function fCreateElement(hElement)
{
    if (hElement.type)
    {
        var oElement = document.createElement(hElement.type);
        if (hElement.className)
        {
            oElement.className = hElement.className;
        }
        if (hElement.id)
        {
            oElement.id = hElement.id;
        }
        if (hElement.forTag)
        {
            oElement.htmlFor = hElement.forAttribute;
        }
        if (hElement.inputType)
        {
            oElement.type = hElement.inputType;
        }
        if (hElement.inputValue)
        {
            oElement.defaultValue = hElement.inputValue;
            oElement.value = hElement.inputValue;
        }
        if (hElement.elementName)
        {
            oElement.name = hElement.elementName;
        }
        if (hElement.href)
        {
            oElement.href = hElement.href;
        }
        if (hElement.title)
        {
            oElement.title = hElement.title;
        }
        if (hElement.tabindex)
        {
            oElement.tabIndex = hElement.tabindex;
        }
        return oElement;
    }
}
