jAdira.fn.extend({
	selectbox: function(options) {
		return this.each(function() {
			new jAdira.SelectBox(this, options);
		});
	}
});

jAdira.SelectBox = function(selectobj, options) {
	
	var opt = options || {};
	opt.inputClass = opt.inputClass || "selectbox";
	opt.containerClass = opt.containerClass || "selectbox-wrapper";
	opt.hoverClass = opt.hoverClass || "selected";
	opt.debug = opt.debug || false;
	opt.containerTopPos = (opt.containerTopPos)? opt.containerTopPos : 0;
	opt.prefixValue = (opt.prefixValue)? opt.prefixValue : "";
	var elm_id = selectobj.id;
	var active = -1;
	var inFocus = false;
	var hasfocus = 0;
	//jquery object for select element
	var jqselect = jAdira(selectobj);
	// jquery container object
	var jqinput = setupInput(opt);
	// hide select and append newly created elements
	var jqcontainer = setupContainer(opt);
	//jquery input object 

	jqselect.hide().before(jqinput);
	jAdira("body").append(jqcontainer);
	init();
	
	jqinput
	.click(function(){
		var sContainerPos = {
				left: jAdira(jqinput).offset().left+"px",
				top: (jAdira(jqinput).offset().top+opt.containerTopPos)+"px"
			}
		jAdira(jqcontainer).css(sContainerPos);
		if(!inFocus)
		{
        	jqcontainer.toggle();
 		}
	}).focus(function(){
		if(jAdira(jqcontainer).not(':visible'))
		{
			inFocus = true;
			jqcontainer.show();
		}		
	}).keydown(function(event) {	   
		switch(event.keyCode) {
			case 38: // up
				event.preventDefault();
				moveSelect(-1);
				break;
			case 40: // down
				event.preventDefault();
				moveSelect(1);
				break;
			//case 9:  // tab 
			case 13: // return
				event.preventDefault(); // seems not working in mac !
				setCurrent();
				hideMe();
				break;
			case 27:
				HideMe();
				break;
		}
	}).blur(function(){
        if (jqcontainer.is(':visible') && hasfocus > 0 ) {
            
        } else {
          if(jAdira.browser.msie || jAdira.browser.safari){
              if(jAdira.browser.safari)
              {
                  hideMe();
              }
        if(document.activeElement.getAttribute('id').indexOf('_container')==-1){
          hideMe();
        } else {
          jqinput.focus();
        }
      } else {
        hideMe();
      }
        }
	});

	function hideMe() {
		hasfocus = 0;
		jqcontainer.hide();
	}
	
	function init() {
		jqcontainer.append(getSelectOptions()).hide();
		var width = jqinput.css("width");
		jqcontainer.css("width", width);
		jAdira("#"+jAdira(jqcontainer).attr("id")+" ul").css("width",width);
		
		var sContainerPos = {
				left: jAdira(jqinput).offset().left+"px",
				top: (jAdira(jqinput).offset().top+opt.containerTopPos)+"px"
			}
		jAdira(jqcontainer).css(sContainerPos);
		if(jAdira(jqcontainer).height() > 220)
		{
			jAdira(jqcontainer).css("height","220px");
			jAdira("#"+jAdira(jqcontainer).attr("id")+" ul").css("height","220px");
		}
    }
	
	function setupContainer(options) {
		var container = document.createElement("div");
		jqcontainer = jAdira(container);
		jqcontainer.attr('id', elm_id+'_container');
		jqcontainer.addClass(options.containerClass);
		if(options.dropPosCss)
		{
			jAdira(jqcontainer).css(options.dropPosCss);
		}
		return jqcontainer;
	}
	
	function setupInput(options) {
		var input = document.createElement("input");
		var jqinput = jAdira(input);
		jqinput.attr("id", elm_id+"_input");
		jqinput.attr("type", "text");
		jqinput.addClass(options.inputClass);
		jqinput.attr("autocomplete", "off");
		jqinput.attr("readonly", "readonly");
		if(options.inputWidth)
		{
			jqinput.attr("style","width:"+options.inputWidth);
		}
		jqinput.attr("tabIndex", jqselect.attr("tabindex")); // "I" capital is important for ie
		jqinput.attr("title", jqselect.attr("title"));
		
		return jqinput;	
	}
	
	function moveSelect(step) {
		var lis = jAdira("li", jqcontainer);
		if (!lis) return;

		active += step;

		if (active < 0) {
			active = 0;
		} else if (active >= lis.size()) {
			active = lis.size() - 1;
		}

		lis.removeClass(opt.hoverClass);

		jAdira(lis[active]).addClass(opt.hoverClass);
	}
	
	function setCurrent() {	
		var li = jAdira("li."+opt.hoverClass, jqcontainer).get(0);
		var el = jAdira(li).attr("id").substring(opt.prefixValue.length);
		jqselect.val(el);
		jqinput.val(jAdira(li).html());
		return true;
	}
	
	// select value
	function getCurrentSelected() {
		return jqselect.val();
	}
	
	// input value
	function getCurrentValue() {
		return jqinput.val();
	}
	
	function getSelectOptions() {
		var select_options = new Array();
		var ul = document.createElement('ul');
		jqselect.children('option').each(function() {
			
			var li = document.createElement('li');
			if(jAdira(this).attr("className"))
			{
				jAdira(li).attr("className",jAdira(this).attr("className"));
			}
			li.setAttribute('id', opt.prefixValue+jAdira(this).val());
			li.innerHTML = jAdira(this).html();
			if (jAdira(this).is(':selected')) {
				jqinput.val(jAdira(this).html());
				jAdira(li).addClass(opt.hoverClass);
			}
			ul.appendChild(li);
			jAdira(li)
			.mouseenter(function(event) {
				hasfocus = 1;
				jAdira(event.target, jqcontainer).addClass(opt.hoverClass);
			})
			.mouseleave(function(event) {
				hasfocus = -1;
				jAdira(event.target, jqcontainer).removeClass(opt.hoverClass);
			})
			.click(function(event) {
				jAdira(this).addClass(opt.hoverClass);
				setCurrent();
				hideMe();
			});
		});
		return ul;
	}
};
