(function($){
	$.fn.menuFloater = function(options) {
		var defaults = {
			classWrapper: 'menu-floater',
			classContent: 'menu-floater-content',
			width: 200,
			idWrapper: 'menu-floater-sidemenu',
			location: 'top', // top, bottom
			align: 'left', // left, right
			offsetLocation: 10,
			offsetAlign: 10,
			speedFloat: 1500,
			speedContent: 600,
			tabText: 'Click',
			event: 'click',
			classTab: 'tab',
			classOpen: 'menu-open',
			classClose: 'menu-close',
			classToggle: 'menu-toggle',
			autoClose: true,
			loadOpen: false,
			tabClose: true,
			easing: 'easeOutQuint',
			onLoad : function() {},
            onOpen : function() {},
			onClose: function() {},
			onFloat: function() {}
		};
			//idWrapper: 'menu-floater-'+$(this).index(),
		var options = $.extend(defaults, options);
		
		return this.each(function(options){
			var floatHtml = $(this).html();
			var floatTab = '<div class="'+defaults.classTab+'"><span>'+defaults.tabText+'</span></div>';
			$(this).hide();
			var idWrapper = defaults.idWrapper;
			if(defaults.location == 'bottom'){
				var objHtml = '<div id="'+idWrapper+'" class="'+defaults.classWrapper+' '+defaults.location+' '+defaults.align+'"><div class="'+defaults.classContent+'">'+floatHtml+'</div>'+floatTab+'</div>';
			} else  {
				var objHtml = '<div id="'+idWrapper+'" class="'+defaults.classWrapper+' '+defaults.align+'">'+floatTab+'<div class="'+defaults.classContent+'">'+floatHtml+'</div></div>';
			}
			$('body').append(objHtml);
			
			var $floater = $('#'+idWrapper);
			var $tab = $('.'+defaults.classTab,$floater);
			var $content = $('.'+defaults.classContent,$floater);
			var linkOpen = $('.'+defaults.classOpen);
			var linkClose = $('.'+defaults.classClose);
			var linkToggle = $('.'+defaults.classToggle);

			$floater.css({width: defaults.width+'px', position: 'absolute', zIndex: 10000});
			
			var h_c = $content.outerHeight(true);
			var h_f = $floater.outerHeight();
			var h_t = $tab.outerHeight();

			if(defaults.tabClose == true){
				$content.hide();
			}
			
			floaterSetup($floater);
			// prvotna inicializacia, lebo sa to nejako sprava divne :(
			$content.animate({marginTop: h_c+'px'}, 0).slideDown(0);
			$content.animate({marginTop: '-'+h_c+'px'}, 0).slideDown(0);
			$floater.removeClass('active');
			
			//var start = $('#'+idWrapper).position().top;
			var start = defaults.offsetLocation;

			floatObj();
			
			$(window).scroll(function (){
				floatObj(1);
			});
			
			if(defaults.loadOpen == true){
				floatOpen();
			}
			
			if(defaults.tabClose == true){
				// If using hover event
				if(defaults.event == 'hover'){
					var config = {
						sensitivity: 2, // number = sensitivity threshold (must be 1 or higher)
						interval: 10, // number = milliseconds for onMouseOver polling interval
						over: floatOpen, // function = onMouseOver callback (REQUIRED)
						timeout: 400, // number = milliseconds delay before onMouseOut
						out: floatClose, // function = onMouseOut callback (REQUIRED)
						element: $floater
					};
					$floater.hoverIntent(config);
				}
			
				if(defaults.event == 'click'){
					$tab.click(function(e){
						if($floater.hasClass('active')){
							floatClose();
						} else {
							floatOpen();
						}
						e.preventDefault();
					});
				}
				
				$(linkOpen).click(function(e){
					if($floater.not('active')){
						floatOpen();
					}
					e.preventDefault();
				});
					
				$(linkClose).click(function(e){
					if($floater.hasClass('active')){
						floatClose();
					}
					e.preventDefault();
				});
					
				$(linkToggle).click(function(e){
					if($floater.hasClass('active')){
						floatClose();
					} else {
						floatOpen();
					}
					e.preventDefault();
				});
				
				if(defaults.autoClose == true)
				{
					$('body').mouseup(function(e){
						if($floater.hasClass('active')){
							if(!$(e.target).parents('#'+defaults.idWrapper+'.'+defaults.classWrapper).length){
								floatClose();
							}
						}
					});
				}
			} else {
				$floater.addClass('active');
			}
			
			function floatOpen()
			{
				$('.'+defaults.classWrapper).css({zIndex: 3});
				//$floater.css({zIndex: 10001});
				var h_fpx = h_c+'px';
				var height_tpx = 0 +'px';

				if(defaults.location == 'bottom') {
					$content.animate({marginTop: '-'+h_fpx}, defaults.speedContent).slideDown(defaults.speedContent);
				} else if (defaults.location == 'top') {
					$content.animate({marginTop: height_tpx}, defaults.speedContent).slideDown(defaults.speedContent);
				}
				$floater.addClass('active');
				// onOpen callback;
				defaults.onOpen.call(this);
			}
			
			function floatClose()
			{
				$content.animate({marginTop: '-'+h_c+'px'}, defaults.speedContent).slideDown(defaults.speedContent);
				$floater.removeClass('active');

				// onOpen callback;
				defaults.onClose.call(this);
			}
			
			function floatObj(i){
			
				var scroll = $(document).scrollTop();
				var moveTo = start + scroll;
				var h_b = $('body').height();
				var h_f = $floater.height();
				var h_c = $content.height();
				if (h_b < h_f + h_c){
					$floater.css("top",start);
				} else {
					$floater.css("top",start);
					//$floater.css("position","fixed");
					//$floater.stop().animate({top: moveTo}, defaults.speedFloat, defaults.easing);
				}
				if(i==1){
					// onFloat callback;
					defaults.onFloat.call(this);
				}
			}
			
			function floaterSetup(obj)
			{
				var location = defaults.location;
				var align = defaults.align;
				var offsetL = defaults.offsetLocation;
				var offsetA = defaults.offsetAlign;
				var Window = $(window).width();
				var body_bckrnd = $('#body-background').width();
				
				if(location == 'top'){
					$(obj).css({top: offsetL});
				} else if (location == 'bottom') {
					$(obj).css({bottom: offsetL});
				}
				
				if(align == 'left'){
					$(obj).css({left: offsetA});
				} else {
					// kedze background je centrovany, tak to musime dat este /2
					$(obj).css({right: offsetA+(Window-body_bckrnd)/2});
				}
				
				// onLoad callback;
				defaults.onLoad.call(this);
			}
		});
	};
})(jQuery);

