function ComboBox_InitWith(n) {
    if ( typeof( window.addEventListener ) != "undefined" ) {
        window.addEventListener("load", ComboBox_Init(n), false);
    } else if ( typeof( window.attachEvent ) != "undefined" ) {
        window.attachEvent("onload", ComboBox_Init(n));
    } else {
        ComboBox_Init(n)();
    }
}
function ComboBox_Init(n) {
    return function () {
        if ( ComboBox_UplevelBrowser( n ) ) {
            ComboBox_Load( n );
        }
    }
}
function ComboBox_UplevelBrowser( n ) {
    if( typeof( document.getElementById ) == "undefined" ) return false;
    var combo = document.getElementById( n + "_Container" );
    if( combo == null || typeof( combo ) == "undefined" ) return false;
    if( typeof( combo.style ) == "undefined" ) return false;
    if( typeof( combo.innerHTML ) == "undefined" ) return false;
    return true;
}
function ComboBox_Load( comboId ) {
    var combo  = document.getElementById( comboId + "_Container" );
    var button = document.getElementById( comboId + "_Button" );
    var list   = document.getElementById( comboId + "_List" );
    var text   = document.getElementById( comboId );
    
    
    combo.List = list;
    combo.Button = button;
    combo.Text = text;
    
    button.Container = combo;
    button.Toggle = ComboBox_ToggleList;
    button.onclick = button.Toggle;
    button.onmouseover = function(e) { this.Container.List.DisableBlur(e); };
    button.onmouseout = function(e) { this.Container.List.EnableBlur(e); };
    button.innerHTML = "\u25BC";
    button.onselectstart = function(e){ return false; };
    button.style.height = ( list.offsetHeight - 4 ) + "px";
    
    text.Container = combo;
    text.TypeDown = ComboBox_TextTypeDown;
    text.KeyAccess = ComboBox_TextKeyAccess;
    text.onkeyup = function(e) { this.KeyAccess(e); this.TypeDown(e); };
    text.style.width = ( list.offsetWidth ) + "px";
    
    list.Container = combo;
    list.Show = ComboBox_ShowList;
    list.Hide = ComboBox_HideList;
    list.EnableBlur = ComboBox_ListEnableBlur;
    list.DisableBlur = ComboBox_ListDisableBlur;
    list.Select = ComboBox_ListItemSelect;
    list.ClearSelection = ComboBox_ListClearSelection;
    list.KeyAccess = ComboBox_ListKeyAccess;
    list.FireTextChange = ComboBox_ListFireTextChange;
    list.onchange = null;
    list.onclick = function(e){ this.Select(e); this.ClearSelection(); this.FireTextChange(); };
    list.onkeyup = function(e) { this.KeyAccess(e); };
    list.EnableBlur(null);
    list.style.position = "absolute";
    list.size = ComboBox_GetListSize( list );
    list.IsShowing = true;
    list.Hide();
    
}
function ComboBox_InitEvent( e ) {
    if( typeof( e ) == "undefined" && typeof( window.event ) != "undefined" ) e = window.event;
    if( e == null ) e = new Object();
    return e;
}
function ComboBox_ListClearSelection() {
            if ( typeof( this.Container.Text.createTextRange ) == "undefined" ) return;
    var rNew = this.Container.Text.createTextRange();
    rNew.moveStart('character', this.Container.Text.value.length) ;
    rNew.select();
}
function ComboBox_GetListSize( theList ) {
    ComboBox_EnsureListSize( theList );
    return theList.listSize;
}
function ComboBox_EnsureListSize( theList ) {
    if ( typeof( theList.listSize ) == "undefined" ) {
        if( typeof( theList.getAttribute ) != "undefined" ) {
            if( theList.getAttribute( "listSize" ) != null && theList.getAttribute( "listSize" ) != "" ) {
                theList.listSize = theList.getAttribute( "listSize" );
                return;
            }
        }
        if( theList.options.length > 0 ) {
            theList.listSize = theList.options.length;
            return;
        }
        theList.listSize = 4;
    }
}
function ComboBox_ListKeyAccess(e) { //Make enter/space and escape do the right thing :)
    e = ComboBox_InitEvent( e );
    if( e.keyCode == 13 || e.keyCode == 32 ) {
        this.Select();
        return;
    }
    if( e.keyCode == 27 ) {
        this.Hide();
        this.Container.Text.focus();
        return;
    }
}
function ComboBox_TextKeyAccess(e) { //Make alt+arrow expand the list
    e = ComboBox_InitEvent( e );
    if( e.altKey && (e.keyCode == 38 || e.keyCode == 40) ) {
            this.Container.List.Show();
    }
}
function ComboBox_TextTypeDown(e) { //Make the textbox do a type-down on the list
    e = ComboBox_InitEvent( e );
    var items = this.Container.List.options;
    if( this.value == "" ) return;
    var ctrlKeys = Array( 8, 46, 37, 38, 39, 40, 33, 34, 35, 36, 45, 16, 20 );
    for( var i = 0; i < ctrlKeys.length; i++ ) {
        if( e.keyCode == ctrlKeys[i] ) return;
    }
    for( var i = 0; i < items.length; i++ ) {
        var item = items[i];
        if( item.text.toLowerCase().indexOf( this.value.toLowerCase() ) == 0 ) {
            this.Container.List.selectedIndex = i;
            if ( typeof( this.Container.Text.createTextRange ) != "undefined" ) {
                                    this.Container.List.Select();
                            }
            break;
        }
    }
}
function ComboBox_ListFireTextChange() {
    var textOnChange = this.Container.Text.onchange;
            if ( textOnChange != null && typeof(textOnChange) == "function" ) {
                    textOnChange();
            }
}
function ComboBox_ListEnableBlur(e) {
    this.onblur = this.Hide;
}
function ComboBox_ListDisableBlur(e) {
    this.onblur = null;
}
function ComboBox_ListItemSelect(e) {
    if( this.options.length > 0 ) {
        var text = this.Container.Text;
        var oldValue = text.value;
        var newValue = this.options[ this.selectedIndex ].value;
        text.value = newValue;
        if ( typeof( text.createTextRange ) != "undefined" ) {
            if (newValue != oldValue) {
                var rNew = text.createTextRange();
                rNew.moveStart('character', oldValue.length) ;
                rNew.select();
            }
        }
    }
    this.Hide();
    this.Container.Text.focus();
}
function ComboBox_ToggleList(e) {
    if( this.Container.List.IsShowing == true ) {
        this.Container.List.Hide();
    } else {
        this.Container.List.Show();
    }
}
function ComboBox_ShowList(e) {
    if ( !this.IsShowing && !this.disabled ) {
        this.style.width = ( this.Container.offsetWidth ) + "px";
        this.style.top = ( this.Container.offsetHeight + ComboBox_RecursiveOffsetTop(this.Container,true) ) + "px";
        this.style.left = ( ComboBox_RecursiveOffsetLeft(this.Container,true) + 1 ) + "px";
        ComboBox_SetVisibility(this,true);
        this.focus();
        this.IsShowing = true;
    }
}
function ComboBox_HideList(e) {
    if( this.IsShowing ) {
                    ComboBox_SetVisibility(this,false);
        this.IsShowing = false;
    }
}
function ComboBox_SetVisibility(theList,isVisible) {
    var isIE = ( typeof( theList.dataSrc ) != "undefined" ); // dataSrc is an IE-only property which is unlikely to be supported elsewhere
    var ua = navigator.userAgent.toLowerCase(); 
    var isSafari = (ua.indexOf('safari') != - 1);
    if ( isIE || isSafari) {
        if ( isVisible ) {
            theList.style.visibility = "visible";
        } else {
            theList.style.visibility = "hidden";
        }
    } else { 
        if ( isVisible ) {
            theList.style.display = "block";
        } else {
            theList.style.display = "none";
        }
    }
}
function ComboBox_RecursiveOffsetTop(thisObject,isFirst) {
    if(thisObject.offsetParent) {
        if ( thisObject.style.position == "absolute" && !isFirst && typeof(document.designMode) != "undefined" ) {
            return 0;
        }
        return (thisObject.offsetTop + ComboBox_RecursiveOffsetTop(thisObject.offsetParent,false));
    } else {
        return thisObject.offsetTop;
    }
}
function ComboBox_RecursiveOffsetLeft(thisObject,isFirst) {
    if(thisObject.offsetParent) {
        if ( thisObject.style.position == "absolute" && !isFirst && typeof(document.designMode) != "undefined" ) {
            return 0;
        }
        return (thisObject.offsetLeft + ComboBox_RecursiveOffsetLeft(thisObject.offsetParent,false));
    } else {
        return thisObject.offsetLeft;
    }
}
function ComboBox_SimpleAttach(selectElement,textElement) {
    textElement.value = selectElement.options[ selectElement.options.selectedIndex ].value;
    var textOnChange = textElement.onchange;
    if ( textOnChange != null && typeof( textOnChange ) == "function" ) {
        textOnChange();
    }
}
