(function($) {
	$.fn.selectbox = function(options) {  
	
		var defaults = {
			className: "jquery-selectbox",
			speed: 0,
			change: function (e) {
			
			}
		}
		
		var options = $.extend(defaults, options);
	
		return this.each( function() {  
			
			if (!$(this).is("select"))
				return;
			
			var main = $(this)
			var select = $("<div></div>").addClass(options.className);
			var selected = "";
			
			main.change( function (e) {
				init();
			});
			
			function toggle() {
				select.toggleClass("jquery-selectbox-opened");
				select.children("ul").slideToggle(options.speed).scrollTop(0);
			}
			
			function set(i) {
				main.find("option").eq(i).attr("selected", "selected");
				main.change()
			}
			
			function init() {
				
				select.children().remove();
				select.append($("<ul></ul>").hide());
			
				main.find("optgroup, option").each( function (i) {
			
					isLabel = $(this).attr("label") ? true : false;
					
					if ($(this).is(":selected") || i == 0) {
						select.children("ul").find("li").removeClass("selected");
						selected = [i, $.trim($(this).text())];
					}
					
					var liText = $.trim( isLabel ? $(this).attr("label") : $(this).text());
						
					select.children("ul").append(
							$("<li></li>")
								.addClass(isLabel ? "label" : "")
								.html(liText)
								.click(function (e) {
									if (e.button != 0) return;
									set(i);
									select.toggleClass("jquery-selectbox-opened");
									options.change();
									e.stopPropagation();
								})
								.addClass(selected[0] == i ? "selected" : "")
						)
				});
					
				select.prepend(
					$("<span>&nbsp;</span>")
						.addClass("jquery-selectbox-toggle")
				).prepend(
					$("<span></span>")
						.addClass("jquery-selectbox-text")
						.html(selected[1])
				);
				
			}
		
			$(this).hide();
			
			init();
			
			main.next("div." + options.className).remove();
			
			select.insertAfter(main);
			
			select.click( function (e) {
				if (select.children("ul").is(":hidden")) {
					$(document).trigger("click", e);
				}	
				init();
				toggle();
				e.stopPropagation();
			});
			
			$(document).bind('click', function (e) {
				if (!select.children("ul").is(":hidden")) {
					toggle();
				}
			}).bind('keydown', function (e) {
				if (e.keyCode == 27 && !select.children("ul").is(":hidden")) {
					toggle();
					//e.stopPropagation();
				}
			});
			
		});
	};  
})(jQuery);  

