﻿Event.observe(window, 'load', SetupDynamicAutoCompletes);

var dynamicInlineSearchPosition = -1;
var dynamicInlineSearchElements = new Hash();
var closeDropDown = true;
var dropDownClosed = true;
var customEnterMethod;

function SetupDynamicAutoCompletes()
{
    var values = dynamicAutoCompleteBoxes.values();

    for (var i = 0; i < values.length; i++)
    {
        var autoCompleteSourceBox = $(values[i]);
        var syntheticKey = values[i] + 'container';

        Event.observe(autoCompleteSourceBox, 'keyup', PerformDynamicAutoComplete);
        Event.observe(autoCompleteSourceBox, 'keydown', UpdateDynamicAutoComplete);
        Event.observe(autoCompleteSourceBox, 'keypress', StopFormSubmitOpera);
        Event.observe(autoCompleteSourceBox, 'blur', ClearDynamicAutoComplete);
        Event.observe(syntheticKey, 'focus', UnClearDynamicAutoComplete.bindAsEventListener(this, values[i]));
        Event.observe(syntheticKey, 'blur', UnClearDynamicAutoComplete.bindAsEventListener(this, values[i]));
        Event.observe(syntheticKey, 'mousedown', UnClearDynamicAutoComplete.bindAsEventListener(this, values[i]));

        var elements = $(syntheticKey).select('a');

        if (elements.length > 0)
        {
            dynamicInlineSearchElements.set(values[i], elements);
        }
    }
}

function UnClearDynamicAutoComplete(event, id)
{
    if (event.type == 'focus' || event.type == 'mousedown')
    {
        if (navigator.appName == 'Microsoft Internet Explorer' || navigator.appName == 'Opera')
        {
            var control = Event.element(event);

            closeDropDown = false;
        }
    }
    else
    {
        closeDropDown = true;

        $(id).focus();
    }
}

function ClearDynamicAutoComplete(event)
{
    var control = Event.element(event);

    setTimeout(
        function()
        {
            if (closeDropDown)
            {
                SetControlValueToggleDisplay(control.id, null, 'none');
            }
            else
            {
                closeDropDown = true;
            }
        }, 250);
}

function SetDynamicAutoCompleteValue(event, control, id)
{
    SetControlValueToggleDisplay(id, FixUpItemForInput(control.innerHTML), 'none');
}

function SetControlValueToggleDisplay(id, value, display)
{
    var syntheticID = id + 'container';
    var autoID = syntheticID + 'auto';
    var textBox = $(id);

    if (value != null)
    {
        textBox.focus();
        textBox.value = value;
    }

    textBox.value = textBox.value;

    if (display == 'block')
    {
        dropDownClosed = false;
    }

    $(autoID).style.display = display;

    if (dynamicInlineSearchPosition > 0)
    {
        dynamicInlineSearchElements.get(id)[dynamicInlineSearchPosition].className = '';
    }

    dynamicInlineSearchPosition = -1;
}

function PerformDynamicAutoComplete(event)
{
    var control = Event.element(event);
    var keyCode = event.keyCode ? event.keyCode : event.which;
    var letter = keyCode != Event.KEY_DOWN && keyCode != Event.KEY_UP && keyCode != Event.KEY_RETURN && keyCode != Event.KEY_ESC && keyCode != Event.KEY_TAB;

    if (letter && control.value.length > 0)
    {
        SetControlValueToggleDisplay(control.id, null, 'block');

        SetNextInlineSearchPosition(control);
    }
}

function HighlightDynamicAutoComplete(elements, previousPos, newPos)
{
    if (elements != null)
    {
        if (previousPos < 0)
        {
            previousPos = 0;
        }

        var prev = elements[previousPos];
        var next = elements[newPos];

        if (prev != null)
        {
            prev.className = '';
        }

        if (next != null && next.className == '')
        {
            next.className = 'dynamicAutoCompleteContainerHover';
        }
    }
}

