YAHOO.namespace('YAHOO.Hack').FixIESelectWidth = new function() {
    var oSelf = this;
    var YUE = YAHOO.util.Event;
    var YUD = YAHOO.util.Dom;
    var oTimer = {};
    var oAnim = {};
    var nTimerId = 0;
    var dLastFocalItem;
    var ie7 = !!(document.uniqueID && typeof (XMLHttpRequest) != 'undefined')
    function init(el) {

        el = el || this;

        if (el.tagName.toLowerCase() != 'select') {
            throw Error('element [' + el.id + '] is not <select>');
            return;
        };

        if (!YUD.hasClass(el.parentNode, 'select-box')) {
            throw Error('className select-box is not included for element [' + el.id + ']');
            return;
        };

        var oRs = el.runtimeStyle;
        var oPRs = el.parentNode.runtimeStyle;

        oPRs.fonSize = 0;

        var sDisplay = el.parentNode.currentStyle.display.toLowerCase();
        if (sDisplay == '' || sDisplay == 'inline' || sDisplay == 'inline-block') {
            oPRs.display = 'inline-block';
            oPRs.width = el.offsetWidth + 'px';
            oPRs.height = el.offsetHeight + 'px';
            oPRs.position = 'relative';
            oRs.position = 'absolute';
            oRs.top = 0;
            oRs.left = 0;
        };

        el._timerId = (nTimerId += 1);

        el.selectedIndex = Math.max(0, el.selectedIndex);

        oTimer['_' + el._timerId] = setTimeout('void(0)', 0);
        oAnim['A' + el._timerId] = setTimeout('void(0)', 0);

        YUE.on(el, 'mouseover', onMouseOver);
        YUE.on(document, 'mousedown', onMouseDown, el, true);
        YUE.on(el, 'change', collapseSelect, el, true);
    }


    function collapseSelect(e) {
        status++;
        this.runtimeStyle.width = '';
    }

    function onMouseOver(e) {

        var el = this;
        if (dLastFocalItem && dLastFocalItem != el) {
            onMouseDown.call(dLastFocalItem, e);
        };

        var sTimerId = '_' + el._timerId;
        var sAniId = 'A' + el._timerId;
        clearTimeout(oTimer[sTimerId]);



        var onTween = function() {
            clearTimeout(oAnim[sAniId]);
            if (Math.abs(nEndWidth - nStartWidth) > 3) {
                nStartWidth += (nEndWidth - nStartWidth) / 3;
                el.runtimeStyle.width = nStartWidth + 'px';
                oAnim[sAniId] = setTimeout(onTween, 0);
            }
            else {
                el.runtimeStyle.width = 'auto';
                el.selectedIndex = Math.max(0, el.selectedIndex);
            }
        }

        var nStartWidth = el.offsetWidth;
        el.runtimeStyle.width = 'auto';
        var nEndWidth = el.offsetWidth;


        clearTimeout(oAnim[sAniId]);
        onTween();

        el.focus();
        dLastFocalItem = el;
    }

    function onMouseDown(e, el) {
        el = (e.srcElement || e.target);

        if (el == this && e.type != 'mouseover') {
            status++;
            YUE.stopEvent(e);
            return false;
        };

        el = this;

        clearTimeout(oAnim['A' + el._timerId]);

        var sTimerId = '_' + el._timerId;
        var doItLater = function() {
            el.runtimeStyle.width = '';
        };
        if (e.type == 'mouseover')
        { doItLater(); }
        else {
            oTimer[sTimerId] = setTimeout(doItLater, 100);
        }
    }

    function constructor(sId) {
        sId = [sId, ''].join('');
        //Only fix for IE55 ~ IE7

        if (document.uniqueID && window.createPopup) {
            YUE.onAvailable(sId, init);
            return true;

        } else { return false };
    };

    return constructor;
}