var YzCombobox=function(selDom)
{
	Yz.util.importStyleSheet(document,"__YzCombobox.css");
	
	if(!selDom.id)selDom.id=Yz.util.newGuid();
	this.selDomId=selDom.id;
	this.handle="YzCombobox_"+Yz.util.newGuid();
	Yz.combobox.instances[this.handle]=this;
	
	this.render();
};
Yz.combobox=YzCombobox;
Yz.combobox.instances={};
Yz.combobox.fromHandle=function(handle){return Yz.combobox.instances[handle];};
Yz.combobox.getById=function(id)
{
	return Yz.combobox.fromHandle($(id).comboboxHandle);
}
Yz.combobox.prototype=
{
	render : function()
	{
		var selDom=$(this.selDomId);
		selDom.style.display="none";
		selDom.comboboxHandle=this.handle;
		
		var selElt=document.createElement("DIV");
		selElt.className="YzCombobox";
		selElt.innerHTML="<table cellpadding='0' width='100%' cellspacing='0'><tr><td><div class='YzComboboxText'>&nbsp;</div></td><td><div class='YzComboboxArrow'>&nbsp;</div></td></tr></table>";
		//selElt.style.width=(parseInt(selDom.getAttribute("width")) || 100)+"px";
		//selElt.firstChild.rows[0].cells[0].width=parseInt(selElt.style.width)-15;
		selElt.comboboxHandle=this.handle;
		selElt.onclick=YzcomboboxTrigger_onclick;
		selElt.onmouseover=YzcomboboxTrigger_onmouseover;
		selElt.onmouseout=YzcomboboxTrigger_onmouseout;
		selDom.parentNode.insertBefore(selElt,selDom);
		
		var selIndex=selDom.selectedIndex;
			if(selIndex<0)selIndex=0;
			selDom.selectedIndex=selIndex;
		var selTxt=selDom.options[selIndex].text;
		selElt.firstChild.rows[0].cells[0].firstChild.innerHTML=selTxt;
		
		this.readOnly=(selDom.getAttribute("readonly")=="1");
		
		var mw=this.buildItems()+14;
		
		var w=parseInt(selDom.getAttribute("width"));
		if(w>0)
		{
			selElt.style.width=w+"px";
			selElt.firstChild.rows[0].cells[0].style.width=(w-15)+"px";
		}
		else
		{
			selElt.style.width=mw+15+"px";
			selElt.firstChild.rows[0].cells[0].style.width=mw+"px";
		}
		
	},
	buildItems : function()
	{
		var panel=null,panelBody=null;
		
		if(!this.itemPanelHandle)
		{
			panel=new Yz.panel();
			panel.importStyleSheet("__YzCombobox.css");
			this.itemPanelHandle=panel.handle;
		}
		else
		{
			panel=Yz.panel.fromHandle(this.itemPanelHandle);	
		}
		
		panelBody=panel.getBody();
		panelBody.className="YzComboboxItemPanel";
		panelBody.comboboxHandle=this.handle;
		if(panelBody.innerHTML!="")
		{
			panelBody.onmouseover=null;
			panelBody.onmouseout=null;
			panelBody.onclick=null;
			panelBody.innerHTML="";
		}
		var selDom=$(this.selDomId),item,html="";
		
		var getWidthSpan=window.top.document.createElement("span");
			getWidthSpan.style.position="absolute";
			getWidthSpan.style.left="-10000px";
			getWidthSpan.style.fontSize="12px";
			window.top.document.body.appendChild(getWidthSpan);
		var maxW=0;	
		for(var i=0;i<selDom.options.length;i++)
		{
			item=selDom.options[i];
			getWidthSpan.innerHTML=item.text;
			maxW=Math.max(getWidthSpan.offsetWidth,maxW);
			var indent=parseInt(item.getAttribute("indent")) || 2;
				indent="padding-left:"+indent+"px;";
				html+="<tr value='"+item.value+"' class='YzComboboxItem'><td style='"+indent+"'>"+item.text+"</td></tr>";
		}
		
		getWidthSpan.parentNode.removeChild(getWidthSpan);
		
		panelBody.innerHTML="<table class='YzComboboxItemTable' width='100%' cellpadding='0' cellspacing='0'>"+html+"</table>";
		panelBody.firstChild.onmouseover=YzCombobox_onmouseover;
		panelBody.firstChild.onmouseout=YzCombobox_onmouseout;
		panelBody.onclick=YzComboboxItem_onclick
		Yz.util.disableSelection(panelBody);
		
		return maxW;
	},
	dispose : function()
	{
		var selElt=$(this.selDomId);
			selElt.onclick=null;
			
		var panel=Yz.panel.fromHandle(this.itemPanelHandle);
		var panelBody=panel.getBody();
			panelBody.onmouseover=null;
			panelBody.onmouseout=null;
			panelBody.onclick=null;
			panelBody.innerHTML="";	
			panel.dispose();
			
			selElt.innerHTML="";
	},
	
	setSelectedIndex : function(idx)
	{
		var selDom=$(this.selDomId);
			selDom.selectedIndex=idx;
			
		var selElt=selDom.previousSibling;
			selElt.firstChild.rows[0].cells[0].firstChild.innerHTML=selDom.options[idx].text;
	}
	
};

