
function initBBSelect( target ) {

	target = (typeof(target)=="undefined") ? jQuery(".BBSelect") : ( (jQuery(target).hasClass("BBSelect")) ? jQuery(target) : jQuery(".BBSelect", jQuery(target)) );

	target.each( function(i,el) {
		var currentSelect = jQuery(this),
			layer = null,
			currentSelectID = currentSelect.attr("id"),
			selectedIndex = 0,
			currentLabel = "",
			currentValue = "",
			currentTarget = null,
			contentLayer = null,
			linkedInput = ( typeof(jQuery(this).attr("name"))!="undefined" && jQuery(this).attr("name")!=null ) ? jQuery(this).attr("name") : false,
			type = this.nodeName.toLowerCase(),
			selectHTML = "<div id='"+ ( (currentSelectID) ? currentSelectID : "BBSelect" + i ) + "' class='"+((typeof(currentSelect.attr("class"))!="undefined")? "BBSelect " + currentSelect.removeClass("BBSelect").attr("class") : "BBSelect")+"'></div>";
			
		if(type=="select") {
			tmpHTML = "",
			options = jQuery("option", currentSelect);
			options.each( function(i, el) {
				option = jQuery(this);
				optionClass = 'BBoption';
				if(i+1==options.length) optionClass += " last";
				if(option.attr("selected")) optionClass += " selected";
				tmpHTML += '<li class="'+optionClass+'" data-BBParams="{value:\'' + option.attr("value") + '\'}"><span>' + option.html() + '</span></li>';
			})
		} else if(type=="ul") 
			tmpHTML = currentSelect.html();

		currentSelect.replaceWith( selectHTML );
		currentSelect = jQuery("#"+( (currentSelectID) ? currentSelectID : "BBSelect" + i ));
		layer = jQuery("#"+( (currentSelectID) ? currentSelectID : "BBSelect" + i ));

		currentSelect.html( "<div class='selectedItem'></div><div class='content'><div class='scroller'></div><ul>" + tmpHTML + "</ul></div>")

		if(linkedInput&&jQuery(":input[type=hidden][name="+linkedInput+"]").length==0)
			currentSelect.closest("form").append("<input type='hidden' name='"+linkedInput+"' value=''>");

		currentTarget = jQuery(".selectedItem", currentSelect);
		currentSelect = jQuery("ul", currentSelect);
		contentLayer = jQuery("div.content", layer);
		
		var contenerPos = contentLayer.offset(),
			allItems = jQuery("li", currentSelect),
			lengthItems = allItems.length,
			totalHeight = 0;

			allItems.each( function(i,el) {
				currentItem = jQuery(this);
				nbItem = currentItem.index();
				if(nbItem==0) currentItem.addClass("first");
				if(nbItem==lengthItems - 1) currentItem.addClass("last");
				totalHeight += ( (currentItem.outerHeight()==0) ? eval(currentItem.css("height").replace("px","")) : currentItem.outerHeight() );
			});
		
		var contenerHeight = (totalHeight > 205) ? 205 : totalHeight,
			contentHeight = currentSelect.outerHeight() - contenerHeight,
			step = contentHeight/contenerHeight,
			scroller = jQuery(".scroller",contentLayer),
			scrollerHeight = scroller.height(),
			scrollBarHeight = contenerHeight - scrollerHeight;
			//listOffset = eval(contentLayer.css("top").replace("px",""));

		//if(allItems.length>1) {
			layer.bind("mouseup", function(e) {
				e.preventDefault();
				var minX = contenerPos.left,
					minY = contenerPos.top,
					maxX = contenerPos.left + contentLayer.width(),
					maxY = contenerPos.top + contentLayer.height();
				
				if(contentLayer.height()==0) {
					contentLayer.animate({ height: contenerHeight}).addClass("open");
					jQuery("body").bind("mousedown", function(evt) {
						evt.preventDefault();
						maxX = contenerPos.left + contentLayer.width(),
						maxY = contenerPos.top + contentLayer.height();
						if( minX > evt.pageX || evt.pageX > maxX || minY > evt.pageY || evt.pageY > maxY )
							layer.trigger("close");
					});
				}
				
			}).bind("close", function() {
				contentLayer.animate({height: 0}, function() { jQuery(this).removeClass("open") });
				jQuery("body").unbind("mousedown");
			});
		//} else layer.addClass("disabled");
		
		if(contenerHeight>=210 /*&& allItems.length>1*/) {
			layer.addClass("scrollable").bind("mousewheel", function(e, d) {
			
				e.preventDefault();
				var currentPos = eval(currentSelect.css("top").replace("px","")),
					newPos = currentPos + d * 20,
					scrollerStep = contentHeight/(contenerHeight - scrollerHeight);
				
				if(newPos>=0) newPos = 0;
				else if (newPos<=-contentHeight) newPos = -contentHeight;
				
				currentSelect.css("top", newPos + "px");
				scroller.css("top", -newPos/scrollerStep + "px");
				
			});
			
			scroller.bind("mousedown", function(e) {
				e.stopPropagation();
				e.preventDefault();
				var eventPos = e.pageY - contenerPos.top - eval(scroller.css("top").replace("px",""));
				jQuery("body").bind("mousemove", function(evt) {
					relPos = eval(scroller.css("top").replace("px",""));
					if( relPos+eventPos >= 0 && relPos-eventPos < scrollBarHeight && evt.pageY - eventPos >= contenerPos.top && evt.pageY + scrollerHeight - eventPos < contenerPos.top + contenerHeight) {
						newPos = evt.pageY - contenerPos.top - eventPos;
						if(newPos<0) newPos = 0;
						if(newPos>=scrollBarHeight) newPos = scrollBarHeight;
						scroller.css("top", newPos);
						cNewPos = -(newPos)*(contentHeight/(contenerHeight - scrollerHeight));
						currentSelect.css("top", cNewPos );
					}
				}).bind("mouseup", function(evt) {
					evt.stopPropagation();
					jQuery("body").unbind("mousemove");
				});
			})
		} else scroller.css("display","none");
		
		allItems.each( function(i, el) {
			var item = jQuery(this),
				defaults = { value: "", target: ".selectedItem", action: "", data: ""},
				params = jQuery.extend({}, defaults, eval( "(" + item.attr("data-BBParams") + ")") ),
				label = item.html();
			//item.removeAttr("data-BBParams");
			if(item.hasClass("selected")) {
				selectedIndex = i,
				currentLabel = label,
				currentValue = params.value;
			} else if(item.hasClass("disabled"))
				item.removeAttr("onclick");
				
			item.bind("click", function(e) {
				if(item.hasClass("disabled")) e.preventDefault();
				else {
					item.trigger("setVal");
					eval( params.action );
				}
				allItems.removeClass("selected");
				item.addClass("selected");
				layer.trigger("close");
				//BBTrace(params.action+"-");
				//if( item.data("events." + params.action ) ) item.trigger( params.action+"("+params.data+")");
			}).bind("setVal", function(e) {
				input = jQuery("input[name="+linkedInput+"]"),
				currentTarget.html( label );
				if(linkedInput) input.val( params.value );
				if(BBSettings.BBForms.checkFormMethod=="rt") {
					currentForm = item.closest("form");
					BBTool_checkForm( currentForm.attr("id"), jQuery(":input[type=hidden][data-BBParams]") );
				}
			});
		});
		jQuery("li", currentSelect).eq(selectedIndex).trigger("setVal");
		
		/* jQuery(".selectedItem", layer).html( currentLabel );
		if(linkedInput) jQuery("input[name="+linkedInput+"]").val( currentValue );*/
		
	});
	
}