(function($) {
	$.fn.hoverIntent = function(f,g) {
		// default configuration options
		var cfg = {
			sensitivity: 7,
			interval: 100,
			timeout: 0,
			element: ''
		};
		// override configuration options with user supplied object
		cfg = $.extend(cfg, g ? { over: f, out: g } : f );

		// instantiate variables
		// cX, cY = current X and Y position of mouse, updated by mousemove event
		// pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
		var cX, cY, pX, pY;

		// A private function for getting mouse position
		var track = function(ev) {
			cX = ev.pageX;
			cY = ev.pageY;
		};

		// A private function for comparing current and previous mouse position
		var compare = function(ev,ob) {
			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
			// compare mouse positions to see if they've crossed the threshold
			if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
				$(ob).unbind("mousemove",track);
				// set hoverIntent state to true (so mouseOut can be called)
				ob.hoverIntent_s = 1;
				return cfg.over.apply(ob,[ev]);
			} else {
				// set previous coordinates for next time
				pX = cX; pY = cY;
				// use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
				ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
			}
		};

		// A private function for delaying the mouseOut function
		var delay = function(ev,ob) {
			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
			ob.hoverIntent_s = 0;
			return cfg.out.apply(ob,[ev]);
		};

		var handleHover = function(e) {
			// copy objects to be passed into t (required for event object to be passed in IE)
			var ev = jQuery.extend({},e);
			var ob = cfg.element;

			// cancel hoverIntent timer if it exists
			if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }

			// if e.type == "mouseenter"
			if (e.type == "mouseenter") {
				// set "previous" X and Y position based on initial entry point
				pX = ev.pageX; pY = ev.pageY;
				// update "current" X and Y position based on mousemove
				$(ob).bind("mousemove",track);
				// start polling interval (self-calling timeout) to compare mouse coordinates over time
				if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}

			// else e.type == "mouseleave"
			} else {
				// unbind expensive mousemove event
				$(ob).unbind("mousemove",track);
				// if hoverIntent state is true, then call the mouseOut function after the specified delay
				if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
			}
		};

		// bind the function to the two event listeners
		return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover);
	};
})(jQuery);

