/**
 * @author Mirosław Bogacz, 2010.08.31
 * @version 1.0
 */
(function($){
	$.fn.exclusiveSelect = function(options) {
		
		var options = {
			name: options.name
		}
		
		return this.each(function () {
			var that = this;
			
			var ExclusiveSelect = function() {
				
				var es = {
					handleName: "",
					bufferSelect: "",
					bufferOption: new Array(),
					indexSelected: 0,
					isVisible: false,
					isFocus: false,
					fFocus: true,
					
					_init: function() {
						es.handleName = "eSelect-" + Math.ceil(100000000000000*Math.random());	
						es.bufferSelect = that;
						$(es.bufferSelect).find("option").each(function ( key , value ) {
							es.bufferOption.push(value);
						});
						$(es.bufferSelect).hide();
						
						$(es.bufferSelect).after('<div class="' + options.name + ' ' + es.handleName +' exlusiveSelect" eSelect="' + es.handleName + '"></div>');
						$('.' + es.handleName).append('<div class="exlusiveSelect-value"></div>');
						$('.' + es.handleName).find('.exlusiveSelect-value').css({'overflow': 'hidden', 'white-space': 'nowrap'});
						$('.' + es.handleName).append('<div class="exlusiveSelect-button"></div>');
						$('.' + es.handleName).append('<ul class="exlusiveSelect-list"></ul>');
						$('.' + es.handleName).find('.exlusiveSelect-list').css('white-space', 'nowrap');
						$.each(es.bufferOption, function ( key , value ) {				
							$('.' + es.handleName).find('ul').append('<li class="exlusiveSelect-list-item" i="'+ key +'">' + $(value).text() + '</li>');
						});
						
						
						$('.' + es.handleName).find('.exlusiveSelect-value').click(function() {es.focus()});
						$('.' + es.handleName).find('.exlusiveSelect-button').click(function() {es.focus()});
						$('.' + es.handleName).find('.exlusiveSelect-list-item').click(function() {es.setIndexSelected($(this).attr("i"));});
						$('.' + es.handleName).find('.exlusiveSelect-list-item').click(function() {es.change()});
						$(es.bufferSelect).change(function () {es.setIndexSelected($(this).get(0).selectedIndex); es.onChange();});
						$('.' + es.handleName).mouseover(function() {es.setFlagFocus(false)});
						$('.' + es.handleName).mouseout(function() {es.setFlagFocus(true)});
						$(document).click(function() {es.blur()});
						$(document).keydown(function (e) {es.key(e.keyCode)});
						es.indexSelected = $(es.bufferSelect).get(0).selectedIndex;
						es.select();
						es.setValue();
						
						$('.' + es.handleName).get(0).oncontextmenu = function () {return false;};
					},
					
					key: function(arg) {
						switch(arg) {
							case 27:
								es.hidden();
							break;
							
							case 13:
								es.change();
							break;
						}
					},
					
					blur: function() {
						if (es.fFocus == true) {
							es.hidden();
						}
					},
					
					focus: function() {
						if ($('.' + es.handleName).find('.exlusiveSelect-list').is(':hidden') == true) {
							es.show();
						} else {
							es.hidden();
						}
					},
					
					change: function() {
						es.select();
						$(es.bufferSelect).change();
						es.hidden();
					},
					
					onChange: function() {
						es.select();
						es.setValue();
					},
					
					setFlagFocus: function(arg) {
						es.fFocus = arg;
					},
					
					select: function() {
						$('.' + es.handleName + ' .exlusiveSelect-list-item-active').removeClass('exlusiveSelect-list-item-active');
						$($('.' + es.handleName + ' li').get(es.indexSelected)).addClass('exlusiveSelect-list-item-active');
						es.bufferOption[es.indexSelected].selected = es.indexSelected;
					},
					
					setValue: function(arg) {
						$('.' + es.handleName).find('.exlusiveSelect-value').text($(es.bufferOption[es.indexSelected]).text());
					},
					
					setIndexSelected: function(arg) {
						es.indexSelected = arg;
					},
					
					hidden: function() {
						$('.' + es.handleName).find('.exlusiveSelect-list').hide();
						es.isVisible = false;
					},
					
					show: function() {
						$('.' + es.handleName).find('.exlusiveSelect-list').show();
						es.isVisible = true;
					}
						
				};
				
				es._init();
			}
			
			new ExclusiveSelect();
		});
	};
})(jQuery)
