/*
  based on: Copyright 2006 Ryan Smith / 345 Technical / 345 Group.	
readyState:
0 – Uninitialisiert
1 – Ladend
2 – Geladen
3 – Interaktiv
4 – Fertiggestellt
*/

var autosearch_default = 0;     // 1 - search suggestion starts immediately
var autocomplete = 1;           // 1 - completes search string  automatically 
var timeout = 2000;     // ms
var sugg_max = 15;              // show maximal this number of search suggestions

var autosearch = autosearch_default;

//Gets the browser specific XmlHttpRequest Object
function getXmlHttpRequestObject() {
	if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	} else if(window.ActiveXObject) {
		return new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		// alert("Your browser doesn't support XMLHttpRequest - time to upgrade your browser ...");
	}
}

//Our XmlHttpRequest object to get the auto suggest
var searchReq = getXmlHttpRequestObject();

//Called from keyup on the search textbox.
//Starts the AJAX request.
var num = -1;
var current = -1;
function searchSugg(what, event, autosrch) {
    autosearch = autosearch_default = autosrch;
    var service = document.formular.service.options[document.formular.service.selectedIndex].value;
    if (! sugg_service[service])
        return;
    event = (event) ? event : ((window.event) ? window.event : "");
    // alert(event.which + ' ' + event.keyCode);
    ss = document.getElementById('sugg');
    if (num > -1) {         // we have search results already
        // Handle down and up cursor keys
        if (event.keyCode == 40 || event.keyCode == 38) {
            id = document.getElementById('s' + current);
            if (!id) id = document.getElementById('s0');
            suggestOut(id);
            if (event.keyCode == 40) {  // down
                current++;
                if (current > num) current = 0;
            } else {
                current--;
                if (current < 0) current = num;
            }
            id = document.getElementById('s' + current);
            suggestOver(id);
            // id.className
            setSearch(id.innerHTML, '', 0);
            // document.getElementById('query').value = id.innerHTML;
            return;
        } else if (event.keyCode == 27) {   // Escape
            ss.style.visibility="hidden";
            return;
        }
    }
    if (event.keyCode == 8) {   // backspace
        autocomplete = 0;
        autosearch = autosearch_default;   // deleting chars - enable auto search (again)
    } else {
        autocomplete = 1;
    }
    if (event.keyCode == 39) {   // cursor right = expand
        autosearch = 1;
        // what.value = what.value.substring(0, what.value.length - 1);
    }

    // fire up the search
	if (autosearch == 1 &&
        (searchReq.readyState == 4 || searchReq.readyState == 0)) {
		var str = escape(what.value);
        if (str.length > 2) {
            // alert('s=' + str + '&l=' + service);
		    searchReq.open("GET", '/sugg.php?s=' + str + '&l=' + service, true);
		    searchReq.onreadystatechange = handleSearchSugg; 
		    searchReq.send(null);
            // active = window.setTimeout("suggestAbort();", timeout);
        } else {
            autosearch = autosearch_default;
            ss.style.visibility="hidden";
        }
	}
}

