/** jQuery SelectBox 1.2 **/

(function($) {
	$.fn.selectbox = function(options) {  
	
		var defaults = {
			className: "jquery-selectbox",
			speed: 0
		}
		
		var options = $.extend(defaults, options);
	
		return this.each( function() {
			
			if (!$(this).is("select"))
				return;
			
			var select = $(this);
			var main = $("<div></div>").addClass(options.className);
			var ul = $("<ul></ul>").hide();
		
			select.hide();
			
			function toggle() {
				main.toggleClass("jquery-selectbox-opened");
				ul.slideToggle(options.speed).scrollTop(0);
			}
			
			function addItem(text, selected, label, group, disabled) {
				var li = $("<li></li>");
				
				li.addClass(selected ? "selected" : "");
				li.addClass(label ? "label" : "");
				li.addClass(group ? "grouped" : "");
				li.addClass(disabled ? "disabled" : "");
				li.html(text);
				
				if (!label && ! disabled) {
					li.click( function () {
						main.find(".jquery-selectbox-text").html(li.text());
						select.find("option").removeAttr("selected").eq($(this).index()).attr("selected", "selected");
						select.change();
						toggle();
						return false;
					});
				} else {
					li.click( function () {
						return false;
					});
				}
				
				ul.append(li);
			}
			
			function init() {
				
				main.children().remove();
				ul.children().remove();
				
				var selected = "";
				
				select.children("optgroup, option").each( function (j) {
					
					var item = $(this);
					
					if (item.is("optgroup")) {
					
						addItem($(this).attr("label"), 0, 1, 0, 0);
					
						item.children("optgroup, option").each( function (i) {
							
							if (!selected) {
								selected = $(this).is("[selected]") ? $(this).text() : "";
							}
							
							disabled = $(this).is("[disabled]") ? 1 : 0;
						
							addItem($(this).text(), 0, 0, 1, disabled);
						
						});
					
					} else {
						
						if (!selected) {
							selected = $(this).is("[selected]") ? $(this).text() : "";
						}
						
						disabled = $(this).is("[disabled]") ? 1 : 0;
					
						addItem($(this).text(), 0, 0, 0, disabled);
					
					}
				
				});
				
				if (!selected) {
					selected = $(main).find("option:first").text();
				}
				
				main.append(ul);
				
				main.prepend(
					$("<span></span>")
						.addClass("jquery-selectbox-toggle")
				).prepend(
					$("<span></span>")
						.addClass("jquery-selectbox-text")
						.html(selected)
				);
			}
			
			init();
			
			select.next("." + options.className).remove();
			
			main.insertAfter(select);
			
			var selectChange = function (e) {
				init();
			}
			
			select
				.unbind("change", selectChange)
				.bind("change", selectChange);
			
			var mainClick = function (e) {
				if (ul.is(":hidden")) {
					$(document).trigger("click", e);
				}	
				toggle();
				e.stopPropagation();
			}
			
			main
				.unbind("click", mainClick)
				.bind("click", mainClick)
				.attr("unselectable", "on")
				.css("MozUserSelect", "none");
			
			function documentClick(e) {
				if (!ul.is(":hidden")) {
					toggle();
				}
			}
			
			var documentKeydown = function (e) {
				if (e.keyCode == 27 && !ul.is(":hidden")) {
					toggle();
					//e.stopPropagation();
				}
			}
			
			$(document)
				.unbind('click', documentClick).unbind('keydown', documentKeydown)
				.bind('click', documentClick).bind('keydown', documentKeydown);
			
		});
	};  
})(jQuery);  

