

(function($) {

jQuery.fn.sgMenu = function(settings) {

	// Settings
	settings = jQuery.extend({
		menuArgs: '',
		menuHeight: 'auto',
		menuWidth: 'auto',
		onInit: function() {},
		onShow: function() {},
		onHide: function() {},
		hoverClass: 'sgMenuActive',
		menuId: 'sgFlyNav',
		menuInside: true,
		containerId: null,
		containerRel: false,
		overlayId: 'sgFlyNavContainer',
		overlayColor: '#000',
		overlayOpacity: 0.8,
		timerDuration: 500,
		offsetTop: 0,
		offsetSide: 0
	}, settings);
	
	var overlayObj, menuObj, containerObj, isPaused;
	var sgMenuObj = this;
	
	_initialize();
	
	return sgMenuObj.each(function() {
		
		var obj = $(this);
		
		obj.hover(
			function() { _show(obj); },
			function() { _pause(obj); }
		);
		
	});
	
	function _initialize() {
		containerObj = (settings.containerId != null) ? $('#' + settings.containerId) : $('body');
		
		containerObj.append('<div id="' + settings.overlayId +'" style="display:none;"></div><div id="' + settings.menuId +'" style="display:none;"></div>');
		
		menuObj = $('#' + settings.menuId);
		overlayObj = $('#' + settings.overlayId);
		
		
		settings.onInit.call();
	}
	
	function _show(obj) {
		
		clearTimeout(settings.sgTimer);
		
		if (obj.hasClass(settings.hoverClass)) return;
		
		sgMenuObj.removeClass(settings.hoverClass);
		settings.onShow.call();
		_hide(obj);
		
		if (!_create(obj)) { return; }
		
		obj.addClass(settings.hoverClass);
		
		var pos = obj.offset();
		
		if (settings.containerRel) {
			var cPos = containerObj.offset();
			pos.left = parseInt(pos.left - cPos.left);
		}
		
		var pLeft = parseInt(pos.left + settings.offsetSide);
		var pRight = parseInt(pos.left + obj.width() + settings.offsetSide);
		var pTop = parseInt(pos.top + settings.offsetTop + obj.height());
		
		// Position The Menu
		menuObj.css('left',pLeft).css('top',pTop).css('width',settings.menuWidth).css('height',settings.menuHeight).show();
		overlayObj.css('left',pLeft).css('top',pTop).css('height',menuObj.height()).css('width',menuObj.width()).css('opacity',settings.overlayOpacity).show();		
		
		if (settings.menuInside) {
			var menuPos = menuObj.offset();
			var containerPos = containerObj.offset();
			
			if (parseInt(menuPos.left + menuObj.width()) > parseInt(containerPos.left + containerObj.width())) {
				pLeft = parseInt(pos.left - menuObj.width() + obj.width() + settings.offsetSide);
				menuObj.css('left', pLeft);
				overlayObj.css('left', pLeft);
			}
		}
		
		menuObj.hover(
			function() { clearTimeout(settings.sgTimer); },
			function() { _pause(obj); }
		);
	}
	
	function _hide(obj) {	
		obj.removeClass(settings.hoverClass);
		menuObj.css('top','-3000').empty().hide();
		overlayObj.css('top','-3000').hide();
		
		settings.onHide.call();
	}
	
	function _create(obj) {
		var itemId = obj.attr('rel');
		
		if (!_defined(settings.menuArgs + itemId)) return false;
		
		menuObj.append('<ul id="sgFlyMenuItems"></ul>');
		var menuItems = eval(settings.menuArgs + itemId);
		
		for(var i=0;i<menuItems.length;i++) {
			var lTarget = (menuItems[i][2] != '') ? ' target="' + menuItems[i][2] + '"' : '';
			$('#'+ settings.menuId + ' ul').append('<li><a href="' + menuItems[i][1] + '"' + lTarget + '>' + menuItems[i][0] + '</a></li>');	
		}
		
		return true;
	}
	
	function _defined(variable) {
		try { 
        	eval(variable);
		} catch (e) { 
			return false;
		}
		return true;
	}
	
	function _pause(obj) {
		clearTimeout(settings.sgTimer);
		settings.sgTimer = setTimeout(function() { _hide(obj); }, settings.timerDuration);
	}

	
	
	
	
	return jQuery;

};

})(jQuery);
