onloadEvents = [];

window.onload = function()
{
    var length;
    var a = document.getElementsByTagName('a');

    length = a.length;

    for (i=0; i<length; i++)
    {
        if (a[i].className == 'confirm')
        {
            a[i].onclick = function()
            {
                return confirm('Sicher?')
            };
        }
    }

    length = onloadEvents.length;

    for (i=0; i<length; i++)
    {
        onloadEvents[i]();
    }
};


function focusThis(htmlRef)
{
    document.getElementById(htmlRef).focus();
}



NHO =

{

    appendNodes: function(parentNode, childNodes)
    {
        var anzahl = childNodes.length;

        for (var i=0; i<anzahl; i++)
        {
            parentNode.appendChild(childNodes[i]);
        }
    },


    removeChildNodes: function(node)
    {
        //if (!node.childNodes) return;

        var lastChild = node.childNodes.length-1;

        for (var i=lastChild; i>=0; i--)
        {
            node.removeChild(node.childNodes[i]);
        }
    },


    searchParentNode: function(childNode, parentNodeName)
    {
        var searchParent = childNode;
        parentNodeName = parentNodeName.toLowerCase();

        ret = null;

        while (searchParent.parentNode)
        {
            if (searchParent.parentNode.nodeName.toLowerCase() == parentNodeName)
            {
                ret = searchParent.parentNode;
                break;
            }

            searchParent = searchParent.parentNode;
        }

        return ret;
    },


    searchNextSiblingByNodeName: function(node, nextSiblingNodeName)
    {
        var searchSibling = node;
        nextSiblingNodeName = nextSiblingNodeName.toLowerCase();

        ret = null;

        while (searchSibling.nextSibling)
        {
            if (searchSibling.nextSibling.nodeName.toLowerCase() == nextSiblingNodeName)
            {
                ret = searchSibling.nextSibling;
                break;
            }

            searchSibling = searchSibling.nextSibling;
        }

        return ret;
    },


    searchPreviousSiblingByNodeName: function(node, previousSiblingNodeName)
    {
        var searchSibling = node;
        previousSiblingNodeName = previousSiblingNodeName.toLowerCase();

        ret = null;

        while (searchSibling.previousSibling)
        {
            if (searchSibling.previousSibling.nodeName.toLowerCase() == previousSiblingNodeName)
            {
                ret = searchSibling.previousSibling;
                break;
            }

            searchSibling = searchSibling.previousSibling;
        }

        return ret;
    }

}


