(function($) {
	
	var RdxC5MenuConfig = {
		menu: '#menu',
		offsets: {top:0,left:-15,right:-15,top2:0,bottom2:0},
		delay: 1000,
		speed: 130,
		type: 'vertical'
	};

	$.fn.RdxC5Menu = function(cfg){
		this.$config  = $.extend({}, RdxC5MenuConfig, cfg || {});
		
		this.$isIphone	= (navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i));
		this.$dropdowns	= $('<div class="rdxdropdowns" />').appendTo($(document.body));
		
		this.$root = new Object();
		this.$timer = false;	
		this.$counter = 0;

		var menu = this;
		
		$(this).children().each(function(){
			menu.$level = 1;
			menu.RdxC5MenuScanUl(this);		
		});	
	}
	
	$.fn.RdxC5MenuScanUl = function(el){
		this.$counter++;

		var level = this.$level;
		el.$ul	  = $(el).find('ul:first');
		el.$level  = level;
		el.$lid	  = this.$counter;
		
		var menu = this;
		if (el.$ul.length>0){
			el.$ul.children().each(function(){
				menu.$level = level+1;
				menu.RdxC5MenuScanUl(this);
			});
				
			if (this.$isIphone) {
				el.$iclick = $('<span class="iclick" />').appendTo($(el));
				el.$iclick.clicked = false;
				
				el.$select.bind('click',function(){
					if (el.$iclick.clicked) {
						menu.RdxC5MenuHide(el,false);
						el.$iclick.clicked = false;
					} else {
						menu.RdxC5MenuShow(el);
						el.$iclick.clicked = true;									
					}
				});	
			}
			
			var newclass = el.className.replace('expand-open','').replace('mitemfirst','')
									   .replace('expand','').replace('active-cur','')
									   .replace('active','').replace('mitemlast','');
			
			el.$div1 = $('<div class="rdxulframe '+newclass+'" />').appendTo(this.$dropdowns);						
			el.$div2 = $('<div class="ulholder" />').append($('<div class="top" />'))
													.append($('<div class="main" />').append(el.$ul))
													.append($('<div class="bottom" />'))
													.appendTo(el.$div1);
				
			el.$div2.w = el.$div1.width();
			el.$div2.h = el.$div1.height();
			el.$div2.css('marginTop')
			
			if (el.$level == 1 && RdxC5MenuConfig.type == 'horizontal') {
				el.$div2.css('marginTop',-el.$div2.h);
			} else {
				el.$div2.css('marginLeft',-el.$div2.w);
			}			

			el.$div2.bind('mouseleave',function(){menu.RdxC5MenuHide(el,true)});
			el.$div2.bind('mouseenter',function(){menu.$timer = clearTimeout(menu.$timer)});
		
		} else {
			el.$ul = false;
		}
		
		$(el).bind('mouseenter',function(){menu.RdxC5MenuShow(el)});
		if (el.$level == 1 && el.$div1)
			$(el).bind('mouseleave',function(){menu.RdxC5MenuHide(el,true)});	
	}
	
	$.fn.RdxC5MenuShow = function(li){
		if ($(li).parent().get(0).$busy) return;
		
		if(this.$timer)
			this.$timer = clearTimeout(this.$timer);
		
		if (this.$root[li.$level] && this.$root[li.$level].$lid != li.$lid)
			this.RdxC5MenuHide(this.$root[li.$level],false);
		
		this.$root[li.$level] = li;
		
		if (!li.$x) {
			li.$w = $(li).width();
			li.$h = $(li).height();
		}
		
		if (!$(li).hasClass('hover') && li.$div1) {
			$(li).addClass('hover');
		} else {
			return;
		}
		
		var offsets = this.$config.offsets;
			
		if (li.$div1) {
			li.$ul.get(0).$busy = true;
			
			var w = new Object()
			w.w = $(window).width();
			w.h = $(window).height();
			w.scrollX = $(window).scrollLeft();
			w.scrollY = $(window).scrollTop();
			
			var direction = 'marginLeft';
			
			if (li.$level == 1 && this.$config.type == 'horizontal') {
				var leftpos = $(li).offset().left-offsets.left;
				var toppos  = $(li).offset().top+li.$h;
				var start	= -li.$div2.h;
				if ((w.w-li.$div2.w-leftpos)<0) {
					var leftpos = w.w-li.$div2.w;
				}
				direction = 'marginTop'; 
				
			} else {
				var toppos  = $(li).offset().top-offsets.top2;
				var leftpos = $(li).offset().left+li.$w-(li.$level == 1?0:offsets.left);
				var start	= -li.$div2.w;

				if ((w.w-li.$div2.w-leftpos)<0) {
					var leftpos = $(li).offset().left-li.$div2.w+offsets.right;
					var start	= li.$div2.w;
				}
				
				if ((w.h+w.scrollY-toppos-li.$div2.h)<0)
					var toppos  = $(li).offset().top+li.$h-li.$div2.h+offsets.bottom2;
			}		
			
			li.$div2.css(direction,start);
			li.$div1.css({'left':leftpos,'top':toppos});			
			$(li).RdxC5MenuFx(0);
			if (this.$isIphone) li.$iclick.clicked = true;
		}		
	}
	
	$.fn.RdxC5MenuFx = function(coord){
		var li = this.get(0);	
		li.$div2.stop();
		var animObject = new Object();
		animObject = (li.$level == 1 && RdxC5MenuConfig.type == 'horizontal') ? {marginTop:coord} : {marginLeft:coord} ;		
		
		li.$div2.animate(animObject, RdxC5MenuConfig.speed, function() {
				if (coord != 0) {
					li.$div1.css('left','-999em');
				}

				li.$ul.get(0).$busy = false;
			}
		);		
	}
	
	$.fn.RdxC5MenuHide = function(li,delay){
		var menu = this;
		if (delay) {
			this.$timer = setTimeout(function(){menu.RdxC5MenuHideElements()},this.$config.delay);
		} else {
			this.RdxC5MenuHideElement(li);
			if (this.$root[li.$level+1]) {
				var level = li.$level+1;
				while (this.$root[level]) {
					this.RdxC5MenuHideElement(this.$root[level]);
					level++;
					if(level>10) break; 					
				}			
			}
		}
	}
	
	$.fn.RdxC5MenuHideElements = function(){
		var menu = this;
		$.each (this.$root, function(k,li) {
			if (li.$div1) menu.RdxC5MenuHideElement(li);
		});	
	}
	$.fn.RdxC5MenuHideElement = function(el){
		if (el.$div1) {
			el.$ul.get(0).$busy = true;
			var crd = (el.$div1.offset().left < $(el).offset().left)?el.$div2.w:-el.$div2.w;
					
			if (el.$level == 1 && this.$config.type == 'horizontal')
				var crd = -el.$div2.h;
			
			$(el).RdxC5MenuFx(crd);
			if (this.$isIphone) el.$iclick.clicked = false;
		}
		$(el).removeClass('hover');	
	}
	
	$(window).ready(function(){
		$(RdxC5MenuConfig.menu).RdxC5Menu();	
	});
})(jQuery);
