///////////////////////////////////
/// INPUT SUGGESTION FUNCTIONS ////
///////////////////////////////////
var previous_value  = null;
var searching       = null;

function getGenericSuggestions(event, search_input, suggest_list) {
    //RM05062007 Check if there are suggestions and if keyup or keydown were pressed
    var key = null;

    if (typeof event !== "undefined"){
        if (window.event){
            key = window.event.keyCode; // RM270202007 IE support
        }else{
            key = event.which; // RM270202007 Firefox support
        }
    }else{
        key = 0;
    }

    //RM07062007 If enter was pressed check which item is selected and set results
    var ss = document.getElementById(suggest_list);
    if (key === 13){
        if (ss.childNodes.length !== 0 && ss.childNodes[0].tagName == 'DIV'){
            var next = 0;

            //RM05062007 Go trough all div-s and check which has the proper css class name, unselect it when found
            for(var i=0; i < ss.childNodes.length; i++){
                if (ss.childNodes[i].tagName === 'DIV'){
                    if (ss.childNodes[i].className == 'suggest_link_over'){
                        //RM07052007 Fire event onclick
                        if( document.createEvent ) { //Firefox
                            ss.childNodes[i].onclick();
                        }else{
                            var newEvent    = document.createEventObject(); //IE
                            ss.childNodes[i].fireEvent("onclick", newEvent);
                        }

                        return;
                    }
                }
            }
        }
        return;
    }

    //RM07062007 If Esc was pressed clear results
    if (key == 27){
        clearSearchSuggest(suggest_list);
        return;
    }

    //RM05062007 38 -> keyup, 40 -> keydown
    if (key == 38 || key == 40){
        if (ss.childNodes.length !== 0 && ss.childNodes[0].tagName == 'DIV'){
            var next = 0;

            //RM05062007 Go trough all div-s and check which has the proper css class name, unselect it when found
            for(var i=0; i < ss.childNodes.length; i++){
                if (ss.childNodes[i].tagName === 'DIV'){
                    if (ss.childNodes[i].className == 'suggest_link_over'){
                        ss.childNodes[i].className = 'suggest_link';

                        //RM05062007 Check which key was pressed
                        if (key == 40){
                            next = i+1; //keydown

                            //RM05062007 Check if we are at the end of suggestions, go to the begining (stack switch)
                            if (next == ss.childNodes.length){
                                next = 0;
                            }
                        }else{ //keyup
                            if (i == 0){
                                next = ss.childNodes.length;
                                next = next-1;
                            }else{
                                next = i-1;
                            }
                        }

                        //RM05062007 Select an item
                        selectSuggestion(ss.childNodes[next], search_input);
                        return;
                    }
                }
            }

            //RM05062007 Currently no div is selected
            if (key == 40){
                //RM05062007 Start with the first one
                next = 0;
            }else{
                next = ss.childNodes.length; //lastone if keyup
                next = next-1;
            }

            selectSuggestion(ss.childNodes[next], search_input);
        }
        return;
    }

    //RM06022008 Preform search
    var value       = trim(document.getElementById(search_input).value);

	if ( (value === '' || value === previous_value)){
		document.getElementById(suggest_list).innerHTML = '';
	    return;
	}

	previous_value = value;

	handleSearchRequest(value, search_input, suggest_list);
}

function handleSearchRequest(value, search_input, suggest_list) {
    if (searching !=null) {
        clearTimeout(searching);
    }

    searching = setTimeout("preformAJAXSearch('"+value+"', '"+search_input+"', '"+suggest_list+"');", 100);
}


function preformAJAXSearch(value, search_input, suggest_list) {
    sendRequest('ajax_search.php', 'value='+value+'&search_input='+search_input+'&suggest_list='+suggest_list, 'createGenericSuggestionsList', 'GET', 'An error occured while trying to preform search. Please inform admin staff.')
}

function selectSuggestion(object, search_input){
    object.className = 'suggest_link_over';
    document.getElementById(search_input).value = object.title;
}