//Called when the AJAX response is returned.
function handleSearchSugg() {
	if (searchReq.readyState == 4) {
        // window.clearTimeout(active);
		var ss = document.getElementById('sugg')
		ss.innerHTML = '';
		var str = searchReq.responseText.split("\n");
        var len = str.length - 1;

        se = document.getElementById('query');
        pos = se.value.length;
        if (len < 1) {      // nothing found
            autosearch = 0;     // disable autosearch
            ss.style.visibility = 'hidden';
            return;
        }
        autosearch = 0;
        // autosearch = autosearch_default;
        if (autocomplete == 1 && len == 1) {     
            // only one result - complete search word
            var wo = str[0].split(': ', 3);
            setSearch(wo[1], wo[0], 0);
            suggestMark(se, pos);
            ss.style.visibility = 'hidden';
            return;
        }
        // alert(len);
        close_icon = '<span style="float:right">X</span>';
        close_icon = '<img src="' + pics_dir + '/wclose.png" onclick="document.getElementById(\'sugg\').style.visibility=\'hidden\';" style="float:right;padding-right:5px;" />';
        var complete = '';
		for(i = 0; i < (len <= sugg_max ? len : len - 1); i++) {
			//Build our element string.  This is cleaner using the DOM, but
			//IE doesn't support dynamically added attributes.
			var suggest = '';
            if (i == 0) suggest += close_icon;
            var wo = str[i].split(': ', 3);
            suggest += '<a href="#" id="s' + i + '" class="sugg_' + wo[0] + '" ';
            suggest += '" onclick="setSearch(this.innerHTML,\'' + wo[0] + '\',1);" ';
            suggest += '>' +  wo[1] + (wo[2] ? ' <em>' +  wo[2] + '</em>' : '') + '</a>';
            /*
            suggest += '<div onmouseover="suggestOver(this);" ';
			suggest += 'onmouseout="suggestOut(this);" ';
			suggest += 'onclick="setSearch(this.innerHTML,\'' + wo[0] + '\',1);" ';

			suggest += 'class="sugg_' + wo[0] + ' sugg_link" id="s' + i + '">' + wo[1] + '</div>';
            */
			ss.innerHTML += suggest;
            if (autocomplete == 1) {
                // find longest common part
                //w = str[i].split(' (',2)[0];
                w =  wo[1];
                var c = w.substring(pos, w.length);
                // alert ('complete=' + complete + ', pos= ' + pos + ', c=' + c + '.');
                j = 1;
                if (i == 0) {       // first
                    complete = c;
                } else if (complete.length > 0) {   // next
                    while (j <= complete.length &&
                           c.substr(0,j) == complete.substr(0,j)) j++;
                    complete = c.substr(0,j-1);
                }
		    }
        }
        if (autocomplete == 1 && complete.length > 0) {
            se.value += complete;
            suggestMark(se, pos);
        }

        num = i - 1;
        current = -1;
        if (len + 1 > sugg_max) {
            var service = document.formular.service.options[document.formular.service.selectedIndex].value;
            ss.innerHTML += '<a class="aopen" href="/?service=' + service + ';az=1;query=' + se.value + '*">' + str[i] + 
                (ui_lang == 'de' ? ' weitere' : ' more') + '</a>';
        }
        // if (len + 1 > sugg_max) ss.innerHTML += '<div>' + str[i] + '</div>';
        if (document.cookie.indexOf('sugg=1') != -1) {
        // if (autosearch_default == 1) {
            ss.innerHTML += '<a class="close" href="#" onclick="suggestDefault(0);set_opt(\'sugg\',\'0\');suggestClose();">' + 
                (ui_lang == 'de' ? 'Vorschl&auml;ge abschalten' : 'Switch off word suggestions') + '</a>';
        } else {
            ss.innerHTML += '<a class="plus" href=#" onclick="suggestDefault(1);set_opt(\'sugg\',\'1\')">' + 
                (ui_lang == 'de' ? 'Vorschl&auml;ge immer zeigen' : 'Always show word suggestions') + '</a>';
        }
        if (len > 0) ss.style.visibility = 'visible';
        autocomplete = 1;
    }
}

function suggestMark(what, pos) {
    // select added part - for easy deletion
    if (what.createTextRange) {   // IE
        t = what.createTextRange();
        t.moveStart("character", pos);
        t.select();
    } else if (typeof what.selectionStart != 'undefined') {    // Gecko
        what.selectionStart = pos;
    }
}

//Mouse over function
function suggestOver(id) {
	id.className = id.className.replace(/$/, ' over');
}
//Mouse out function
function suggestOut(id) {
	id.className = id.className.replace(/over/, '');
}
//Click function
function setSearch(value, lang, submit) {
    // var w = value.split(' (',2);
    var form = document.formular;
    form.query.value = value.replace(/ <em>.*<\/em>/i,'');
    // form.query.value = w[0];
    // set search direction
    var service = form.service.options[document.formular.service.selectedIndex].value;
    if (service.search(/^..-..$/) == -1) {  // not de-en (transl. direction) 
        var langs = service.match(/../g);   // probably: deen (no transl. direction)
        if (langs) {
            if (langs[0] == lang)
                form.iservice.value = langs[0] + '-' + langs[1];
            else if (langs[1] == lang)
                form.iservice.value = langs[1] + '-' + langs[0];
            // alert(form.iservice.value);
        }
    }
    if (submit) { 
        suggestClose();
        form.submit();
    }
}

function suggestClose() {
    ss = document.getElementById('sugg');
	ss.innerHTML = '';
    ss.style.visibility="hidden";
    document.formular.query.focus();
}
function suggestDefault(v) {
    q = document.getElementById('query'); 
    if (q) {
        q.onkeyup = function(event){searchSugg(q, event, v);};
        q.focus();
    }
}

function suggestAbort () {
    searchReq.abort();
    // alert("Timed out");
}
