jQuery.fn.menuGenerator = function(params) {
	defaults = {
		action: 'hover', // evento que disparará o efeito, pode ser 'hover' ou 'click' (ainda não está pronto)
		active: 'active',  // classe que representa o elemento ativo
		current: 'current', // class que representa o elemento que deve ficar ativo quando nenhum outro for selecionado.
		first: 'first', // classe que representa o primeiro elemento
		fx: 'none',  // o tipo de efeito. Pode ser 'none', 'fade' ou 'slide'.
		last: 'last', // classe que representa o último elemento
		level: 'level',  // classe que representa os níveis de ul
		skin: '' // path para o skin
	};
	
	var doEffect = function(obj,fx,flag) {
		switch(fx) {
			case 'slide':
				if(flag) obj.slideDown('fast');
				else obj.slideUp('fast');
				break;
			case 'fade':
				if(flag) obj.fadeIn();
				else obj.fadeOut();
				break;
			case 'puff':
				break;
			case 'fold':
				break;
			case 'drop':
				break;
			case 'none':
				if(flag) obj.show();
				else obj.hide();
				break;
		}
	};
	
	var putClass = function(arrObj, level) {
		jQuery(arrObj).each(function() {
			jQuery(this).addClass(settings.level+'-'+level);
			if(jQuery(this).find('ul').length) {
				putClass(jQuery(this).children().children().filter('ul'),(level+1));
			}
		});
	};
	
	var settings = jQuery.extend(defaults, params);
	
	// verificar se o skin existe e carregá-lo
	if(settings.skin!='') {
		jQuery.ajax({
			url: settings.skin,
			success: function() {
				jQuery('head').append('<link rel="stylesheet" href="'+settings.skin+'" type="text/css" media="all" />');
			}
		});
	}
	
	return this.each(function() {
		$this = jQuery(this);
		
		// colocar as classes
		jQuery('li:first-child',$this).addClass(settings.first);
		jQuery('li:last-child',$this).addClass(settings.last);
		
		jQuery($this).addClass(settings.level+'-1');
		
		if($this.find('ul').length) {
			putClass($this.children().children().filter('ul'),2);
		}
		
		if(settings.action == 'click') {
			// colocar as setas e fazer o bind dos eventos às mesmas.
		}
		
		// ---------------------------------
		
		jQuery('li ul',$this).hide();
		var arrObj = new Array();
		var prev = new Array();
		var cont = 0;
		
		switch(settings.action) {
			case 'hover':
				jQuery('li',$this).hover(
					function() {
						jQuery(this).addClass(settings.active)
							.siblings().removeClass(settings.active);
					}, function() {
						jQuery(this).removeClass(settings.active);
						if(!jQuery(this).siblings('.'+settings.active).length)
							jQuery(this).parent().children('.'+settings.current).addClass(settings.active);
					}
				);
				jQuery('li ul',$this).parent().hover( // apenas lis com sub-níveis
					function() {
						flag = false;
						now = new Date();
						for(i in arrObj) {
							if(jQuery(arrObj[i]).html() == jQuery(this).html()) {
								if((now -prev[i]) > 1000) {
									doEffect(jQuery(this).children('ul'),settings.fx,1);
									prev[i] = new Date();
								}
								flag = true;
								break;
							}
						}
						if(!flag) {
							arrObj[arrObj.length] = this;
							prev[prev.length] = new Date();
							doEffect(jQuery(this).children('ul'),settings.fx,1);
						}
					}, function() {
						doEffect(jQuery(this).children('ul'),settings.fx,0);
					}
				);
				break;
			case 'click':
				break;
		}
	});
};

