({
	name: "HTMLSelectboxControl",
	
	getPosition: function(node) {
		var y,x,o=node;
		y = o.offsetTop;
		x=o.offsetLeft;
		while(o.tagName!="BODY"){
			if(o.offsetParent){
				if(o.tagName!="TR"){
					o=o.offsetParent;
					y += o.offsetTop;
					x += o.offsetLeft;
				}
			}else break;
		}
		return {left:x, top:y};
	},
	
	/**
	 * <code>window.onload</code> event handler.
	 * @param e Event
	 */
	onload: function(e) {
		var o,i,d = document;
		var elements = d.getElementsByTagName("SELECT");
		for(i=0; i<elements.length;) {
			if((o = elements[i++]).type == "select-one") {
				var div = d.createElement("DIV");
				div.onmouseover = function() {
					this.firstChild.className += " button_over";
				};
				
				div.onmouseout = function() {
					this.firstChild.className = this.firstChild.className.replace(/\s*button_(over|down)/g, "");
				};
				
				div.onmouseup = function(){
					this.onmouseout();
					this.onmouseover();
					this.mP = false;
				};
				
				div.onmousedown=function(e){
					var d = document;
					this.firstChild.className += " button_down";
					var select = this;
					var list = this.nextSibling;
					select.mP = true;
					
					function hide(e){
						var o=e.target||event.srcElement;
						if(!select.mP && o.className !=" option")
							list.style.visibility = "hidden";
					}
					
					if(list.style.visibility == "visible") {
						list.style.visibility = "hidden";
						(d.detachEvent) ? d.detachEvent("onmousedown", hide) : d.removeEventListener("mousedown", hide, false);
					} else {
						var h = (window.opera) ? d.body.clientHeight : d.documentElement.clientHeight;
						var pos = HTMLSelectboxControl.getPosition(this);
						if(h > (pos.top + this.offsetHeight + list.offsetHeight - d.documentElement.scrollTop))
							 list.style.top = (pos.top + this.offsetHeight) + "px";
						else 
							list.style.top = (pos.top - list.offsetHeight) + "px";
						
						list.style.left = pos.left+ "px";
						list.style.width = this.offsetWidth + "px";
						list.style.visibility = "visible";
						(d.attachEvent) ? d.attachEvent("onmousedown", hide) : d.addEventListener("mousedown", hide, false);
					}
				};
				div.className = "select";
				var opt = o.options[(o.selectedIndex!=-1) ? o.selectedIndex : 0];
				div.innerHTML="<span class='button' onselectstart='return false'>&nbsp;</span><input readonly='readonly' class='option'"+
					" onkeydown='this.parentNode.nextSibling.onkeydown(event)' option='" + opt.value + "' value='" + opt.text + "'/>";
				var list = d.createElement("DIV");
				list.className = "list";
				
				list.onkeydown=function(e) {
					if(!e) e = event;
					if(e.keyCode==40 || e.keyCode==38) {
						this.style.visibility = "visible";
						var a = this.selected ? this.selected : this.firstChild;
						a = (e.keyCode==40 && a.nextSibling) ? a.nextSibling : (e.keyCode == 38 && a.previousSibling) ? a.previousSibling : a;
						a.focus();
						this.selected = a;
					}
				};
				
				list.onchange = function(a) {
					this.selected = a;
					this.previousSibling.lastChild.value = a.innerHTML;
					this.previousSibling.lastChild.setAttribute("option", a.getAttribute("option"));
					this.nextSibling.value = a.getAttribute("value");
					if(this.nextSibling.onchange) this.nextSibling.onchange();
					//this.previousSibling.lastChild.select();
					this.style.visibility = "hidden";
					return false;
				};
				
				var j,html='';
				for(j=0; j<o.options.length;) {
					var op = o.options[j++];
					html+='<a unselectable="on" class="option" value="' + op.value + '" title="' + op.text + '" href="javascript:void(0);" onmousedown="return this.parentNode.onchange(this)">'+op.text+'</a>';
				}
				list.innerHTML = html;
				
				div.onselectstart = list.onselectstart = function(){return false;};
			
				o.parentNode.insertBefore(div, o);
				o.parentNode.insertBefore(list,o);
			}
		}
	},
	
	/**
	 * Initializing component, sets <code>onload</code> handler
	 * @see InputFactory.onload()
	 */
	init:function(){
		var n, h, w = window;
		n = this.name; 
		w[n] = this;
		h = function(e) {
			w[n].onload(e);
		};
		(w.attachEvent) ? w.attachEvent("onload", h) : w.addEventListener("load", h, false);
	}
}).init()