var autocomplete_textfields = new Array();
var autocomplete_textfield = null;
var autocomplete_request = null;
var autocomplete_oldins = -1;
var autocomplete_posi = -1;
var autocomplete_words = new Array();
var autocomplete_input = "";
var autocomplete_key;

function autocomplete_setVisible(visi)
{
    if (autocomplete_textfield == null)
        return;
    var sh = document.getElementById("autocomplete_shadow");
    var op = document.getElementById("autocomplete_output");
    sh.style.position = 'absolute';
    sh.style.backgroundColor = autocomplete_textfield.shadow_color;
    sh.style.top =  (autocomplete_findPosY(autocomplete_textfield.textfield)+3)+"px";
    sh.style.left = (autocomplete_findPosX(autocomplete_textfield.textfield)+2)+"px";
    sh.style.width = autocomplete_textfield.textfield.clientWidth + "px";
    op.style.borderColor = autocomplete_textfield.border_color;
    op.style.color = autocomplete_textfield.color;
    op.style.backgroundColor = autocomplete_textfield.background;
    if (window.attachEvent && !window.opera)
        op.style.width = (autocomplete_textfield.textfield.clientWidth - 2) + "px";
    else
        op.style.width = (autocomplete_textfield.textfield.clientWidth - 5) + "px";
    sh.style.visibility = visi;
}

function autocomplete_findPosX(obj)
{
    var curleft = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            curleft += obj.offsetLeft;
            obj = obj.offsetParent;
        }
    }
    else if (obj.x)
        curleft += obj.x;
    return curleft;
}

function autocomplete_findPosY(obj)
{
    var curtop = 0;
    if (obj.offsetParent){
        curtop += obj.offsetHeight;
        while (obj.offsetParent){
            curtop += obj.offsetTop;
            obj = obj.offsetParent;
        }
    }
    else if (obj.y){
        curtop += obj.y;
        curtop += obj.height;
    }
    return curtop;
}

function autocomplete_start( passed_id )
{
    autocomplete_textfield = null;
    for ( i = 0; i < autocomplete_textfields.length; i++ ) {
        if (autocomplete_textfields[i].id == this.id || autocomplete_textfields[i].id == passed_id) {
            autocomplete_textfield = autocomplete_textfields[i];
            break;
        }
    }
    if (autocomplete_textfield == null)
        return;
    var ins = autocomplete_textfield.textfield.value;
    if (autocomplete_oldins == ins)
        return;
    else if (autocomplete_posi > -1)
        autocomplete_textfield.textfield.selPos = ins.length;
    else if (ins.length > 0) {
        if (autocomplete_request != null)
            autocomplete_request.abort();
        autocomplete_clearOutput();
        var outp = document.getElementById("autocomplete_output");
        var sp = document.createElement("div");
        sp.style.textAlign = "center";
        sp.innerHTML = "<img src=\"" + autocomplete_textfield.basedir + "img/gallery/loading.gif\" alt=\"Loading\" />";
        outp.appendChild(sp);
        autocomplete_setVisible("visible");
        autocomplete_input = autocomplete_textfield.textfield.value;
        autocomplete_words = Array();
        autocomplete_request = ajaxGetRand(autocomplete_textfield.request(ins), autocomplete_textfield.results)
    }
    else {
        autocomplete_setVisible("hidden");
        autocomplete_posi = -1;
    }
    autocomplete_oldins = ins;
}

function addWord(word, label) {
    autocomplete_request = null;
    autocomplete_words[autocomplete_words.length] = word;
    var outp = document.getElementById("autocomplete_output");
    var sp = document.createElement("div");
    sp.innerHTML = label;
    sp.onmouseover = mouseHandler;
    sp.onmouseout = mouseHandlerOut;
    sp.onclick = mouseClick;
    sp.style.cursor = "default";
    outp.appendChild(sp);
}

function autocomplete_clearOutput() {
    var outp = document.getElementById("autocomplete_output");
    while (outp.hasChildNodes()){
        noten=outp.firstChild;
        outp.removeChild(noten);
    }
    autocomplete_posi = -1;
    autocomplete_words = Array();
}

function setColor (_posi, _color, _forg){
    var outp = document.getElementById("autocomplete_output");
    outp.childNodes[_posi].style.background = _color;
    outp.childNodes[_posi].style.color = _forg;
}

function keygetter(event){
    if (!event && window.event)
        event = window.event;
    if (event)
        autocomplete_key = event.keyCode;
    else
        autocomplete_key = event.which;
}

