(function($){
	$.fn.puMenu = function(){
		var selected = false;
		var handlers = new Array();
		$(this).each(function(){
			var $item = $(this);
			$item.data("selected",false);
			$item.mouseover(function(e){
				var $this = $(this);
				var $aobj = $this.find("a");
				$aobj.addClass("active");
				
				clearHandlers();//limpio todos los handlers que estén en cola
				clearSubitems();//limpio los subitems que puedan haber todavia en la dom (es poco probable, pero no cuesta nada hacerlo)

				/*
				*	Calculo la posición donde estaría el menú dependiendo del alto de la página y la posición del scroll
				*/
				var offset = $this.offset();
				var $subItems = $('<div class="div_subitems"></div>').attr('refid', $aobj.attr('id')).append('<div class="div_close"><img src="../images/close.png" border="0"></div>')
				.click(function(){
					//Limpio todo
					clearSubitems();
					clearHandlers();
				});

				$subItems.css("display","none").append($this.find("div.items_contents").html()); //lo inicio con display none para obtener el height más tarde
				$("body").append($subItems);
				var top = offset.top - 5;
				var wHeight = ($(window).height()+$(window).scrollTop());//total del height de la pagina (incluyendo si se hace scroll)
				if((top + $subItems.height()) > wHeight) top = (wHeight - $subItems.height()); 

				$subItems.css({"display":"","top": top+"px","left":(Math.round((offset.left+$this.outerWidth())))+"px"});//Seteo las propiedades más importantes
				
				$subItems.mouseleave(function(e){
					close($subItems, true, e);//Hago que se cierre en el mouse leave, solo si el cursor no está encima del mismo
					e.preventDefault();
				});
				$subItems.mouseover(function(e){
					close($subItems, true, e);//Hago lo mismo en el mouseover para que se "active" otra vez
					e.preventDefault();
				});

				$this.mouseleave(function(e){//Hago un close con un poco de delay
					close($subItems, true, e);
					e.preventDefault();
				});

				e.preventDefault();
			});

		});

		function clearHandlers(){
			for (var i=0; i<handlers.length;i++){
				clearTimeout(handlers[i]);
			}
			handlers = new Array();
		}
		
		function clearSubitems(){
			$("div.div_subitems").each(function(){
				close($(this), false);
			});
		}

		function close(obj, withDelay, event){
			clearHandlers();
			if(withDelay) {
				var erase = function(){
					var $relTarget = $(event.relatedTarget);
					if($relTarget != obj &&  $relTarget.parents(".div_subitems").length==0 && $relTarget.attr("class") != "div_subitems") {
						$("#"+obj.attr("refid")).removeClass("active");
						obj.remove();
					}
				};
				var t = setTimeout(erase,350);
				handlers.push(t);
			}else {
				$("#"+obj.attr("refid")).removeClass("active");
				obj.remove();
			}
		}
	};
})(jQuery);
