aboutsummaryrefslogblamecommitdiff
blob: dc6ce43d9752e98997a9e0c4f1b018471cf9fcfd (plain) (tree)






























































































































































































































































                                                                                                                
/**
 * jquery.swatchbook.js v1.1.0
 * http://www.codrops.com
 *
 * Licensed under the MIT license.
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Copyright 2012, Codrops
 * http://www.codrops.com
 */

;
(function($, window, undefined) {

	'use strict';

	// global
	var Modernizr = window.Modernizr;

	jQuery.fn.reverse = [].reverse;

	$.SwatchBook = function(options, element) {

		this.$el = $(element);
		this._init(options);

	};

	$.SwatchBook.defaults = {
		// index of initial centered item
		center: 6,
		// number of degrees that is between each item
		angleInc: 8,
		speed: 700,
		easing: 'ease',
		// amount in degrees for the opened item's next sibling
		proximity: 45,
		// amount in degrees between the opened item's next siblings
		neighbor: 4,
		// animate on load
		onLoadAnim: true,
		// if it should be closed by default
		initclosed: false,
		// index of the element that when clicked, triggers the open/close function
		// by default there is no such element
		closeIdx: -1,
		// open one specific item initially (overrides initclosed)
		openAt: -1
	};

	$.SwatchBook.prototype = {

		_init: function(options) {

			this.options = $.extend(true, {}, $.SwatchBook.defaults, options);

			this.$items = this.$el.children('div');
			this.itemsCount = this.$items.length;
			this.current = -1;
			this.support = Modernizr.csstransitions;
			this.cache = [];

			if (this.options.onLoadAnim) {
				this._setTransition();
			}

			if (!this.options.initclosed) {
				this._center(this.options.center, this.options.onLoadAnim);
			} else {

				this.isClosed = true;
				if (!this.options.onLoadAnim) {
					this._setTransition();
				}

			}

			if (this.options.openAt >= 0 && this.options.openAt < this.itemsCount) {
				this._openItem(this.$items.eq(this.options.openAt));
			}

			this._initEvents();

		},
		_setTransition: function() {

			if (this.support) {
				this.$items.css({
					'transition': 'all ' + this.options.speed + 'ms ' + this.options.easing
				});
			}

		},
		_openclose: function() {

			this.isClosed ? this._center(this.options.center, true) : this.$items.css({
				'transform': 'rotate(0deg)'
			});
			this.isClosed = !this.isClosed;

		},
		_center: function(idx, anim) {

			var self = this;

			this.$items.each(function(i) {

				var transformStr = 'rotate(' + (self.options.angleInc * (i - idx)) + 'deg)';
				$(this).css({
					'transform': transformStr
				});

			});

		},
		_openItem: function($item) {

			var itmIdx = $item.index();

			if (itmIdx !== this.current) {

				if (this.options.closeIdx !== -1 && itmIdx === this.options.closeIdx) {

					this._openclose();
					this._setCurrent();

				} else {

					this._setCurrent($item);
					$item.css({
						'transform': 'rotate(0deg)'
					});
					this._rotateSiblings($item);

				}

			}

		},
		_initEvents: function() {

			var self = this;

			this.$items.on('click.swatchbook', function(event) {
				self._openItem($(this));
			});

		},
		_rotateSiblings: function($item) {

			var self = this,
				idx = $item.index(),
				$cached = this.cache[idx],
				$siblings;

			if ($cached) {
				$siblings = $cached;
			} else {

				$siblings = $item.siblings();
				this.cache[idx] = $siblings;

			}

			$siblings.each(function(i) {

				var rotateVal = i < idx ?
					self.options.angleInc * (i - idx) :
					i - idx === 1 ?
					self.options.proximity :
					self.options.proximity + (i - idx - 1) * self.options.neighbor;

				var transformStr = 'rotate(' + rotateVal + 'deg)';

				$(this).css({
					'transform': transformStr
				});

			});

		},
		_setCurrent: function($el) {

			this.current = $el ? $el.index() : -1;
			this.$items.removeClass('ff-active');
			if ($el) {
				$el.addClass('ff-active');
			}

		}

	};

	var logError = function(message) {

		if (window.console) {

			window.console.error(message);

		}

	};

	$.fn.swatchbook = function(options) {

		var instance = $.data(this, 'swatchbook');

		if (typeof options === 'string') {

			var args = Array.prototype.slice.call(arguments, 1);

			this.each(function() {

				if (!instance) {

					logError("cannot call methods on swatchbook prior to initialization; " +
						"attempted to call method '" + options + "'");
					return;

				}

				if (!$.isFunction(instance[options]) || options.charAt(0) === "_") {

					logError("no such method '" + options + "' for swatchbook instance");
					return;

				}

				instance[options].apply(instance, args);

			});

		} else {

			this.each(function() {

				if (instance) {

					instance._init();

				} else {

					instance = $.data(this, 'swatchbook', new $.SwatchBook(options, this));

				}

			});

		}

		return instance;

	};

})(jQuery, window);
Powered by cgit v1.2.3 (git 2.41.0)