(function($) {
	$.FSresponder = $.fn.FSresponder = function(method) {
		var defaults = {

		}

		var settings = {}

		var methods = {
			init : function(options) {
				settings = $.extend({}, defaults, options);

				return this.each(function() {
					var element = $(this);
					var data = element.data('responder');
					var timer;
					var timer500;

					if (!data) {
						element.data('responder', {
							windowSize: {
								width: element.width(),
								height: element.height()
							},
							hasSecondaryContent: $('body').has('#secondaryContent').length > 0 ? true : false,
							isPDP: $('body').hasClass('pdp'),
							headerHeight: $('#header').height(),
							footerHeight: $('#footer').height(),
							adjustedFooterPosition: null,
							defaultFooterPosition: null,
							falloffFooterPosition: null,
							scrollTop: null
						});
						//! move somewhere global, make styles responsive and update array values
						FS.controlBarHeight = [30, 30, 35, 35];
						if(FS.dom.body.hasClass('viewAll')){FS.controlBarHeight = [0, 0, 0, 0]};
						FS.footerHeight = 20;
						FS.menuToggleBottom = 50;

						data = element.data('responder');
						if (data.hasSecondaryContent) {
							methods.updateNav(element);
						}
					}

					if (data.hasSecondaryContent) {
						methods.updateNav(element);
						FS.dom.secondaryContent = FS.dom.secondaryContent;
						data.secondaryContentHeight = FS.dom.secondaryContent.height()+FS.dom.secondaryContent.offset().top;
						data.secondaryContentPinned = FS.dom.secondaryContent.height();

						//methods.updateNav(element);
						element.FSresponder('footerCollision');

						element.bind("scroll", function(){
							methods.updateNav(element);
						});
					}

					element.data('responder', data);

					element.resize(function() {
						FS.dom.body.trigger('resizeStartHandler');
						FS.dom.body.unbind('resizeStartHandler');
						if (data.hasSecondaryContent) {
							methods.updateNav(element);
							clearInterval(timer);
							timer = setInterval(function() {
								element.FSresponder('footerCollision');
								clearInterval(timer);
							}, 100);
						}
						clearInterval(timer500);
						timer500 = setInterval(function() {
							FS.dom.body.trigger('resizeEnd');
							FS.dom.body.bind('resizeStartHandler', function(e){
								FS.dom.body.trigger('resizeStart');
							});
							clearInterval(timer500);
						}, 500);
						//! this should only trigger when the threshold actually changes, this is slowing down category view pages
						FS.dom.body.trigger("updateThreshold");
						//console.log('updateThreshold');
					});
					FS.dom.body.bind('resizeStartHandler', function(e){
						FS.dom.body.trigger('resizeStart');
					});
				});
			},

			footerCollision: function() {
				return this.each(function() {
					var element = $(this);
					var data = element.data('responder');
					var opacity = helpers.colliding(FS.dom.secondaryContent.find("#leftNavContainer"), FS.dom.footer) ? '-25' : '0';

					FS.dom.footer.animate({bottom: opacity}, 250);
				})
			},

			updateNav: function(element) {
				element = typeof element === "undefined" ? this : $(element);
				var data = element.data('responder');

				var totalHeight, currentScroll, visibleHeight;

				//temporary fix to stop breaking modals
				if (/ModalView/.test(window.location) || /PrintableShoppingCart/.test(window.location)) {
					return false;
				} else {
					FS.respond.pageOffset = FS.dom.content.offset().left;
				}

				FS.dom.primaryContent.css({
					marginLeft: FS.dom.secondaryContent.length ? FS.respond.leftNavWidth() : 0
				});
				FS.dom.secondaryContent.css({
					width: FS.respond.leftNavWidth(),
					left: 0
				});
			}
		}

		var helpers = {
			colliding: function(baseElement, testElement) {
				if (baseElement.parent().width() <= 0) {
					return false;
				}

				var baseElementPos = helpers.getPositions(baseElement);
				var testElementPos = helpers.getPositions(testElement);

				var horizontalMatch = helpers.comparePositions(baseElementPos[0], testElementPos[0]);
				var verticalMatch   = helpers.comparePositions(baseElementPos[1], testElementPos[1]);

				return horizontalMatch && verticalMatch;
			},

			getPositions: function(element) {
				var pos = element.offset();
				var width = element.width();
				var height = element.height();
				return [ [ pos.left, pos.left + width ], [ pos.top, pos.top + height ] ];
			},

			comparePositions: function(p1, p2) {
				var x1 = p1[0] < p2[0] ? p1 : p2;
				var x2 = p1[0] < p2[0] ? p2 : p1;
				return x1[1] > x2[0] || x1[0] === x2[0] ? true : false;
			}
		}

		if (methods[method]) {
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		}
		else if (typeof method === 'object' || !method) {
			return methods.init.apply(this, arguments);
		}
		else {
			$.error( 'Method "' +  method + '" does not exist in FSresponder plugin!');
		}
	}
})(jQuery);

