(function($){

	$.fn.comaCombo = function(){
	
		var args = Array.prototype.slice.call(arguments);
	
		if(args.length > 0 && typeof(args[0]) == 'string') {
		
			var api = $(this).data('comaCombo');
			var method = args.shift();
			
			api[method](args);
		
		} else {
		
			var opciones = args[0];
	
			var settings = $.extend({
				autoWidth: false,
				maxHeight: Infinity
			}, opciones);
			
			var z = 10;
			
			this.each(function(){

				var select = $(this);
				var combo = $('<span class="comaCombo"/>');
				var texto = $('<span/>');
				var label = $('<span class="label"/>');
				var boton = $('<span class="boton"/>');
				var opciones = $('<div class="comaComboOpciones"/>');
				var lock = false;
				var delay = 0;
				
				select.css('visibility', 'hidden');
				
				label.append(texto);
				combo.append(label);
				combo.append(boton);
				combo.insertAfter(select.hide());
				opciones.appendTo('body');
				
				combo.css({
					width: select.outerWidth()
				});
				
				opciones.slideUp(0);
				
				combo
				.click(open)
				.mouseleave(delayedClose);
				
				opciones
				.mouseenter(clearDelay)
				.mouseleave(close);
				
				load();
				
				z++;
				
				function setLabel() {
				
					texto.text(select.find('option:selected').text());
				
				}

				function load() {
				
					var html = '<div>';
					
					select.children().each(function(){

						html += '<a href="#" rel="' + this.value + '">' + $(this).text() + '</a>';

					});
					
					html += '</div>';
					
					opciones
					.html(html)
					.find('a')
					.click(change);
					
					if(settings.autoWidth) {
					
						combo.width(2000);
						combo.width(opciones.width() + boton.width());
						opciones.width(combo.width());
						
					}
					
					if(opciones.height() > settings.maxHeight) {
					
						//opciones.height(settings.maxHeight);
						opciones.find('div').height(settings.maxHeight);
						
					}
					
					setLabel();
				
				}
				
				function open(event) {
				
					if(!lock) {
						
						opciones.css({
							width: combo.outerWidth(),
							top: combo.offset().top + label.outerHeight() - 3,
							left: combo.offset().left,
							zIndex: z++
						});
						opciones.slideDown(250);
						
						combo.css('z-index', z);
						
					}
				
				}
				
				function clearDelay() {
					
					clearTimeout(delay);
				
				}
				
				function delayedClose(event) {
					
					delay = setTimeout(close, 300);
				
				}
				
				function close(event) {
					
					if(!lock) {
					
						opciones.slideUp(250);
						clearDelay();
						
					}
				
				}
				
				function change(event) {
				
					event.preventDefault();
					$(this).blur();
					
					lock = true;
					
					select
					.val(this.rel)
					.change();
					
					setLabel();
					
					opciones.slideUp(250, function() {
					
						lock = false;
					
					});
				
				}
				
				var api = {
					update: function(args) {
					
						if(args.length > 0) {
						
							if(args[0] instanceof Array) {
							
								var html = '';
								var v;
								
								$.each(args[0], function(i) {
								
									html += '<option value="' + this.value + '">' + this.label + '</option>';
									
									if(this.selected) {
									
										v = this.value;
									
									}
								
								});
								
								select.html(html);
								select.val(v);
								load();
							
							} else {
							
								select.val(args[0]);
								setLabel();
							
							}
						
						} else {
						
							load();
						
						}
					
					}
				}
				
				select.data('comaCombo', api);

			});

			return this;
		
		}

	}

})(jQuery);

