(function($) {
$.fn.ui_menu = function(options) {

	this.each(function() {	
	
		ui_menu(this,options);
		
		return this; 
  	})
  
}

ui_menu = function (content,options) {

	return new ui_fn_menu(content,options), false ;

}

ui_fn_menu = function (content,options) {

	var self = this;
	this.content = content;
	this.settings = $.extend({}, $.fn.ui_menu.defaults, options);
	
	$('li > *',this.content).not('a').hide()
		
	this[this.settings.type]();

	return false;

}

ui_fn_menu.prototype = {

	fading: function () {
	
	var self = this;
		
		$(document.body).bind('click', function(e){
   				 
   			if(e.target.id !== self) {
   			
   				self.unselect_all();
   			
   			if ($.browser.msie){
   			
   			$('ul li ul:visible',self.content).hide();
			
			$('ul:visible',self.content).hide();

			
			} else {
			
			$('ul:visible',self.content).ui_hide();
			
			}
   				
   			} 
       			
       	})	
       	
       	
			
		$('a',this.content).each(function(index) {
		
			$(this).live('click', function () {
		
		this.href=$(this).attr('href');
		

		if ($(this).siblings('ul').size()> 0) {	
		
			self.hide_visible(this);
			
			self.unselect_all(this);
		
			
			if ($.browser.msie){
			
			$(this).toggleClass('selected').siblings('ul').find('ul:visible').andSelf().toggle();
			
			} else {
			
			$(this).toggleClass('selected').siblings('ul').find('ul:visible').andSelf().ui_toggle();
			
			}
			
			return false;		

		} 
		
	})
	})
	
	},
	sliding: function (){
	
		var self = this;
		
		if(self.settings.parent) {
		
			this.parent = $(self.settings.parent)

		} else {
		
			this.parent = this.content;
		}

		if(self.settings.wrapper) {
	
			this.wrapper = self.settings.wrapper;
	
			$(this.wrapper).ui_wrapper('self')
	
			$(this.parent).css({position:'relative'})
	
		} else {
	
			this.wrapper=$(this.parent).ui_wrapper();
	
		}
		
		
	
		this.displacement =$(this.wrapper).outerWidth();
		
	
		$('li >a',this.content).not($(':not(ul,li) a',this.content)).bind('click', function () {
		
			var button = this;
	
			
			if($(this).closest('ul').not(self.content).size()>0 || self.settings.parent==false){
				
				button.parent  = $(this).closest('ul');
			
			} else {
			
				button.parent  = self.parent;
			}		
			
					

			button.siblings = $(this).siblings();
		
			if (self.settings.ajax) {
		
				if ($(button.siblings).size() > 0 ) {
			
					button.nextSilde = $(button.siblings).clone(true);
				
				
					var wrapperHeight = $(self.wrapper).height();
				
					var scrollTop = $(window).scrollTop();
				
					var wrapperTop = $(self.wrapper).offset().top;
			
					var scroll = wrapperTop - (wrapperHeight*0.1) ;
			
					if (scrollTop <= scroll) { scroll = scrollTop;}
							
						/* 	alert(scroll+' '+scrollTop) */
				
					$(button.nextSilde).show().css({position:'absolute', width:'100%', top:0, left:self.displacement}).appendTo(self.wrapper)
				
					$(button.parent).animate({'left': '-='+self.displacement+'px'}, "slow");
				
					$(button.nextSilde).animate({'left': '-='+self.displacement+'px'}, "slow",function () {
				
						$('html,body').animate({scrollTop : scroll})
				
					});
					
					if ($('a.ui-menu-back',button.nextSilde).size()==0) {
						
						var back =$('<a/>', { 'href':'#','class': 'ui-menu-back'}).append('back');
						
						
						
						if(self.settings.back && $(self.settings.back,button.nextSilde).size()>0){
							
								$(self.settings.back,button.nextSilde).prepend(back);	
							
							} else {
							
								$(back).prependTo(button.nextSilde);	
								
								$(button.nextSilde).prepend(back);
							
							}
							
					
					}
						var animate_options = {};
						
						animate_options[self.settings.direction] = '+=' + self.displacement + 'px';
					
					$('a.ui-menu-back',button.nextSilde).bind('click', function () {
				
						$(button.nextSilde).animate(animate_options, self.settings.speed , function () {
						
						
				
							$(this).remove();
						});
						
				
						$(button.nextSilde).prev().animate(animate_options, self.settings.speed, function () {
				
						
				
							 $('html,body').animate({scrollTop : scrollTop})
							 
							 
						});
					
						return false;
					})
			
				} else {
			
					/* alert('get ajax');  */
			
				}
		
		return false;
		
		} else {
				
					var animate_options = {};
					animate_options[self.settings.direction] = '-=' + self.displacement + 'px';
		
		if($(this).attr('href')=='#') { 
		
				
			if ($(this).siblings('ul').size() > 0 ) {
			
				
				$(this).siblings('ul').clone(true).show().css({position:'absolute', width:'100%', top:0, left:self.displacement}).appendTo(self.wrapper)
				
				$('> ul:visible',self.wrapper).animate(animate_options, self.settings.speed);
					
			}	
		
		return false;
		}		
		
		}
		
	

	
	})
	},

	hide_visible : function (element) {
		
		if (element) {

			var parent = $(element).parent('li');
			
			if ($.browser.msie){
				
			$(parent).siblings('li').find('ul:visible').hide();
			
			} else {
			
			$(parent).siblings('li').find('ul:visible').ui_hide();
			
			}
	
		} else {
		
			if ($.browser.msie){
			
			$('a',this.content).siblings('ul:visible').hide();
			
			} else {
			
			$('a',this.content).siblings('ul:visible').ui_hide();
			
			}
		
		}
		
		 
	
	},
	
	unselect_all : function (element) {	
	
		if (element) {	
			
		 	
			var parent = $(element).parent('li');
		 	$(parent).siblings('li').find('a').removeClass('selected');

			
		} else {
		
			$('a',this.content).removeClass('selected');
			
		
		}
			
	}
	

}

$.fn.ui_menu.defaults = {
	type:'fading',
	speed:'slow',
	direction:'left',
	target: false,
	ajax: false,
	callback:jQuery.noop
}; 
 })(jQuery);
