﻿Publicis.namespace('Publicis.NavScroll', function ()
{
	var configObj = Publicis.Global.config;
	var registered_scrollers = {};

	var update_scroll = function (scroller)
	{
		if (configObj.overlayOpen && !scroller.overlayUpdate)
		{
			return;
		}

		var element = scroller.obj;
		var init_top = scroller.top;
		var change_state_callbacks = scroller.callbacks;

		var current_offset = element.offset().top;
		var current_scroll_top = $(document).scrollTop();

		if (!element.hasClass('docked') && (current_offset - current_scroll_top < 0))
		{
			element.addClass('docked');

			if (scroller.css)
			{
				element.css(scroller.css);
			}

			if (change_state_callbacks && typeof change_state_callbacks.docked === 'function')
			{
				change_state_callbacks.docked();
			}
		}
		else if (element.hasClass('docked') && current_scroll_top <= init_top)
		{
			element.removeClass('docked');

			if (scroller.css)
			{
				element.removeAttr('style');
			}

			if (change_state_callbacks && typeof change_state_callbacks.undocked === 'function')
			{
				change_state_callbacks.undocked();
			}
		}
	};

	var winHeight = $(window).height();
	var docHeight = $(document).height();
	var scrollTopMax = docHeight - winHeight;

	var update_window_size = function ()
	{
		winHeight = $(window).height();
		docHeight = $(document).height();
		scrollTopMax = docHeight - winHeight;

		update_background_position();
	};

	var update_background_position = function ()
	{
		var curScrollTop = $(window).scrollTop();
		var scrollPercent = Math.round((curScrollTop / scrollTopMax) * 1000) / 1000;
		var topPercent = (-configObj.backgroundScrollPercent * scrollPercent) + '%';

		$('#background-hero').css('top', topPercent);
	};

	var init = function ()
	{
		register(configObj.$global_nav, undefined, undefined, false);

		$(window).resize(update_window_size);
		$(window).scroll(function ()
		{
			$.each(registered_scrollers, function (key, value)
			{
				update_scroll(value);
			});

			if (!configObj.overlayOpen)
			{
				update_background_position();
			}
		}).scroll();

		update_window_size();
	};

	var register = function (obj, cssObj, callbacks, updateDuringOverlayOpen)
	{
		var initTop = obj.offset().top;
		var o = obj.attr('id');
		registered_scrollers[o] = { obj: obj, top: initTop, css: cssObj, callbacks: callbacks, overlayUpdate: updateDuringOverlayOpen };
	};

	var unregister = function (obj)
	{
		var o = obj.attr('id');
		var scroller = registered_scrollers[o];

		if (scroller)
		{
			reset(scroller);
			delete registered_scrollers[o];
		}
	};

	var reset = function (scroller)
	{
		scroller.obj.removeClass('docked');

		if (scroller.css)
		{
			scroller.obj.removeAttr('style');
		}

		if (scroller.callbacks && typeof scroller.callbacks.undocked === 'function')
		{
			scroller.callbacks.undocked(true);
		}
	};

	return {
		Init: init,
		RegisterScroller: register,
		UnRegisterScroller: unregister,
		UpdateWindowSize: update_window_size
	};
}, 'Init');

