function prepareSelects(context,maxHeight) {
	$("select.auto-submit",context).bind("change",function(){
		this.form.submit();
	})
	.each(function() {
		$('input[type=submit]',$(this.form)).remove();
	});
	
	$("select.auto-redirect",context).bind("change",function(){
		window.location.href = this.options[this.selectedIndex].value;
	}).each(function() {
		$('input[type=submit]',$(this.form)).remove();
	});
	
	var zIndexOpening = 10;
	
	// wybieram tylko widoczne selecty (nie znajdujace sie w czyms co ma display:none
	// odrzucam selecty z wylaczona opcja custom i selecty juz przetworzone
	$("select:visible",context).not(".no-custom").each(function(){
		$(this).addClass('no-custom'); // zabezpieczenie przed powtornym przetworzeniem tego samego selecta
		var p = $(this.parentNode).addClass('customselectbox').get(0); // flaga
		var sWidth = this.offsetWidth;
		
		$(this).css('display','none');
		$(p).append('<div class="current"></div><div class="arrow"></div><div class="optionholder"></div>');
		
		$arrow = $('div.arrow',p);
		
		$current = $('div.current',p);
		currentWidth = sWidth - $arrow.outerWidth();
		$current.css('width',currentWidth);
		
		var currentText = (this.options[this.selectedIndex].label) ? this.options[this.selectedIndex].label : this.options[this.selectedIndex].text;
		$current.html(currentText);
		
		$optionHolder = $('div.optionholder',p);
		holderWidth = sWidth + ($current.outerWidth() - $current.width()) - ($optionHolder.outerWidth() - $optionHolder.width());
		$optionHolder.css('width',holderWidth).css('display','none').css('opacity',0);
		
		function addNewOption(opt,$holder) {
			var $o = $('<div class="option">'+(opt.label ? opt.label : opt.text)+'</div>').data('index',opt.index);
			if (opt.disabled) $o.addClass('disabled');
			$holder.append($o);
		}
		
		// tworze elementy optionow uwzgledniajac obsluge optgroup
		$(this).children().each(function(){
			if (this.tagName == 'OPTGROUP') {
				$optGroup = $('<div class="optgroup"><div class="label">'+this.label+'</div></div>');
				$(this).children().each(function(){
					addNewOption(this,$optGroup);
				});
				$optionHolder.append($optGroup);
			}
			else if (this.tagName == 'OPTION') {
				addNewOption(this,$optionHolder);
			}
		});
		
		if (!isNaN(maxHeight) && $optionHolder.height() > maxHeight) {
			$optionHolder.css('overflow-y','scroll');
			$optionHolder.height(maxHeight);
		}
		
		// dodawanie funkcji dla select holdera
		p.setSelect = function(index,txt) {
			if (this.enabled) {
				$('div.current',this).html(txt);
				$('select',this).get(0).selectedIndex = index;
				try {
					$('select',this).change();
				} catch (ex) { }
			}
		}
		
		p.closeSelect = function() {
			var o = this;
			
			o.enabled = false;
			$(o).removeClass('select-open');
			if (!isNaN($(o).css('zIndex')) && $(o).css('zIndex')>0) $(o).css('zIndex',$(o).css('zIndex')-1);
			$('div.optionholder',o).stop().animate({opacity:0},150,function(){$(this).css('display','none'); $(o).css('zIndex','');});
		}
		
		p.openSelect = function() {
			var o = this;
			
			$(o).addClass('select-to-open').css('zIndex',zIndexOpening);
			$optionHolder = $('div.optionholder',o).css('display','').css('top','').stop().animate({opacity:1},150,function(){o.enabled=true;});
			if (!o.isInView()) {
				// ustawiam tak, zeby odleglosc od krawedzi current byla taka sama dla obu przypadkow, dla zachowania odpowiedniego wygladu
				var current = $('div.current',o).get(0);
				$optionHolder.css('top',-$optionHolder.outerHeight()-($optionHolder.position().top-current.offsetHeight));
			}
		}
		
		p.toggleSelect = function() {
			if ($(this).hasClass('select-open')) this.openSelect();
			else this.closeSelect();
		}
		
		p.isInView = function() {
			var docViewTop = $(window).scrollTop();
			var docViewBottom = docViewTop + $(window).height();
		
			var elemTop = $('div.optionholder',this).offset().top;
			var elemBottom = elemTop + $('div.optionholder',this).outerHeight();
			
			return !(elemBottom >= docViewBottom);
		}
		
		// dodawanie event'ow
		$arrow.add($current).add($('label[for='+this.id+']')).bind('click',function(e){
			var $p = $(this.selectHolder);
			if ($p.hasClass('select-open')) $p.removeClass('select-open');
			else $p.addClass('select-open');
			
			$('div.customselectbox').not($p).removeClass('select-open');
			e.preventDefault();
		}).each(function(){this.selectHolder = p;}).addClass('con');
		
		$('div.option,div.label',p).bind('click',function(e){
			if ($(this).hasClass('disabled') || $(this).hasClass('label')) {
				e.preventDefault();
				e.stopPropagation();
			}
			else {					 
				var p = $(this).closest('div.customselectbox').removeClass('select-open').get(0);
				p.setSelect($(this).data('index'),$(this).html());
			}
		});
		
		p.enabled = true;
	});
}

$(document).bind('click',function(e){
	if (typeof e.target.selectHolder == "undefined") {
		$('.select-open').removeClass('select-open');
	}
	$('div.customselectbox').each(function(){this.toggleSelect();})
});
