(function($){

	if(!$.zIndex) $.zIndex = 1;

	$.select = function (callback)
	{
		var active = null;

		$('.js-select').each(function()
		{
			var select = $(this);
			select.unselectable();
			var box = select.find('.js-select-text');
			var popup = select.find('.js-select-popup');
			var scrollarea = popup.find('.js-select-list');
			var input = select.find('input');
			var width = select.width();

			var set = function (option)
			{
				if(option.hasClass('selected') || option.hasClass('unselectable'))
				{

					if(select.find('li:first')[0] == option[0])
					{
						box.html(option.html());

						if(!$('.step.current:has(#'+select[0].id+')').length)
						{
							box.css('font-weight','normal')
								.css('color','rgb(255, 0, 0)');
						}
					}
					else if(!option.hasClass('unselectable'))
					{
						box.html(option.html());
						select.find('li.selected').removeClass('selected');
						option.addClass('selected');
						box.css('font-weight','bold');
					}

					select.find('li:first').css('display','none');
					return false;
				}

				select.find('li.selected').removeClass('selected');
				option.addClass('selected');
				input.attr('value',option.attr('value'));
				box.html(option.html());
				box.css('font-weight','bold');
				box.css('color','black');

				if(select.attr('resets'))
				{
					$(select.attr('resets').split(';')).each(function()
					{alert(this);
						var other = $('#'+this);
						if(other[0] != select[0])
						{
							other.find('input').attr('value','0');
							other.find('.js-select-text').html(other.find('li:first').html())
								.css('font-weight','normal')
								.css('color','rgb(184, 184, 184)');
						}
					});
				}

				if(callback) callback(this);
			};

			if(select.find('li.selected').length)
			{
				set(select.find('li.selected'));
			}
			else
			{
				set(select.find('li:first'));
			}

			select.click(function(event)
			{
				event.stopPropagation();
				event.preventDefault();

				if(active && active[0] != this)
				{
					active.removeClass('active');
				}

				active = select;

				active.css('zIndex',$.zIndex += 1);
				popup.css('zIndex',$.zIndex += 1);

				select.toggleClass('active');

				if($(event.target).is('li'))
				{
					set ($(event.target));
				}
			});

			popup.css('width',(width)+'px');

			if(popup.height() > 250)
			{
				var scrollbar = popup.find('.js-select-scrollbar');

				var scrollup = popup.find('.js-select-scrollbar-up');
				var scrollmove = popup.find('.js-select-scrollbar-move');
				var scrolldown = popup.find('.js-select-scrollbar-down');

				popup.css('height','250px');
				scrollbar.css('height',popup.height()+'px').css('display','block')
				scrollarea.css('width',(popup.width() - scrollbar.outerWidth() - 1)+'px');
				scrollarea.css('position','relative');
				scrollarea.css('float','left');

				var min = scrollup.position().top + scrollup.outerHeight() + 1;
				var max = scrolldown.position().top - scrollmove.outerHeight() - 1;
				var height = scrollarea.outerHeight() - popup.innerHeight() - 1;
				var factor = -(height/max);

				var mousescroll = function (direction)
				{
					var pixels = scrollmove.position().top + (5 * direction);
					doscroll (pixels);
				};

				var doscroll = function (pixels)
				{
					if(pixels <= min)
					{
						scrollmove.css('top',min+'px');
						scrollarea.css('top','0px');
					}
					else if(pixels >= max)
					{
						scrollmove.css('top',max+'px');
						scrollarea.css('top',(max*factor)+'px');
					}
					else
					{
						scrollmove.css('top',pixels+'px');
						scrollarea.css('top',(pixels*factor)+'px');
					}
				};

				popup.bind('DOMMouseScroll',function(event)
				{
					event.preventDefault();
					event.stopPropagation();

					var direction = event.detail > 0 ? 1 : -1;
					mousescroll(direction);
				});

				popup.bind('mousewheel',function(event)
				{
					event.preventDefault();
					event.stopPropagation();

					var direction = event.wheelDelta > 0 ? -1 : 1;
					mousescroll(direction);
				});

				popup.find('.js-select-scrollbar-move').mousedown(function(event)
				{
					event.preventDefault();
					event.stopPropagation();

					var delta = event.pageY - scrollmove.position().top;

					popup.bind('click.jsscroller', function(event){
						event.preventDefault();
						event.stopImmediatePropagation();
						popup.unbind('click.jsscroller');
					});

					$(document).bind('mouseup.jsscroller', function(event)
					{
						$(document).unbind('mousemove.jsscroller').unbind('mouseup.jsscroller');
					});

					$(document).bind('mousemove.jsscroller', function(event)
					{
						var pixels = event.pageY - delta;
						doscroll(pixels);
					});
				});

				scrollbar.css('display','block').click(function(event)
				{
					event.preventDefault();
					event.stopPropagation();

					if(event.target == scrollup[0])
					{
						mousescroll(-1);
					}
					else if (event.target == scrolldown[0])
					{
						mousescroll(1);
					}
				});
			}

			popup.find('li:first').css('margin-bottom','0px');
			popup.find('li:last').css('margin-bottom','0px');

			popup.find('li').each(function()
			{
				if(!$(this).hasClass('unselectable'))
				{
					$(this).hover (function(event){$(this).addClass('hover');},function(event){$(this).removeClass('hover');});
				}
			});
		});

		$(document).click(function(event)
		{
			$('.js-select').removeClass('active');
		});
	};

})(jQuery);

