// Author: Vince Chang
// Website: http://msp-story.blogspot.com/2010/04/jquery-float-dropdown-list-plugin.html
// Version: 1.0

(function($) {	
	$.fn.dropDownList = function(options) {
		//d(this);
		var opts = $.extend({}, $.fn.dropDownList.defaults, options);
		
		return this.each(function() {
			var src = $(this);
			if (!opts.target || $(opts.target).length != 1) return;
			
			var t = $(opts.target);
			opts.rePositionFn(src, t, opts);
			$(window).resize(function(){ opts.rePositionFn(src, t, opts) });
			
			src.hover(function() {
				src.data('mOver', true);
				
				var r = Math.random();
				src.data('r', r);
				setTimeout(function() {
					if(r != src.data('r')) return;
					
					if (!t.is(':visible')) {
						opts.beforShowFn();
						t[opts.showEffect](opts.durationIn); 
					}
				}, opts.delayIn);
			}, function() {
				src.data('mOver', false); 
				
				var r = Math.random();
				src.data('r', r);
				setTimeout(function() {
					if(r != src.data('r')) return;				
									
					if (!t.data('mOver') && t.is(':visible') && !src.data('mOver'))
						t[opts.hideEffect](opts.durationOut);
				}, opts.delayOut);
			});
			
			t.hover(function() { 
				$(this).data('mOver', true) 
			}, function() {
				$(this).data('mOver', false);
				
				var r = Math.random();
				src.data('r', r);
				setTimeout(function() {
					if(r != src.data('r')) return;	
					
					if (!t.data('mOver') && t.is(':visible') && !src.data('mOver'))
						t[opts.hideEffect](opts.durationOut);
				}, opts.delayOut);
			});
		});
	};
  
	// private: debug
	function d(obj) {
		if (window.console && window.console.log)
			window.console.log(obj);
	};
	
	function rePosition(src, target, opts) {
		var left, top;
		switch(opts.position) {
			case 'top':
				left = src.offset().left;
				top = src.offset().top - target.height() ;
				break;
			case 'left':
				left = src.offset().left - target.width();
				top = src.offset().top;
				break;
			case 'right':
				left = src.offset().left + src.width();
				top = src.offset().top;
				break;
			default:
				left = src.offset().left;
				top = src.offset().top + src.height();
				break;
		}
		
		target.css({
			left: left-10,
			top: top ,
			position: 'absolute',
			zIndex: 999
		})
	};
	
	// plugin defaults
	$.fn.dropDownList.defaults = {
		target: null,
		position: 'bottom', // top, left, right, bottom
		durationIn: 'fast',
		durationOut: 'fast',
		delayIn: 0,
		delayOut: 250,
		showEffect: 'slideDown',
		hideEffect: 'slideUp',
		beforShowFn: function() {},
		rePositionFn: rePosition // args: sourceObj, targetObj, options
	};
})(jQuery);
