commit 399bb961a457e8012fd12231a1c06266a805aab0 Author: John Bintz Date: Sun Oct 7 14:44:41 2012 -0400 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a955cfa --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +*.gem +*.rbc +.bundle +.config +.yardoc +Gemfile.lock +InstalledFiles +_yardoc +coverage +doc/ +lib/bundler/man +pkg +rdoc +spec/reports +test/tmp +test/version_tmp +tmp +.DS_Store diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..d3458b1 --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in caroufredsel-rails.gemspec +gemspec diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..87b491e --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2012 John Bintz + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d676b2c --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +Use [CarouFredSel](http://caroufredsel.frebsite.nl/) with Rails. It's pretty good! + +`Gemfile`: + +``` ruby +gem 'caroufredsel-rails', :git => 'git://github.com/johnbintz/caroufredsel-rails.git' +``` + +`app/assets/javascripts/application.js`: + +``` javascript +//= require caroufredsel + +carousel = new Carousel( + $('#carousel_items'), + { + onChange: function(items) { + // something when the items change + }, + otherCarouFredSelOptions: 'go here'_ + } +); +``` + +`Carousel` objects respond to the following: + +* `slideTo(index)`: Slide to the target original index +* `moveTo(index)`: Immediately move to the target original index +* `pause`: Pause the carousel + +Get at the original carousel with `Carousel#carousel` + +Needs CoffeeScript, 'cause I'm lazy right now! + diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..2995527 --- /dev/null +++ b/Rakefile @@ -0,0 +1 @@ +require "bundler/gem_tasks" diff --git a/caroufredsel-rails.gemspec b/caroufredsel-rails.gemspec new file mode 100644 index 0000000..6a73c5f --- /dev/null +++ b/caroufredsel-rails.gemspec @@ -0,0 +1,21 @@ +# -*- encoding: utf-8 -*- +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'caroufredsel-rails/version' + +Gem::Specification.new do |gem| + gem.name = "caroufredsel-rails" + gem.version = Caroufredsel::Rails::VERSION + gem.authors = ["John Bintz"] + gem.email = ["john@coswellproductions.com"] + gem.description = %q{TODO: Write a gem description} + gem.summary = %q{TODO: Write a gem summary} + gem.homepage = "" + + gem.files = `git ls-files`.split($/) + gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) } + gem.test_files = gem.files.grep(%r{^(test|spec|features)/}) + gem.require_paths = ["lib"] + + gem.add_dependency 'coffee-script' +end diff --git a/lib/assets/javascripts/caroufredsel.js.coffee b/lib/assets/javascripts/caroufredsel.js.coffee new file mode 100644 index 0000000..306dbd1 --- /dev/null +++ b/lib/assets/javascripts/caroufredsel.js.coffee @@ -0,0 +1,33 @@ +#= require jquery +#= require caroufredsel/jquery.mousewheel.min +#= require caroufredsel/jquery.touchSwipe.min +#= require caroufredsel/jquery.carouFredSel-6.0.3 + +class @Carousel + constructor: (@carousel, options) -> + if options.onChange + @onChange = options.onChange + delete options.onChange + + options.scroll ||= {} + options.scroll.onBefore = (args) => + @onChange($(args.items.new[0])) + + @carousel.carouFredSel(options) + @onChange($(@carousel.children()[0])) + + slideTo: (index, options = {}) => + @carousel.trigger('slideTo', index, true, options) + this + + moveTo: (index) => + @slideTo(index, duration: 0) + this + + pause: => + @carousel.trigger('pause') + this + + onChange: (item) -> + null + diff --git a/lib/caroufredsel-rails.rb b/lib/caroufredsel-rails.rb new file mode 100644 index 0000000..ad74e77 --- /dev/null +++ b/lib/caroufredsel-rails.rb @@ -0,0 +1,2 @@ +require "caroufredsel-rails/version" +require 'caroufredsel-rails/engine' if defined?(Rails::Engine) diff --git a/lib/caroufredsel-rails/engine.rb b/lib/caroufredsel-rails/engine.rb new file mode 100644 index 0000000..d30e3b0 --- /dev/null +++ b/lib/caroufredsel-rails/engine.rb @@ -0,0 +1,5 @@ +module Caroufredsel + class Engine < ::Rails::Engine + end +end + diff --git a/lib/caroufredsel-rails/version.rb b/lib/caroufredsel-rails/version.rb new file mode 100644 index 0000000..b81d4ca --- /dev/null +++ b/lib/caroufredsel-rails/version.rb @@ -0,0 +1,5 @@ +module Caroufredsel + module Rails + VERSION = "0.0.1" + end +end diff --git a/vendor/assets/javascripts/caroufredsel/jquery.carouFredSel-6.0.3.js b/vendor/assets/javascripts/caroufredsel/jquery.carouFredSel-6.0.3.js new file mode 100644 index 0000000..786da64 --- /dev/null +++ b/vendor/assets/javascripts/caroufredsel/jquery.carouFredSel-6.0.3.js @@ -0,0 +1,4284 @@ +/* + * jQuery carouFredSel 6.0.3 + * Demo's and documentation: + * caroufredsel.frebsite.nl + * + * Copyright (c) 2012 Fred Heusschen + * www.frebsite.nl + * + * Dual licensed under the MIT and GPL licenses. + * http://en.wikipedia.org/wiki/MIT_License + * http://en.wikipedia.org/wiki/GNU_General_Public_License + */ + + +(function($) { + + + // LOCAL + + if ( $.fn.carouFredSel ) + { + return; + } + + $.fn.caroufredsel = $.fn.carouFredSel = function(options, configs) + { + + // no element + if (this.length == 0) + { + debug( true, 'No element found for "' + this.selector + '".' ); + return this; + } + + // multiple elements + if (this.length > 1) + { + return this.each(function() { + $(this).carouFredSel(options, configs); + }); + } + + + var $cfs = this, + $tt0 = this[0], + starting_position = false; + + if ($cfs.data('_cfs_isCarousel')) + { + starting_position = $cfs.triggerHandler('_cfs_triggerEvent', 'currentPosition'); + $cfs.trigger('_cfs_triggerEvent', ['destroy', true]); + } + + + $cfs._cfs_init = function(o, setOrig, start) + { + o = go_getObject($tt0, o); + + o.items = go_getItemsObject($tt0, o.items); + o.scroll = go_getScrollObject($tt0, o.scroll); + o.auto = go_getAutoObject($tt0, o.auto); + o.prev = go_getPrevNextObject($tt0, o.prev); + o.next = go_getPrevNextObject($tt0, o.next); + o.pagination = go_getPaginationObject($tt0, o.pagination); + o.swipe = go_getSwipeObject($tt0, o.swipe); + o.mousewheel = go_getMousewheelObject($tt0, o.mousewheel); + + if (setOrig) + { + opts_orig = $.extend(true, {}, $.fn.carouFredSel.defaults, o); + } + + opts = $.extend(true, {}, $.fn.carouFredSel.defaults, o); + opts.d = cf_getDimensions(opts); + + crsl.direction = (opts.direction == 'up' || opts.direction == 'left') ? 'next' : 'prev'; + + var a_itm = $cfs.children(), + avail_primary = ms_getParentSize($wrp, opts, 'width'); + + if (is_true(opts.cookie)) + { + opts.cookie = 'caroufredsel_cookie_' + conf.serialNumber; + } + + opts.maxDimension = ms_getMaxDimension(opts, avail_primary); + + // complement items and sizes + opts.items = in_complementItems(opts.items, opts, a_itm, start); + opts[opts.d['width']] = in_complementPrimarySize(opts[opts.d['width']], opts, a_itm); + opts[opts.d['height']] = in_complementSecondarySize(opts[opts.d['height']], opts, a_itm); + + // primary size not set for a responsive carousel + if (opts.responsive) + { + if (!is_percentage(opts[opts.d['width']])) + { + opts[opts.d['width']] = '100%'; + } + } + + // primary size is percentage + if (is_percentage(opts[opts.d['width']])) + { + crsl.upDateOnWindowResize = true; + crsl.primarySizePercentage = opts[opts.d['width']]; + opts[opts.d['width']] = ms_getPercentage(avail_primary, crsl.primarySizePercentage); + if (!opts.items.visible) + { + opts.items.visibleConf.variable = true; + } + } + + if (opts.responsive) + { + opts.usePadding = false; + opts.padding = [0, 0, 0, 0]; + opts.align = false; + opts.items.visibleConf.variable = false; + } + else + { + // visible-items not set + if (!opts.items.visible) + { + opts = in_complementVisibleItems(opts, avail_primary); + } + + // primary size not set -> calculate it or set to "variable" + if (!opts[opts.d['width']]) + { + if (!opts.items.visibleConf.variable && is_number(opts.items[opts.d['width']]) && opts.items.filter == '*') + { + opts[opts.d['width']] = opts.items.visible * opts.items[opts.d['width']]; + opts.align = false; + } + else + { + opts[opts.d['width']] = 'variable'; + } + } + // align not set -> set to center if primary size is number + if (is_undefined(opts.align)) + { + opts.align = (is_number(opts[opts.d['width']])) + ? 'center' + : false; + } + // set variabe visible-items + if (opts.items.visibleConf.variable) + { + opts.items.visible = gn_getVisibleItemsNext(a_itm, opts, 0); + } + } + + // set visible items by filter + if (opts.items.filter != '*' && !opts.items.visibleConf.variable) + { + opts.items.visibleConf.org = opts.items.visible; + opts.items.visible = gn_getVisibleItemsNextFilter(a_itm, opts, 0); + } + + opts.items.visible = cf_getItemsAdjust(opts.items.visible, opts, opts.items.visibleConf.adjust, $tt0); + opts.items.visibleConf.old = opts.items.visible; + + if (opts.responsive) + { + if (!opts.items.visibleConf.min) + { + opts.items.visibleConf.min = opts.items.visible; + } + if (!opts.items.visibleConf.max) + { + opts.items.visibleConf.max = opts.items.visible; + } + opts = in_getResponsiveValues(opts, a_itm, avail_primary); + } + else + { + opts.padding = cf_getPadding(opts.padding); + + if (opts.align == 'top') + { + opts.align = 'left'; + } + else if (opts.align == 'bottom') + { + opts.align = 'right'; + } + + switch (opts.align) + { + // align: center, left or right + case 'center': + case 'left': + case 'right': + if (opts[opts.d['width']] != 'variable') + { + opts = in_getAlignPadding(opts, a_itm); + opts.usePadding = true; + } + break; + + // padding + default: + opts.align = false; + opts.usePadding = ( + opts.padding[0] == 0 && + opts.padding[1] == 0 && + opts.padding[2] == 0 && + opts.padding[3] == 0 + ) ? false : true; + break; + } + } + + if (!is_number(opts.scroll.duration)) + { + opts.scroll.duration = 500; + } + if (is_undefined(opts.scroll.items)) + { + opts.scroll.items = (opts.responsive || opts.items.visibleConf.variable || opts.items.filter != '*') + ? 'visible' + : opts.items.visible; + } + + opts.auto = $.extend(true, {}, opts.scroll, opts.auto); + opts.prev = $.extend(true, {}, opts.scroll, opts.prev); + opts.next = $.extend(true, {}, opts.scroll, opts.next); + opts.pagination = $.extend(true, {}, opts.scroll, opts.pagination); + // swipe and mousewheel extend later on, per direction + + opts.auto = go_complementAutoObject($tt0, opts.auto); + opts.prev = go_complementPrevNextObject($tt0, opts.prev); + opts.next = go_complementPrevNextObject($tt0, opts.next); + opts.pagination = go_complementPaginationObject($tt0, opts.pagination); + opts.swipe = go_complementSwipeObject($tt0, opts.swipe); + opts.mousewheel = go_complementMousewheelObject($tt0, opts.mousewheel); + + if (opts.synchronise) + { + opts.synchronise = cf_getSynchArr(opts.synchronise); + } + + + // DEPRECATED + if (opts.auto.onPauseStart) + { + opts.auto.onTimeoutStart = opts.auto.onPauseStart; + deprecated('auto.onPauseStart', 'auto.onTimeoutStart'); + } + if (opts.auto.onPausePause) + { + opts.auto.onTimeoutPause = opts.auto.onPausePause; + deprecated('auto.onPausePause', 'auto.onTimeoutPause'); + } + if (opts.auto.onPauseEnd) + { + opts.auto.onTimeoutEnd = opts.auto.onPauseEnd; + deprecated('auto.onPauseEnd', 'auto.onTimeoutEnd'); + } + if (opts.auto.pauseDuration) + { + opts.auto.timeoutDuration = opts.auto.pauseDuration; + deprecated('auto.pauseDuration', 'auto.timeoutDuration'); + } + // /DEPRECATED + + + }; // /init + + + $cfs._cfs_build = function() { + $cfs.data('_cfs_isCarousel', true); + + var a_itm = $cfs.children(), + orgCSS = in_mapCss($cfs, ['textAlign', 'float', 'position', 'top', 'right', 'bottom', 'left', 'zIndex', 'width', 'height', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft']), + newPosition = 'relative'; + + switch (orgCSS.position) + { + case 'absolute': + case 'fixed': + newPosition = orgCSS.position; + break; + } + + $wrp.css(orgCSS).css({ + 'overflow' : 'hidden', + 'position' : newPosition + }); + + $cfs.data('_cfs_origCss', orgCSS).css({ + 'textAlign' : 'left', + 'float' : 'none', + 'position' : 'absolute', + 'top' : 0, + 'right' : 'auto', + 'bottom' : 'auto', + 'left' : 0, + 'zIndex' : 1, + 'marginTop' : 0, + 'marginRight' : 0, + 'marginBottom' : 0, + 'marginLeft' : 0 + }); + + sz_storeMargin(a_itm, opts); + sz_storeSizes(a_itm, opts); + if (opts.responsive) + { + sz_setResponsiveSizes(opts, a_itm); + } + + }; // /build + + + $cfs._cfs_bind_events = function() { + $cfs._cfs_unbind_events(); + + + // stop event + $cfs.bind(cf_e('stop', conf), function(e, imm) { + e.stopPropagation(); + + // button + if (!crsl.isStopped) + { + if (opts.auto.button) + { + opts.auto.button.addClass(cf_c('stopped', conf)); + } + } + + // set stopped + crsl.isStopped = true; + + if (opts.auto.play) + { + opts.auto.play = false; + $cfs.trigger(cf_e('pause', conf), imm); + } + return true; + }); + + + // finish event + $cfs.bind(cf_e('finish', conf), function(e) { + e.stopPropagation(); + if (crsl.isScrolling) + { + sc_stopScroll(scrl); + } + return true; + }); + + + // pause event + $cfs.bind(cf_e('pause', conf), function(e, imm, res) { + e.stopPropagation(); + tmrs = sc_clearTimers(tmrs); + + // immediately pause + if (imm && crsl.isScrolling) + { + scrl.isStopped = true; + var nst = getTime() - scrl.startTime; + scrl.duration -= nst; + if (scrl.pre) + { + scrl.pre.duration -= nst; + } + if (scrl.post) + { + scrl.post.duration -= nst; + } + sc_stopScroll(scrl, false); + } + + // update remaining pause-time + if (!crsl.isPaused && !crsl.isScrolling) + { + if (res) + { + tmrs.timePassed += getTime() - tmrs.startTime; + } + } + + // button + if (!crsl.isPaused) + { + if (opts.auto.button) + { + opts.auto.button.addClass(cf_c('paused', conf)); + } + } + + // set paused + crsl.isPaused = true; + + // pause pause callback + if (opts.auto.onTimeoutPause) + { + var dur1 = opts.auto.timeoutDuration - tmrs.timePassed, + perc = 100 - Math.ceil( dur1 * 100 / opts.auto.timeoutDuration ); + + opts.auto.onTimeoutPause.call($tt0, perc, dur1); + } + return true; + }); + + + // play event + $cfs.bind(cf_e('play', conf), function(e, dir, del, res) { + e.stopPropagation(); + tmrs = sc_clearTimers(tmrs); + + // sort params + var v = [dir, del, res], + t = ['string', 'number', 'boolean'], + a = cf_sortParams(v, t); + + dir = a[0]; + del = a[1]; + res = a[2]; + + if (dir != 'prev' && dir != 'next') + { + dir = crsl.direction; + } + if (!is_number(del)) + { + del = 0; + } + if (!is_boolean(res)) + { + res = false; + } + + // stopped? + if (res) + { + crsl.isStopped = false; + opts.auto.play = true; + } + if (!opts.auto.play) + { + e.stopImmediatePropagation(); + return debug(conf, 'Carousel stopped: Not scrolling.'); + } + + // button + if (crsl.isPaused) + { + if (opts.auto.button) + { + opts.auto.button.removeClass(cf_c('stopped', conf)); + opts.auto.button.removeClass(cf_c('paused', conf)); + } + } + + // set playing + crsl.isPaused = false; + tmrs.startTime = getTime(); + + // timeout the scrolling + var dur1 = opts.auto.timeoutDuration + del; + dur2 = dur1 - tmrs.timePassed; + perc = 100 - Math.ceil(dur2 * 100 / dur1); + + if (opts.auto.progress) + { + tmrs.progress = setInterval(function() { + var pasd = getTime() - tmrs.startTime + tmrs.timePassed, + perc = Math.ceil(pasd * 100 / dur1); + opts.auto.progress.updater.call(opts.auto.progress.bar[0], perc); + }, opts.auto.progress.interval); + } + + tmrs.auto = setTimeout(function() { + if (opts.auto.progress) + { + opts.auto.progress.updater.call(opts.auto.progress.bar[0], 100); + } + if (opts.auto.onTimeoutEnd) + { + opts.auto.onTimeoutEnd.call($tt0, perc, dur2); + } + if (crsl.isScrolling) + { + $cfs.trigger(cf_e('play', conf), dir); + } + else + { + $cfs.trigger(cf_e(dir, conf), opts.auto); + } + }, dur2); + + // pause start callback + if (opts.auto.onTimeoutStart) + { + opts.auto.onTimeoutStart.call($tt0, perc, dur2); + } + + return true; + }); + + + // resume event + $cfs.bind(cf_e('resume', conf), function(e) { + e.stopPropagation(); + if (scrl.isStopped) + { + scrl.isStopped = false; + crsl.isPaused = false; + crsl.isScrolling = true; + scrl.startTime = getTime(); + sc_startScroll(scrl); + } + else + { + $cfs.trigger(cf_e('play', conf)); + } + return true; + }); + + + // prev + next events + $cfs.bind(cf_e('prev', conf)+' '+cf_e('next', conf), function(e, obj, num, clb, que) { + e.stopPropagation(); + + // stopped or hidden carousel, don't scroll, don't queue + if (crsl.isStopped || $cfs.is(':hidden')) + { + e.stopImmediatePropagation(); + return debug(conf, 'Carousel stopped or hidden: Not scrolling.'); + } + + // not enough items + var minimum = (is_number(opts.items.minimum)) ? opts.items.minimum : opts.items.visible + 1; + if (minimum > itms.total) + { + e.stopImmediatePropagation(); + return debug(conf, 'Not enough items ('+itms.total+' total, '+minimum+' needed): Not scrolling.'); + } + + // get config + var v = [obj, num, clb, que], + t = ['object', 'number/string', 'function', 'boolean'], + a = cf_sortParams(v, t); + + obj = a[0]; + num = a[1]; + clb = a[2]; + que = a[3]; + + var eType = e.type.slice(conf.events.prefix.length); + + if (!is_object(obj)) + { + obj = {}; + } + if (is_function(clb)) + { + obj.onAfter = clb; + } + if (is_boolean(que)) + { + obj.queue = que; + } + obj = $.extend(true, {}, opts[eType], obj); + + // test conditions callback + if (obj.conditions && !obj.conditions.call($tt0, eType)) + { + e.stopImmediatePropagation(); + return debug(conf, 'Callback "conditions" returned false.'); + } + + if (!is_number(num)) + { + if (opts.items.filter != '*') + { + num = 'visible'; + } + else + { + var arr = [num, obj.items, opts[eType].items]; + for (var a = 0, l = arr.length; a < l; a++) + { + if (is_number(arr[a]) || arr[a] == 'page' || arr[a] == 'visible') { + num = arr[a]; + break; + } + } + } + switch(num) { + case 'page': + e.stopImmediatePropagation(); + return $cfs.triggerHandler(cf_e(eType+'Page', conf), [obj, clb]); + break; + + case 'visible': + if (!opts.items.visibleConf.variable && opts.items.filter == '*') + { + num = opts.items.visible; + } + break; + } + } + + // resume animation, add current to queue + if (scrl.isStopped) + { + $cfs.trigger(cf_e('resume', conf)); + $cfs.trigger(cf_e('queue', conf), [eType, [obj, num, clb]]); + e.stopImmediatePropagation(); + return debug(conf, 'Carousel resumed scrolling.'); + } + + // queue if scrolling + if (obj.duration > 0) + { + if (crsl.isScrolling) + { + if (obj.queue) + { + $cfs.trigger(cf_e('queue', conf), [eType, [obj, num, clb]]); + } + e.stopImmediatePropagation(); + return debug(conf, 'Carousel currently scrolling.'); + } + } + + tmrs.timePassed = 0; + $cfs.trigger(cf_e('slide_'+eType, conf), [obj, num]); + + // synchronise + if (opts.synchronise) + { + var s = opts.synchronise, + c = [obj, num]; + + for (var j = 0, l = s.length; j < l; j++) { + var d = eType; + if (!s[j][2]) + { + d = (d == 'prev') ? 'next' : 'prev'; + } + if (!s[j][1]) + { + c[0] = s[j][0].triggerHandler('_cfs_triggerEvent', ['configuration', d]); + } + c[1] = num + s[j][3]; + s[j][0].trigger('_cfs_triggerEvent', ['slide_'+d, c]); + } + } + return true; + }); + + + // prev event + $cfs.bind(cf_e('slide_prev', conf), function(e, sO, nI) { + e.stopPropagation(); + var a_itm = $cfs.children(); + + // non-circular at start, scroll to end + if (!opts.circular) + { + if (itms.first == 0) + { + if (opts.infinite) + { + $cfs.trigger(cf_e('next', conf), itms.total-1); + } + return e.stopImmediatePropagation(); + } + } + + sz_resetMargin(a_itm, opts); + + // find number of items to scroll + if (!is_number(nI)) + { + if (opts.items.visibleConf.variable) + { + nI = gn_getVisibleItemsPrev(a_itm, opts, itms.total-1); + } + else if (opts.items.filter != '*') + { + var xI = (is_number(sO.items)) ? sO.items : gn_getVisibleOrg($cfs, opts); + nI = gn_getScrollItemsPrevFilter(a_itm, opts, itms.total-1, xI); + } + else + { + nI = opts.items.visible; + } + nI = cf_getAdjust(nI, opts, sO.items, $tt0); + } + + // prevent non-circular from scrolling to far + if (!opts.circular) + { + if (itms.total - nI < itms.first) + { + nI = itms.total - itms.first; + } + } + + // set new number of visible items + opts.items.visibleConf.old = opts.items.visible; + if (opts.items.visibleConf.variable) + { + var vI = gn_getVisibleItemsNext(a_itm, opts, itms.total-nI); + if (opts.items.visible+nI <= vI && nI < itms.total) + { + nI++; + vI = gn_getVisibleItemsNext(a_itm, opts, itms.total-nI); + } + opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0); + } + else if (opts.items.filter != '*') + { + var vI = gn_getVisibleItemsNextFilter(a_itm, opts, itms.total-nI); + opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0); + } + + sz_resetMargin(a_itm, opts, true); + + // scroll 0, don't scroll + if (nI == 0) + { + e.stopImmediatePropagation(); + return debug(conf, '0 items to scroll: Not scrolling.'); + } + debug(conf, 'Scrolling '+nI+' items backward.'); + + + // save new config + itms.first += nI; + while (itms.first >= itms.total) + { + itms.first -= itms.total; + } + + // non-circular callback + if (!opts.circular) + { + if (itms.first == 0 && sO.onEnd) + { + sO.onEnd.call($tt0, 'prev'); + } + if (!opts.infinite) + { + nv_enableNavi(opts, itms.first, conf); + } + } + + // rearrange items + $cfs.children().slice(itms.total-nI, itms.total).prependTo($cfs); + if (itms.total < opts.items.visible + nI) + { + $cfs.children().slice(0, (opts.items.visible+nI)-itms.total).clone(true).appendTo($cfs); + } + + // the needed items + var a_itm = $cfs.children(), + i_old = gi_getOldItemsPrev(a_itm, opts, nI), + i_new = gi_getNewItemsPrev(a_itm, opts), + i_cur_l = a_itm.eq(nI-1), + i_old_l = i_old.last(), + i_new_l = i_new.last(); + + sz_resetMargin(a_itm, opts); + + var pL = 0, + pR = 0; + + if (opts.align) + { + var p = cf_getAlignPadding(i_new, opts); + pL = p[0]; + pR = p[1]; + } + var oL = (pL < 0) ? opts.padding[opts.d[3]] : 0; + + // hide items for fx directscroll + var hiddenitems = false, + i_skp = $(); + if (opts.items.visible < nI) + { + i_skp = a_itm.slice(opts.items.visibleConf.old, nI); + if (sO.fx == 'directscroll') + { + var orgW = opts.items[opts.d['width']]; + hiddenitems = i_skp; + i_cur_l = i_new_l; + sc_hideHiddenItems(hiddenitems); + opts.items[opts.d['width']] = 'variable'; + } + } + + // save new sizes + var $cf2 = false, + i_siz = ms_getTotalSize(a_itm.slice(0, nI), opts, 'width'), + w_siz = cf_mapWrapperSizes(ms_getSizes(i_new, opts, true), opts, !opts.usePadding), + i_siz_vis = 0, + a_cfs = {}, + a_wsz = {}, + a_cur = {}, + a_old = {}, + a_new = {}, + a_lef = {}, + a_lef_vis = {}, + a_dur = sc_getDuration(sO, opts, nI, i_siz); + + switch(sO.fx) + { + case 'cover': + case 'cover-fade': + i_siz_vis = ms_getTotalSize(a_itm.slice(0, opts.items.visible), opts, 'width'); + break; + } + + if (hiddenitems) + { + opts.items[opts.d['width']] = orgW; + } + + sz_resetMargin(a_itm, opts, true); + if (pR >= 0) + { + sz_resetMargin(i_old_l, opts, opts.padding[opts.d[1]]); + } + if (pL >= 0) + { + sz_resetMargin(i_cur_l, opts, opts.padding[opts.d[3]]); + } + + if (opts.align) + { + opts.padding[opts.d[1]] = pR; + opts.padding[opts.d[3]] = pL; + } + + a_lef[opts.d['left']] = -(i_siz - oL); + a_lef_vis[opts.d['left']] = -(i_siz_vis - oL); + a_wsz[opts.d['left']] = w_siz[opts.d['width']]; + + // scrolling functions + var _s_wrapper = function() {}, + _a_wrapper = function() {}, + _s_paddingold = function() {}, + _a_paddingold = function() {}, + _s_paddingnew = function() {}, + _a_paddingnew = function() {}, + _s_paddingcur = function() {}, + _a_paddingcur = function() {}, + _onafter = function() {}, + _moveitems = function() {}, + _position = function() {}; + + // clone carousel + switch(sO.fx) + { + case 'crossfade': + case 'cover': + case 'cover-fade': + case 'uncover': + case 'uncover-fade': + $cf2 = $cfs.clone(true).appendTo($wrp); + break; + } + switch(sO.fx) + { + case 'crossfade': + case 'uncover': + case 'uncover-fade': + $cf2.children().slice(0, nI).remove(); + $cf2.children().slice(opts.items.visibleConf.old).remove(); + break; + + case 'cover': + case 'cover-fade': + $cf2.children().slice(opts.items.visible).remove(); + $cf2.css(a_lef_vis); + break; + } + + $cfs.css(a_lef); + + // reset all scrolls + scrl = sc_setScroll(a_dur, sO.easing); + + // animate / set carousel + a_cfs[opts.d['left']] = (opts.usePadding) ? opts.padding[opts.d[3]] : 0; + + // animate / set wrapper + if (opts[opts.d['width']] == 'variable' || opts[opts.d['height']] == 'variable') + { + _s_wrapper = function() { + $wrp.css(w_siz); + }; + _a_wrapper = function() { + scrl.anims.push([$wrp, w_siz]); + }; + } + + // animate / set items + if (opts.usePadding) + { + if (i_new_l.not(i_cur_l).length) + { + a_cur[opts.d['marginRight']] = i_cur_l.data('_cfs_origCssMargin'); + + if (pL < 0) + { + i_cur_l.css(a_cur); + } + else + { + _s_paddingcur = function() { + i_cur_l.css(a_cur); + }; + _a_paddingcur = function() { + scrl.anims.push([i_cur_l, a_cur]); + }; + } + } + switch(sO.fx) + { + case 'cover': + case 'cover-fade': + $cf2.children().eq(nI-1).css(a_cur); + break; + } + + if (i_new_l.not(i_old_l).length) + { + a_old[opts.d['marginRight']] = i_old_l.data('_cfs_origCssMargin'); + _s_paddingold = function() { + i_old_l.css(a_old); + }; + _a_paddingold = function() { + scrl.anims.push([i_old_l, a_old]); + }; + } + + if (pR >= 0) + { + a_new[opts.d['marginRight']] = i_new_l.data('_cfs_origCssMargin') + opts.padding[opts.d[1]]; + _s_paddingnew = function() { + i_new_l.css(a_new); + }; + _a_paddingnew = function() { + scrl.anims.push([i_new_l, a_new]); + }; + } + } + + // set position + _position = function() { + $cfs.css(a_cfs); + }; + + + var overFill = opts.items.visible+nI-itms.total; + + // rearrange items + _moveitems = function() { + if (overFill > 0) + { + $cfs.children().slice(itms.total).remove(); + i_old = $( $cfs.children().slice(itms.total-(opts.items.visible-overFill)).get().concat( $cfs.children().slice(0, overFill).get() ) ); + } + sc_showHiddenItems(hiddenitems); + + if (opts.usePadding) + { + var l_itm = $cfs.children().eq(opts.items.visible+nI-1); + l_itm.css(opts.d['marginRight'], l_itm.data('_cfs_origCssMargin')); + } + }; + + + var cb_arguments = sc_mapCallbackArguments(i_old, i_skp, i_new, nI, 'prev', a_dur, w_siz); + + // fire onAfter callbacks + _onafter = function() { + sc_afterScroll($cfs, $cf2, sO); + crsl.isScrolling = false; + clbk.onAfter = sc_fireCallbacks($tt0, sO, 'onAfter', cb_arguments, clbk); + queu = sc_fireQueue($cfs, queu, conf); + + if (!crsl.isPaused) + { + $cfs.trigger(cf_e('play', conf)); + } + }; + + // fire onBefore callback + crsl.isScrolling = true; + tmrs = sc_clearTimers(tmrs); + clbk.onBefore = sc_fireCallbacks($tt0, sO, 'onBefore', cb_arguments, clbk); + + switch(sO.fx) + { + case 'none': + $cfs.css(a_cfs); + _s_wrapper(); + _s_paddingold(); + _s_paddingnew(); + _s_paddingcur(); + _position(); + _moveitems(); + _onafter(); + break; + + case 'fade': + scrl.anims.push([$cfs, { 'opacity': 0 }, function() { + _s_wrapper(); + _s_paddingold(); + _s_paddingnew(); + _s_paddingcur(); + _position(); + _moveitems(); + scrl = sc_setScroll(a_dur, sO.easing); + scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]); + sc_startScroll(scrl); + }]); + break; + + case 'crossfade': + $cfs.css({ 'opacity': 0 }); + scrl.anims.push([$cf2, { 'opacity': 0 }]); + scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]); + _a_wrapper(); + _s_paddingold(); + _s_paddingnew(); + _s_paddingcur(); + _position(); + _moveitems(); + break; + + case 'cover': + scrl.anims.push([$cf2, a_cfs, function() { + _s_paddingold(); + _s_paddingnew(); + _s_paddingcur(); + _position(); + _moveitems(); + _onafter(); + }]); + _a_wrapper(); + break; + + case 'cover-fade': + scrl.anims.push([$cfs, { 'opacity': 0 }]); + scrl.anims.push([$cf2, a_cfs, function() { + $cfs.css({ 'opacity': 1 }); + _s_paddingold(); + _s_paddingnew(); + _s_paddingcur(); + _position(); + _moveitems(); + _onafter(); + }]); + _a_wrapper(); + break; + + case 'uncover': + scrl.anims.push([$cf2, a_wsz, _onafter]); + _a_wrapper(); + _s_paddingold(); + _s_paddingnew(); + _s_paddingcur(); + _position(); + _moveitems(); + break; + + case 'uncover-fade': + $cfs.css({ 'opacity': 0 }); + scrl.anims.push([$cfs, { 'opacity': 1 }]); + scrl.anims.push([$cf2, a_wsz, _onafter]); + _a_wrapper(); + _s_paddingold(); + _s_paddingnew(); + _s_paddingcur(); + _position(); + _moveitems(); + break; + + default: + scrl.anims.push([$cfs, a_cfs, function() { + _moveitems(); + _onafter(); + }]); + _a_wrapper(); + _a_paddingold(); + _a_paddingnew(); + _a_paddingcur(); + break; + } + + sc_startScroll(scrl); + cf_setCookie(opts.cookie, $cfs, conf); + + $cfs.trigger(cf_e('updatePageStatus', conf), [false, w_siz]); + + return true; + }); + + + // next event + $cfs.bind(cf_e('slide_next', conf), function(e, sO, nI) { + e.stopPropagation(); + var a_itm = $cfs.children(); + + // non-circular at end, scroll to start + if (!opts.circular) + { + if (itms.first == opts.items.visible) + { + if (opts.infinite) + { + $cfs.trigger(cf_e('prev', conf), itms.total-1); + } + return e.stopImmediatePropagation(); + } + } + + sz_resetMargin(a_itm, opts); + + // find number of items to scroll + if (!is_number(nI)) + { + if (opts.items.filter != '*') + { + var xI = (is_number(sO.items)) ? sO.items : gn_getVisibleOrg($cfs, opts); + nI = gn_getScrollItemsNextFilter(a_itm, opts, 0, xI); + } + else + { + nI = opts.items.visible; + } + nI = cf_getAdjust(nI, opts, sO.items, $tt0); + } + + var lastItemNr = (itms.first == 0) ? itms.total : itms.first; + + // prevent non-circular from scrolling to far + if (!opts.circular) + { + if (opts.items.visibleConf.variable) + { + var vI = gn_getVisibleItemsNext(a_itm, opts, nI), + xI = gn_getVisibleItemsPrev(a_itm, opts, lastItemNr-1); + } + else + { + var vI = opts.items.visible, + xI = opts.items.visible; + } + + if (nI + vI > lastItemNr) + { + nI = lastItemNr - xI; + } + } + + // set new number of visible items + opts.items.visibleConf.old = opts.items.visible; + if (opts.items.visibleConf.variable) + { + var vI = gn_getVisibleItemsNextTestCircular(a_itm, opts, nI, lastItemNr); + while (opts.items.visible-nI >= vI && nI < itms.total) + { + nI++; + vI = gn_getVisibleItemsNextTestCircular(a_itm, opts, nI, lastItemNr); + } + opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0); + } + else if (opts.items.filter != '*') + { + var vI = gn_getVisibleItemsNextFilter(a_itm, opts, nI); + opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0); + } + + sz_resetMargin(a_itm, opts, true); + + // scroll 0, don't scroll + if (nI == 0) + { + e.stopImmediatePropagation(); + return debug(conf, '0 items to scroll: Not scrolling.'); + } + debug(conf, 'Scrolling '+nI+' items forward.'); + + + // save new config + itms.first -= nI; + while (itms.first < 0) + { + itms.first += itms.total; + } + + // non-circular callback + if (!opts.circular) + { + if (itms.first == opts.items.visible && sO.onEnd) + { + sO.onEnd.call($tt0, 'next'); + } + if (!opts.infinite) + { + nv_enableNavi(opts, itms.first, conf); + } + } + + // rearrange items + if (itms.total < opts.items.visible+nI) + { + $cfs.children().slice(0, (opts.items.visible+nI)-itms.total).clone(true).appendTo($cfs); + } + + // the needed items + var a_itm = $cfs.children(), + i_old = gi_getOldItemsNext(a_itm, opts), + i_new = gi_getNewItemsNext(a_itm, opts, nI), + i_cur_l = a_itm.eq(nI-1), + i_old_l = i_old.last(), + i_new_l = i_new.last(); + + sz_resetMargin(a_itm, opts); + + var pL = 0, + pR = 0; + + if (opts.align) + { + var p = cf_getAlignPadding(i_new, opts); + pL = p[0]; + pR = p[1]; + } + + // hide items for fx directscroll + var hiddenitems = false, + i_skp = $(); + if (opts.items.visibleConf.old < nI) + { + i_skp = a_itm.slice(opts.items.visibleConf.old, nI); + if (sO.fx == 'directscroll') + { + var orgW = opts.items[opts.d['width']]; + hiddenitems = i_skp; + i_cur_l = i_old_l; + sc_hideHiddenItems(hiddenitems); + opts.items[opts.d['width']] = 'variable'; + } + } + + // save new sizes + var $cf2 = false, + i_siz = ms_getTotalSize(a_itm.slice(0, nI), opts, 'width'), + w_siz = cf_mapWrapperSizes(ms_getSizes(i_new, opts, true), opts, !opts.usePadding), + i_siz_vis = 0, + a_cfs = {}, + a_cfs_vis = {}, + a_cur = {}, + a_old = {}, + a_lef = {}, + a_dur = sc_getDuration(sO, opts, nI, i_siz); + + switch(sO.fx) + { + case 'uncover': + case 'uncover-fade': + i_siz_vis = ms_getTotalSize(a_itm.slice(0, opts.items.visibleConf.old), opts, 'width'); + break; + } + + if (hiddenitems) + { + opts.items[opts.d['width']] = orgW; + } + + if (opts.align) + { + if (opts.padding[opts.d[1]] < 0) + { + opts.padding[opts.d[1]] = 0; + } + } + sz_resetMargin(a_itm, opts, true); + sz_resetMargin(i_old_l, opts, opts.padding[opts.d[1]]); + + if (opts.align) + { + opts.padding[opts.d[1]] = pR; + opts.padding[opts.d[3]] = pL; + } + + a_lef[opts.d['left']] = (opts.usePadding) ? opts.padding[opts.d[3]] : 0; + + // scrolling functions + var _s_wrapper = function() {}, + _a_wrapper = function() {}, + _s_paddingold = function() {}, + _a_paddingold = function() {}, + _s_paddingcur = function() {}, + _a_paddingcur = function() {}, + _onafter = function() {}, + _moveitems = function() {}, + _position = function() {}; + + // clone carousel + switch(sO.fx) + { + case 'crossfade': + case 'cover': + case 'cover-fade': + case 'uncover': + case 'uncover-fade': + $cf2 = $cfs.clone(true).appendTo($wrp); + $cf2.children().slice(opts.items.visibleConf.old).remove(); + break; + } + switch(sO.fx) + { + case 'crossfade': + case 'cover': + case 'cover-fade': + $cf2.css('zIndex', 0); + break; + } + + // reset all scrolls + scrl = sc_setScroll(a_dur, sO.easing); + + // animate / set carousel + a_cfs[opts.d['left']] = -i_siz; + a_cfs_vis[opts.d['left']] = -i_siz_vis; + + if (pL < 0) + { + a_cfs[opts.d['left']] += pL; + } + + // animate / set wrapper + if (opts[opts.d['width']] == 'variable' || opts[opts.d['height']] == 'variable') + { + _s_wrapper = function() { + $wrp.css(w_siz); + }; + _a_wrapper = function() { + scrl.anims.push([$wrp, w_siz]); + }; + } + + // animate / set items + if (opts.usePadding) + { + var i_new_l_m = i_new_l.data('_cfs_origCssMargin'); + if (pR >= 0) + { + i_new_l_m += opts.padding[opts.d[1]]; + } + i_new_l.css(opts.d['marginRight'], i_new_l_m); + + if (i_cur_l.not(i_old_l).length) + { + a_old[opts.d['marginRight']] = i_old_l.data('_cfs_origCssMargin'); + } + _s_paddingold = function() { + i_old_l.css(a_old); + }; + _a_paddingold = function() { + scrl.anims.push([i_old_l, a_old]); + }; + + var i_cur_l_m = i_cur_l.data('_cfs_origCssMargin'); + if (pL > 0) + { + i_cur_l_m += opts.padding[opts.d[3]]; + } + a_cur[opts.d['marginRight']] = i_cur_l_m; + _s_paddingcur = function() { + i_cur_l.css(a_cur); + }; + _a_paddingcur = function() { + scrl.anims.push([i_cur_l, a_cur]); + }; + } + + // set position + _position = function() { + $cfs.css(a_lef); + }; + + + var overFill = opts.items.visible+nI-itms.total; + + // rearrange items + _moveitems = function() { + if (overFill > 0) + { + $cfs.children().slice(itms.total).remove(); + } + var l_itm = $cfs.children().slice(0, nI).appendTo($cfs).last(); + if (overFill > 0) + { + i_new = gi_getCurrentItems(a_itm, opts); + } + sc_showHiddenItems(hiddenitems); + + if (opts.usePadding) + { + if (itms.total < opts.items.visible+nI) { + var i_cur_l = $cfs.children().eq(opts.items.visible-1); + i_cur_l.css(opts.d['marginRight'], i_cur_l.data('_cfs_origCssMargin') + opts.padding[opts.d[3]]); + } + l_itm.css(opts.d['marginRight'], l_itm.data('_cfs_origCssMargin')); + } + }; + + + var cb_arguments = sc_mapCallbackArguments(i_old, i_skp, i_new, nI, 'next', a_dur, w_siz); + + // fire onAfter callbacks + _onafter = function() { + sc_afterScroll($cfs, $cf2, sO); + crsl.isScrolling = false; + clbk.onAfter = sc_fireCallbacks($tt0, sO, 'onAfter', cb_arguments, clbk); + queu = sc_fireQueue($cfs, queu, conf); + + if (!crsl.isPaused) + { + $cfs.trigger(cf_e('play', conf)); + } + }; + + // fire onBefore callbacks + crsl.isScrolling = true; + tmrs = sc_clearTimers(tmrs); + clbk.onBefore = sc_fireCallbacks($tt0, sO, 'onBefore', cb_arguments, clbk); + + switch(sO.fx) + { + case 'none': + $cfs.css(a_cfs); + _s_wrapper(); + _s_paddingold(); + _s_paddingcur(); + _position(); + _moveitems(); + _onafter(); + break; + + case 'fade': + scrl.anims.push([$cfs, { 'opacity': 0 }, function() { + _s_wrapper(); + _s_paddingold(); + _s_paddingcur(); + _position(); + _moveitems(); + scrl = sc_setScroll(a_dur, sO.easing); + scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]); + sc_startScroll(scrl); + }]); + break; + + case 'crossfade': + $cfs.css({ 'opacity': 0 }); + scrl.anims.push([$cf2, { 'opacity': 0 }]); + scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]); + _a_wrapper(); + _s_paddingold(); + _s_paddingcur(); + _position(); + _moveitems(); + break; + + case 'cover': + $cfs.css(opts.d['left'], $wrp[opts.d['width']]()); + scrl.anims.push([$cfs, a_lef, _onafter]); + _a_wrapper(); + _s_paddingold(); + _s_paddingcur(); + _moveitems(); + break; + + case 'cover-fade': + $cfs.css(opts.d['left'], $wrp[opts.d['width']]()); + scrl.anims.push([$cf2, { 'opacity': 0 }]); + scrl.anims.push([$cfs, a_lef, _onafter]); + _a_wrapper(); + _s_paddingold(); + _s_paddingcur(); + _moveitems(); + break; + + case 'uncover': + scrl.anims.push([$cf2, a_cfs_vis, _onafter]); + _a_wrapper(); + _s_paddingold(); + _s_paddingcur(); + _position(); + _moveitems(); + break; + + case 'uncover-fade': + $cfs.css({ 'opacity': 0 }); + scrl.anims.push([$cfs, { 'opacity': 1 }]); + scrl.anims.push([$cf2, a_cfs_vis, _onafter]); + _a_wrapper(); + _s_paddingold(); + _s_paddingcur(); + _position(); + _moveitems(); + break; + + default: + scrl.anims.push([$cfs, a_cfs, function() { + _position(); + _moveitems(); + _onafter(); + }]); + _a_wrapper(); + _a_paddingold(); + _a_paddingcur(); + break; + } + + sc_startScroll(scrl); + cf_setCookie(opts.cookie, $cfs, conf); + + $cfs.trigger(cf_e('updatePageStatus', conf), [false, w_siz]); + + return true; + }); + + + // slideTo event + $cfs.bind(cf_e('slideTo', conf), function(e, num, dev, org, obj, dir, clb) { + e.stopPropagation(); + + var v = [num, dev, org, obj, dir, clb], + t = ['string/number/object', 'number', 'boolean', 'object', 'string', 'function'], + a = cf_sortParams(v, t); + + obj = a[3]; + dir = a[4]; + clb = a[5]; + + num = gn_getItemIndex(a[0], a[1], a[2], itms, $cfs); + + if (num == 0) + { + return false; + } + if (!is_object(obj)) + { + obj = false; + } + + if (crsl.isScrolling) + { + if (!is_object(obj) || obj.duration > 0) + { + return false; + } + } + + if (dir != 'prev' && dir != 'next') + { + if (opts.circular) + { + dir = (num <= itms.total / 2) ? 'next' : 'prev'; + } + else + { + dir = (itms.first == 0 || itms.first > num) ? 'next' : 'prev'; + } + } + + if (dir == 'prev') + { + num = itms.total-num; + } + $cfs.trigger(cf_e(dir, conf), [obj, num, clb]); + + return true; + }); + + + // prevPage event + $cfs.bind(cf_e('prevPage', conf), function(e, obj, clb) { + e.stopPropagation(); + var cur = $cfs.triggerHandler(cf_e('currentPage', conf)); + return $cfs.triggerHandler(cf_e('slideToPage', conf), [cur-1, obj, 'prev', clb]); + }); + + + // nextPage event + $cfs.bind(cf_e('nextPage', conf), function(e, obj, clb) { + e.stopPropagation(); + var cur = $cfs.triggerHandler(cf_e('currentPage', conf)); + return $cfs.triggerHandler(cf_e('slideToPage', conf), [cur+1, obj, 'next', clb]); + }); + + + // slideToPage event + $cfs.bind(cf_e('slideToPage', conf), function(e, pag, obj, dir, clb) { + e.stopPropagation(); + if (!is_number(pag)) + { + pag = $cfs.triggerHandler(cf_e('currentPage', conf)); + } + var ipp = opts.pagination.items || opts.items.visible, + max = Math.ceil(itms.total / ipp)-1; + + if (pag < 0) + { + pag = max; + } + if (pag > max) + { + pag = 0; + } + return $cfs.triggerHandler(cf_e('slideTo', conf), [pag*ipp, 0, true, obj, dir, clb]); + }); + + // jumpToStart event + $cfs.bind(cf_e('jumpToStart', conf), function(e, s) { + e.stopPropagation(); + if (s) + { + s = gn_getItemIndex(s, 0, true, itms, $cfs); + } + else + { + s = 0; + } + + s += itms.first; + if (s != 0) + { + if (items.total > 0) + { + while (s > itms.total) + { + s -= itms.total; + } + } + $cfs.prepend($cfs.children().slice(s, itms.total)); + } + return true; + }); + + + // synchronise event + $cfs.bind(cf_e('synchronise', conf), function(e, s) { + e.stopPropagation(); + if (s) + { + s = cf_getSynchArr(s); + } + else if (opts.synchronise) + { + s = opts.synchronise; + } + else + { + return debug(conf, 'No carousel to synchronise.'); + } + + var n = $cfs.triggerHandler(cf_e('currentPosition', conf)), + x = true; + + for (var j = 0, l = s.length; j < l; j++) + { + if (!s[j][0].triggerHandler(cf_e('slideTo', conf), [n, s[j][3], true])) + { + x = false; + } + } + return x; + }); + + + // queue event + $cfs.bind(cf_e('queue', conf), function(e, dir, opt) { + e.stopPropagation(); + if (is_function(dir)) + { + dir.call($tt0, queu); + } + else if (is_array(dir)) + { + queu = dir; + } + else if (!is_undefined(dir)) + { + queu.push([dir, opt]); + } + return queu; + }); + + + // insertItem event + $cfs.bind(cf_e('insertItem', conf), function(e, itm, num, org, dev) { + e.stopPropagation(); + + var v = [itm, num, org, dev], + t = ['string/object', 'string/number/object', 'boolean', 'number'], + a = cf_sortParams(v, t); + + itm = a[0]; + num = a[1]; + org = a[2]; + dev = a[3]; + + if (is_object(itm) && !is_jquery(itm)) + { + itm = $(itm); + } + else if (is_string(itm)) + { + itm = $(itm); + } + if (!is_jquery(itm) || itm.length == 0) + { + return debug(conf, 'Not a valid object.'); + } + + if (is_undefined(num)) + { + num = 'end'; + } + + sz_storeMargin(itm, opts); + sz_storeSizes(itm, opts); + + var orgNum = num, + before = 'before'; + + if (num == 'end') + { + if (org) + { + if (itms.first == 0) + { + num = itms.total-1; + before = 'after'; + } + else + { + num = itms.first; + itms.first += itm.length + } + if (num < 0) + { + num = 0; + } + } + else + { + num = itms.total-1; + before = 'after'; + } + } + else + { + num = gn_getItemIndex(num, dev, org, itms, $cfs); + } + if (orgNum != 'end' && !org) + { + if (num < itms.first) + { + itms.first += itm.length; + } + } + if (itms.first >= itms.total) + { + itms.first -= itms.total; + } + + var $cit = $cfs.children().eq(num); + if ($cit.length) + { + $cit[before](itm); + } + else + { + $cfs.append(itm); + } + + itms.total = $cfs.children().length; + + $cfs.trigger(cf_e('updateSizes', conf)); + $cfs.trigger(cf_e('linkAnchors', conf)); + + return true; + }); + + + // removeItem event + $cfs.bind(cf_e('removeItem', conf), function(e, num, org, dev) { + e.stopPropagation(); + + var v = [num, org, dev], + t = ['string/number/object', 'boolean', 'number'], + a = cf_sortParams(v, t); + + num = a[0]; + org = a[1]; + dev = a[2]; + + var removed = false; + if (num instanceof $ && num.length > 1) + { + $removed = $(); + num.each(function(i, el) { + var $rem = $cfs.trigger(cf_e('removeItem', conf), [$(this), org, dev]); + if ($rem) $removed = $removed.add($rem); + }); + return $removed; + } + + if (is_undefined(num) || num == 'end') + { + $removed = $cfs.children().last(); + } + else + { + num = gn_getItemIndex(num, dev, org, itms, $cfs); + var $removed = $cfs.children().eq(num); + if ($removed.length){ + if (num < itms.first) itms.first -= $removed.length; + } + } + if ($removed && $removed.length) + { + $removed.detach(); + itms.total = $cfs.children().length; + $cfs.trigger(cf_e('updateSizes', conf)); + } + + return $removed; + }); + + + // onBefore and onAfter event + $cfs.bind(cf_e('onBefore', conf)+' '+cf_e('onAfter', conf), function(e, fn) { + e.stopPropagation(); + var eType = e.type.slice(conf.events.prefix.length); + if (is_array(fn)) + { + clbk[eType] = fn; + } + if (is_function(fn)) + { + clbk[eType].push(fn); + } + return clbk[eType]; + }); + + + // currentPosition event + $cfs.bind(cf_e('currentPosition', conf), function(e, fn) { + e.stopPropagation(); + if (itms.first == 0) + { + var val = 0; + } + else + { + var val = itms.total - itms.first; + } + if (is_function(fn)) + { + fn.call($tt0, val); + } + return val; + }); + + + // currentPage event + $cfs.bind(cf_e('currentPage', conf), function(e, fn) { + e.stopPropagation(); + var ipp = opts.pagination.items || opts.items.visible, + max = Math.ceil(itms.total/ipp-1), + nr; + if (itms.first == 0) + { + nr = 0; + } + else if (itms.first < itms.total % ipp) + { + nr = 0; + } + else if (itms.first == ipp && !opts.circular) + { + nr = max; + } + else + { + nr = Math.round((itms.total-itms.first)/ipp); + } + if (nr < 0) + { + nr = 0; + } + if (nr > max) + { + nr = max; + } + if (is_function(fn)) + { + fn.call($tt0, nr); + } + return nr; + }); + + + // currentVisible event + $cfs.bind(cf_e('currentVisible', conf), function(e, fn) { + e.stopPropagation(); + var $i = gi_getCurrentItems($cfs.children(), opts); + if (is_function(fn)) + { + fn.call($tt0, $i); + } + return $i; + }); + + + // slice event + $cfs.bind(cf_e('slice', conf), function(e, f, l, fn) { + e.stopPropagation(); + + if (itms.total == 0) + { + return false; + } + + var v = [f, l, fn], + t = ['number', 'number', 'function'], + a = cf_sortParams(v, t); + + f = (is_number(a[0])) ? a[0] : 0; + l = (is_number(a[1])) ? a[1] : itms.total; + fn = a[2]; + + f += itms.first; + l += itms.first; + + if (items.total > 0) + { + while (f > itms.total) + { + f -= itms.total; + } + while (l > itms.total) + { + l -= itms.total; + } + while (f < 0) + { + f += itms.total; + } + while (l < 0) + { + l += itms.total; + } + } + var $iA = $cfs.children(), + $i; + + if (l > f) + { + $i = $iA.slice(f, l); + } + else + { + $i = $( $iA.slice(f, itms.total).get().concat( $iA.slice(0, l).get() ) ); + } + + if (is_function(fn)) + { + fn.call($tt0, $i); + } + return $i; + }); + + + // isPaused, isStopped and isScrolling events + $cfs.bind(cf_e('isPaused', conf)+' '+cf_e('isStopped', conf)+' '+cf_e('isScrolling', conf), function(e, fn) { + e.stopPropagation(); + var eType = e.type.slice(conf.events.prefix.length), + value = crsl[eType]; + if (is_function(fn)) + { + fn.call($tt0, value); + } + return value; + }); + + + // configuration event + $cfs.bind(cf_e('configuration', conf), function(e, a, b, c) { + e.stopPropagation(); + var reInit = false; + + // return entire configuration-object + if (is_function(a)) + { + a.call($tt0, opts); + } + // set multiple options via object + else if (is_object(a)) + { + opts_orig = $.extend(true, {}, opts_orig, a); + if (b !== false) reInit = true; + else opts = $.extend(true, {}, opts, a); + + } + else if (!is_undefined(a)) + { + + // callback function for specific option + if (is_function(b)) + { + var val = eval('opts.'+a); + if (is_undefined(val)) + { + val = ''; + } + b.call($tt0, val); + } + // set individual option + else if (!is_undefined(b)) + { + if (typeof c !== 'boolean') c = true; + eval('opts_orig.'+a+' = b'); + if (c !== false) reInit = true; + else eval('opts.'+a+' = b'); + } + // return value for specific option + else + { + return eval('opts.'+a); + } + } + if (reInit) + { + sz_resetMargin($cfs.children(), opts); + $cfs._cfs_init(opts_orig); + $cfs._cfs_bind_buttons(); + var sz = sz_setSizes($cfs, opts); + $cfs.trigger(cf_e('updatePageStatus', conf), [true, sz]); + } + return opts; + }); + + + // linkAnchors event + $cfs.bind(cf_e('linkAnchors', conf), function(e, $con, sel) { + e.stopPropagation(); + + if (is_undefined($con)) + { + $con = $('body'); + } + else if (is_string($con)) + { + $con = $($con); + } + if (!is_jquery($con) || $con.length == 0) + { + return debug(conf, 'Not a valid object.'); + } + if (!is_string(sel)) + { + sel = 'a.caroufredsel'; + } + + $con.find(sel).each(function() { + var h = this.hash || ''; + if (h.length > 0 && $cfs.children().index($(h)) != -1) + { + $(this).unbind('click').click(function(e) { + e.preventDefault(); + $cfs.trigger(cf_e('slideTo', conf), h); + }); + } + }); + return true; + }); + + + // updatePageStatus event + $cfs.bind(cf_e('updatePageStatus', conf), function(e, build, sizes) { + e.stopPropagation(); + if (!opts.pagination.container) + { + return; + } + + var ipp = opts.pagination.items || opts.items.visible, + pgs = Math.ceil(itms.total/ipp); + + if (build) + { + if (opts.pagination.anchorBuilder) + { + opts.pagination.container.children().remove(); + opts.pagination.container.each(function() { + for (var a = 0; a < pgs; a++) + { + var i = $cfs.children().eq( gn_getItemIndex(a*ipp, 0, true, itms, $cfs) ); + $(this).append(opts.pagination.anchorBuilder.call(i[0], a+1)); + } + }); + } + opts.pagination.container.each(function() { + $(this).children().unbind(opts.pagination.event).each(function(a) { + $(this).bind(opts.pagination.event, function(e) { + e.preventDefault(); + $cfs.trigger(cf_e('slideTo', conf), [a*ipp, -opts.pagination.deviation, true, opts.pagination]); + }); + }); + }); + } + + var selected = $cfs.triggerHandler(cf_e('currentPage', conf)) + opts.pagination.deviation; + if (selected >= pgs) + { + selected = 0; + } + if (selected < 0) + { + selected = pgs-1; + } + opts.pagination.container.each(function() { + $(this).children().removeClass(cf_c('selected', conf)).eq(selected).addClass(cf_c('selected', conf)); + }); + return true; + }); + + + // updateSizes event + $cfs.bind(cf_e('updateSizes', conf), function(e) { + var vI = opts.items.visible, + a_itm = $cfs.children(), + avail_primary = ms_getParentSize($wrp, opts, 'width'); + + itms.total = a_itm.length; + opts.maxDimension = ms_getMaxDimension(opts, avail_primary); + + if (crsl.primarySizePercentage) + { + opts[opts.d['width']] = ms_getPercentage(avail_primary, crsl.primarySizePercentage); + } + if (opts.responsive) + { + opts.items.width = opts.items.sizesConf.width; + opts.items.height = opts.items.sizesConf.height; + opts = in_getResponsiveValues(opts, a_itm, avail_primary); + vI = opts.items.visible; + sz_setResponsiveSizes(opts, a_itm); + } + else if (opts.items.visibleConf.variable) + { + vI = gn_getVisibleItemsNext(a_itm, opts, 0); + } + else if (opts.items.filter != '*') + { + vI = gn_getVisibleItemsNextFilter(a_itm, opts, 0); + } + + if (!opts.circular && itms.first != 0 && vI > itms.first) { + if (opts.items.visibleConf.variable) + { + var nI = gn_getVisibleItemsPrev(a_itm, opts, itms.first) - itms.first; + } + else if (opts.items.filter != '*') + { + var nI = gn_getVisibleItemsPrevFilter(a_itm, opts, itms.first) - itms.first; + } + else + { + var nI = opts.items.visible - itms.first; + } + debug(conf, 'Preventing non-circular: sliding '+nI+' items backward.'); + $cfs.trigger(cf_e('prev', conf), nI); + } + + opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0); + opts.items.visibleConf.old = opts.items.visible; + opts = in_getAlignPadding(opts, a_itm); + + var sz = sz_setSizes($cfs, opts); + $cfs.trigger(cf_e('updatePageStatus', conf), [true, sz]); + nv_showNavi(opts, itms.total, conf); + nv_enableNavi(opts, itms.first, conf); + + return sz; + }); + + + // destroy event + $cfs.bind(cf_e('destroy', conf), function(e, orgOrder) { + e.stopPropagation(); + tmrs = sc_clearTimers(tmrs); + + $cfs.data('_cfs_isCarousel', false); + $cfs.trigger(cf_e('finish', conf)); + if (orgOrder) + { + $cfs.trigger(cf_e('jumpToStart', conf)); + } + sz_resetMargin($cfs.children(), opts); + if (opts.responsive) + { + $cfs.children().each(function() { + $(this).css($(this).data('_cfs_origCssSizes')); + }); + } + + $cfs.css($cfs.data('_cfs_origCss')); + $cfs._cfs_unbind_events(); + $cfs._cfs_unbind_buttons(); + $wrp.replaceWith($cfs); + + return true; + }); + + + // debug event + $cfs.bind(cf_e('debug', conf), function(e) { + debug(conf, 'Carousel width: '+opts.width); + debug(conf, 'Carousel height: '+opts.height); + debug(conf, 'Item widths: '+opts.items.width); + debug(conf, 'Item heights: '+opts.items.height); + debug(conf, 'Number of items visible: '+opts.items.visible); + if (opts.auto.play) + { + debug(conf, 'Number of items scrolled automatically: '+opts.auto.items); + } + if (opts.prev.button) + { + debug(conf, 'Number of items scrolled backward: '+opts.prev.items); + } + if (opts.next.button) + { + debug(conf, 'Number of items scrolled forward: '+opts.next.items); + } + return conf.debug; + }); + + + // triggerEvent, making prefixed and namespaced events accessible from outside + $cfs.bind('_cfs_triggerEvent', function(e, n, o) { + e.stopPropagation(); + return $cfs.triggerHandler(cf_e(n, conf), o); + }); + }; // /bind_events + + + $cfs._cfs_unbind_events = function() { + $cfs.unbind(cf_e('', conf)); + $cfs.unbind(cf_e('', conf, false)); + $cfs.unbind('_cfs_triggerEvent'); + }; // /unbind_events + + + $cfs._cfs_bind_buttons = function() { + $cfs._cfs_unbind_buttons(); + nv_showNavi(opts, itms.total, conf); + nv_enableNavi(opts, itms.first, conf); + + if (opts.auto.pauseOnHover) + { + var pC = bt_pauseOnHoverConfig(opts.auto.pauseOnHover); + $wrp.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); }) + .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); }); + } + + // play button + if (opts.auto.button) + { + opts.auto.button.bind(cf_e(opts.auto.event, conf, false), function(e) { + e.preventDefault(); + var ev = false, + pC = null; + + if (crsl.isPaused) + { + ev = 'play'; + } + else if (opts.auto.pauseOnEvent) + { + ev = 'pause'; + pC = bt_pauseOnHoverConfig(opts.auto.pauseOnEvent); + } + if (ev) + { + $cfs.trigger(cf_e(ev, conf), pC); + } + }); + } + + // prev button + if (opts.prev.button) + { + opts.prev.button.bind(cf_e(opts.prev.event, conf, false), function(e) { + e.preventDefault(); + $cfs.trigger(cf_e('prev', conf)); + }); + if (opts.prev.pauseOnHover) + { + var pC = bt_pauseOnHoverConfig(opts.prev.pauseOnHover); + opts.prev.button.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); }) + .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); }); + } + } + + // next butotn + if (opts.next.button) + { + opts.next.button.bind(cf_e(opts.next.event, conf, false), function(e) { + e.preventDefault(); + $cfs.trigger(cf_e('next', conf)); + }); + if (opts.next.pauseOnHover) + { + var pC = bt_pauseOnHoverConfig(opts.next.pauseOnHover); + opts.next.button.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); }) + .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); }); + } + } + + // pagination + if (opts.pagination.container) + { + if (opts.pagination.pauseOnHover) + { + var pC = bt_pauseOnHoverConfig(opts.pagination.pauseOnHover); + opts.pagination.container.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); }) + .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); }); + } + } + + // prev/next keys + if (opts.prev.key || opts.next.key) + { + $(document).bind(cf_e('keyup', conf, false, true, true), function(e) { + var k = e.keyCode; + if (k == opts.next.key) + { + e.preventDefault(); + $cfs.trigger(cf_e('next', conf)); + } + if (k == opts.prev.key) + { + e.preventDefault(); + $cfs.trigger(cf_e('prev', conf)); + } + }); + } + + // pagination keys + if (opts.pagination.keys) + { + $(document).bind(cf_e('keyup', conf, false, true, true), function(e) { + var k = e.keyCode; + if (k >= 49 && k < 58) + { + k = (k-49) * opts.items.visible; + if (k <= itms.total) + { + e.preventDefault(); + $cfs.trigger(cf_e('slideTo', conf), [k, 0, true, opts.pagination]); + } + } + }); + } + + + // DEPRECATED + if (opts.prev.wipe || opts.next.wipe) + { + deprecated( 'the touchwipe-plugin', 'the touchSwipe-plugin' ); + if ($.fn.touchwipe) + { + var wP = (opts.prev.wipe) ? function() { $cfs.trigger(cf_e('prev', conf)) } : null, + wN = (opts.next.wipe) ? function() { $cfs.trigger(cf_e('next', conf)) } : null; + + if (wN || wN) + { + if (!crsl.touchwipe) + { + crsl.touchwipe = true; + var twOps = { + 'min_move_x': 30, + 'min_move_y': 30, + 'preventDefaultEvents': true + }; + switch (opts.direction) + { + case 'up': + case 'down': + twOps.wipeUp = wP; + twOps.wipeDown = wN; + break; + default: + twOps.wipeLeft = wN; + twOps.wipeRight = wP; + } + $wrp.touchwipe(twOps); + } + } + } + } + // /DEPRECATED + + + // swipe + if ($.fn.swipe) + { + var isTouch = 'ontouchstart' in window; + if ((isTouch && opts.swipe.onTouch) || (!isTouch && opts.swipe.onMouse)) + { + var scP = $.extend(true, {}, opts.prev, opts.swipe), + scN = $.extend(true, {}, opts.next, opts.swipe), + swP = function() { $cfs.trigger(cf_e('prev', conf), [scP]) }, + swN = function() { $cfs.trigger(cf_e('next', conf), [scN]) }; + + switch (opts.direction) + { + case 'up': + case 'down': + opts.swipe.options.swipeUp = swN; + opts.swipe.options.swipeDown = swP; + break; + default: + opts.swipe.options.swipeLeft = swN; + opts.swipe.options.swipeRight = swP; + } + if (crsl.swipe) + { + $cfs.swipe('destroy'); + } + $wrp.swipe(opts.swipe.options); + $wrp.css('cursor', 'move'); + crsl.swipe = true; + } + } + + // mousewheel + if ($.fn.mousewheel) + { + + + // DEPRECATED + if (opts.prev.mousewheel) + { + deprecated('The prev.mousewheel option', 'the mousewheel configuration object'); + opts.prev.mousewheel = null; + opts.mousewheel = { + items: bt_mousesheelNumber(opts.prev.mousewheel) + }; + } + if (opts.next.mousewheel) + { + deprecated('The next.mousewheel option', 'the mousewheel configuration object'); + opts.next.mousewheel = null; + opts.mousewheel = { + items: bt_mousesheelNumber(opts.next.mousewheel) + }; + } + // /DEPRECATED + + + if (opts.mousewheel) + { + var mcP = $.extend(true, {}, opts.prev, opts.mousewheel), + mcN = $.extend(true, {}, opts.next, opts.mousewheel); + + if (crsl.mousewheel) + { + $wrp.unbind(cf_e('mousewheel', conf, false)); + } + $wrp.bind(cf_e('mousewheel', conf, false), function(e, delta) { + e.preventDefault(); + if (delta > 0) + { + $cfs.trigger(cf_e('prev', conf), [mcP]); + } + else + { + $cfs.trigger(cf_e('next', conf), [mcN]); + } + }); + crsl.mousewheel = true; + } + } + + if (opts.auto.play) + { + $cfs.trigger(cf_e('play', conf), opts.auto.delay); + } + + if (crsl.upDateOnWindowResize) + { + var $w = $(window), + _windowWidth = 0, + _windowHeight = 0; + + $w.bind(cf_e('resize', conf, false, true, true), function(e) { + var nw = $w.width(), + nh = $w.height(); + + if (nw != _windowWidth || nh != _windowHeight) + { + + $cfs.trigger(cf_e('finish', conf)); + if (opts.auto.pauseOnResize && !crsl.isPaused) + { + $cfs.trigger(cf_e('play', conf)); + } + + sz_resetMargin($cfs.children(), opts); + + $cfs.trigger(cf_e('updateSizes', conf)); + + _windowWidth = nw; + _windowHeight = nh; + } + }); + } + }; // /bind_buttons + + + $cfs._cfs_unbind_buttons = function() { + var ns1 = cf_e('', conf), + ns2 = cf_e('', conf, false); + ns3 = cf_e('', conf, false, true, true); + + $(document).unbind(ns3); + $(window).unbind(ns3); + $wrp.unbind(ns2); + + if (opts.auto.button) + { + opts.auto.button.unbind(ns2); + } + if (opts.prev.button) + { + opts.prev.button.unbind(ns2); + } + if (opts.next.button) + { + opts.next.button.unbind(ns2); + } + if (opts.pagination.container) + { + opts.pagination.container.unbind(ns2); + if (opts.pagination.anchorBuilder) + { + opts.pagination.container.children().remove(); + } + } + if (crsl.swipe) + { + $cfs.swipe('destroy'); + $wrp.css('cursor', 'default'); + crsl.swipe = false; + } + if (crsl.mousewheel) + { + crsl.mousewheel = false; + } + + nv_showNavi(opts, 'hide', conf); + nv_enableNavi(opts, 'removeClass', conf); + + }; // /unbind_buttons + + + + // START + + if (is_boolean(configs)) + { + configs = { + 'debug': configs + }; + } + + // set vars + var crsl = { + 'direction' : 'next', + 'isPaused' : true, + 'isScrolling' : false, + 'isStopped' : false, + 'mousewheel' : false, + 'swipe' : false + }, + itms = { + 'total' : $cfs.children().length, + 'first' : 0 + }, + tmrs = { + 'auto' : null, + 'progress' : null, + 'startTime' : getTime(), + 'timePassed' : 0 + }, + scrl = { + 'isStopped' : false, + 'duration' : 0, + 'startTime' : 0, + 'easing' : '', + 'anims' : [] + }, + clbk = { + 'onBefore' : [], + 'onAfter' : [] + }, + queu = [], + conf = $.extend(true, {}, $.fn.carouFredSel.configs, configs), + opts = {}, + opts_orig = $.extend(true, {}, options), + $wrp = $cfs.wrap('<'+conf.wrapper.element+' class="'+conf.wrapper.classname+'" />').parent(); + + + conf.selector = $cfs.selector; + conf.serialNumber = $.fn.carouFredSel.serialNumber++; + + + // create carousel + $cfs._cfs_init(opts_orig, true, starting_position); + $cfs._cfs_build(); + $cfs._cfs_bind_events(); + $cfs._cfs_bind_buttons(); + + // find item to start + if (is_array(opts.items.start)) + { + var start_arr = opts.items.start; + } + else + { + var start_arr = []; + if (opts.items.start != 0) + { + start_arr.push(opts.items.start); + } + } + if (opts.cookie) + { + start_arr.unshift(parseInt(cf_getCookie(opts.cookie), 10)); + } + + if (start_arr.length > 0) + { + for (var a = 0, l = start_arr.length; a < l; a++) + { + var s = start_arr[a]; + if (s == 0) + { + continue; + } + if (s === true) + { + s = window.location.hash; + if (s.length < 1) + { + continue; + } + } + else if (s === 'random') + { + s = Math.floor(Math.random()*itms.total); + } + if ($cfs.triggerHandler(cf_e('slideTo', conf), [s, 0, true, { fx: 'none' }])) + { + break; + } + } + } + var siz = sz_setSizes($cfs, opts), + itm = gi_getCurrentItems($cfs.children(), opts); + + if (opts.onCreate) + { + opts.onCreate.call($tt0, { + 'width': siz.width, + 'height': siz.height, + 'items': itm + }); + } + + $cfs.trigger(cf_e('updatePageStatus', conf), [true, siz]); + $cfs.trigger(cf_e('linkAnchors', conf)); + + if (conf.debug) + { + $cfs.trigger(cf_e('debug', conf)); + } + + return $cfs; + }; + + + + // GLOBAL PUBLIC + + $.fn.carouFredSel.serialNumber = 1; + $.fn.carouFredSel.defaults = { + 'synchronise' : false, + 'infinite' : true, + 'circular' : true, + 'responsive' : false, + 'direction' : 'left', + 'items' : { + 'start' : 0 + }, + 'scroll' : { + 'easing' : 'swing', + 'duration' : 500, + 'pauseOnHover' : false, + 'event' : 'click', + 'queue' : false + } + }; + $.fn.carouFredSel.configs = { + 'debug' : false, + 'events' : { + 'prefix' : '', + 'namespace' : 'cfs' + }, + 'wrapper' : { + 'element' : 'div', + 'classname' : 'caroufredsel_wrapper' + }, + 'classnames' : {} + }; + $.fn.carouFredSel.pageAnchorBuilder = function(nr) { + return ''+nr+''; + }; + $.fn.carouFredSel.progressbarUpdater = function(perc) { + $(this).css('width', perc+'%'); + }; + + $.fn.carouFredSel.cookie = { + get: function(n) { + n += '='; + var ca = document.cookie.split(';'); + for (var a = 0, l = ca.length; a < l; a++) + { + var c = ca[a]; + while (c.charAt(0) == ' ') + { + c = c.slice(1); + } + if (c.indexOf(n) == 0) + { + return c.slice(n.length); + } + } + return 0; + }, + set: function(n, v, d) { + var e = ""; + if (d) + { + var date = new Date(); + date.setTime(date.getTime() + (d * 24 * 60 * 60 * 1000)); + e = "; expires=" + date.toGMTString(); + } + document.cookie = n + '=' + v + e + '; path=/'; + }, + remove: function(n) { + $.fn.carouFredSel.cookie.set(n, "", -1); + } + }; + + + // GLOBAL PRIVATE + + // scrolling functions + function sc_setScroll(d, e) { + return { + anims: [], + duration: d, + orgDuration: d, + easing: e, + startTime: getTime() + }; + } + function sc_startScroll(s) { + + if (is_object(s.pre)) + { + sc_startScroll(s.pre); + } + for (var a = 0, l = s.anims.length; a < l; a++) + { + var b = s.anims[a]; + if (!b) + { + continue; + } + if (b[3]) + { + b[0].stop(); + } + b[0].animate(b[1], { + complete: b[2], + duration: s.duration, + easing: s.easing + }); + } + if (is_object(s.post)) + { + sc_startScroll(s.post); + } + } + function sc_stopScroll(s, finish) { + if (!is_boolean(finish)) + { + finish = true; + } + if (is_object(s.pre)) + { + sc_stopScroll(s.pre, finish); + } + for (var a = 0, l = s.anims.length; a < l; a++) + { + var b = s.anims[a]; + b[0].stop(true); + if (finish) + { + b[0].css(b[1]); + if (is_function(b[2])) + { + b[2](); + } + } + } + if (is_object(s.post)) + { + sc_stopScroll(s.post, finish); + } + } + function sc_afterScroll( $c, $c2, o ) { + if ($c2) + { + $c2.remove(); + } + + switch(o.fx) { + case 'fade': + case 'crossfade': + case 'cover-fade': + case 'uncover-fade': + $c.css('filter', ''); + break; + } + } + function sc_fireCallbacks($t, o, b, a, c) { + if (o[b]) + { + o[b].call($t, a); + } + if (c[b].length) + { + for (var i = 0, l = c[b].length; i < l; i++) + { + c[b][i].call($t, a); + } + } + return []; + } + function sc_fireQueue($c, q, c) { + + if (q.length) + { + $c.trigger(cf_e(q[0][0], c), q[0][1]); + q.shift(); + } + return q; + } + function sc_hideHiddenItems(hiddenitems) { + hiddenitems.each(function() { + var hi = $(this); + hi.data('_cfs_isHidden', hi.is(':hidden')).hide(); + }); + } + function sc_showHiddenItems(hiddenitems) { + if (hiddenitems) + { + hiddenitems.each(function() { + var hi = $(this); + if (!hi.data('_cfs_isHidden')) + { + hi.show(); + } + }); + } + } + function sc_clearTimers(t) { + if (t.auto) + { + clearTimeout(t.auto); + } + if (t.progress) + { + clearInterval(t.progress); + } + return t; + } + function sc_mapCallbackArguments(i_old, i_skp, i_new, s_itm, s_dir, s_dur, w_siz) { + return { + 'width': w_siz.width, + 'height': w_siz.height, + 'items': { + 'old': i_old, + 'skipped': i_skp, + + // DEPRECATED + 'new': i_new, + // /DEPRECATED + + 'visible': i_new + }, + 'scroll': { + 'items': s_itm, + 'direction': s_dir, + 'duration': s_dur + } + }; + } + function sc_getDuration( sO, o, nI, siz ) { + var dur = sO.duration; + if (sO.fx == 'none') + { + return 0; + } + if (dur == 'auto') + { + dur = o.scroll.duration / o.scroll.items * nI; + } + else if (dur < 10) + { + dur = siz / dur; + } + if (dur < 1) + { + return 0; + } + if (sO.fx == 'fade') + { + dur = dur / 2; + } + return Math.round(dur); + } + + // navigation functions + function nv_showNavi(o, t, c) { + var minimum = (is_number(o.items.minimum)) ? o.items.minimum : o.items.visible + 1; + if (t == 'show' || t == 'hide') + { + var f = t; + } + else if (minimum > t) + { + debug(c, 'Not enough items ('+t+' total, '+minimum+' needed): Hiding navigation.'); + var f = 'hide'; + } + else + { + var f = 'show'; + } + var s = (f == 'show') ? 'removeClass' : 'addClass', + h = cf_c('hidden', c); + + if (o.auto.button) + { + o.auto.button[f]()[s](h); + } + if (o.prev.button) + { + o.prev.button[f]()[s](h); + } + if (o.next.button) + { + o.next.button[f]()[s](h); + } + if (o.pagination.container) + { + o.pagination.container[f]()[s](h); + } + } + function nv_enableNavi(o, f, c) { + if (o.circular || o.infinite) return; + var fx = (f == 'removeClass' || f == 'addClass') ? f : false, + di = cf_c('disabled', c); + + if (o.auto.button && fx) + { + o.auto.button[fx](di); + } + if (o.prev.button) + { + var fn = fx || (f == 0) ? 'addClass' : 'removeClass'; + o.prev.button[fn](di); + } + if (o.next.button) + { + var fn = fx || (f == o.items.visible) ? 'addClass' : 'removeClass'; + o.next.button[fn](di); + } + } + + // get object functions + function go_getObject($tt, obj) { + if (is_function(obj)) + { + obj = obj.call($tt); + } + else if (is_undefined(obj)) + { + obj = {}; + } + return obj; + } + function go_getItemsObject($tt, obj) { + obj = go_getObject($tt, obj); + if (is_number(obj)) + { + obj = { + 'visible': obj + }; + } + else if (obj == 'variable') + { + obj = { + 'visible': obj, + 'width': obj, + 'height': obj + }; + } + else if (!is_object(obj)) + { + obj = {}; + } + return obj; + } + function go_getScrollObject($tt, obj) { + obj = go_getObject($tt, obj); + if (is_number(obj)) + { + if (obj <= 50) + { + obj = { + 'items': obj + }; + } + else + { + obj = { + 'duration': obj + }; + } + } + else if (is_string(obj)) + { + obj = { + 'easing': obj + }; + } + else if (!is_object(obj)) + { + obj = {}; + } + return obj; + } + function go_getNaviObject($tt, obj) { + obj = go_getObject($tt, obj); + if (is_string(obj)) + { + var temp = cf_getKeyCode(obj); + if (temp == -1) + { + obj = $(obj); + } + else + { + obj = temp; + } + } + return obj; + } + + function go_getAutoObject($tt, obj) { + obj = go_getNaviObject($tt, obj); + if (is_jquery(obj)) + { + obj = { + 'button': obj + }; + } + else if (is_boolean(obj)) + { + obj = { + 'play': obj + }; + } + else if (is_number(obj)) + { + obj = { + 'timeoutDuration': obj + }; + } + if (obj.progress) + { + if (is_string(obj.progress) || is_jquery(obj.progress)) + { + obj.progress = { + 'bar': obj.progress + }; + } + } + return obj; + } + function go_complementAutoObject($tt, obj) { + if (is_function(obj.button)) + { + obj.button = obj.button.call($tt); + } + if (is_string(obj.button)) + { + obj.button = $(obj.button); + } + if (!is_boolean(obj.play)) + { + obj.play = true; + } + if (!is_number(obj.delay)) + { + obj.delay = 0; + } + if (is_undefined(obj.pauseOnEvent)) + { + obj.pauseOnEvent = true; + } + if (!is_boolean(obj.pauseOnResize)) + { + obj.pauseOnResize = true; + } + if (!is_number(obj.timeoutDuration)) + { + obj.timeoutDuration = (obj.duration < 10) + ? 2500 + : obj.duration * 5; + } + if (obj.progress) + { + if (is_function(obj.progress.bar)) + { + obj.progress.bar = obj.progress.bar.call($tt); + } + if (is_string(obj.progress.bar)) + { + obj.progress.bar = $(obj.progress.bar); + } + if (obj.progress.bar) + { + if (!is_function(obj.progress.updater)) + { + obj.progress.updater = $.fn.carouFredSel.progressbarUpdater; + } + if (!is_number(obj.progress.interval)) + { + obj.progress.interval = 50; + } + } + else + { + obj.progress = false; + } + } + return obj; + } + + function go_getPrevNextObject($tt, obj) { + obj = go_getNaviObject($tt, obj); + if (is_jquery(obj)) + { + obj = { + 'button': obj + }; + } + else if (is_number(obj)) + { + obj = { + 'key': obj + }; + } + return obj; + } + function go_complementPrevNextObject($tt, obj) { + if (is_function(obj.button)) + { + obj.button = obj.button.call($tt); + } + if (is_string(obj.button)) + { + obj.button = $(obj.button); + } + if (is_string(obj.key)) + { + obj.key = cf_getKeyCode(obj.key); + } + return obj; + } + + function go_getPaginationObject($tt, obj) { + obj = go_getNaviObject($tt, obj); + if (is_jquery(obj)) + { + obj = { + 'container': obj + }; + } + else if (is_boolean(obj)) + { + obj = { + 'keys': obj + }; + } + return obj; + } + function go_complementPaginationObject($tt, obj) { + if (is_function(obj.container)) + { + obj.container = obj.container.call($tt); + } + if (is_string(obj.container)) + { + obj.container = $(obj.container); + } + if (!is_number(obj.items)) + { + obj.items = false; + } + if (!is_boolean(obj.keys)) + { + obj.keys = false; + } + if (!is_function(obj.anchorBuilder) && !is_false(obj.anchorBuilder)) + { + obj.anchorBuilder = $.fn.carouFredSel.pageAnchorBuilder; + } + if (!is_number(obj.deviation)) + { + obj.deviation = 0; + } + return obj; + } + + function go_getSwipeObject($tt, obj) { + if (is_function(obj)) + { + obj = obj.call($tt); + } + if (is_undefined(obj)) + { + obj = { + 'onTouch': false + }; + } + if (is_true(obj)) + { + obj = { + 'onTouch': obj + }; + } + else if (is_number(obj)) + { + obj = { + 'items': obj + }; + } + return obj; + } + function go_complementSwipeObject($tt, obj) { + if (!is_boolean(obj.onTouch)) + { + obj.onTouch = true; + } + if (!is_boolean(obj.onMouse)) + { + obj.onMouse = false; + } + if (!is_object(obj.options)) + { + obj.options = {}; + } + if (!is_boolean(obj.options.triggerOnTouchEnd)) + { + obj.options.triggerOnTouchEnd = false; + } + return obj; + } + function go_getMousewheelObject($tt, obj) { + if (is_function(obj)) + { + obj = obj.call($tt); + } + if (is_true(obj)) + { + obj = {}; + } + else if (is_number(obj)) + { + obj = { + 'items': obj + }; + } + else if (is_undefined(obj)) + { + obj = false; + } + return obj; + } + function go_complementMousewheelObject($tt, obj) { + return obj; + } + + // get number functions + function gn_getItemIndex(num, dev, org, items, $cfs) { + if (is_string(num)) + { + num = $(num, $cfs); + } + + if (is_object(num)) + { + num = $(num, $cfs); + } + if (is_jquery(num)) + { + num = $cfs.children().index(num); + if (!is_boolean(org)) + { + org = false; + } + } + else + { + if (!is_boolean(org)) + { + org = true; + } + } + if (!is_number(num)) + { + num = 0; + } + if (!is_number(dev)) + { + dev = 0; + } + + if (org) + { + num += items.first; + } + num += dev; + if (items.total > 0) + { + while (num >= items.total) + { + num -= items.total; + } + while (num < 0) + { + num += items.total; + } + } + return num; + } + + // items prev + function gn_getVisibleItemsPrev(i, o, s) { + var t = 0, + x = 0; + + for (var a = s; a >= 0; a--) + { + var j = i.eq(a); + t += (j.is(':visible')) ? j[o.d['outerWidth']](true) : 0; + if (t > o.maxDimension) + { + return x; + } + if (a == 0) + { + a = i.length; + } + x++; + } + } + function gn_getVisibleItemsPrevFilter(i, o, s) { + return gn_getItemsPrevFilter(i, o.items.filter, o.items.visibleConf.org, s); + } + function gn_getScrollItemsPrevFilter(i, o, s, m) { + return gn_getItemsPrevFilter(i, o.items.filter, m, s); + } + function gn_getItemsPrevFilter(i, f, m, s) { + var t = 0, + x = 0; + + for (var a = s, l = i.length; a >= 0; a--) + { + x++; + if (x == l) + { + return x; + } + + var j = i.eq(a); + if (j.is(f)) + { + t++; + if (t == m) + { + return x; + } + } + if (a == 0) + { + a = l; + } + } + } + + function gn_getVisibleOrg($c, o) { + return o.items.visibleConf.org || $c.children().slice(0, o.items.visible).filter(o.items.filter).length; + } + + // items next + function gn_getVisibleItemsNext(i, o, s) { + var t = 0, + x = 0; + + for (var a = s, l = i.length-1; a <= l; a++) + { + var j = i.eq(a); + + t += (j.is(':visible')) ? j[o.d['outerWidth']](true) : 0; + if (t > o.maxDimension) + { + return x; + } + + x++; + if (x == l+1) + { + return x; + } + if (a == l) + { + a = -1; + } + } + } + function gn_getVisibleItemsNextTestCircular(i, o, s, l) { + var v = gn_getVisibleItemsNext(i, o, s); + if (!o.circular) + { + if (s + v > l) + { + v = l - s; + } + } + return v; + } + function gn_getVisibleItemsNextFilter(i, o, s) { + return gn_getItemsNextFilter(i, o.items.filter, o.items.visibleConf.org, s, o.circular); + } + function gn_getScrollItemsNextFilter(i, o, s, m) { + return gn_getItemsNextFilter(i, o.items.filter, m+1, s, o.circular) - 1; + } + function gn_getItemsNextFilter(i, f, m, s, c) { + var t = 0, + x = 0; + + for (var a = s, l = i.length-1; a <= l; a++) + { + x++; + if (x >= l) + { + return x; + } + + var j = i.eq(a); + if (j.is(f)) + { + t++; + if (t == m) + { + return x; + } + } + if (a == l) + { + a = -1; + } + } + } + + // get items functions + function gi_getCurrentItems(i, o) { + return i.slice(0, o.items.visible); + } + function gi_getOldItemsPrev(i, o, n) { + return i.slice(n, o.items.visibleConf.old+n); + } + function gi_getNewItemsPrev(i, o) { + return i.slice(0, o.items.visible); + } + function gi_getOldItemsNext(i, o) { + return i.slice(0, o.items.visibleConf.old); + } + function gi_getNewItemsNext(i, o, n) { + return i.slice(n, o.items.visible+n); + } + + // sizes functions + function sz_storeMargin(i, o, d) { + if (o.usePadding) + { + if (!is_string(d)) + { + d = '_cfs_origCssMargin'; + } + i.each(function() { + var j = $(this), + m = parseInt(j.css(o.d['marginRight']), 10); + if (!is_number(m)) + { + m = 0; + } + j.data(d, m); + }); + } + } + function sz_resetMargin(i, o, m) { + if (o.usePadding) + { + var x = (is_boolean(m)) ? m : false; + if (!is_number(m)) + { + m = 0; + } + sz_storeMargin(i, o, '_cfs_tempCssMargin'); + i.each(function() { + var j = $(this); + j.css(o.d['marginRight'], ((x) ? j.data('_cfs_tempCssMargin') : m + j.data('_cfs_origCssMargin'))); + }); + } + } + function sz_storeSizes(i, o) { + if (o.responsive) + { + i.each(function() { + var j = $(this), + s = in_mapCss(j, ['width', 'height']); + j.data('_cfs_origCssSizes', s); + }); + } + } + function sz_setResponsiveSizes(o, all) { + var visb = o.items.visible, + newS = o.items[o.d['width']], + seco = o[o.d['height']], + secp = is_percentage(seco); + + all.each(function() { + var $t = $(this), + nw = newS - ms_getPaddingBorderMargin($t, o, 'Width'); + + $t[o.d['width']](nw); + if (secp) + { + $t[o.d['height']](ms_getPercentage(nw, seco)); + } + }); + } + function sz_setSizes($c, o) { + var $w = $c.parent(), + $i = $c.children(), + $v = gi_getCurrentItems($i, o), + sz = cf_mapWrapperSizes(ms_getSizes($v, o, true), o, false); + + $w.css(sz); + + if (o.usePadding) + { + var p = o.padding, + r = p[o.d[1]]; + + if (o.align && r < 0) + { + r = 0; + } + var $l = $v.last(); + $l.css(o.d['marginRight'], $l.data('_cfs_origCssMargin') + r); + $c.css(o.d['top'], p[o.d[0]]); + $c.css(o.d['left'], p[o.d[3]]); + } + + $c.css(o.d['width'], sz[o.d['width']]+(ms_getTotalSize($i, o, 'width')*2)); + $c.css(o.d['height'], ms_getLargestSize($i, o, 'height')); + return sz; + } + + // measuring functions + function ms_getSizes(i, o, wrapper) { + return [ms_getTotalSize(i, o, 'width', wrapper), ms_getLargestSize(i, o, 'height', wrapper)]; + } + function ms_getLargestSize(i, o, dim, wrapper) { + if (!is_boolean(wrapper)) + { + wrapper = false; + } + if (is_number(o[o.d[dim]]) && wrapper) + { + return o[o.d[dim]]; + } + if (is_number(o.items[o.d[dim]])) + { + return o.items[o.d[dim]]; + } + dim = (dim.toLowerCase().indexOf('width') > -1) ? 'outerWidth' : 'outerHeight'; + return ms_getTrueLargestSize(i, o, dim); + } + function ms_getTrueLargestSize(i, o, dim) { + var s = 0; + + for (var a = 0, l = i.length; a < l; a++) + { + var j = i.eq(a); + + var m = (j.is(':visible')) ? j[o.d[dim]](true) : 0; + if (s < m) + { + s = m; + } + } + return s; + } + + function ms_getTotalSize(i, o, dim, wrapper) { + if (!is_boolean(wrapper)) + { + wrapper = false; + } + if (is_number(o[o.d[dim]]) && wrapper) + { + return o[o.d[dim]]; + } + if (is_number(o.items[o.d[dim]])) + { + return o.items[o.d[dim]] * i.length; + } + + var d = (dim.toLowerCase().indexOf('width') > -1) ? 'outerWidth' : 'outerHeight', + s = 0; + + for (var a = 0, l = i.length; a < l; a++) + { + var j = i.eq(a); + s += (j.is(':visible')) ? j[o.d[d]](true) : 0; + } + return s; + } + function ms_getParentSize($w, o, d) { + var isVisible = $w.is(':visible'); + if (isVisible) + { + $w.hide(); + } + var s = $w.parent()[o.d[d]](); + if (isVisible) + { + $w.show(); + } + return s; + } + function ms_getMaxDimension(o, a) { + return (is_number(o[o.d['width']])) ? o[o.d['width']] : a; + } + function ms_hasVariableSizes(i, o, dim) { + var s = false, + v = false; + + for (var a = 0, l = i.length; a < l; a++) + { + var j = i.eq(a); + + var c = (j.is(':visible')) ? j[o.d[dim]](true) : 0; + if (s === false) + { + s = c; + } + else if (s != c) + { + v = true; + } + if (s == 0) + { + v = true; + } + } + return v; + } + function ms_getPaddingBorderMargin(i, o, d) { + return i[o.d['outer'+d]](true) - i[o.d[d.toLowerCase()]](); + } + function ms_getPercentage(s, o) { + if (is_percentage(o)) + { + o = parseInt( o.slice(0, -1), 10 ); + if (!is_number(o)) + { + return s; + } + s *= o/100; + } + return s; + } + + // config functions + function cf_e(n, c, pf, ns, rd) { + if (!is_boolean(pf)) + { + pf = true; + } + if (!is_boolean(ns)) + { + ns = true; + } + if (!is_boolean(rd)) + { + rd = false; + } + + if (pf) + { + n = c.events.prefix + n; + } + if (ns) + { + n = n +'.'+ c.events.namespace; + } + if (ns && rd) + { + n += c.serialNumber; + } + + return n; + } + function cf_c(n, c) { + return (is_string(c.classnames[n])) ? c.classnames[n] : n; + } + function cf_mapWrapperSizes(ws, o, p) { + if (!is_boolean(p)) + { + p = true; + } + var pad = (o.usePadding && p) ? o.padding : [0, 0, 0, 0]; + var wra = {}; + + wra[o.d['width']] = ws[0] + pad[1] + pad[3]; + wra[o.d['height']] = ws[1] + pad[0] + pad[2]; + + return wra; + } + function cf_sortParams(vals, typs) { + var arr = []; + for (var a = 0, l1 = vals.length; a < l1; a++) + { + for (var b = 0, l2 = typs.length; b < l2; b++) + { + if (typs[b].indexOf(typeof vals[a]) > -1 && is_undefined(arr[b])) + { + arr[b] = vals[a]; + break; + } + } + } + return arr; + } + function cf_getPadding(p) { + if (is_undefined(p)) + { + return [0, 0, 0, 0]; + } + if (is_number(p)) + { + return [p, p, p, p]; + } + if (is_string(p)) + { + p = p.split('px').join('').split('em').join('').split(' '); + } + + if (!is_array(p)) + { + return [0, 0, 0, 0]; + } + for (var i = 0; i < 4; i++) + { + p[i] = parseInt(p[i], 10); + } + switch (p.length) + { + case 0: + return [0, 0, 0, 0]; + case 1: + return [p[0], p[0], p[0], p[0]]; + case 2: + return [p[0], p[1], p[0], p[1]]; + case 3: + return [p[0], p[1], p[2], p[1]]; + default: + return [p[0], p[1], p[2], p[3]]; + } + } + function cf_getAlignPadding(itm, o) { + var x = (is_number(o[o.d['width']])) ? Math.ceil(o[o.d['width']] - ms_getTotalSize(itm, o, 'width')) : 0; + switch (o.align) + { + case 'left': + return [0, x]; + case 'right': + return [x, 0]; + case 'center': + default: + return [Math.ceil(x/2), Math.floor(x/2)]; + } + } + function cf_getDimensions(o) { + var dm = [ + ['width' , 'innerWidth' , 'outerWidth' , 'height' , 'innerHeight' , 'outerHeight' , 'left', 'top' , 'marginRight' , 0, 1, 2, 3], + ['height' , 'innerHeight' , 'outerHeight' , 'width' , 'innerWidth' , 'outerWidth' , 'top' , 'left', 'marginBottom', 3, 2, 1, 0] + ]; + + var dl = dm[0].length, + dx = (o.direction == 'right' || o.direction == 'left') ? 0 : 1; + + var dimensions = {}; + for (var d = 0; d < dl; d++) + { + dimensions[dm[0][d]] = dm[dx][d]; + } + return dimensions; + } + function cf_getAdjust(x, o, a, $t) { + var v = x; + if (is_function(a)) + { + v = a.call($t, v); + + } + else if (is_string(a)) + { + var p = a.split('+'), + m = a.split('-'); + + if (m.length > p.length) + { + var neg = true, + sta = m[0], + adj = m[1]; + } + else + { + var neg = false, + sta = p[0], + adj = p[1]; + } + + switch(sta) + { + case 'even': + v = (x % 2 == 1) ? x-1 : x; + break; + case 'odd': + v = (x % 2 == 0) ? x-1 : x; + break; + default: + v = x; + break; + } + adj = parseInt(adj, 10); + if (is_number(adj)) + { + if (neg) + { + adj = -adj; + } + v += adj; + } + } + if (!is_number(v) || v < 1) + { + v = 1; + } + return v; + } + function cf_getItemsAdjust(x, o, a, $t) { + return cf_getItemAdjustMinMax(cf_getAdjust(x, o, a, $t), o.items.visibleConf); + } + function cf_getItemAdjustMinMax(v, i) { + if (is_number(i.min) && v < i.min) + { + v = i.min; + } + if (is_number(i.max) && v > i.max) + { + v = i.max; + } + if (v < 1) + { + v = 1; + } + return v; + } + function cf_getSynchArr(s) { + if (!is_array(s)) + { + s = [[s]]; + } + if (!is_array(s[0])) + { + s = [s]; + } + for (var j = 0, l = s.length; j < l; j++) + { + if (is_string(s[j][0])) + { + s[j][0] = $(s[j][0]); + } + if (!is_boolean(s[j][1])) + { + s[j][1] = true; + } + if (!is_boolean(s[j][2])) + { + s[j][2] = true; + } + if (!is_number(s[j][3])) + { + s[j][3] = 0; + } + } + return s; + } + function cf_getKeyCode(k) { + if (k == 'right') + { + return 39; + } + if (k == 'left') + { + return 37; + } + if (k == 'up') + { + return 38; + } + if (k == 'down') + { + return 40; + } + return -1; + } + function cf_setCookie(n, $c, c) { + if (n) + { + var v = $c.triggerHandler(cf_e('currentPosition', c)); + $.fn.carouFredSel.cookie.set(n, v); + } + } + function cf_getCookie(n) { + var c = $.fn.carouFredSel.cookie.get(n); + return (c == '') ? 0 : c; + } + + // init function + function in_mapCss($elem, props) { + var css = {}, prop; + for (var p = 0, l = props.length; p < l; p++) + { + prop = props[p]; + css[prop] = $elem.css(prop); + } + return css; + } + function in_complementItems(obj, opt, itm, sta) { + if (!is_object(obj.visibleConf)) + { + obj.visibleConf = {}; + } + if (!is_object(obj.sizesConf)) + { + obj.sizesConf = {}; + } + + if (obj.start == 0 && is_number(sta)) + { + obj.start = sta; + } + + // visible items + if (is_object(obj.visible)) + { + obj.visibleConf.min = obj.visible.min; + obj.visibleConf.max = obj.visible.max; + obj.visible = false; + } + else if (is_string(obj.visible)) + { + // variable visible items + if (obj.visible == 'variable') + { + obj.visibleConf.variable = true; + } + // adjust string visible items + else + { + obj.visibleConf.adjust = obj.visible; + } + obj.visible = false; + } + else if (is_function(obj.visible)) + { + obj.visibleConf.adjust = obj.visible; + obj.visible = false; + } + + // set items filter + if (!is_string(obj.filter)) + { + obj.filter = (itm.filter(':hidden').length > 0) ? ':visible' : '*'; + } + + // primary item-size not set + if (!obj[opt.d['width']]) + { + // responsive carousel -> set to largest + if (opt.responsive) + { + debug(true, 'Set a '+opt.d['width']+' for the items!'); + obj[opt.d['width']] = ms_getTrueLargestSize(itm, opt, 'outerWidth'); + } + // non-responsive -> measure it or set to "variable" + else + { + obj[opt.d['width']] = (ms_hasVariableSizes(itm, opt, 'outerWidth')) + ? 'variable' + : itm[opt.d['outerWidth']](true); + } + } + + // secondary item-size not set -> measure it or set to "variable" + if (!obj[opt.d['height']]) + { + obj[opt.d['height']] = (ms_hasVariableSizes(itm, opt, 'outerHeight')) + ? 'variable' + : itm[opt.d['outerHeight']](true); + } + + obj.sizesConf.width = obj.width; + obj.sizesConf.height = obj.height; + return obj; + } + function in_complementVisibleItems(opt, avl) { + // primary item-size variable -> set visible items variable + if (opt.items[opt.d['width']] == 'variable') + { + opt.items.visibleConf.variable = true; + } + if (!opt.items.visibleConf.variable) { + // primary size is number -> calculate visible-items + if (is_number(opt[opt.d['width']])) + { + opt.items.visible = Math.floor(opt[opt.d['width']] / opt.items[opt.d['width']]); + } + // measure and calculate primary size and visible-items + else + { + opt.items.visible = Math.floor(avl / opt.items[opt.d['width']]); + opt[opt.d['width']] = opt.items.visible * opt.items[opt.d['width']]; + if (!opt.items.visibleConf.adjust) + { + opt.align = false; + } + } + if (opt.items.visible == 'Infinity' || opt.items.visible < 1) + { + debug(true, 'Not a valid number of visible items: Set to "variable".'); + opt.items.visibleConf.variable = true; + } + } + return opt; + } + function in_complementPrimarySize(obj, opt, all) { + // primary size set to auto -> measure largest item-size and set it + if (obj == 'auto') + { + obj = ms_getTrueLargestSize(all, opt, 'outerWidth'); + } + return obj; + } + function in_complementSecondarySize(obj, opt, all) { + // secondary size set to auto -> measure largest item-size and set it + if (obj == 'auto') + { + obj = ms_getTrueLargestSize(all, opt, 'outerHeight'); + } + // secondary size not set -> set to secondary item-size + if (!obj) + { + obj = opt.items[opt.d['height']]; + } + return obj; + } + function in_getAlignPadding(o, all) { + var p = cf_getAlignPadding(gi_getCurrentItems(all, o), o); + o.padding[o.d[1]] = p[1]; + o.padding[o.d[3]] = p[0]; + return o; + } + function in_getResponsiveValues(o, all, avl) { + + var visb = cf_getItemAdjustMinMax(Math.ceil(o[o.d['width']] / o.items[o.d['width']]), o.items.visibleConf); + if (visb > all.length) + { + visb = all.length; + } + + var newS = Math.floor(o[o.d['width']]/visb); + + o.items.visible = visb; + o.items[o.d['width']] = newS; + o[o.d['width']] = visb * newS; + return o; + } + + + // buttons functions + function bt_pauseOnHoverConfig(p) { + if (is_string(p)) + { + var i = (p.indexOf('immediate') > -1) ? true : false, + r = (p.indexOf('resume') > -1) ? true : false; + } + else + { + var i = r = false; + } + return [i, r]; + } + function bt_mousesheelNumber(mw) { + return (is_number(mw)) ? mw : null + } + + // helper functions + function is_null(a) { + return (a === null); + } + function is_undefined(a) { + return (is_null(a) || typeof a == 'undefined' || a === '' || a === 'undefined'); + } + function is_array(a) { + return (a instanceof Array); + } + function is_jquery(a) { + return (a instanceof jQuery); + } + function is_object(a) { + return ((a instanceof Object || typeof a == 'object') && !is_null(a) && !is_jquery(a) && !is_array(a)); + } + function is_number(a) { + return ((a instanceof Number || typeof a == 'number') && !isNaN(a)); + } + function is_string(a) { + return ((a instanceof String || typeof a == 'string') && !is_undefined(a) && !is_true(a) && !is_false(a)); + } + function is_function(a) { + return (a instanceof Function || typeof a == 'function'); + } + function is_boolean(a) { + return (a instanceof Boolean || typeof a == 'boolean' || is_true(a) || is_false(a)); + } + function is_true(a) { + return (a === true || a === 'true'); + } + function is_false(a) { + return (a === false || a === 'false'); + } + function is_percentage(x) { + return (is_string(x) && x.slice(-1) == '%'); + } + + + function getTime() { + return new Date().getTime(); + } + + function deprecated( o, n ) { + debug(true, o+' is DEPRECATED, support for it will be removed. Use '+n+' instead.'); + } + function debug(d, m) { + if (is_object(d)) + { + var s = ' ('+d.selector+')'; + d = d.debug; + } + else + { + var s = ''; + } + if (!d) + { + return false; + } + + if (is_string(m)) + { + m = 'carouFredSel'+s+': ' + m; + } + else + { + m = ['carouFredSel'+s+':', m]; + } + + if (window.console && window.console.log) + { + window.console.log(m); + } + return false; + } + + + + // EASING FUNCTIONS + + $.extend($.easing, { + 'quadratic': function(t) { + var t2 = t * t; + return t * (-t2 * t + 4 * t2 - 6 * t + 4); + }, + 'cubic': function(t) { + return t * (4 * t * t - 9 * t + 6); + }, + 'elastic': function(t) { + var t2 = t * t; + return t * (33 * t2 * t2 - 106 * t2 * t + 126 * t2 - 67 * t + 15); + } + }); + + +})(jQuery); \ No newline at end of file diff --git a/vendor/assets/javascripts/caroufredsel/jquery.mousewheel.min.js b/vendor/assets/javascripts/caroufredsel/jquery.mousewheel.min.js new file mode 100644 index 0000000..3390202 --- /dev/null +++ b/vendor/assets/javascripts/caroufredsel/jquery.mousewheel.min.js @@ -0,0 +1,12 @@ +/*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net) + * Licensed under the MIT License (LICENSE.txt). + * + * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. + * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. + * Thanks to: Seamus Leahy for adding deltaX and deltaY + * + * Version: 3.0.6 + * + * Requires: 1.2.2+ + */ +(function(a){function d(b){var c=b||window.event,d=[].slice.call(arguments,1),e=0,f=!0,g=0,h=0;return b=a.event.fix(c),b.type="mousewheel",c.wheelDelta&&(e=c.wheelDelta/120),c.detail&&(e=-c.detail/3),h=e,c.axis!==undefined&&c.axis===c.HORIZONTAL_AXIS&&(h=0,g=-1*e),c.wheelDeltaY!==undefined&&(h=c.wheelDeltaY/120),c.wheelDeltaX!==undefined&&(g=-1*c.wheelDeltaX/120),d.unshift(b,e,g,h),(a.event.dispatch||a.event.handle).apply(this,d)}var b=["DOMMouseScroll","mousewheel"];if(a.event.fixHooks)for(var c=b.length;c;)a.event.fixHooks[b[--c]]=a.event.mouseHooks;a.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=b.length;a;)this.addEventListener(b[--a],d,!1);else this.onmousewheel=d},teardown:function(){if(this.removeEventListener)for(var a=b.length;a;)this.removeEventListener(b[--a],d,!1);else this.onmousewheel=null}},a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery) diff --git a/vendor/assets/javascripts/caroufredsel/jquery.touchSwipe.min.js b/vendor/assets/javascripts/caroufredsel/jquery.touchSwipe.min.js new file mode 100755 index 0000000..dd18459 --- /dev/null +++ b/vendor/assets/javascripts/caroufredsel/jquery.touchSwipe.min.js @@ -0,0 +1,13 @@ +/* +* touchSwipe - jQuery Plugin +* https://github.com/mattbryson/TouchSwipe-Jquery-Plugin +* http://labs.skinkers.com/touchSwipe/ +* http://plugins.jquery.com/project/touchSwipe +* +* Copyright (c) 2010 Matt Bryson (www.skinkers.com) +* Dual licensed under the MIT or GPL Version 2 licenses. +* +* $version: 1.3.3 +*/ + +(function(g){function P(c){if(c&&void 0===c.allowPageScroll&&(void 0!==c.swipe||void 0!==c.swipeStatus))c.allowPageScroll=G;c||(c={});c=g.extend({},g.fn.swipe.defaults,c);return this.each(function(){var b=g(this),f=b.data(w);f||(f=new W(this,c),b.data(w,f))})}function W(c,b){var f,p,r,s;function H(a){var a=a.originalEvent,c,Q=n?a.touches[0]:a;d=R;n?h=a.touches.length:a.preventDefault();i=0;j=null;k=0;!n||h===b.fingers||b.fingers===x?(r=f=Q.pageX,s=p=Q.pageY,y=(new Date).getTime(),b.swipeStatus&&(c= l(a,d))):t(a);if(!1===c)return d=m,l(a,d),c;e.bind(I,J);e.bind(K,L)}function J(a){a=a.originalEvent;if(!(d===q||d===m)){var c,e=n?a.touches[0]:a;f=e.pageX;p=e.pageY;u=(new Date).getTime();j=S();n&&(h=a.touches.length);d=z;var e=a,g=j;if(b.allowPageScroll===G)e.preventDefault();else{var o=b.allowPageScroll===T;switch(g){case v:(b.swipeLeft&&o||!o&&b.allowPageScroll!=M)&&e.preventDefault();break;case A:(b.swipeRight&&o||!o&&b.allowPageScroll!=M)&&e.preventDefault();break;case B:(b.swipeUp&&o||!o&&b.allowPageScroll!= N)&&e.preventDefault();break;case C:(b.swipeDown&&o||!o&&b.allowPageScroll!=N)&&e.preventDefault()}}h===b.fingers||b.fingers===x||!n?(i=U(),k=u-y,b.swipeStatus&&(c=l(a,d,j,i,k)),b.triggerOnTouchEnd||(e=!(b.maxTimeThreshold?!(k>=b.maxTimeThreshold):1),!0===D()?(d=q,c=l(a,d)):e&&(d=m,l(a,d)))):(d=m,l(a,d));!1===c&&(d=m,l(a,d))}}function L(a){a=a.originalEvent;a.preventDefault();u=(new Date).getTime();i=U();j=S();k=u-y;if(b.triggerOnTouchEnd||!1===b.triggerOnTouchEnd&&d===z)if(d=q,(h===b.fingers||b.fingers=== x||!n)&&0!==f){var c=!(b.maxTimeThreshold?!(k>=b.maxTimeThreshold):1);if((!0===D()||null===D())&&!c)l(a,d);else if(c||!1===D())d=m,l(a,d)}else d=m,l(a,d);else d===z&&(d=m,l(a,d));e.unbind(I,J,!1);e.unbind(K,L,!1)}function t(){y=u=p=f=s=r=h=0}function l(a,c){var d=void 0;b.swipeStatus&&(d=b.swipeStatus.call(e,a,c,j||null,i||0,k||0,h));if(c===m&&b.click&&(1===h||!n)&&(isNaN(i)||0===i))d=b.click.call(e,a,a.target);if(c==q)switch(b.swipe&&(d=b.swipe.call(e,a,j,i,k,h)),j){case v:b.swipeLeft&&(d=b.swipeLeft.call(e, a,j,i,k,h));break;case A:b.swipeRight&&(d=b.swipeRight.call(e,a,j,i,k,h));break;case B:b.swipeUp&&(d=b.swipeUp.call(e,a,j,i,k,h));break;case C:b.swipeDown&&(d=b.swipeDown.call(e,a,j,i,k,h))}(c===m||c===q)&&t(a);return d}function D(){return null!==b.threshold?i>=b.threshold:null}function U(){return Math.round(Math.sqrt(Math.pow(f-r,2)+Math.pow(p-s,2)))}function S(){var a;a=Math.atan2(p-s,r-f);a=Math.round(180*a/Math.PI);0>a&&(a=360-Math.abs(a));return 45>=a&&0<=a?v:360>=a&&315<=a?v:135<=a&&225>=a? A:45a?C:B}function V(){e.unbind(E,H);e.unbind(F,t);e.unbind(I,J);e.unbind(K,L)}var O=n||!b.fallbackToMouseEvents,E=O?"touchstart":"mousedown",I=O?"touchmove":"mousemove",K=O?"touchend":"mouseup",F="touchcancel",i=0,j=null,k=0,e=g(c),d="start",h=0,y=p=f=s=r=0,u=0;try{e.bind(E,H),e.bind(F,t)}catch(P){g.error("events not supported "+E+","+F+" on jQuery.swipe")}this.enable=function(){e.bind(E,H);e.bind(F,t);return e};this.disable=function(){V();return e};this.destroy=function(){V();e.data(w,null); return e}}var v="left",A="right",B="up",C="down",G="none",T="auto",M="horizontal",N="vertical",x="all",R="start",z="move",q="end",m="cancel",n="ontouchstart"in window,w="TouchSwipe";g.fn.swipe=function(c){var b=g(this),f=b.data(w);if(f&&"string"===typeof c){if(f[c])return f[c].apply(this,Array.prototype.slice.call(arguments,1));g.error("Method "+c+" does not exist on jQuery.swipe")}else if(!f&&("object"===typeof c||!c))return P.apply(this,arguments);return b};g.fn.swipe.defaults={fingers:1,threshold:75, maxTimeThreshold:null,swipe:null,swipeLeft:null,swipeRight:null,swipeUp:null,swipeDown:null,swipeStatus:null,click:null,triggerOnTouchEnd:!0,allowPageScroll:"auto",fallbackToMouseEvents:!0};g.fn.swipe.phases={PHASE_START:R,PHASE_MOVE:z,PHASE_END:q,PHASE_CANCEL:m};g.fn.swipe.directions={LEFT:v,RIGHT:A,UP:B,DOWN:C};g.fn.swipe.pageScroll={NONE:G,HORIZONTAL:M,VERTICAL:N,AUTO:T};g.fn.swipe.fingers={ONE:1,TWO:2,THREE:3,ALL:x}})(jQuery); \ No newline at end of file