(function( $ ) {
	var methods = {
		settings: {
			slide: false,
			slide_time: 300,
			timeout: 500,
			menu_position: 'left',
			adjust: {
				top: 0,
				left: 0
			},
			hide_selected: false
		},
		active: null,
		selected: null,
		set_data: function( obj,obj2 ) {
			var data = obj.data('lb_menu');
			if ( !data ) {
				data = {};
			}
			$.extend( data,obj2 );
			obj.data('lb_menu',data);
		},
		get_data: function( obj ) {
			var data = obj.data('lb_menu');
			if ( typeof data !== 'object' ) {
				data = {};
			}
			return data;
		},
		init: function( settings ) {
			if ( typeof settings == 'object' ) {
				$.extend( methods.settings,settings );
			}
			return this.each(function() {
				var $this = $(this);
				if ( $this.attr('id') == '' ) {
					return;
				}
				var selected = false;
				if ( typeof methods.settings.selected_class == 'string' ) {
					if ( $this.attr('class').indexOf( methods.settings.selected_class ) !== -1 ) {
						selected = true;
					}
				}
				else if ( methods.settings.selected_id == true ) {
					if ( $this.attr('id').lastIndexOf('-sel') == ( $this.attr('id').length - 4 ) ) {
						selected = true;
					}
				}
				methods.set_data( $this,{ selected: selected } );
				if ( selected == true ) {
					methods.selected = $this;
				}
				$this.mouseover(function() {
					if ( methods.active !== null ) {
						if ( $this.attr('id') == methods.active.attr('id') ) {
							methods.close_cancel( $this );
							return;
						}
					}
					methods.open( $this );
				});
				$this.mouseout(function() {
					methods.close_start( $this );
				});
			});
		},
		select: function( obj ) {
			if ( methods.settings.selected_class ) {
				obj.addClass( methods.settings.selected_class );
			}
			else if ( methods.settings.selected_id ) {
				obj.attr('id',obj.attr('id') + '-sel');
			}
		},
		deselect: function( obj ) {
			if ( methods.settings.selected_class ) {
				obj.removeClass( methods.settings.selected_class );
			}
			else if ( methods.settings.selected_id && obj.attr('id').indexOf('-sel') !== -1 ) {
				obj.attr('id',obj.attr('id').substr(0,( obj.attr('id').length - 4 )));
			}
		},
		open: function( parent ) {
			if ( methods.active !== null ) {
				methods.close_cancel( methods.active );
				methods.close( methods.active );
			}
			methods.active = parent;
			var data = methods.get_data( parent );
			var menu;
			if ( typeof data.menu == 'undefined' ) {
				menu = $('#' + ( data.selected == true && parent.attr('id').indexOf('-sel') !== -1 ? parent.attr('id').substr(0,( parent.attr('id').length - 4 )) : parent.attr('id') ) + '-menu');
				if ( menu.length == 0 ) {
					return;
				}
				menu.mouseover(function() {
					methods.close_cancel( parent );
				});
				menu.mouseout(function() {
					methods.close_start( parent );
				});
				var offset = parent.offset();
				var top = left = 0;
				top = ( offset.top + parent.outerHeight() ) + methods.settings.adjust.top;
				switch( methods.settings.menu_position ) {
					case 'center':
						left = ( offset.left + ( parent.outerWidth() / 2 ) - ( menu.outerWidth() / 2 ) );
					break;
					case 'page-center':
						left = ( ( $(window).width() / 2 ) - ( menu.outerWidth() / 2 ) );
					break;
					default:
						left = offset.left;
					break;
				}
				left += methods.settings.adjust.left;
				menu.css({
					position: 'absolute',
					top: top + 'px',
					left: left + 'px'
				});
				methods.set_data( parent,{ menu: menu } );
			}
			else {
				menu = data.menu;
			}
			if ( methods.settings.slide == true ) {
				menu.slideDown( methods.settings.slide_time );
			}
			else {
				menu.css('display','block');
			}
			if ( !data.selected ) {
				methods.select( parent );
			}
			if ( !data.selected && methods.settings.hide_selected == true && methods.selected !== null ) {
				methods.deselect( methods.selected );
			}
		},
		close_start: function( parent ) {
			var data = methods.get_data( parent );
			if ( !data.timer || data.timer == null ) {
				methods.set_data( parent,{ timer: setTimeout(function() {
					methods.close( parent );
				},methods.settings.timeout) } );
			}
		},
		close_cancel: function( parent ) {
			var data = methods.get_data( parent );
			clearTimeout( data.timer );
			methods.set_data( parent,{ timer: null } );
		},
		close: function( parent ) {
			var data = methods.get_data( parent );
			if ( typeof data.menu == 'undefined' ) {
				return;
			}
			if ( methods.settings.slide == true ) {
				data.menu.slideUp( methods.settings.slide_time,function() {
					if ( !data.selected ) {
						methods.deselect( parent );
						if ( methods.settings.hide_selected == true && methods.selected !== null ) {
							methods.select( methods.selected );
						}
					}
				});
			}
			else {
				data.menu.css('display','none');
				if ( !data.selected ) {
					methods.deselect( parent );
					if ( methods.settings.hide_selected == true && methods.selected !== null ) {
						methods.select( methods.selected );
					}
				}
			}
			methods.set_data( parent,{ timer: null } );
			methods.active = null;
		}
	};
	$.fn.lb_menu = function() {
		methods.init.apply( this,arguments );
	}
})( jQuery );
