YAHOO.namespace( 'YAHOO.Hack' ).FixIESelectWidth = new function() {

	var oSelf = this; 
	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 (!YAHOO.util.Dom.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.fontSize = 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);
		
		YAHOO.util.Event.on(el, 'mouseover' , onMouseOver);
		YAHOO.util.Event.on(document, 'mousedown' ,onMouseDown , el, true);
		YAHOO.util.Event.on(el, 'change' ,collapseSelect , el, true);
	}


	function collapseSelect(e) {
		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;
		el.runtimeStyle.width = '';
		
		if (parseInt(nStartWidth) <= nEndWidth) {
			el.runtimeStyle.width = 'auto';
			clearTimeout( oAnim [  sAniId  ] );
			onTween();
			el.focus();		
			dLastFocalItem = el;
		}
		
	}

	function onMouseDown(e , el ) {
	
		el = ( e.srcElement || e.target );
		
		if( el == this && e.type!='mouseover' )
		{
			YAHOO.util.Event.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) {
			YAHOO.util.Event.onAvailable(sId ,init );
			return true;
		} else {return false};
		
	};

	return  constructor;
}