Yz.combobox.render=function()
{
	var selArr=document.getElementsByTagName("SELECT");
	for(var i=0;i<selArr.length;i++)
	{
		var sel=new Yz.combobox(selArr[i]);
	}
}

Yz.combobox.dispose=function()
{
	var cb=null;
	for(var p in Yz.combobox.instances)
	{
		cb=Yz.combobox.instances[p];
		cb.dispose();
		for(var x in cb)
			cb[x]=null;
		cb=null; Yz.combobox.instances[p]=null;
		delete 	Yz.combobox.instances[p];
	}
	Yz.combobox.instances=null;
}
Yz.cleanup.add(Yz.combobox);

function YzCombobox_onmouseover(e)
{
		e=e || Yz.util.getElementWindow(this).event;
	var td=e.srcElement || e.target;
	var tr=Yz.util.getElementAscensor(td,"TR");
	if(tr)
	{
		tr.className="YzComboboxItemHover";
		this.focusRowIndex=tr.rowIndex;
	}
	
}
function YzCombobox_onmouseout(e)
{
	/*e=e || Yz.util.getElementWindow(this).event;
	var td=e.srcElement || e.target;
	var tr=Yz.util.getElementAscensor(td,"TR");
	if(tr)tr.className="YzComboboxItem";*/
	if(typeof this.focusRowIndex!="undefined")
	{
		this.rows[this.focusRowIndex].className="YzComboboxItem";
	}
}
function YzcomboboxTrigger_onclick(e)
{
	var cbInst=Yz.combobox.fromHandle(this.comboboxHandle);
	if(cbInst.readOnly==true)return;
	//each item in the list with the height 20px
	//total height is rows length * 20+2(top border width plus bottom border width)
	//the list height is limited to 200px
	//if set height to zero,means the height will calc auto
	var panel=Yz.panel.fromHandle(cbInst.itemPanelHandle);	
	var t=panel.getBody().firstChild;
	var h=t.rows.length*18+2; 
		if(h>200)h=200; if(h<200)h=0;
		
	var pos=Yz.util.getElementPosition(this,window);
		panel.show(	pos.X,
					/*pos.Y+this.offsetHeight-1,*/
					pos.Y,
					this.offsetWidth-(Yz.isIE ? 0 : 2),
					h,document.body,this.offsetHeight);
}
function YzcomboboxTrigger_onmouseover()
{
	Yz.util.addRemoveClass(this,"YzComboboxhover");
}
function YzcomboboxTrigger_onmouseout()
{
	Yz.util.addRemoveClass(this,"-YzComboboxhover");
}
function YzComboboxItem_onclick(e)
{
	e=e || Yz.util.getElementWindow(this).event;
	var td=e.srcElement || e.target;
		if(!td)return;
	var	tr=td.parentNode;
	var cbInst=Yz.combobox.fromHandle(this.comboboxHandle);
	var selDom=$(cbInst.selDomId);
	var selElt=selDom.previousSibling;
		selElt.firstChild.rows[0].cells[0].firstChild.innerHTML=td.innerText || td.textContent;
	
	var val=tr.getAttribute("value");	
	var oldValue=selDom.value;
		selDom.value=val;
		if(oldValue!=val && selDom.onchange)selDom.onchange.call(selDom);
		
		Yz.panel.fromHandle(cbInst.itemPanelHandle).hide();
}