function SetNextInlineSearchPosition(control)
{
    new Ajax.Request(UtilitiesHandler, {
        method: 'get',
        parameters: { method: 'DynamicAutoComplete', cacheBust: new Date().getTime(), id: control.id, textFragment: control.value },
        onSuccess: function(transport)
        {
            var rpcData = eval("(" + transport.responseText + ")");

            if (rpcData.OperationResult)
            {
                if (rpcData.Data[0] == control.value)
                {
                    if (rpcData.Data[2] == true)
                    {
                        var pos = rpcData.Data[1];

                        if (pos != null)
                        {
                            pos = parseInt(pos);

                            var elements = dynamicInlineSearchElements.get(control.id);
                            var container = $(control.id + 'container');

                            if (pos > dynamicInlineSearchPosition)
                            {
                                SetDynamicAutoCompleteLocation(elements, container, false, pos);
                            }
                            else
                            {
                                SetDynamicAutoCompleteLocation(elements, container, true, pos);
                            }
                        }
                    }
                    else
                    {
                        var words = rpcData.Data[1];

                        if (words != null)
                        {
                            var container = $(control.id + 'container');
                            var elements = new Array();

                            container.update();
                                              
                            for (var i = 0; i < words.length; i++)
                            {
                                var element = new Element('a', { 'href': 'javascript:void(0)', 'onclick': 'return SetDynamicAutoCompleteValue(event, this, \'' + control.id + '\');' }).update(decodeURI(words[i]));

                                container.insert(element);

                                elements.push(element);
                            }

                            dynamicInlineSearchElements.set(control.id, elements);

                            SetDynamicAutoCompleteLocation(elements, container, false, 0);
                        }
                    }
                }
            }
        }
    }
    );
}

function SetDynamicAutoCompleteLocation(elements, container, down, pos)
{
    if (down)
    {
        if (pos != null)
        {
            HighlightDynamicAutoComplete(elements, dynamicInlineSearchPosition, pos);

            dynamicInlineSearchPosition = pos;
        }
        else
        {
            dynamicInlineSearchPosition--;

            HighlightDynamicAutoComplete(elements, dynamicInlineSearchPosition + 1, dynamicInlineSearchPosition);
        }

        var scrollTop = dynamicInlineSearchPosition * 20;

        if (container.scrollTop > 0)
        {
            container.scrollTop = scrollTop;
        }
    }
    else
    {
        if (pos != null)
        {
            HighlightDynamicAutoComplete(elements, dynamicInlineSearchPosition, pos);

            dynamicInlineSearchPosition = pos;
        }
        else
        {
            dynamicInlineSearchPosition++;

            HighlightDynamicAutoComplete(elements, dynamicInlineSearchPosition - 1, dynamicInlineSearchPosition);
        }

        var scrollTop = dynamicInlineSearchPosition * 20;

        if (scrollTop > 190 || scrollTop < container.scrollTop)
        {
            setTimeout(
                function()
                {
                    container.scrollTop = scrollTop;
                }, 1);
        }
    }
}

function StopFormSubmitOpera(event)
{
    var keyCode = event.keyCode ? event.keyCode : event.which;

    if (keyCode == Event.KEY_RETURN)
    {
        Event.stop(event);
    }
}

function UpdateDynamicAutoComplete(event)
{
    var control = Event.element(event);
    var keyCode = event.keyCode ? event.keyCode : event.which;
    var elements = dynamicInlineSearchElements.get(control.id);
    var container = $(control.id + 'container');

    if (keyCode == Event.KEY_DOWN)
    {
        if (dynamicInlineSearchPosition < 0)
        {
            SetControlValueToggleDisplay(control.id, null, 'block');
        }

        if (elements != null && dynamicInlineSearchPosition < elements.length - 1)
        {
            SetDynamicAutoCompleteLocation(elements, container, false, null);
        }
    }
    else if (keyCode == Event.KEY_UP)
    {
        if (elements != null && dynamicInlineSearchPosition > 0)
        {
            SetDynamicAutoCompleteLocation(elements, container, true, null);
        }

        Event.stop(event);
    }
    else if (keyCode == Event.KEY_RETURN)
    {
        if (elements != null && dynamicInlineSearchPosition >= 0)
        {
            var element = elements[dynamicInlineSearchPosition];

            control.value = FixUpItemForInput(element.innerHTML);
            container.parentNode.parentNode.style.display = 'none';

            element.className = '';

            dynamicInlineSearchPosition = -1;

            dropDownClosed = true;
        }
        else
        {
            if (customEnterMethod != null)
            {
                customEnterMethod();
            }
        }

        Event.stop(event);
    }
    else if (keyCode == Event.KEY_ESC)
    {
        SetControlValueToggleDisplay(control.id, null, 'none');
    }
}

function FixUpItemForInput(value)
{
    var result = value;
    
    if (value.indexOf('"') == -1)
    {
        result = '"' + result + '"';
    }

    return result;
}