
function WingFinder() {

    var sHoverBkColor = "#000000";
    var sHoverFgColor = "#ffffff";

    var obField     = null;
    var obPlace     = null;

    var iCurIndex   = 0;
    var strOrgValue = '';

    var obAjax      = new Establishment();
    var curArray    = new Array();
    var obPrevSug   = new Object();

    var bIsHidden   = true;
    var bIsMSIE     = false;
    var bDidInit    = false;

    var iCityId     = -1;

    if (navigator.userAgent.indexOf('MSIE') >= 0 && navigator.userAgent.indexOf('Opera') < 0 )
        bIsMSIE = true;

    var clearElement = function(iIndex) {
        var obElement = document.getById("__opt_" + (iIndex + 1));
        obElement.style.backgroundColor = "";
        obElement.style.color = "";
    }

    var setElement = function(iIndex) {
        var obElement = document.getById("__opt_" + (iIndex + 1));
        obField.value = curArray[iIndex];
        obElement.style.backgroundColor = sHoverBkColor;
        obElement.style.color = sHoverFgColor;
    }

    this.hoverOver = function(iIndex) {
        for (var i = 0; i < curArray.length; ++i) {
            if (i != iIndex)
                clearElement(i);
            else {
                var obElement = document.getById("__opt_" + (iIndex + 1));
                obElement.style.backgroundColor = sHoverBkColor;
                obElement.style.color = sHoverFgColor;
                iCurIndex = iIndex + 1;
            }
        }
    }

    this.select = function(iIndex) {
        obField.value = curArray[iIndex];
    }

    var moveToElement = function() {
        var index = iCurIndex;
        for (var i = 0; i < curArray.length; ++i) {
            if ((i + 1) != index)
                clearElement(i);
            else
                setElement(i);
        }
        if (index == 0) {
            obField.value = strOrgValue;
            return;
        }
    }

    var requestSuggestions = function(strValue) {
        var minStr = "";
        for (var i = 0; i < strValue.length; ++i) {
            var chr = strValue.charAt(i).toUpperCase();
            if (obPrevSug["city_" + iCityId] && obPrevSug["city_" + iCityId][minStr + chr]) {
                minStr += chr;
            }
            else {
                break;
            }
        }
        if (minStr != "" && obPrevSug["city_" + iCityId][minStr].length < 10) {
            var arr_prev = obPrevSug["city_" + iCityId][minStr];
            var new_arr  = new Array();
            for (var i = 0; i < arr_prev.length; ++i) {
                if (arr_prev[i].toLowerCase().indexOf(strValue.toLowerCase()) == 0)
                    new_arr[new_arr.length] = arr_prev[i];
            }
            return new_arr;
        }

        return obAjax.getEstablishmentSuggestions(strValue, iCityId);
    }

    var getSuggestions = function(strValue) {

        var arr_sug  = null;
        if (obPrevSug["city_" + iCityId] && obPrevSug["city_" + iCityId][strValue.toUpperCase()])
            arr_sug = obPrevSug["city_" + iCityId][strValue.toUpperCase()];
        else if (strValue.trim().length != 0)
            arr_sug = requestSuggestions(strValue);
        else
            arr_sug = new Array();      //blank for empty searches...
        if (!obPrevSug["city_" + iCityId])
            obPrevSug["city_" + iCityId] = new Object();
        obPrevSug["city_" + iCityId][strValue.toUpperCase()] = arr_sug;

        var ob_place = document.getById("ajax_opt_list");
        var iCount   = arr_sug.length;

        ob_place.innerHTML = "";
        curArray = arr_sug;
        var strHtml = "";

        if (bIsMSIE && iCount != 0) {
            strHtml += "<iframe id=\"__wnd_iframe\" src=\"about:blank\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" align=\"bottom\" frameborder=\"0\" style=\"filter: alpha(opacity=0); display: block; height: 200px; width: 285px; position: absolute; z-index: -1;\"></iframe>";
        }
        for (var i = 0; i < iCount; ++i) {
            var str_element = "<div id=\"__opt_" + (i + 1) + "\" style=\"padding-top: 2px; padding-bottom: 2px; padding-left: 4px; padding-right: 4px; cursor: default;z-index:99999;\" onmouseover=\"g_obFinder.hoverOver(" + i + ");\" onclick=\"g_obFinder.select(" + i + ");\">" + htmlEscape(arr_sug[i]) + "</div>";
            strHtml += str_element;
        }

        ob_place.innerHTML = strHtml;
        iCurIndex = 0;

        if (iCount != 0 && bIsHidden) {
            showMenu();
        }
        else if (iCount == 0 && !bIsHidden) {
            hideMenu();
        }
    }

    var hideMenu = this.hideMenu = function() {
        var ob_place = document.getById("ajax_opt_list");
        ob_place.style.visibility = "hidden";
        ob_place.style.display    = "none";
        bIsHidden = true;

        if (bIsMSIE) {
            var obFrame = document.getById("__wnd_iframe");
            if (obFrame) {
                obHeight = 0;
                obFrame.style.height = obHeight + "px";
            }
        }
    }

    var showMenu = this.showMenu = function() {

        var ob_place = document.getById("ajax_opt_list");
        ob_place.style.visibility = "visible";
        ob_place.style.display    = "block";
        bIsHidden = false;

        if (bIsMSIE) {
            //calc ob_place height and set __wnd_iframe to same height.
            var obHeight = ob_place.offsetHeight;
            var obFrame  = document.getById("__wnd_iframe");

            if (obFrame && obHeight != 0) {
                //negate 4 pixels for padding
                obHeight -= 4;
                obFrame.style.height = obHeight + "px";
            }
        }
    }

    this.handleKeyUp = function(obForm, evt) {

        obField = obForm.query;
        iCityId = obForm.frmCityID.options[obForm.frmCityID.selectedIndex].value;

        if (iCurIndex == 0) {
            strOrgValue = obField.value;
        }
        if (evt.keyCode == 38 && bIsMSIE) {
            if (bIsHidden) {
                if (curArray.length != 0)
                    showMenu();
                return;
            }
            if (iCurIndex == 0)
                iCurIndex = curArray.length;
            else
                --iCurIndex;
            moveToElement();
        }
        else if (evt.keyCode == 40 && bIsMSIE) {
            if (bIsHidden) {
                if (curArray.length != 0)
                    showMenu();
                return;
            }
            if (iCurIndex == curArray.length)
                iCurIndex = 0;
            else
                ++iCurIndex;
            moveToElement();
        }
        else if (evt.keyCode == 27) {
            hideMenu();
        }
        else if ((evt.keyCode == 0) || (evt.keyCode == 9) || (evt.keyCode > 15 && evt.keyCode < 19) || (evt.keyCode > 32 && evt.keyCode < 41) || (evt.keyCode == 45) || (evt.keyCode > 111 && evt.keyCode < 124)) {
            //ignore...
        }
        else {
            strOrgValue = obField.value;
            getSuggestions(strOrgValue);
        }
    }

    this.handleKeyPress = function(obForm, evt) {

        obField = obForm.query;
        iCityId = obForm.frmCityID.options[obForm.frmCityID.selectedIndex].value;

        if (evt.keyCode == 38) {
            if (bIsHidden) {
                if (curArray.length != 0)
                    showMenu();
                return;
            }
            if (iCurIndex == 0)
                iCurIndex = curArray.length;
            else
                --iCurIndex;
            moveToElement();
        }
        else if (evt.keyCode == 40) {
            if (bIsHidden) {
                if (curArray.length != 0)
                    showMenu();
                return;
            }
            if (iCurIndex == curArray.length)
                iCurIndex = 0;
            else
                ++iCurIndex;
            moveToElement();
        }
    }
}

var g_obFinder = new WingFinder();
