/** * jCarousel Core */ (function($) { 'use strict'; var jCarousel = $.jCarousel = {}; jCarousel.version = '@VERSION'; var rRelativeTarget = /^([+\-]=)?(.+)$/; jCarousel.parseTarget = function(target) { var relative = false, parts = typeof target !== 'object' ? rRelativeTarget.exec(target) : null; if (parts) { target = parseInt(parts[2], 10) || 0; if (parts[1]) { relative = true; if (parts[1] === '-=') { target *= -1; } } } else if (typeof target !== 'object') { target = parseInt(target, 10) || 0; } return { target: target, relative: relative }; }; jCarousel.detectCarousel = function(element) { var carousel; while (element.length > 0) { carousel = element.filter('[data-jcarousel]'); if (carousel.length > 0) { return carousel; } carousel = element.find('[data-jcarousel]'); if (carousel.length > 0) { return carousel; } element = element.parent(); } return null; }; jCarousel.base = function(pluginName) { return { version: jCarousel.version, _options: {}, _element: null, _carousel: null, _init: $.noop, _create: $.noop, _destroy: $.noop, _reload: $.noop, create: function() { this._element .attr('data-' + pluginName.toLowerCase(), true) .data(pluginName, this); if (false === this._trigger('create')) { return this; } this._create(); this._trigger('createend'); return this; }, destroy: function() { if (false === this._trigger('destroy')) { return this; } this._destroy(); this._trigger('destroyend'); this._element .removeData(pluginName) .removeAttr('data-' + pluginName.toLowerCase()); return this; }, reload: function(options) { if (false === this._trigger('reload')) { return this; } if (options) { this.options(options); } this._reload(); this._trigger('reloadend'); return this; }, element: function() { return this._element; }, options: function(key, value) { if (arguments.length === 0) { return $.extend({}, this._options); } if (typeof key === 'string') { if (typeof value === 'undefined') { return typeof this._options[key] === 'undefined' ? null : this._options[key]; } this._options[key] = value; } else { this._options = $.extend({}, this._options, key); } return this; }, carousel: function() { if (!this._carousel) { this._carousel = jCarousel.detectCarousel(this.options('carousel') || this._element); if (!this._carousel) { $.error('Could not detect carousel for plugin "' + pluginName + '"'); } } return this._carousel; }, _trigger: function(type, element, data) { var event, defaultPrevented = false; data = [this].concat(data || []); (element || this._element).each(function() { event = $.Event((pluginName + ':' + type).toLowerCase()); $(this).trigger(event, data); if (event.isDefaultPrevented()) { defaultPrevented = true; } }); return !defaultPrevented; } }; }; jCarousel.plugin = function(pluginName, pluginPrototype) { var Plugin = $[pluginName] = function(element, options) { this._element = $(element); this.options(options); this._init(); this.create(); }; Plugin.fn = Plugin.prototype = $.extend( {}, jCarousel.base(pluginName), pluginPrototype ); $.fn[pluginName] = function(options) { var args = Array.prototype.slice.call(arguments, 1), returnValue = this; if (typeof options === 'string') { this.each(function() { var instance = $(this).data(pluginName); if (!instance) { return $.error( 'Cannot call methods on ' + pluginName + ' prior to initialization; ' + 'attempted to call method "' + options + '"' ); } if (!$.isFunction(instance[options]) || options.charAt(0) === '_') { return $.error( 'No such method "' + options + '" for ' + pluginName + ' instance' ); } var methodValue = instance[options].apply(instance, args); if (methodValue !== instance && typeof methodValue !== 'undefined') { returnValue = methodValue; return false; } }); } else { this.each(function() { var instance = $(this).data(pluginName); if (instance instanceof Plugin) { instance.reload(options); } else { new Plugin(this, options); } }); } return returnValue; }; return Plugin; }; }(jQuery));