﻿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++;
// Using stopPropagation instead of stopEvent due to IE9 preventing normal functionality of the 
// select element.
//Yue.stopEvent(e);
YUE.stopPropagation(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;
}