function keyHandler(event){
    if (autocomplete_textfield == null)
        return;
    if (document.getElementById("autocomplete_shadow").style.visibility == "visible") {
        var outp = document.getElementById("autocomplete_output");
        if (autocomplete_key == 40) {
            // Key down
            if (autocomplete_words.length > 0 && autocomplete_posi <= autocomplete_words.length-1) {
                if (autocomplete_posi >=0)
                    setColor(autocomplete_posi, autocomplete_textfield.background, autocomplete_textfield.color);
                else
                    autocomplete_input = autocomplete_textfield.textfield.value;
                setColor(++autocomplete_posi, autocomplete_textfield.sel_background, autocomplete_textfield.sel_color);
                autocomplete_textfield.textfield.value = autocomplete_words[autocomplete_posi];
            }
        }
        else if (autocomplete_key == 38){
            // Key up
            if (autocomplete_words.length > 0 && autocomplete_posi >= 0) {
                if (autocomplete_posi >=1) {
                    setColor(autocomplete_posi, autocomplete_textfield.background, autocomplete_textfield.color);
                    setColor(--autocomplete_posi, autocomplete_textfield.sel_background, autocomplete_textfield.sel_color);
                    autocomplete_textfield.textfield.value = autocomplete_words[autocomplete_posi];
                }
                else {
                    setColor(autocomplete_posi, autocomplete_textfield.background, autocomplete_textfield.color);
                    autocomplete_textfield.textfield.value = autocomplete_input;
                    autocomplete_textfield.textfield.focus();
                    autocomplete_posi--;
                }
            }
        }
        else if (autocomplete_key == 27) {
            // Esc
            autocomplete_textfield.textfield.value = autocomplete_input;
            autocomplete_setVisible("hidden");
            autocomplete_posi = -1;
            autocomplete_oldins = autocomplete_input;
            autocomplete_textfield = null;
        }
        else if (autocomplete_key == 8) {
            // Backspace
            autocomplete_posi = -1;
            autocomplete_oldins=-1;
        }
    }
}

var mouseHandler=function(){
    if (autocomplete_textfield == null)
        return;
    for (var i=0; i < autocomplete_words.length; ++i)
        setColor (i, autocomplete_textfield.background, autocomplete_textfield.color);
    this.style.background = autocomplete_textfield.sel_background;
    this.style.color= autocomplete_textfield.sel_color;
}

var mouseHandlerOut=function(){
    if (autocomplete_textfield == null)
        return;
    this.style.background = autocomplete_textfield.background;
    this.style.color= autocomplete_textfield.color;
}

var mouseClick=function(){
    if (autocomplete_textfield == null)
        return;
    var outp = document.getElementById("autocomplete_output");
    for (var i=0; i < autocomplete_words.length; ++i) {
        if (this == outp.childNodes[i]) {
            autocomplete_textfield.textfield.value = autocomplete_words[i];
            autocomplete_setVisible("hidden");
            autocomplete_posi = -1;
            autocomplete_oldins = autocomplete_words[i];
            autocomplete_textfield = null;
            break;
        }
    }
}

function autocomplete_enable( id, req_func, res_func, bo_col, sh_col, nf_col, nb_col, sf_col, sb_col, dir )
{
    for ( i=0 ; i < autocomplete_textfields.length; i++ )
        if (autocomplete_textfields[i].id == id)
            return;
    var obj = document.getElementById(id);
    autocomplete_textfields[autocomplete_textfields.length] = {
        id: id,
        textfield: obj,
        request: req_func,
        results: res_func,
        border_color: bo_col,
        shadow_color: sh_col,
        color: nf_col,
        background: nb_col,
        sel_color: sf_col,
        sel_background: sb_col,
        basedir: dir
    };
    obj.onkeyup = autocomplete_start;
    obj.setAttribute('autocomplete', 'off');
}

function autocomplete_init() {
    var shad = document.createElement("div");
    var outp = document.createElement("div");
    shad.id = "autocomplete_shadow";
    shad.style.position = "relative";
    shad.style.top = "2px";
    shad.style.left = "2px";
    shad.style.visibility = "hidden";
    shad.style.zIndex = "1000";
    shad.style.width = "10px";
    outp.id = "autocomplete_output";
    outp.style.fontFamily = "Arial";
    outp.style.fontSize = "10pt";
    outp.style.paddingLeft = "3px";
    outp.style.paddingTop = "3px";
    outp.style.borderWidth = "1px";
    outp.style.borderStyle = "solid";
    outp.style.position = "relative";
    outp.style.top = "-2px";
    outp.style.left = "-2px";
    shad.style.width = "8px";
    shad.appendChild(outp);
    document.body.appendChild(shad);
    document.onkeyup = keyHandler;
    document.onkeydown = keygetter;
}
if (window.onload) {
    old_win_onload = window.onload;
    window.onload = function() {
        old_win_onload();
        autocomplete_init();
    };
}
else {
    window.onload = autocomplete_init;
}
