/* 
   jQuery.selectList Plugin version 0.6.2
   Developed for jQuery 1.3.2
   Author: Andreas Nylin  - andreas.nylin@dropit.se
*/
(function($) {
	$.fn.selectList = function(options) {
		var defaults = {
			className: "SelectList",
			expandedClassName: "SelectListExpanded",
			disabledClassName: "SelectListDisabled",
			selectedItemClassName: "sel",
			onchange: null,
			maxHeight: 0
		};

		var options = $.extend(defaults, options),
			sbBody = "<div class=\"" + options.className + "\"><span class=\"label\"><span class=\"labelInner\"></span></span><div class=\"selectListList\"><div class=\"selectListInner\"><ul></ul></div></div></div>";

		function appendSelectList(selectObj) {
			$(selectObj).hide();
			var selectList = $(sbBody).insertAfter(selectObj);

			if (selectObj.disabled) {
				selectList.addClass(options.disabledClassName);
			}
			selectList.data("enabled", !selectObj.disabled);

			if (selectObj.selectedIndex != -1) {
				selectList.find("span.labelInner").html(selectObj.options[selectObj.selectedIndex].text);
			}
			selectList.data("selectObj", selectObj);
			selectList.find("div.selectListList")
				.css("top", selectList.offset().top + selectList.outerHeight())
				.css("left", selectList.offset().left)
				.css("width", selectList.outerWidth());
			insertItems(selectObj, selectList);

			if (options.maxHeight > 0)
				selectList.find("ul").height(options.maxHeight).addClass("scroll");
		}

		function insertItems(selectObj, selectList) {
			var selectOptions = $(selectObj).children("option"),
				items = "";
			for (var i = 0; i < selectOptions.length; i++) {
				var selected = selectOptions[i].selected ? " class=\"" + options.selectedItemClassName + "\"" : "";
				items += "<li" + selected + ">" + selectOptions[i].text + "</li>";
			}
			selectList.find("ul").html(items);
			attachEvents(selectList);
		}

		function toggleList(selectList) {
			var visible = selectList.find("div.selectListList").toggle().is(":visible");
			selectList.toggleClass(options.expandedClassName);
			window.visibleSelectList = visible ? selectList : null;
		}

		function hideVisibleList(selectList) {
			if (window.visibleSelectList && window.visibleSelectList != selectList) {
				toggleList(window.visibleSelectList);
				window.visibleSelectList = selectList;
			}
		}

		function attachEvents(selectList) {
			if (selectList.data("enabled")) {
				selectList.children("span").click(function(e) {
					hideVisibleList(selectList)
					toggleList(selectList);
					$(document).one("click", function(e) {
						hideVisibleList(null);
					});
					e.stopPropagation();
				});
				selectList.find("li").click(function(e) {
					var selectList = $(this).parents("div." + options.className);
					var index = selectList.find("li").index(this);

					selectList.find("span.labelInner").html($(this).html());
					selectList.find("li." + options.selectedItemClassName).removeClass(options.selectedItemClassName);
					toggleList(selectList);
					$(this).addClass(options.selectedItemClassName);

					selectList.data("selectObj").selectedIndex = index;
					if (selectList.data("selectObj").onchange) {
						selectList.data("selectObj").onchange();
					}
					selectList.trigger("change", { listElement: this, index: index });

					e.stopPropagation();
				});
				if (options.onchange != null) {
					selectList.bind("change", options.onchange);
				}
			}
		}

		return this.each(function() {
			appendSelectList(this);
		});
	};
})(jQuery);