function CSAjax()
{
    var self = this;
    var ajaxBO;

    var lastAjaxRequest;
    var lastAjaxUrl;
    var lastAjaxQuery;


    if (window.XMLHttpRequest)
        ajaxBO = new XMLHttpRequest();
    else
        if (window.ActiveXObject)
        {
            try
            {
                ajaxBO = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (ex)
            {
                try
                {
                    ajaxBO = new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch (ex) {}
            }
        }
        else
        {
            alert("Nutzung mit diesem Medium nicht möglich!");
            return;
        }


    function ajaxCallback(responseHandler)
    {
        if (ajaxBO.readyState < 4)
        {
            return;
        }
        else
        {
            if (ajaxBO.status != 200)
            {
                return
            }
            else
            {
                responseHandler();
            }
        }
    }

    this.sendAjaxByGet = function(request, responseHandler, sync)
    {
        var async = sync ? false : true;

        setRequestParams(request);

        if (ajaxBO.readyState)
        {
            ajaxBO.abort();
        }

        ajaxBO.open("GET", request, async);
        if (async)
        {
            ajaxBO.onreadystatechange = function() { ajaxCallback(responseHandler); };
        }
        ajaxBO.send(null);

        if (!async) { responseHandler(); }
    }

    function setRequestParams(request)
    {
        var urlParams = request.split('?');

        lastAjaxRequest = request;
        lastAjaxUrl = urlParams[0];
        lastAjaxQuery = urlParams[1];
    }

    this.getAjaxBO = function()
    {
        return ajaxBO;
    };


    this.getLastAjaxRequest = function()
    {
        return lastAjaxRequest;
    };

    this.getLastAjaxUrl = function()
    {
        return lastAjaxUrl;
    };

    this.getLastAjaxQuery = function()
    {
        return lastAjaxQuery;
    };
}


function Autosuggestions(params)
{
    var query = '';
    var onblur = false;
    var resultObject;
    var selectedIndex;
    var countSuggestions = 0;
    var suggestions;
    var countLetters = 2;
    var timer;
    var lastChars;

    var obligatorisch =
    [
        'watch', 'suggestionsBox', 'file'
    ];

    // optional: countLetters, submitCallback

    for (var i=0; i<obligatorisch.length; i++)
    {
        if (!params[obligatorisch[i]])
        {
            alert(obligatorisch[i] + ' is not set!');
            return;
        }
    }

    if (params.query && params.query.length)
    {
        query = '&' + params.query;
    }

    if (params.countLetters)
    {
        countLetters = params.countLetters;
    }

    var autosuggestions = new CSAjax();

    window.onclick = function()
    {
        NHO.removeChildNodes(params.suggestionsBox);
        params.suggestionsBox.style.display = 'none';
    }

    params.watch.setAttribute('autocomplete', 'off');

    params.watch.onkeyup = function(e)
    {
        taste = e ? e.which : event.keyCode;

        if (taste != 40 && taste != 38 && taste != 13)
        {
            clearTimeout(timer);
            if (navigator.appCodeName == 'Mozilla')
            {
                timer = setTimeout(sendRequest, 200);
            }
            else
            {
                timer = setTimeout(sendRequest, 20);
            }
        }
    };


    function sendRequest()
    {
        var chars = params.watch.value;

        if (chars == lastChars)
        {
            return;
        }

        lastChars = chars;

        if (chars.length < countLetters)
        {
            NHO.removeChildNodes(params.suggestionsBox);
            params.suggestionsBox.style.display = 'none';
            return;
        }

        var queryString = '?' + query + 'beginnWith=' + chars;

        var request = params.file + queryString;

        autosuggestions.sendAjaxByGet(request, getSuggestions, 1);
    }

    function getSuggestions()
    {
        selectedIndex = -1;

        var result = autosuggestions.getAjaxBO().responseText;

        if (!result)
        {
            NHO.removeChildNodes(params.suggestionsBox);
            params.suggestionsBox.style.display = 'none';
            return;
        }

        resultObject = eval('(' + result + ')');

        countSuggestions = resultObject.length;
        var entries = [];

        for (var i=0; i<countSuggestions; i++)
        {
            var div = document.createElement('div');

            div.appendChild(document.createTextNode(resultObject[i].text));

            div.onclick = function()
            {
                params.watch.value = this.firstChild.nodeValue;
                params.suggestionsBox.style.display = 'none';

                if (params.submitCallback)
                {
                    params.submitCallback(params.watch.value);
                }
            };


            div.onmousemove = function()
            {
                for (var i=0; i<countSuggestions; i++)
                {
                    suggestions[i].className = '';

                    if (suggestions[i] == this)
                    {
                        selectedIndex = i;
                    }
                }

                params.suggestionsBox.getElementsByTagName('div')[selectedIndex].className = 'selected';

                params.watch.value = this.firstChild.nodeValue;
            };

            params.watch.onkeydown = function(e)
            {
                taste = e ? e.which : event.keyCode;

                if (taste == 40)
                {
                    selectedIndex++;

                    if (selectedIndex >= countSuggestions)
                    {
                        selectedIndex = 0;
                    }

                    for (var i=0; i<countSuggestions; i++)
                    {
                        suggestions[i].className = '';
                    }

                    params.suggestionsBox.getElementsByTagName('div')[selectedIndex].className = 'selected';
                    params.watch.value = suggestions[selectedIndex].firstChild.nodeValue;
                }

                if (taste == 38)
                {
                    selectedIndex--;

                    if (selectedIndex < 0)
                    {
                        selectedIndex = countSuggestions-1;
                    }

                    for (var i=0; i<countSuggestions; i++)
                    {
                        suggestions[i].className = '';
                    }

                    params.suggestionsBox.getElementsByTagName('div')[selectedIndex].className = 'selected';
                    params.watch.value = suggestions[selectedIndex].firstChild.nodeValue;
                }
            };

            entries.push(div);
        }

        NHO.removeChildNodes(params.suggestionsBox);
        NHO.appendNodes(params.suggestionsBox, entries);
        suggestions = params.suggestionsBox.getElementsByTagName('div');

        params.suggestionsBox.style.display = 'block';
    }


    this.getSelectedIndex = function()
    {
        return selectedIndex;
    }


    this.getSelectedObject = function()
    {
        return resultObject[selectedIndex] && resultObject[selectedIndex].text == params.watch.value ? resultObject[selectedIndex] : null;
    }
}


onloadEvents.push(wortsuche);

function wortsuche()
{
    var params = {};

    params.file = '/ajax/autosuggest_woerter.php';
    params.watch = document.getElementById('wortsuche-input');
    params.suggestionsBox = document.getElementById('wortsuche-vorschlaege');
    params.countLetters = 1;
    params.submitCallback = function()
    {
        submitForm();
    }

    params.watch.form.onsubmit = function()
    {
        submitForm();
    }

    submitForm = function()
    {
        var inputText = suggest.getSelectedObject() != null ? suggest.getSelectedObject().url : params.watch.value;
        //params.watch.form.action = params.watch.form.action + inputText.replace(/ /g, '+');
        params.watch.form.submit();
    }

    var suggest = new Autosuggestions(params);
}
