(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
		};

		// 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);
				} else {
					opts.sLink.removeClass('activ').removeClass('hover');
				}
			});
		}

		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 () {
						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);