function createGenericSuggestionsList(request) {
    var elements     = request.responseXML.getElementsByTagName('elements')[0].firstChild.data;
	var search_input = request.responseXML.getElementsByTagName('search_input')[0].firstChild.data;
    var suggest_list = request.responseXML.getElementsByTagName('suggest_list')[0].firstChild.data;

	// Clear previous suggestions
    var ss = document.getElementById(suggest_list);
    ss.innerHTML = '';

    // RM250202007 Generate results
    for (i=0; i<elements; i++){
        var term_id  	= request.responseXML.getElementsByTagName('term_id')[i].firstChild.data;
        var name        = request.responseXML.getElementsByTagName('name')[i].firstChild.data;

        if (BrowserDetect.browser == 'Opera' || BrowserDetect.browser == 'Konqueror' || BrowserDetect.browser == 'Safari'){
            var suggest 		= document.createElement('div');
            suggest.lang        = term_id;
            suggest.title       = name;
            suggest.onmouseover = 'javascript:suggestOver(this);';
            suggest.onmouseout	= 'javascript:suggestOut(this);';
            suggest.onclick	    = 'javascript:setResultValue("'+name+'", "'+search_input+'", "'+suggest_list+'");'
            suggest.className 	= 'suggest_link';
            suggest.innerHTML	= name;
            ss.appendChild(suggest);
        }else{
            // RM08032007 Build our element string.  This is cleaner using the DOM, but IE doesn't support dynamically added attributes.
            var suggest = "<div lang='"+term_id+"' title='"+name+"' onmouseover='javascript:suggestOver(this);' onmouseout='javascript:suggestOut(this);' onclick='javascript:setResultValue(\""+name+"\", \""+search_input+"\", \""+suggest_list+"\");' class='suggest_link'>"+name+"</div>";
            ss.innerHTML += suggest;
        }
    }
}

function suggestOver(div_object) {
    var suggest_id       = div_object.parentNode.id;
    clearSelectedSuggestion(suggest_id);
    div_object.className = 'suggest_link_over';
    return;
}

function suggestOut(div_object){
   var suggest_id = div_object.parentNode.id;
   clearSelectedSuggestion(suggest_id)
   return;
}

function clearSelectedSuggestion(suggest_list){
    var ss = document.getElementById(suggest_list);
    for(var i=0; i < ss.childNodes.length; i++){
        if (ss.childNodes[i].tagName === 'DIV'){
            if (ss.childNodes[i].className == 'suggest_link_over'){
                ss.childNodes[i].className = 'suggest_link';
            }
        }
   }
}

function setResultValue(text, search_input, suggest_list) {
	document.getElementById(search_input).value = text;
	previous_value = text;
    clearSearchSuggest(suggest_list);
}

function clearSearchSuggest(suggest_list){
    document.getElementById(suggest_list).innerHTML = '';
}

function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}

// RM13032007 Source: http://www.quirksmode.org/js/detect.html
var BrowserDetect = {
    init: function () {
        this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
        this.version = this.searchVersion(navigator.userAgent)
        || this.searchVersion(navigator.appVersion)
        || "an unknown version";
        this.OS = this.searchString(this.dataOS) || "an unknown OS";
    },
    searchString: function (data) {
        for (var i=0;i<data.length;i++)	{
            var dataString = data[i].string;
            var dataProp = data[i].prop;
            this.versionSearchString = data[i].versionSearch || data[i].identity;
            if (dataString) {
                if (dataString.indexOf(data[i].subString) != -1)
                return data[i].identity;
            }
            else if (dataProp)
            return data[i].identity;
        }
    },
    searchVersion: function (dataString) {
        var index = dataString.indexOf(this.versionSearchString);
        if (index == -1) return;
        return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
    },
    dataBrowser: [
    { 	string: navigator.userAgent,
    subString: "OmniWeb",
    versionSearch: "OmniWeb/",
    identity: "OmniWeb"
    },
    {
        string: navigator.vendor,
        subString: "Apple",
        identity: "Safari"
    },
    {
        prop: window.opera,
        identity: "Opera"
    },
    {
        string: navigator.vendor,
        subString: "iCab",
        identity: "iCab"
    },
    {
        string: navigator.vendor,
        subString: "KDE",
        identity: "Konqueror"
    },
    {
        string: navigator.userAgent,
        subString: "Firefox",
        identity: "Firefox"
    },
    {
        string: navigator.vendor,
        subString: "Camino",
        identity: "Camino"
    },
    {		// for newer Netscapes (6+)
        string: navigator.userAgent,
        subString: "Netscape",
        identity: "Netscape"
    },
    {
        string: navigator.userAgent,
        subString: "MSIE",
        identity: "Explorer",
        versionSearch: "MSIE"
    },
    {
        string: navigator.userAgent,
        subString: "Gecko",
        identity: "Mozilla",
        versionSearch: "rv"
    },
    { 		// for older Netscapes (4-)
        string: navigator.userAgent,
        subString: "Mozilla",
        identity: "Netscape",
        versionSearch: "Mozilla"
    }
    ],
    dataOS : [
    {
        string: navigator.platform,
        subString: "Win",
        identity: "Windows"
    },
    {
        string: navigator.platform,
        subString: "Mac",
        identity: "Mac"
    },
    {
        string: navigator.platform,
        subString: "Linux",
        identity: "Linux"
    }
    ]

};
BrowserDetect.init();