/* SELECTS */
document.lastKeyHit = '';
document.lastKeyCounter = 0;
var customSelects = [];
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(){
		customSelects.push(this);
																
		$(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);
		
		try {
			var currentText = (this.options[this.selectedIndex].label) ? this.options[this.selectedIndex].label : this.options[this.selectedIndex].text;
		} catch (ex) {
			var currentText = "";
		}
		$current.html(currentText);
		
		$optionHolder = $('div.optionholder',p);
		holderWidth = sWidth + ($current.outerWidth() - $current.width()) - ($optionHolder.outerWidth() - $optionHolder.width());
		$optionHolder.css('minWidth',holderWidth).css('display','none').css('opacity',0);
		var maxWidth = holderWidth;
				
		function addNewOption(opt,$holder) {
			var $o = $('<div class="option">'+(opt.label ? opt.label : opt.text)+'</div>').data('index',opt.index);
			$o.attr('letter',opt.text.substr(0,1).toLowerCase());
			if (opt.disabled) $o.addClass('disabled');
			$holder.append($o);
			$o.bind('mouseenter',function(){
				document.lastKeyHit = '';
				document.lastKeyCounter = 0;
				$('.option',$optionHolder).removeClass('hover');
				$(this).addClass('hover');
			});
		}
		
		// tworze elementy optionow uwzgledniajac obsluge optgroup
		$(this).children().each(function(){
			if (this.tagName == 'OPTGROUP') {
				$optGroup = $('<div class="optgroup"></div>');
				$label = $('<div class="label">'+this.label+'</div></div>');
				$optGroup.append($label);
				
				$(this).children().each(function(){
					addNewOption(this,$optGroup);
				});
				$optionHolder.append($optGroup);
			}
			else if (this.tagName == 'OPTION') {
				addNewOption(this,$optionHolder);
			}
		});
		
		$optionHolder.css('visiblity','hidden').css('display','block');
		$('.option, .label',$optionHolder).each(function(){
			maxWidth = (maxWidth < this.offsetWidth) ? this.offsetWidth : maxWidth;
		}).each(function(){
			var paddingTotal = $(this).innerWidth() - $(this).width();
			$(this).width(maxWidth - paddingTotal);
		});
		$optionHolder.css('visiblity','visible').css('display','none');
		
		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() {
			if ($('select',this).attr('disabled')) return false;
			
			var o = this;
			
			var index = $('select',this).get(0).selectedIndex;
			$('.option',this).removeClass('hover');
			$('.option',this).eq(index).addClass('hover');
			
			$(o).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;});
		
		$('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();})
});

$(document).bind('keydown',function(e){
	if (e.which == 13) {
		$('.select-open .option.hover').click();
	}
	if (e.which < 65 || e.which > 90) return;
	var keyChar = String.fromCharCode(e.which);
	var isLetter = /[a-z]/i;
	
	if (isLetter.test(keyChar)) {
		if (document.lastKeyHit == keyChar)
			document.lastKeyCounter++;
		else
			document.lastKeyCounter = 0;
			
		$holder = $('.select-open .optionholder');
		
		if ($holder.length == 0) return;

		$options = $('div.option[letter='+keyChar.toLowerCase()+']',$holder);
		
		if (document.lastKeyCounter >= $options.length)
			document.lastKeyCounter = 0;

		var option = $options.get(document.lastKeyCounter);
		
		$('.option',$holder).removeClass('hover');
		$(option).addClass('hover');
		
		var holder = $holder.get(0);
		var theHeight = (holder.clientHeight == 0) ? holder.offsetHeight : holder.clientHeight;
		if (theHeight < holder.scrollHeight && $options.length > 0) {
			var diff = holder.scrollHeight - theHeight;
			var scrTo = option.offsetTop;
			
			if (scrTo > diff) scrTo = diff;
			
			$holder.scrollTop(scrTo);
		}
		document.lastKeyHit = keyChar;
	}
});

setInterval(function(){
	for (i in customSelects) {
		if ($(customSelects[i]).attr('disabled')) {
			$(customSelects[i]).closest('.customselectbox > *').css('opacity',0.5);
		} else
			$(customSelects[i]).closest('.customselectbox > *').css('opacity',1);
	}
},100);
