/*
*	Menu desplegable que soporta n niveles
*	El html debe tener la siguiente estructura:
*	<div>
*		<div class="item">
*				<div class="subitems">
*					<div class="subitem"></div>
*					<div class="subitem"></div>
*				</div>
*		</div>
*		<div>
*		</div>
*	</div>
*/
var tmpQueue = new Array();
var tmpQueueClose = new Array();

(function($){
	$.fn.puMenu = function(isFirst, options){
		var settings = $.extend({
				'firstlevelclass':'boxitems',
				'secondlevelclass':'boxsubitems',
				'overclass':'itemover',
				'showpath':false
			},options);
			
		var selected = false;
		$(this).each(function(){
			var $item = $(this);
			if ($item.find('.subitems').length) {
				var $a = $item.find('a');
				var $triggerObj = isFirst?$a:$item;
				$item[isFirst?'click':'mouseenter'](function(e){
					clearQueue(true); // freno si se esta cerrando
				
					e.preventDefault();
					
					var 
					proximity = 1, //pixeles extra para acercarlo
					subItemLeft = isFirst?Math.round($item.offset().left):(Math.round($item.offset().left+$item.outerWidth(true))),//Si es el primero, lo coloco en el mismo offset left que tiene el div que lo invoc�
					subItemTop = isFirst?Math.round($item.offset().top+$item.height()):$item.offset().top,
					tmpLevel = $item.parent().attr('level') || 0,
					level =(parseInt(tmpLevel)+1),
					tmpId = 'menu_'+level;
					
					//Borro las entradas anteriores a este nivel
					remClass(settings.overclass,tmpLevel);
					
					$item.addClass(settings.overclass);	//Agrego la clase

					//Elimino la posibilidad de que hayan 2 divs con el mismo id o 2 en el mismo nivel
					removeMenu(tmpLevel);
					$('body').find('div#'+tmpId).remove();

					var $subItemDiv = $('<div id="'+tmpId+'"  level="'+level+'"  class="'+(isFirst?settings.firstlevelclass:settings.secondlevelclass)+'" '+
					'style="position:absolute;top:'+subItemTop+'px;left:'+subItemLeft+'px;width:'+$item.outerWidth(true)+'px;z-index:999;"></div>').html($item.find('.subitems').html());

					$subItemDiv.find('.subitem').css({'z-index':999}); //No cuesta nada asegurarse...

					$subItemDiv.mouseenter(function(){
						clearQueue(true);
					});

					$subItemDiv.mouseleave(function(e){
						//clearQueue();
						addToQueue(function(){
							removeAll();
						},1000, true);
					});
					
					$item.mouseleave(function(){
						addToQueue(function(){
							removeAll();
						},1000, true);		
					});

					$(window).click(function(e){
						if(e.target.tagName == 'HTML'){
							removeAll();
						}
					});

					$(window).resize(function(){
						removeAll();
					});

					$subItemDiv.find('.subitem').each(function(){//Me fijo si hay items con subitems dentro para darle la clase y la funcionalidad
						var $this = $(this);
						if($this.find('.subitems').length) {
							$this.addClass('subitemArrow');
							$this.puMenu(false);
						} else {
							 //Cambios ML
							$this.mouseenter(function(e){
								e.preventDefault();
								clearQueue(true);
								removeMenu(level);
								remClass(settings.overclass,level);
								$this.addClass(settings.overclass);
							}).mouseleave(function(e){
								e.preventDefault();
								remClass(settings.overclass,level);
								addToQueue(function(){
									removeAll();
								},1000, true);
							});
						}
					});

					$('body').append($subItemDiv);//agrego el menu temporal
					
					//Busco que no se salga de pantalla
					var wHeight = ($(window).height()+$(window).scrollTop());//total del height de la pagina (incluyendo si se hace scroll)
					if((subItemTop + $subItemDiv.height()) > wHeight) subItemTop = (wHeight - $subItemDiv.height());
					subItemTop = Math.round(subItemTop);
					
					if (subItemTop < 1) subItemTop = 1;

					$subItemDiv.css('top', subItemTop);

				}).mouseleave(function(){
					addToQueue(function(){
						$item.removeClass(settings.overclass);
					},20, true);
				});
			}
		});

		function removeMenu(lvl){
			$('body').find('div').filter(function(){
				return parseInt($(this).attr('level'))>lvl;
			}).each(function(){
					$(this).remove();
			});
		}

		function remClass(cls,level){
			$('body').find('.'+cls).filter(function(){
				return ($(this).parent().attr('level') == level);
			}).each(function(){
				$(this).removeClass(cls);
			});
		}

		function addToQueue(fun,mil,isClose){
			if (fun){
				var t = setTimeout(fun,mil);
				if (isClose) tmpQueueClose.push(t);
				else tmpQueue.push(t);
			}
		}

		function clearQueue(onlyClose){
			if (!onlyClose) {
				for (var i=0; i<tmpQueue.length;i++){
					clearTimeout(tmpQueue[i]);
				}
				tmpQueue = new Array();
			}
			for (var i=0; i<tmpQueueClose.length;i++){
				clearTimeout(tmpQueueClose[i]);
			}
			tmpQueueClose = new Array();
		}

		function removeAll(){
			$('body').find('div').filter(function(){
				return $(this).attr('level');
			}).each(function(){
				$(this).remove();
			});
		}

	};
})(jQuery);
