(function($) {

	$.fn.menu = function (options) {

		// définition des paramètres par défaut
		var defaults = {
			sLink       : '',
			sMenu       : '',
			menuHeight  : '',
			menuTimer   : null,
			sDelay      : 100,
			sCloseDelay : 250,
			sOpenTime   : 350,
			sCloseTime  : 250,
			sClass      : '',
			sClassSel   : '',
			sEvent      : 'hover',
			input       : null,
			lagLeft     : -2,
			lagTop      : -16
		};

		// mélange des paramètres fournis et des paramètres par défaut
		var opts = $.extend(defaults,options);
	
		function sMenuShow() {
			if (opts.sClassSel != '' && !opts.sLink.attr('class').match(opts.sClassSel)) opts.sLink.attr('class',opts.sLink.attr('class')+opts.sClassSel);
			else opts.sLink.addClass('activ hover');
					
			opts.sMenu.stop().css({
				display: 'block'
			}).animate({
				height: opts.menuHeight
			},opts.sOpenTime);
		}

		function initShow() {
			if(opts.menuTimer) window.clearTimeout(opts.menuTimer);
			opts.menuTimer = window.setTimeout(function () {sMenuShow()},opts.sDelay);		
		}

		function initHide() {
			if(opts.menuTimer) window.clearTimeout(opts.menuTimer);
			opts.menuTimer = window.setTimeout(function () {sMenuHide()},opts.sCloseDelay);			
		}

		function sMenuHide() {
			opts.sMenu.stop().animate({
				height: 0
			},opts.sCloseTime,function(){
				$(this).css({
					display: 'none'
				});

				if (opts.sClassSel != '' && opts.sClass != '') {
					opts.sLink.attr('class',opts.sClass);
					opts.sLink.removeClass(opts.sClassSel);
				} else {
					opts.sLink.removeClass('activ').removeClass('hover');
					if(opts.sClassSel != ''){
						opts.sLink.removeClass(opts.sClassSel);
					}
				}
			});
		}

		function constructMenu(){

			var elements = new Array(opts.sLink,opts.sMenu);

			if (opts.sEvent == 'hover') {
				if (opts.input != null) {
					opts.input.hover(function () {
						initHide();
					});
				}

				for (var i = 0;i < elements.length;i++) {
					var element = elements[i];
			
					element.hover(function () {
						var link       = $(this);
						var height     = $(this).height();
						var offset     = $(this).offset();
						
						opts.sMenu.css({
							position : 'absolute'
						});

						if($(this).attr('id') == opts.sLink.attr('id')){
							if (opts.sLink.offset().top > opts.sLink.position().top) var top = opts.sLink.position().top+height+opts.lagTop;
							else var top = opts.sLink.offset().top+height+opts.lagTop;

							if (opts.sLink.offset().left > opts.sLink.position().left) var left = opts.sLink.position().left+opts.lagLeft;
							else var left = opts.sLink.offset().left+opts.lagLeft;

							opts.sMenu.css({
								top : top,
								left : left
							});
						}

						initShow();
					},function () {
						initHide();
					});
				}
			} else if (opts.sEvent == 'click') {
				opts.sLink.click(function () {
					if (opts.sMenu.height() == 0) initShow();
					else initHide();

					return false;
				});
			}

		}

		$(this).each(constructMenu);

		return $(this);

	};

})(jQuery);

