var ac_http = getHTTPObject();

function autoComplete(control)
{
    this.queryField = document.getElementById(control.id + '_field');
    this.resultsDiv = document.getElementById(control.id + '_results');
    this.operatorField = document.getElementById(control.id + '_operator');
    this.idField = document.getElementById(control.id + '_id');

    queryField.onfocus = startCompletion;
    queryField.onblur = stopCompletion;
    queryField.setAttribute("autocomplete", "off");

    var running = false;
    var lastInput = null;
    var resultsArray = null;

    var frequency = 50;
    var currentSelection = -1;

    function init(input)
    {
        this.control = input.parentNode.parentNode;
        this.queryField = document.getElementById(control.id + '_field');
        this.resultsDiv = document.getElementById(control.id + '_results');
        this.operatorField = document.getElementById(control.id + '_operator');
        this.idField = document.getElementById(control.id + '_id');

        this.queryImageName = document.getElementById(control.id + '_queryProgress').innerHTML;
        this.queryImage = document.getElementById(queryImageName);
        this.querySourceName = document.getElementById(control.id + '_querySource').innerHTML;
        this.querySource = document.getElementById(querySourceName);
        this.submitId = document.getElementById(control.id + '_submitId').innerHTML;
        this.submitControl = document.getElementById(submitId);
        this.threshold = document.getElementById(control.id + '_threshold').innerHTML;

        queryField.onkeydown = highlightCompletion;
        queryField.onfocus = startCompletion;
        queryField.onblur = stopCompletion;
    }

    function startCompletion()
    {
        init(this);
        running = true;
        if (lastInput == null) this.value = "";
        setTimeout(function(){autoCompleteLoop();}, frequency);
    }

    function stopCompletion()
    {
        running = false;
        setTimeout("this.resultsDiv.innerHTML = ''", 200);
        setTimeout("this.resultsDiv.style.display = 'none'", 200);
    }

    function autoCompleteLoop()
    {
        if (!running)
        {
            return;
        }

        newInput = queryField.value;

        if (newInput.length < this.threshold)
        {
            resultsDiv.innerHTML = "";
            resultsDiv.style.display = "none";
            lastInput = newInput;
            setTimeout(function(){autoCompleteLoop();}, frequency);
            return;
        }

        if (lastInput != newInput)
        {
            try
            {
                currentSelection = -1;
                type = (querySource != null) ? querySource.options[querySource.selectedIndex].value : querySourceName;
                url = getCompleteURL() + "?" + getParamType() + "=" + type + "&"
                        + getParamInput() + "=" + encodeURIComponent(newInput) + "&"
                        + getParamFestivalId() + "=" + getCurrentFestivalId();

                ac_http.open("GET", url, true);
                ac_http.onreadystatechange = handleCompleteResponse;
                if (queryImage!= null) queryImage.style.display = "inline";
                ac_http.send(null);
            }
            catch(e) {}
        }

        lastInput = newInput;
        setTimeout(function(){autoCompleteLoop();}, frequency);
        return true;
    }

    function handleCompleteResponse()
    {
        if (ac_http.readyState == 4)
        {
            if (queryImage != null) queryImage.style.display = "none";

            resultsArray = eval(ac_http.responseText);

            while (resultsDiv.childNodes.length > 0)
            {
                resultsDiv.removeChild(resultsDiv.childNodes[0]);
            }

            if (resultsArray == null || resultsArray.length == 0)
            {
                resultsDiv.innerHTML = "";
                resultsDiv.style.display = "none";
                
                return;
            }
            else
            {
                resultsDiv.style.display = "inline";
            }

            for (i = 0; i < resultsArray.length; i++)
            {
                var key = resultsArray[i][0];
                var keyId = resultsArray[i][1];
                var value = resultsArray[i][2];

                var entry = document.createElement("div");
                entry.className = "autocompletediv";
                entry.id = "autocompletediv" + i;
                resultsDiv.appendChild(entry);

                var leftspan = document.createElement("span");
                leftspan.className = "autocompletekey";
                leftspan.id = key;
                leftspan.title = key;
                leftspan.onclick = clickCompletion;
                leftspan.innerHTML = "<nobr>" + key + "</nobr>";
                entry.appendChild(leftspan);

                var rightspan = document.createElement("span");
                rightspan.className = "autocompletevalue";
                // rightspan.innerHTML = value;

                if (value >= 0)
                {
                    var textspan = document.createElement("span");
                    textspan.innerHTML = format(value);
                    textspan.className = 'autocompletetxt';

                    var imgspan = document.createElement("img");
                    imgspan.src = getImageDir() + 'avg.gif';
                    imgspan.className = 'autocompleteimg';

                    rightspan.appendChild(textspan);
                    rightspan.appendChild(imgspan);
                    entry.appendChild(rightspan);
                }
            }

            if (resultsArray.length == 1)
            {
                currentSelection = 0;
                document.getElementById("autocompletediv0").className = "autocompletedivselected";
            }
        }
    }

    function highlightCompletion(e)
    {
        if (e == null) e = window.event;

        if (resultsArray == null)
        {
            return;
        }

        switch ((e.keyCode) ? e.keyCode : e.which)
        {
            case 9:     //tab
                if (currentSelection < 0 || currentSelection > resultsArray - 1)
                {
                    return;
                }
                resultsDiv.innerHTML = "";
                resultsDiv.style.display = "none";
                lastInput = unescapeHTML(resultsArray[currentSelection][0]);
                queryField.value = lastInput;
                operatorField.value = "=";
                idField.value = resultsArray[currentSelection][1];
                break;
            case 13:    //return
                if (currentSelection < 0 || currentSelection > resultsArray - 1)
                {
                    return;
                }
                resultsDiv.innerHTML = "";
                resultsDiv.style.display = "none";
                lastInput = unescapeHTML(resultsArray[currentSelection][0]);
                queryField.value = lastInput;
                operatorField.value = "=";
                idField.value = resultsArray[currentSelection][1];
                if (submitControl != null && navigator.appName == "Microsoft Internet Explorer") submitControl.click();
                break;
            case 38:    //up
                for (i = 0; i < resultsArray.length; i++)
                {
                    var divi = document.getElementById("autocompletediv" + i);
                    if (divi != null) divi.className = "autocompletediv";
                }
                currentSelection = (currentSelection > -1) ? currentSelection - 1 : resultsArray.length - 1;
                selected = document.getElementById("autocompletediv" + currentSelection);
                if (selected != null) selected.className = "autocompletedivselected";
                // prevent duplicate events on safari
                if (e.stopPropagation) e.stopPropagation();
                if (e.preventDefault) e.preventDefault();
                break;
            case 40:    //down
                for (i = 0; i < resultsArray.length; i++)
                {
                    var divi = document.getElementById("autocompletediv" + i);
                    if (divi != null) divi.className = "autocompletediv";
                }
                currentSelection = (currentSelection < resultsArray.length - 1) ? currentSelection + 1 : -1;
                selected = document.getElementById("autocompletediv" + currentSelection);
                if (selected != null) selected.className = "autocompletedivselected";
                // prevent duplicate events on safari
                if (e.stopPropagation) e.stopPropagation();
                if (e.preventDefault) e.preventDefault();
                break;
            default:
                operatorField.value = "ilike";
                break;
        }
    }

    function clickCompletion()
    {
		if( this.innerText ) // ie version
			queryField.value = this.innerText;
		else // firefox & safari
        	queryField.value = this.textContent;
        operatorField.value = "=";
    }
}