File "sticky-kit.js"

Full Path: /home/siazco/grocery.siazco.se/wp-content/themes/kapee222/assets/js/sticky-kit.js
File size: 7.29 KB
MIME-type: text/plain
Charset: utf-8

// Generated by CoffeeScript 1.10.0

/**
@license Sticky-kit v1.1.3 | MIT | Leaf Corcoran 2015 | http://leafo.net
 */

(function() {
	var $, win;

	$ = window.jQuery;

	win = $(window);

	$.fn.stick_in_parent = function(opts) {
		var doc, elm, enable_bottoming, fn, i, inner_scrolling, len, manual_spacer, offset_top, outer_width, parent_selector, recalc_every, sticky_class;
		if (opts == null) {
			opts = {};
		}
		sticky_class = opts.sticky_class, inner_scrolling = opts.inner_scrolling, recalc_every = opts.recalc_every, parent_selector = opts.parent, offset_top = opts.offset_top, manual_spacer = opts.spacer, enable_bottoming = opts.bottoming;
		if (offset_top == null) {
			offset_top = 0;
		}
		if (parent_selector == null) {
			parent_selector = void 0;
		}
		if (inner_scrolling == null) {
			inner_scrolling = true;
		}
		if (sticky_class == null) {
			sticky_class = 'is_stuck';
		}
		doc = $(document);
		if (enable_bottoming == null) {
			enable_bottoming = true;
		}
		outer_width = function(el) {
			var _el, computed, w;
			if (window.getComputedStyle) {
				_el = el[0];
				computed = window.getComputedStyle(el[0]);
				w = parseFloat(computed.getPropertyValue('width')) + parseFloat(computed.getPropertyValue('margin-left')) + parseFloat(computed.getPropertyValue('margin-right'));
				if (computed.getPropertyValue('box-sizing') !== 'border-box') {
					w += parseFloat(computed.getPropertyValue('border-left-width')) + parseFloat(computed.getPropertyValue('border-right-width')) + parseFloat(computed.getPropertyValue('padding-left')) + parseFloat(computed.getPropertyValue('padding-right'));
				}
				return w;
			} else {
				return el.outerWidth(true);
			}
		};
		fn = function(elm, padding_bottom, parent_top, parent_height, top, height, el_float, detached) {
			var bottomed, detach, fixed, last_pos, last_scroll_height, offset, parent, recalc, recalc_and_tick, recalc_counter, spacer, tick;
			if (elm.data('sticky_kit')) {
				return;
			}
			elm.data('sticky_kit', true);
			last_scroll_height = doc.height();
			parent = elm.parent();
			if (parent_selector != null) {
				parent = parent.closest(parent_selector);
			}
			if (!parent.length) {
				throw 'failed to find stick parent';
			}
			fixed = false;
			bottomed = false;
			spacer = manual_spacer != null
				? manual_spacer && elm.closest(manual_spacer)
				: $('<div />');
			if (spacer) {
				spacer.css('position', elm.css('position'));
			}
			recalc = function() {
				var border_top, padding_top, restore;
				if (detached) {
					return;
				}
				last_scroll_height = doc.height();
				border_top = parseInt(parent.css('border-top-width'), 10);
				padding_top = parseInt(parent.css('padding-top'), 10);
				padding_bottom = parseInt(parent.css('padding-bottom'), 10);
				parent_top = parent.offset().top + border_top + padding_top;
				parent_height = parent.height();
				if (fixed) {
					fixed = false;
					bottomed = false;
					if (manual_spacer == null) {
						elm.insertAfter(spacer);
						spacer.detach();
					}
					elm.css({
						position: '',
						top: '',
						width: '',
						bottom: '',
					}).removeClass(sticky_class);
					restore = true;
				}
				top = elm.offset().top - (parseInt(elm.css('margin-top'), 10) || 0) - offset_top;
				height = elm.outerHeight(true);
				el_float = elm.css('float');
				if (spacer) {
					spacer.css({
						width: outer_width(elm),
						height: height,
						display: elm.css('display'),
						'vertical-align': elm.css('vertical-align'),
						'float': el_float,
					});
				}
				if (restore) {
					return tick();
				}
			};
			recalc();
			if (height === parent_height) {
				return;
			}
			last_pos = void 0;
			offset = offset_top;
			recalc_counter = recalc_every;
			tick = function() {
				var css, delta, recalced, scroll, will_bottom, win_height;
				if (detached) {
					return;
				}
				recalced = false;
				if (recalc_counter != null) {
					recalc_counter -= 1;
					if (recalc_counter <= 0) {
						recalc_counter = recalc_every;
						recalc();
						recalced = true;
					}
				}
				if (!recalced && doc.height() !== last_scroll_height) {
					recalc();
					recalced = true;
				}
				scroll = win.scrollTop();
				if (last_pos != null) {
					delta = scroll - last_pos;
				}
				last_pos = scroll;
				if (fixed) {
					if (enable_bottoming) {
						will_bottom = scroll + height + offset > parent_height + parent_top;
						if (bottomed && !will_bottom) {
							bottomed = false;
							elm.css({
								position: 'fixed',
								bottom: '',
								top: offset,
							}).trigger('sticky_kit:unbottom');
						}
					}
					if (scroll < top) {
						fixed = false;
						offset = offset_top;
						if (manual_spacer == null) {
							if (el_float === 'left' || el_float === 'right') {
								elm.insertAfter(spacer);
							}
							spacer.detach();
						}
						css = {
							position: '',
							width: '',
							top: '',
						};
						elm.css(css).removeClass(sticky_class).trigger('sticky_kit:unstick');
					}
					if (inner_scrolling) {
						win_height = win.height();
						if (height + offset_top > win_height) {
							if (!bottomed) {
								offset -= delta;
								offset = Math.max(win_height - height, offset);
								offset = Math.min(offset_top, offset);
								if (fixed) {
									elm.css({
										top: offset + 'px',
									});
								}
							}
						}
					}
				} else {
					if (scroll > top) {
						fixed = true;
						css = {
							position: 'fixed',
							top: offset,
						};
						css.width = elm.css('box-sizing') === 'border-box'
							? elm.outerWidth() + 'px'
							: elm.width() + 'px';
						elm.css(css).addClass(sticky_class);
						if (manual_spacer == null) {
							elm.after(spacer);
							if (el_float === 'left' || el_float === 'right') {
								spacer.append(elm);
							}
						}
						elm.trigger('sticky_kit:stick');
					}
				}
				if (fixed && enable_bottoming) {
					if (will_bottom == null) {
						will_bottom = scroll + height + offset > parent_height + parent_top;
					}
					if (!bottomed && will_bottom) {
						bottomed = true;
						if (parent.css('position') === 'static') {
							parent.css({
								position: 'relative',
							});
						}
						return elm.css({
							position: 'absolute',
							bottom: padding_bottom,
							top: 'auto',
						}).trigger('sticky_kit:bottom');
					}
				}
			};
			recalc_and_tick = function() {
				recalc();
				return tick();
			};
			detach = function() {
				detached = true;
				win.off('touchmove', tick);
				win.off('scroll', tick);
				win.off('resize', recalc_and_tick);
				$(document.body).off('sticky_kit:recalc', recalc_and_tick);
				elm.off('sticky_kit:detach', detach);
				elm.removeData('sticky_kit');
				elm.css({
					position: '',
					bottom: '',
					top: '',
					width: '',
				});
				parent.position('position', '');
				if (fixed) {
					if (manual_spacer == null) {
						if (el_float === 'left' || el_float === 'right') {
							elm.insertAfter(spacer);
						}
						spacer.remove();
					}
					return elm.removeClass(sticky_class);
				}
			};
			win.on('touchmove', tick);
			win.on('scroll', tick);
			win.on('resize', recalc_and_tick);
			$(document.body).on('sticky_kit:recalc', recalc_and_tick);
			elm.on('sticky_kit:detach', detach);
			return setTimeout(tick, 0);
		};
		for (i = 0, len = this.length; i < len; i++) {
			elm = this[i];
			fn($(elm));
		}
		return this;
	};

}).call(this);