function SearchSuggestion() {
    var suggestions;
    var counts;
    var TAB = 9;
    var ESC = 27;
    var KEYUP = 38;
    var KEYDN = 40;
    var ENTER = 13;
    var highlighted = -1;
    var searchBox = document.getElementById('txt_search');
    var div = document.getElementById("searchsuggestion");
    var shim = document.getElementById("ie-shim");
    var me = this;
    var xhr;
    var xmlDoc;
    var OK = 200;
    var READY = 4;
    var NO_COUNT_INDICATOR = "999999";
        
    //Firefox hidden div hack
    document.getElementsByTagName('body')[0].style.width='99%';
    document.getElementsByTagName('body')[0].style.width='auto';
    
    updateAjax = function() {
        //Init AJAX
        if (window.ActiveXObject) {
            xhr = new ActiveXObject("Microsoft.XMLHTTP"); //IE
        } else if (window.XMLHttpRequest) {
            xhr = new XMLHttpRequest(); //Non-IE
        }  
    
        var newCounts = new Array();
        var newKeywords = new Array();
        var cacheBuster = "&rand=" + parseInt(Math.random()*99999999);
        var url = document.getElementById('suggestions_url').value + searchBox.value + cacheBuster;
        try {
            xhr.open('GET', url, true); //Third param specifies asynchronous transfer
            xhr.send(null);
        } catch (e) {
            alert(e);
        }
        
        //Listen for change
        xhr.onreadystatechange = function() {
            if (xhr.readyState == READY) {
                if (xhr.status == OK) {
                    
                    //Get XML from response
                    var xml = xhr.responseText;
                    
                    //Initialize XML parser
                    try {
                        xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); //IE parser
                        xmlDoc.async = "false";
                        xmlDoc.loadXML(xml);
                    } catch (e) {
                        try {
                            parser = new DOMParser();
                            xmlDoc = parser.parseFromString(xml, "text/xml");   //Non-IE parser
                        } catch (e) {
                            alert(e);
                            return;
                        }
                    }
                    
                    //Fill counts and keywords arrays
                    var countElements = xmlDoc.getElementsByTagName("count");
                    var keywordElements = xmlDoc.getElementsByTagName("keyword");
                    for (var i = 0; i < keywordElements.length; i++) {
                        newCounts[i] = countElements[i].childNodes[0].nodeValue;
                        newKeywords[i] = keywordElements[i].childNodes[0].nodeValue;
                    }
                    
                    //Create and show dropdown div if there were keywords returned
                    if (newKeywords.length > 0 && newCounts.length > 0) {
                        createDiv(newKeywords, newCounts);
                        positionDiv();
                        showDiv();
                    } else {
                        hideDiv();
                    }
                    
                    
                }
            }
        }   
    };

    searchBox.onkeyup = function(ev) {
        key = getKey(ev);
    
        switch(key) {
            case ENTER:
                useSuggestion();
                var searchURL = document.getElementById("search_url").value + searchBox.value;
                location = searchURL;
                break;
            case TAB:
                useSuggestion();
                break;
            case ESC:
                hideDiv();
                break;
            case KEYUP:
                if (highlighted > 0) {
                    highlighted--;
                    changeHighlight(highlighted);
                }
                break;
            case KEYDN:
                if (highlighted < (suggestions.length - 1)) {
                    highlighted++;
                    changeHighlight(highlighted);
                }
                break;
            default:
                if (searchBox.value.length > 0) {
                    updateAjax();
                } else {
                    hideDiv();
                }
        }
    };

    useSuggestion = function() {
        if (highlighted > -1) {
            searchBox.value = suggestions[highlighted];
            hideDiv();
        }
    };

    showDiv = function() {
    	shim.style.display = 'block';
        div.style.display = 'block';
    };

    hideDiv = function() {
    	shim.style.display = 'none';
        div.style.display = 'none';
        highlighted = -1;
    };

    changeHighlight = function(highlighted) {
        liArray = div.getElementsByTagName('LI');
        for (i in liArray) {
            var li = liArray[i];
        
            if (highlighted == i) {
                li.className = "selected";
            } else {
                li.className = "";
            }
        }
    };

    positionDiv = function() {
        var element = searchBox;
        var x = -40; //Required offset
        var y = element.offsetHeight;
    
        while (element.offsetParent && element.tagName.toLowerCase() != 'body') {
            x += element.offsetLeft;
            y += element.offsetTop;
            element = element.offsetParent;
        }
    
        x += element.offsetLeft;
        y += element.offsetTop;
    
        div.style.left = x + 'px';
        div.style.top = y + 'px';
	x += 40; //Correcting offset
        shim.style.left = x + 'px';
        shim.style.top = y + 'px';
    };

    createDiv = function(newSuggestions, newCounts) {
        var ul = document.createElement('ul');
	var shimHeight = 0;
        suggestions = newSuggestions;
        counts = newCounts;
        for (i in suggestions) {
            var word = suggestions[i];
            var count = counts[i];
            var li = document.createElement('li');
            var a = document.createElement('a');
        
            if (NO_COUNT_INDICATOR == count) {
                a.innerHTML = "<table width='100%'><td align='left'>" + word + "</td></table>";
            } else {
                a.innerHTML = "<table width='100%'><td align='left'>" + word + "</td><td align='right' class='count'>(" +  count + ")</td></table>";
            }
            
            a.href = document.getElementById("search_url").value + word;
            li.appendChild(a);
        
            if (highlighted == i) {
                li.className = "selected";
            }
       
	    shimHeight += 10;	
 
            ul.appendChild(li);
        }
    
        div.replaceChild(ul, div.childNodes[0]);
	shimHeight += 'px';
	shim.style.height = shimHeight;
    
        //Mouseover handler for ul
        ul.onmouseover = function(ev) {
            var target = getEventSource(ev);
            
            
            while (target.parentNode && target.tagName.toLowerCase() != 'li') {
                
                target = target.parentNode;
            }
            
            var liArray = div.getElementsByTagName('LI');
        
            for (i in liArray) {
                var li = liArray[i];
                if (li == target) {
                    highlighted = i;
                    break;
                }
            }
            
            changeHighlight(highlighted);
        };
    
        ul.onclick = function(ev) {
            useSuggestion();
            var searchURL = document.getElementById("search_url").value + searchBox.value;
            location = searchURL;
            hideDiv();
        };
    
        div.className = "suggestion_list";
        div.style.position = 'absolute';
        div.style.width = '200px';
        div.style.display = "none";
        //shim.className = "suggestion_list";
        //shim.style.position = 'absolute';
        shim.style.width = '160px';
        shim.style.display = 'none';
        div.style.zIndex = 10;
        shim.style.zIndex = 5;
    };

    getKey = function(ev) {
        if (ev) {
            return ev.keyCode; //Non-IE
        } else if (window.event) {
            return window.event.keyCode; //IE
        }
    };

    getEventSource = function(ev) {
        if (ev) {
            return ev.target; //Non-IE
        } else if (window.event) {
            return window.event.srcElement; //IE
        }
    };
}

