// PD BOX
(function ($) {
    $.fbSelect = function (select, options) {
    	this.$select = select;
    	this.options = $.extend({
    		selectListOffsetElement: $('body')
    	}, options);
    	this.selectListOffsetElement = this.options.selectListOffsetElement;
    	this.focused = false;
    	this.actived = false;
    	this.canBlur = true;
    	this.blurTimer = null;

    	return this;
    };

    $.fbSelect.prototype = {
		init: function(){
			if(typeof this.$select == 'undefined' || !this.$select.length){
				return this;
			}
			// aktuální index
			this.selectedIndex = this.$select.attr('selectedIndex');

			var klass = this.$select.attr('class');
			var hasClass = klass ? ' '+klass : '';

			this.$fakeSelect = $('<div class="fb-select-text'+hasClass+'" tabindex="0"><div class="fb-select-text-inner"><div class="fb-select-text-arr"><div></div></div></div></div>');
			this.$fakeSelectIn = this.$fakeSelect.children().children();
			this.$fakeSelectText = this.$fakeSelectIn.children();
			this.$fakeSelectList = $('<div class="fb-select-list"><div class="fb-select-list-inner"></div></div>');
			this.$fakeSelectListIn = this.$fakeSelectList.children();

			this.getSelectList();
			this.getSelectText();

			// nastavení rozměrů
			this.selectWidth = this.$select.outerWidth();
			this.$fakeSelect.width(this.selectWidth);

			// vložení do domu
			this.$select.hide().after(this.$fakeSelect);
			this.options.selectListOffsetElement.append(this.$fakeSelectList);

			this.$fakeSelectList.width($.proxy(function(i, old){
				var width =  old > this.selectWidth ? old : this.selectWidth;
				this.selectListWidth = width;
				return width;
			}, this))

			// Event
			this.$fakeSelect.bind('click', $.proxy(this.click, this));
			this.$fakeSelect.bind('focus', $.proxy(this.focus, this));
			if($.browser.msie){
				this.$fakeSelect.bind('mousedown', $.proxy(function(e){
					this.$fakeSelect.focus()
					return false;
				}, this));
			}
			this.$fakeSelect.bind('mouseup', false);
			this.$fakeSelect.bind('blur', $.proxy(this.blur, this));
			this.$fakeSelect.bind('keydown', $.proxy(this.keypress, this));
			this.$fakeSelect.bind('keyup keypress', function(e){
				// tab
				if(e.keyCode != 9)
				{
					return false
				}
				return true
			});
			this.$fakeSelect.bind('change', $.proxy(this.change, this));
			this.$fakeSelectOptions.bind('click', $.proxy(this.clickList, this));
			this.$fakeSelectList.bind('mouseenter', $.proxy(this.overList, this));
			this.$fakeSelectList.bind('mouseleave', $.proxy(this.outList, this));
		},
		click: function(e){
			this.$target = $(e.currentTarget);

			if(!this.actived)
			{
				this.open();
			}
			else
			{
				this.close();
			}
			return false;
		},
		clickList: function(e){
			this.$target = $(e.currentTarget);
			var active = this.$target.index();

			if(active != this.selectedIndex)
			{
				this.selectedIndex = active;
				this.$fakeSelect
					.trigger('change')
					.focus();
			}
			this.close();
			return false;
		},
		overList: function(e){
			this.canBlur = false;
			return false;
		},
		outList: function(e){
			this.canBlur = true;
			return false;
		},
		focus: function(e){
			if(!this.focused)
			{
				this.$fakeSelect.addClass('fb-select-state-focus');
				this.$fakeSelectIn.addClass('js-reflow').removeClass('js-reflow');
				this.focused = true;
			}
		},
		blur: function(e){
			if(this.actived && this.canBlur)
			{
				this.close();
			}
			this.$fakeSelect.removeClass('fb-select-state-focus');
			this.$fakeSelectIn.addClass('js-reflow').removeClass('js-reflow');
			this.focused = false;
		},
		keypress: function(e){
			this.$target = $(e.currentTarget);

			// šipka dolů
			if(e.keyCode == 40)
			{
				this.keypressDown();
				return false;
			}
			// šipka nahoru
			if(e.keyCode == 38)
			{
				this.keypressUp();
				return false;
			}
			// enter
			if(e.keyCode == 13)
			{
				if(this.$select.attr('selectedIndex') != this.selectedIndex)
				{
					this.$fakeSelect.trigger('change');
				}
				this.close();
				return false;
			}
			// tab
			if(e.keyCode == 9)
			{
				if(this.$select.attr('selectedIndex') != this.selectedIndex)
				{
					this.$fakeSelect.trigger('change');
				}
				this.canBlur = true;
			}
		},
		keypressDown: function(e){
			var active = this.selectedIndex;
			var max = this.optionArr.length - 1;
			active = active < max ? active + 1 : max;

			if(active != this.selectedIndex)
			{
				this.selectedIndex = active;
				this.$fakeSelect.trigger('change', [true]);
			}

		},
		keypressUp: function(e){
			var active = this.selectedIndex;
			var min = 0;
			active = min < active ? active-1 : min;

			if(active != this.selectedIndex)
			{
				this.selectedIndex = active;
				this.$fakeSelect.trigger('change', [true]);
			}
		},
		change: function(e, arr){
			this.getSelectText();
			this.$fakeSelectOptions
				.removeClass('fb-select-state-selected')
				.eq(this.selectedIndex)
				.addClass('fb-select-state-selected');

			if(!arr)
			{
				this.$select
					.attr('selectedIndex', this.selectedIndex)
					.trigger('change');
			}
		},

		open: function(){
			var off = this.$target.offset();
			var pOff = this.selectListOffsetElement.offset();
			this.$fakeSelect.addClass('fb-select-state-active');
			this.$fakeSelectIn.addClass('js-reflow').removeClass('js-reflow');
			this.$fakeSelectList
				.css({
					'left': off.left - pOff.left,
					'top': off.top - pOff.top + this.$target.height()
				});

			this.actived = true;
		},
		close: function(){
			this.$fakeSelect.removeClass('fb-select-state-active');
			this.$fakeSelectIn.addClass('js-reflow').removeClass('js-reflow');
			this.$fakeSelectList
				.css({
					'left': '',
					'top': ''
				})

			this.actived = false;
		},
		getSelectText: function(){
			var selectOptionData = this.optionArr[this.selectedIndex];

			this.$fakeSelectText
				.text(selectOptionData.text)
				.attr('class', selectOptionData.klass)
		},
		getSelectList: function(){
			this.optionArr = [];

			var that = this;
			var get = function($element){
				var $kids = $element.children();
				var html = '';

				if($kids.length)
				{
					for (var i=0, l = $kids.length; i < l; i++)
					{
						var $kid = $kids.eq(i);
						var tag = $kid.attr('tagName').toLowerCase();
						var klass = $kid.attr('class');

						if(tag == 'option')
						{
							var text = $kid.text();
							var val = $kid.val() || text;
							var hasClass = klass ? ' class="'+klass+'"' : '';
							var isSelected = $kid.attr('selected') ? ' fb-select-state-selected' : '';
							html += '<a href="#" class="fb-select-option'+ isSelected +'" -data-value="'+ val +'"><span'+ hasClass +'>'+text+'</span></a>'
							that.optionArr.push({
								text: text,
								val: val,
								klass: klass
							})
						}
						if(tag == 'optgroup')
						{
							var label = $kid.attr('label');
							html += '<div class="fb-select-optgroup">'
										+ (label ? '<div class="fb-select-label">' +label +'</div>' : '')
										+ get($kid)
									+'</div>'
						}
					}
					return html;
				}
				return '';
			}

			this.$fakeSelectListIn.append( get(this.$select) );

			// pole optionů
			this.$fakeSelectOptions = this.$fakeSelectListIn.find('.fb-select-option');
		}
	};
})(jQuery);

(function($){

	$(document).ready(function(){

		$.fn.idTabs && $('.tab-box .tab-menu').idTabs();

        // table
    	$('table')
    		.not('.reset')
    		.wrap('<div class="table-wrap"></div>')
    		.find('tbody tr:odd')
    			.addClass('even')
    			.end()
    		.find('tbody tr:last')
    			.addClass('last-row')

    	$('.wysiwyg hr')
    		.wrap('<div class="separator"></div>')
    		.hide();

    	// SELECT
		$('select').each(function(index) {
			var select =  new $.fbSelect($(this), {selectListOffsetElement: $('#main')}).init()
		});
    });

})(this.jQuery);



