spree_showcase 0.5.3 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. data/app/models/spree/slide.rb +36 -10
  2. data/app/overrides/{add_showcase_to_admin_configuration_menu.rb → showcase/add_showcase_to_admin_configuration_menu.rb} +0 -0
  3. data/app/overrides/{add_showcase_to_admin_configurations_side_menu.rb → showcase/add_showcase_to_admin_configurations_side_menu.rb} +0 -0
  4. data/app/overrides/showcase/add_showcase_to_home_layout.rb +12 -0
  5. data/app/views/spree/admin/shared/_showcase_submenu.html.erb +1 -1
  6. data/app/views/spree/admin/showcase_settings/edit.html.erb +4 -1
  7. data/app/views/spree/admin/showcase_settings/show.html.erb +17 -6
  8. data/app/views/spree/admin/slides/edit.html.erb +4 -1
  9. data/app/views/spree/admin/slides/index.html.erb +13 -9
  10. data/app/views/spree/admin/slides/new.html.erb +3 -1
  11. data/app/views/spree/slides/_showcase.html.erb +63 -28
  12. data/config/locales/en.yml +16 -1
  13. data/lib/generators/spree_showcase/install/assets/overrides/showcase/add_showcase_to_home_layout.rb +12 -0
  14. data/lib/generators/spree_showcase/install/assets/partials/_showcase.html.erb +32 -0
  15. data/lib/generators/spree_showcase/install/assets/stylesheets/store/showcase.css.scss +1 -1
  16. data/lib/generators/spree_showcase/install/assets/vendor/javascripts/jquery.flexslider.js +903 -0
  17. data/lib/generators/spree_showcase/install/assets/vendor/stylesheets/jquery.flexslider.css +76 -0
  18. data/lib/generators/spree_showcase/install/install_generator.rb +47 -22
  19. data/lib/spree/showcase_configuration.rb +1 -0
  20. data/spree_showcase-0.5.3.gem +0 -0
  21. data/spree_showcase.gemspec +3 -3
  22. data/vendor/assets/javascripts/jquery.flexslider.js +903 -0
  23. data/vendor/assets/stylesheets/jquery.flexslider.css +76 -0
  24. metadata +16 -14
  25. data/app/overrides/add_showcase_to_home_layout.rb +0 -8
  26. data/app/overrides/insert_slider_into_spree_application.rb +0 -10
  27. data/lib/generators/spree_showcase/install/assets/javascripts/store/jquery.flexslider.js +0 -563
  28. data/lib/generators/spree_showcase/install/assets/javascripts/store/showcase.js.erb +0 -32
  29. data/lib/generators/spree_showcase/install/assets/stylesheets/store/flexslider.css +0 -64
@@ -0,0 +1,76 @@
1
+ /*
2
+ * jQuery FlexSlider v2.0
3
+ * http://www.woothemes.com/flexslider/
4
+ *
5
+ * Copyright 2012 WooThemes
6
+ * Free to use under the GPLv2 license.
7
+ * http://www.gnu.org/licenses/gpl-2.0.html
8
+ *
9
+ * Contributing author: Tyler Smith (@mbmufffin)
10
+ */
11
+
12
+
13
+ /* Browser Resets */
14
+ .flex-container a:active,
15
+ .flexslider a:active,
16
+ .flex-container a:focus,
17
+ .flexslider a:focus {outline: none;}
18
+ .slides,
19
+ .flex-control-nav,
20
+ .flex-direction-nav {margin: 0; padding: 0; list-style: none;}
21
+
22
+ /* FlexSlider Necessary Styles
23
+ *********************************/
24
+ .flexslider {margin: 0; padding: 0;}
25
+ .flexslider .slides > li {display: none; -webkit-backface-visibility: hidden;} /* Hide the slides before the JS is loaded. Avoids image jumping */
26
+ .flexslider .slides img {width: 100%; display: block;}
27
+ .flex-pauseplay span {text-transform: capitalize;}
28
+
29
+ /* Clearfix for the .slides element */
30
+ .slides:after {content: "."; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;}
31
+ html[xmlns] .slides {display: block;}
32
+ * html .slides {height: 1%;}
33
+
34
+ /* No JavaScript Fallback */
35
+ /* If you are not using another script, such as Modernizr, make sure you
36
+ * include js that eliminates this class on page load */
37
+ .no-js .slides > li:first-child {display: block;}
38
+
39
+
40
+ /* FlexSlider Default Theme
41
+ *********************************/
42
+ .flexslider {margin: 0 0 60px; background: #fff; border: 4px solid #fff; position: relative; -webkit-border-radius: 4px; -moz-border-radius: 4px; -o-border-radius: 4px; border-radius: 4px; box-shadow: 0 1px 4px rgba(0,0,0,.2); -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.2); -moz-box-shadow: 0 1px 4px rgba(0,0,0,.2); -o-box-shadow: 0 1px 4px rgba(0,0,0,.2); zoom: 1;}
43
+ .flex-viewport {max-height: 2000px; -webkit-transition: all 1s ease; -moz-transition: all 1s ease; transition: all 1s ease;}
44
+ .loading .flex-viewport {max-height: 300px;}
45
+ .flexslider .slides {zoom: 1;}
46
+
47
+ .carousel li {margin-right: 5px}
48
+
49
+
50
+ /* Direction Nav */
51
+ .flex-direction-nav {*height: 0;}
52
+ .flex-direction-nav a {width: 30px; height: 30px; margin: -20px 0 0; display: block; background: url(images/bg_direction_nav.png) no-repeat 0 0; position: absolute; top: 50%; z-index: 10; cursor: pointer; text-indent: -9999px; opacity: 0; -webkit-transition: all .3s ease;}
53
+ .flex-direction-nav .flex-next {background-position: 100% 0; right: -36px; }
54
+ .flex-direction-nav .flex-prev {left: -36px;}
55
+ .flexslider:hover .flex-next {opacity: 0.8; right: 5px;}
56
+ .flexslider:hover .flex-prev {opacity: 0.8; left: 5px;}
57
+ .flexslider:hover .flex-next:hover, .flexslider:hover .flex-prev:hover {opacity: 1;}
58
+ .flex-direction-nav .flex-disabled {opacity: .3!important; filter:alpha(opacity=30); cursor: default;}
59
+
60
+ /* Control Nav */
61
+ .flex-control-nav {width: 100%; position: absolute; bottom: -40px; text-align: center;}
62
+ .flex-control-nav li {margin: 0 6px; display: inline-block; zoom: 1; *display: inline;}
63
+ .flex-control-paging li a {width: 11px; height: 11px; display: block; background: #666; background: rgba(0,0,0,0.5); cursor: pointer; text-indent: -9999px; -webkit-border-radius: 20px; -moz-border-radius: 20px; -o-border-radius: 20px; border-radius: 20px; box-shadow: inset 0 0 3px rgba(0,0,0,0.3);}
64
+ .flex-control-paging li a:hover { background: #333; background: rgba(0,0,0,0.7); }
65
+ .flex-control-paging li a.flex-active { background: #000; background: rgba(0,0,0,0.9); cursor: default; }
66
+
67
+ .flex-control-thumbs {margin: 5px 0 0; position: static; overflow: hidden;}
68
+ .flex-control-thumbs li {width: 25%; float: left; margin: 0;}
69
+ .flex-control-thumbs img {width: 100%; display: block; opacity: .7; cursor: pointer;}
70
+ .flex-control-thumbs img:hover {opacity: 1;}
71
+ .flex-control-thumbs .flex-active {opacity: 1; cursor: default;}
72
+
73
+ @media screen and (max-width: 860px) {
74
+ .flex-direction-nav .flex-prev {opacity: 1; left: 0;}
75
+ .flex-direction-nav .flex-next {opacity: 1; right: 0;}
76
+ }
@@ -3,44 +3,66 @@ module SpreeShowcase
3
3
  class InstallGenerator < Rails::Generators::Base
4
4
  source_root File.expand_path("../assets", __FILE__)
5
5
 
6
- def add_javascripts
7
- append_file 'app/assets/javascripts/store/all.js', "//= require store/spree_showcase\n"
8
- if copy_file "javascripts/store/showcase.js.erb", "app/assets/javascripts/store/showcase.js.erb"
9
- puts "Copied showcase.js.erb into app/assets/javascripts/store/showcase.js.erb\n"
6
+ def messages
7
+ @messages||= []
8
+ end
9
+
10
+ def copy_message
11
+ status = status.to_s.capitalize
12
+ "Copy #{@source} into #{@dest}..."
13
+ end
14
+
15
+ def add_overrides
16
+ @source = "overrides/showcase/add_showcase_to_home_layout.rb"
17
+ @dest = "app/overrides/showcase/add_showcase_to_home_layout.rb"
18
+ if copy_file(@source, @dest)
19
+ messages << copy_message
10
20
  else
11
- puts "[Failed] File copying showcase.js.erb => app/assets/javascripts/store/showcase.js.erb\n"
21
+ messages << copy_message
12
22
  end
13
- if copy_file "javascripts/store/jquery.flexslider.js", "app/assets/javascripts/store/jquery.flexslider.js"
14
- puts "Copied jquery.flexslider.js into app/assets/javascripts/store/jquery.flexslider.js\n"
23
+ end
24
+
25
+ def add_javascripts
26
+ append_file 'app/assets/javascripts/store/all.js', "//= require jquery.flexslider\n"
27
+ @source = "vendor/javascripts/jquery.flexslider.js"
28
+ @dest = "vendor/assets/javascripts/store/jquery.flexslider.js"
29
+ if copy_file(@source, @dest)
30
+ messages << copy_message
15
31
  else
16
- puts "[Failed] File copying jquery.flexslider.js => app/assets/javascripts/store/jquery.flexslider.js\n"
32
+ messages << copy_message
17
33
  end
18
- puts "Copying JS assets into your app's javascripts/store directory. The file showcase.js.erb is required by the extension and is used to activate slideshow.\n"
19
34
  end
20
35
 
21
36
  def add_stylesheets
22
37
  inject_into_file 'app/assets/stylesheets/store/all.css', " *= require store/spree_showcase\n", :before => /\*\//, :verbose => true
23
- if copy_file "stylesheets/store/showcase.css.scss", "app/assets/stylesheets/store/showcase.css.scss"
24
- puts "Copied showcase.css.scss into app/assets/stylesheets/store/showcase.css.scss\n"
38
+
39
+ @source = "stylesheets/store/showcase.css.scss"
40
+ @dest = "app/assets/stylesheets/store/showcase.css.scss"
41
+ if copy_file(@source, @dest)
42
+ messages << self.copy_message
25
43
  else
26
- puts "[Failed] File copying showcase.css.scss => app/assets/stylesheets/store/showcase.css.scss\n"
44
+ messages << self.copy_message
27
45
  end
28
- if copy_file "stylesheets/store/flexslider.css", "app/assets/stylesheets/store/flexslider.css"
29
- puts "Copied flexslider into app/assets/stylesheets/store/flexslider.css. This is used for the default flexslider slider.\n"
46
+
47
+ @source = "vendor/stylesheets/jquery.flexslider.css"
48
+ @dest = "vendor/assets/stylesheets/store/jquery.flexslider.css"
49
+ if copy_file(@source, @dest)
50
+ messages << copy_message
30
51
  else
31
- puts "[Failed] File copying flexslider.css => app/assets/stylesheets/store/flexslider.css\n"
52
+ messages << copy_message
32
53
  end
33
54
  puts "showcase.css styles are required by the extension and can be changed in anyway to fit your own _showcase.html.erb\n"
34
55
  end
35
-
36
56
 
37
-
38
57
  def add_partials
39
- puts %q{This partial is the template structure for displaying the slideshow.}
40
- if copy_file "partials/_showcase.html.erb", "app/views/spree/slides/_showcase.html.erb"
41
- puts "Copied Partial _showcase.html.erb into app/views/spree/slides/_showcase.html.erb\n"
58
+ puts %q{This partial is the template structure for displaying the slideshow and also includes the settings for the JavaScript plugin.}
59
+
60
+ @source = "partials/_showcase.html.erb"
61
+ @dest = "app/views/spree/slides/_showcase.html.erb"
62
+ if copy_file(@source, @dest)
63
+ messages << copy_message
42
64
  else
43
- puts "[Failed] File copying _showcase.html.erb => app/views/spree/slides/_showcase.html.erb\n"
65
+ messages << copy_message
44
66
  end
45
67
  end
46
68
 
@@ -56,8 +78,11 @@ module SpreeShowcase
56
78
  puts 'Skiping rake db:migrate, don\'t forget to run it!'
57
79
  end
58
80
  end
59
-
81
+
60
82
  def complete
83
+ puts "\n-------- Files copied --------\n"
84
+ puts messages.join("\n")
85
+ puts "\n---------------------------------\n"
61
86
  puts "\nEverything is done! To summarize, _showcase.html.erb => HTML template, showcase.css.scss & showcase.js.erb => assets. Edit these 3 files to fit run the slideshow."
62
87
  puts "\nPlease run rake assets:clean (IMPORTANT) to clear any precompiled assets from fresh install of Spree."
63
88
  end
@@ -12,5 +12,6 @@ class Spree::ShowcaseConfiguration < Spree::Preferences::Configuration
12
12
  preference :randomize, :boolean, :default => false
13
13
  preference :animation_loop, :boolean, :default => true
14
14
  preference :pause_on_hover, :boolean, :default => true
15
+
15
16
  end
16
17
 
Binary file
@@ -2,21 +2,21 @@
2
2
  Gem::Specification.new do |s|
3
3
  s.platform = Gem::Platform::RUBY
4
4
  s.name = 'spree_showcase'
5
- s.version = '0.5.3'
5
+ s.version = '0.6.0'
6
6
  s.summary = 'A Simple Spree Slider'
7
7
  s.description = 'A simple slider accommodator, using Flexslider as default'
8
8
  s.required_ruby_version = '>= 1.8.7'
9
9
 
10
10
  s.author = 'Damon Aw'
11
11
  s.email = 'daemonsy@gmail.com'
12
- s.homepage = 'http://theidealweb.com'
12
+ s.homepage = 'http://damon.theidealweb.com'
13
13
 
14
14
  s.files = `git ls-files`.split("\n")
15
15
  # s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
16
  s.require_path = 'lib'
17
17
  s.requirements << 'none'
18
18
 
19
- s.add_dependency 'spree_core', '~> 1.1.0'
19
+ s.add_dependency 'spree_core', '>= 1.3.0'
20
20
 
21
21
  s.add_development_dependency 'capybara', '1.0.1'
22
22
  s.add_development_dependency 'factory_girl', '~> 2.6.4'
@@ -0,0 +1,903 @@
1
+ /*
2
+ * jQuery FlexSlider v2.1
3
+ * http://www.woothemes.com/flexslider/
4
+ *
5
+ * Copyright 2012 WooThemes
6
+ * Free to use under the GPLv2 license.
7
+ * http://www.gnu.org/licenses/gpl-2.0.html
8
+ *
9
+ * Contributing author: Tyler Smith (@mbmufffin)
10
+ */
11
+
12
+ ;(function ($) {
13
+
14
+ //FlexSlider: Object Instance
15
+ $.flexslider = function(el, options) {
16
+ var slider = $(el),
17
+ vars = $.extend({}, $.flexslider.defaults, options),
18
+ namespace = vars.namespace,
19
+ touch = ("ontouchstart" in window) || window.DocumentTouch && document instanceof DocumentTouch,
20
+ eventType = (touch) ? "touchend" : "click",
21
+ vertical = vars.direction === "vertical",
22
+ reverse = vars.reverse,
23
+ carousel = (vars.itemWidth > 0),
24
+ fade = vars.animation === "fade",
25
+ asNav = vars.asNavFor !== "",
26
+ methods = {};
27
+
28
+ // Store a reference to the slider object
29
+ $.data(el, "flexslider", slider);
30
+
31
+ // Privat slider methods
32
+ methods = {
33
+ init: function() {
34
+ slider.animating = false;
35
+ slider.currentSlide = vars.startAt;
36
+ slider.animatingTo = slider.currentSlide;
37
+ slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last);
38
+ slider.containerSelector = vars.selector.substr(0,vars.selector.search(' '));
39
+ slider.slides = $(vars.selector, slider);
40
+ slider.container = $(slider.containerSelector, slider);
41
+ slider.count = slider.slides.length;
42
+ // SYNC:
43
+ slider.syncExists = $(vars.sync).length > 0;
44
+ // SLIDE:
45
+ if (vars.animation === "slide") vars.animation = "swing";
46
+ slider.prop = (vertical) ? "top" : "marginLeft";
47
+ slider.args = {};
48
+ // SLIDESHOW:
49
+ slider.manualPause = false;
50
+ // TOUCH/USECSS:
51
+ slider.transitions = !vars.video && !fade && vars.useCSS && (function() {
52
+ var obj = document.createElement('div'),
53
+ props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective'];
54
+ for (var i in props) {
55
+ if ( obj.style[ props[i] ] !== undefined ) {
56
+ slider.pfx = props[i].replace('Perspective','').toLowerCase();
57
+ slider.prop = "-" + slider.pfx + "-transform";
58
+ return true;
59
+ }
60
+ }
61
+ return false;
62
+ }());
63
+ // CONTROLSCONTAINER:
64
+ if (vars.controlsContainer !== "") slider.controlsContainer = $(vars.controlsContainer).length > 0 && $(vars.controlsContainer);
65
+ // MANUAL:
66
+ if (vars.manualControls !== "") slider.manualControls = $(vars.manualControls).length > 0 && $(vars.manualControls);
67
+
68
+ // RANDOMIZE:
69
+ if (vars.randomize) {
70
+ slider.slides.sort(function() { return (Math.round(Math.random())-0.5); });
71
+ slider.container.empty().append(slider.slides);
72
+ }
73
+
74
+ slider.doMath();
75
+
76
+ // ASNAV:
77
+ if (asNav) methods.asNav.setup();
78
+
79
+ // INIT
80
+ slider.setup("init");
81
+
82
+ // CONTROLNAV:
83
+ if (vars.controlNav) methods.controlNav.setup();
84
+
85
+ // DIRECTIONNAV:
86
+ if (vars.directionNav) methods.directionNav.setup();
87
+
88
+ // KEYBOARD:
89
+ if (vars.keyboard && ($(slider.containerSelector).length === 1 || vars.multipleKeyboard)) {
90
+ $(document).bind('keyup', function(event) {
91
+ var keycode = event.keyCode;
92
+ if (!slider.animating && (keycode === 39 || keycode === 37)) {
93
+ var target = (keycode === 39) ? slider.getTarget('next') :
94
+ (keycode === 37) ? slider.getTarget('prev') : false;
95
+ slider.flexAnimate(target, vars.pauseOnAction);
96
+ }
97
+ });
98
+ }
99
+ // MOUSEWHEEL:
100
+ if (vars.mousewheel) {
101
+ slider.bind('mousewheel', function(event, delta, deltaX, deltaY) {
102
+ event.preventDefault();
103
+ var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev');
104
+ slider.flexAnimate(target, vars.pauseOnAction);
105
+ });
106
+ }
107
+
108
+ // PAUSEPLAY
109
+ if (vars.pausePlay) methods.pausePlay.setup();
110
+
111
+ // SLIDSESHOW
112
+ if (vars.slideshow) {
113
+ if (vars.pauseOnHover) {
114
+ slider.hover(function() {
115
+ if (!slider.manualPlay && !slider.manualPause) slider.pause();
116
+ }, function() {
117
+ if (!slider.manualPause && !slider.manualPlay) slider.play();
118
+ });
119
+ }
120
+ // initialize animation
121
+ (vars.initDelay > 0) ? setTimeout(slider.play, vars.initDelay) : slider.play();
122
+ }
123
+
124
+ // TOUCH
125
+ if (touch && vars.touch) methods.touch();
126
+
127
+ // FADE&&SMOOTHHEIGHT || SLIDE:
128
+ if (!fade || (fade && vars.smoothHeight)) $(window).bind("resize focus", methods.resize);
129
+
130
+
131
+ // API: start() Callback
132
+ setTimeout(function(){
133
+ vars.start(slider);
134
+ }, 200);
135
+ },
136
+ asNav: {
137
+ setup: function() {
138
+ slider.asNav = true;
139
+ slider.animatingTo = Math.floor(slider.currentSlide/slider.move);
140
+ slider.currentItem = slider.currentSlide;
141
+ slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide");
142
+ slider.slides.click(function(e){
143
+ e.preventDefault();
144
+ var $slide = $(this),
145
+ target = $slide.index();
146
+ if (!$(vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) {
147
+ slider.direction = (slider.currentItem < target) ? "next" : "prev";
148
+ slider.flexAnimate(target, vars.pauseOnAction, false, true, true);
149
+ }
150
+ });
151
+ }
152
+ },
153
+ controlNav: {
154
+ setup: function() {
155
+ if (!slider.manualControls) {
156
+ methods.controlNav.setupPaging();
157
+ } else { // MANUALCONTROLS:
158
+ methods.controlNav.setupManual();
159
+ }
160
+ },
161
+ setupPaging: function() {
162
+ var type = (vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging',
163
+ j = 1,
164
+ item;
165
+
166
+ slider.controlNavScaffold = $('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>');
167
+
168
+ if (slider.pagingCount > 1) {
169
+ for (var i = 0; i < slider.pagingCount; i++) {
170
+ item = (vars.controlNav === "thumbnails") ? '<img src="' + slider.slides.eq(i).attr("data-thumb") + '"/>' : '<a>' + j + '</a>';
171
+ slider.controlNavScaffold.append('<li>' + item + '</li>');
172
+ j++;
173
+ }
174
+ }
175
+
176
+ // CONTROLSCONTAINER:
177
+ (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold);
178
+ methods.controlNav.set();
179
+
180
+ methods.controlNav.active();
181
+
182
+ slider.controlNavScaffold.delegate('a, img', eventType, function(event) {
183
+ event.preventDefault();
184
+ var $this = $(this),
185
+ target = slider.controlNav.index($this);
186
+
187
+ if (!$this.hasClass(namespace + 'active')) {
188
+ slider.direction = (target > slider.currentSlide) ? "next" : "prev";
189
+ slider.flexAnimate(target, vars.pauseOnAction);
190
+ }
191
+ });
192
+ // Prevent iOS click event bug
193
+ if (touch) {
194
+ slider.controlNavScaffold.delegate('a', "click touchstart", function(event) {
195
+ event.preventDefault();
196
+ });
197
+ }
198
+ },
199
+ setupManual: function() {
200
+ slider.controlNav = slider.manualControls;
201
+ methods.controlNav.active();
202
+
203
+ slider.controlNav.live(eventType, function(event) {
204
+ event.preventDefault();
205
+ var $this = $(this),
206
+ target = slider.controlNav.index($this);
207
+
208
+ if (!$this.hasClass(namespace + 'active')) {
209
+ (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev";
210
+ slider.flexAnimate(target, vars.pauseOnAction);
211
+ }
212
+ });
213
+ // Prevent iOS click event bug
214
+ if (touch) {
215
+ slider.controlNav.live("click touchstart", function(event) {
216
+ event.preventDefault();
217
+ });
218
+ }
219
+ },
220
+ set: function() {
221
+ var selector = (vars.controlNav === "thumbnails") ? 'img' : 'a';
222
+ slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider);
223
+ },
224
+ active: function() {
225
+ slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active");
226
+ },
227
+ update: function(action, pos) {
228
+ if (slider.pagingCount > 1 && action === "add") {
229
+ slider.controlNavScaffold.append($('<li><a>' + slider.count + '</a></li>'));
230
+ } else if (slider.pagingCount === 1) {
231
+ slider.controlNavScaffold.find('li').remove();
232
+ } else {
233
+ slider.controlNav.eq(pos).closest('li').remove();
234
+ }
235
+ methods.controlNav.set();
236
+ (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active();
237
+ }
238
+ },
239
+ directionNav: {
240
+ setup: function() {
241
+ var directionNavScaffold = $('<ul class="' + namespace + 'direction-nav"><li><a class="' + namespace + 'prev" href="#">' + vars.prevText + '</a></li><li><a class="' + namespace + 'next" href="#">' + vars.nextText + '</a></li></ul>');
242
+
243
+ // CONTROLSCONTAINER:
244
+ if (slider.controlsContainer) {
245
+ $(slider.controlsContainer).append(directionNavScaffold);
246
+ slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer);
247
+ } else {
248
+ slider.append(directionNavScaffold);
249
+ slider.directionNav = $('.' + namespace + 'direction-nav li a', slider);
250
+ }
251
+
252
+ methods.directionNav.update();
253
+
254
+ slider.directionNav.bind(eventType, function(event) {
255
+ event.preventDefault();
256
+ var target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev');
257
+ slider.flexAnimate(target, vars.pauseOnAction);
258
+ });
259
+ // Prevent iOS click event bug
260
+ if (touch) {
261
+ slider.directionNav.bind("click touchstart", function(event) {
262
+ event.preventDefault();
263
+ });
264
+ }
265
+ },
266
+ update: function() {
267
+ var disabledClass = namespace + 'disabled';
268
+ if (slider.pagingCount === 1) {
269
+ slider.directionNav.addClass(disabledClass);
270
+ } else if (!vars.animationLoop) {
271
+ if (slider.animatingTo === 0) {
272
+ slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass);
273
+ } else if (slider.animatingTo === slider.last) {
274
+ slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass);
275
+ } else {
276
+ slider.directionNav.removeClass(disabledClass);
277
+ }
278
+ } else {
279
+ slider.directionNav.removeClass(disabledClass);
280
+ }
281
+ }
282
+ },
283
+ pausePlay: {
284
+ setup: function() {
285
+ var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a></a></div>');
286
+
287
+ // CONTROLSCONTAINER:
288
+ if (slider.controlsContainer) {
289
+ slider.controlsContainer.append(pausePlayScaffold);
290
+ slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer);
291
+ } else {
292
+ slider.append(pausePlayScaffold);
293
+ slider.pausePlay = $('.' + namespace + 'pauseplay a', slider);
294
+ }
295
+
296
+ methods.pausePlay.update((vars.slideshow) ? namespace + 'pause' : namespace + 'play');
297
+
298
+ slider.pausePlay.bind(eventType, function(event) {
299
+ event.preventDefault();
300
+ if ($(this).hasClass(namespace + 'pause')) {
301
+ slider.manualPause = true;
302
+ slider.manualPlay = false;
303
+ slider.pause();
304
+ } else {
305
+ slider.manualPause = false;
306
+ slider.manualPlay = true;
307
+ slider.play();
308
+ }
309
+ });
310
+ // Prevent iOS click event bug
311
+ if (touch) {
312
+ slider.pausePlay.bind("click touchstart", function(event) {
313
+ event.preventDefault();
314
+ });
315
+ }
316
+ },
317
+ update: function(state) {
318
+ (state === "play") ? slider.pausePlay.removeClass(namespace + 'pause').addClass(namespace + 'play').text(vars.playText) : slider.pausePlay.removeClass(namespace + 'play').addClass(namespace + 'pause').text(vars.pauseText);
319
+ }
320
+ },
321
+ touch: function() {
322
+ var startX,
323
+ startY,
324
+ offset,
325
+ cwidth,
326
+ dx,
327
+ startT,
328
+ scrolling = false;
329
+
330
+ el.addEventListener('touchstart', onTouchStart, false);
331
+ function onTouchStart(e) {
332
+ if (slider.animating) {
333
+ e.preventDefault();
334
+ } else if (e.touches.length === 1) {
335
+ slider.pause();
336
+ // CAROUSEL:
337
+ cwidth = (vertical) ? slider.h : slider. w;
338
+ startT = Number(new Date());
339
+ // CAROUSEL:
340
+ offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
341
+ (carousel && reverse) ? slider.limit - (((slider.itemW + vars.itemMargin) * slider.move) * slider.animatingTo) :
342
+ (carousel && slider.currentSlide === slider.last) ? slider.limit :
343
+ (carousel) ? ((slider.itemW + vars.itemMargin) * slider.move) * slider.currentSlide :
344
+ (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
345
+ startX = (vertical) ? e.touches[0].pageY : e.touches[0].pageX;
346
+ startY = (vertical) ? e.touches[0].pageX : e.touches[0].pageY;
347
+
348
+ el.addEventListener('touchmove', onTouchMove, false);
349
+ el.addEventListener('touchend', onTouchEnd, false);
350
+ }
351
+ }
352
+
353
+ function onTouchMove(e) {
354
+ dx = (vertical) ? startX - e.touches[0].pageY : startX - e.touches[0].pageX;
355
+ scrolling = (vertical) ? (Math.abs(dx) < Math.abs(e.touches[0].pageX - startY)) : (Math.abs(dx) < Math.abs(e.touches[0].pageY - startY));
356
+
357
+ if (!scrolling || Number(new Date()) - startT > 500) {
358
+ e.preventDefault();
359
+ if (!fade && slider.transitions) {
360
+ if (!vars.animationLoop) {
361
+ dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1);
362
+ }
363
+ slider.setProps(offset + dx, "setTouch");
364
+ }
365
+ }
366
+ }
367
+
368
+ function onTouchEnd(e) {
369
+ // finish the touch by undoing the touch session
370
+ el.removeEventListener('touchmove', onTouchMove, false);
371
+
372
+ if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
373
+ var updateDx = (reverse) ? -dx : dx,
374
+ target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
375
+
376
+ if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
377
+ slider.flexAnimate(target, vars.pauseOnAction);
378
+ } else {
379
+ if (!fade) slider.flexAnimate(slider.currentSlide, vars.pauseOnAction, true);
380
+ }
381
+ }
382
+ el.removeEventListener('touchend', onTouchEnd, false);
383
+ startX = null;
384
+ startY = null;
385
+ dx = null;
386
+ offset = null;
387
+ }
388
+ },
389
+ resize: function() {
390
+ if (!slider.animating && slider.is(':visible')) {
391
+ if (!carousel) slider.doMath();
392
+
393
+ if (fade) {
394
+ // SMOOTH HEIGHT:
395
+ methods.smoothHeight();
396
+ } else if (carousel) { //CAROUSEL:
397
+ slider.slides.width(slider.computedW);
398
+ slider.update(slider.pagingCount);
399
+ slider.setProps();
400
+ }
401
+ else if (vertical) { //VERTICAL:
402
+ slider.viewport.height(slider.h);
403
+ slider.setProps(slider.h, "setTotal");
404
+ } else {
405
+ // SMOOTH HEIGHT:
406
+ if (vars.smoothHeight) methods.smoothHeight();
407
+ slider.newSlides.width(slider.computedW);
408
+ slider.setProps(slider.computedW, "setTotal");
409
+ }
410
+ }
411
+ },
412
+ smoothHeight: function(dur) {
413
+ if (!vertical || fade) {
414
+ var $obj = (fade) ? slider : slider.viewport;
415
+ (dur) ? $obj.animate({"height": slider.slides.eq(slider.animatingTo).height()}, dur) : $obj.height(slider.slides.eq(slider.animatingTo).height());
416
+ }
417
+ },
418
+ sync: function(action) {
419
+ var $obj = $(vars.sync).data("flexslider"),
420
+ target = slider.animatingTo;
421
+
422
+ switch (action) {
423
+ case "animate": $obj.flexAnimate(target, vars.pauseOnAction, false, true); break;
424
+ case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break;
425
+ case "pause": $obj.pause(); break;
426
+ }
427
+ }
428
+ }
429
+
430
+ // public methods
431
+ slider.flexAnimate = function(target, pause, override, withSync, fromNav) {
432
+ if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev";
433
+
434
+ if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) {
435
+ if (asNav && withSync) {
436
+ var master = $(vars.asNavFor).data('flexslider');
437
+ slider.atEnd = target === 0 || target === slider.count - 1;
438
+ master.flexAnimate(target, true, false, true, fromNav);
439
+ slider.direction = (slider.currentItem < target) ? "next" : "prev";
440
+ master.direction = slider.direction;
441
+
442
+ if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) {
443
+ slider.currentItem = target;
444
+ slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
445
+ target = Math.floor(target/slider.visible);
446
+ } else {
447
+ slider.currentItem = target;
448
+ slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
449
+ return false;
450
+ }
451
+ }
452
+
453
+ slider.animating = true;
454
+ slider.animatingTo = target;
455
+ // API: before() animation Callback
456
+ vars.before(slider);
457
+
458
+ // SLIDESHOW:
459
+ if (pause) slider.pause();
460
+
461
+ // SYNC:
462
+ if (slider.syncExists && !fromNav) methods.sync("animate");
463
+
464
+ // CONTROLNAV
465
+ if (vars.controlNav) methods.controlNav.active();
466
+
467
+ // !CAROUSEL:
468
+ // CANDIDATE: slide active class (for add/remove slide)
469
+ if (!carousel) slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide');
470
+
471
+ // INFINITE LOOP:
472
+ // CANDIDATE: atEnd
473
+ slider.atEnd = target === 0 || target === slider.last;
474
+
475
+ // DIRECTIONNAV:
476
+ if (vars.directionNav) methods.directionNav.update();
477
+
478
+ if (target === slider.last) {
479
+ // API: end() of cycle Callback
480
+ vars.end(slider);
481
+ // SLIDESHOW && !INFINITE LOOP:
482
+ if (!vars.animationLoop) slider.pause();
483
+ }
484
+
485
+ // SLIDE:
486
+ if (!fade) {
487
+ var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW,
488
+ margin, slideString, calcNext;
489
+
490
+ // INFINITE LOOP / REVERSE:
491
+ if (carousel) {
492
+ margin = (vars.itemWidth > slider.w) ? vars.itemMargin * 2 : vars.itemMargin;
493
+ calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo;
494
+ slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext;
495
+ } else if (slider.currentSlide === 0 && target === slider.count - 1 && vars.animationLoop && slider.direction !== "next") {
496
+ slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0;
497
+ } else if (slider.currentSlide === slider.last && target === 0 && vars.animationLoop && slider.direction !== "prev") {
498
+ slideString = (reverse) ? 0 : (slider.count + 1) * dimension;
499
+ } else {
500
+ slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension;
501
+ }
502
+ slider.setProps(slideString, "", vars.animationSpeed);
503
+ if (slider.transitions) {
504
+ if (!vars.animationLoop || !slider.atEnd) {
505
+ slider.animating = false;
506
+ slider.currentSlide = slider.animatingTo;
507
+ }
508
+ slider.container.unbind("webkitTransitionEnd transitionend");
509
+ slider.container.bind("webkitTransitionEnd transitionend", function() {
510
+ slider.wrapup(dimension);
511
+ });
512
+ } else {
513
+ slider.container.animate(slider.args, vars.animationSpeed, vars.easing, function(){
514
+ slider.wrapup(dimension);
515
+ });
516
+ }
517
+ } else { // FADE:
518
+ if (!touch) {
519
+ slider.slides.eq(slider.currentSlide).fadeOut(vars.animationSpeed, vars.easing);
520
+ slider.slides.eq(target).fadeIn(vars.animationSpeed, vars.easing, slider.wrapup);
521
+ } else {
522
+ slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
523
+ slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
524
+
525
+ slider.slides.unbind("webkitTransitionEnd transitionend");
526
+ slider.slides.eq(slider.currentSlide).bind("webkitTransitionEnd transitionend", function() {
527
+ // API: after() animation Callback
528
+ vars.after(slider);
529
+ });
530
+
531
+ slider.animating = false;
532
+ slider.currentSlide = slider.animatingTo;
533
+ }
534
+ }
535
+ // SMOOTH HEIGHT:
536
+ if (vars.smoothHeight) methods.smoothHeight(vars.animationSpeed);
537
+ }
538
+ }
539
+ slider.wrapup = function(dimension) {
540
+ // SLIDE:
541
+ if (!fade && !carousel) {
542
+ if (slider.currentSlide === 0 && slider.animatingTo === slider.last && vars.animationLoop) {
543
+ slider.setProps(dimension, "jumpEnd");
544
+ } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && vars.animationLoop) {
545
+ slider.setProps(dimension, "jumpStart");
546
+ }
547
+ }
548
+ slider.animating = false;
549
+ slider.currentSlide = slider.animatingTo;
550
+ // API: after() animation Callback
551
+ vars.after(slider);
552
+ }
553
+
554
+ // SLIDESHOW:
555
+ slider.animateSlides = function() {
556
+ if (!slider.animating) slider.flexAnimate(slider.getTarget("next"));
557
+ }
558
+ // SLIDESHOW:
559
+ slider.pause = function() {
560
+ clearInterval(slider.animatedSlides);
561
+ slider.playing = false;
562
+ // PAUSEPLAY:
563
+ if (vars.pausePlay) methods.pausePlay.update("play");
564
+ // SYNC:
565
+ if (slider.syncExists) methods.sync("pause");
566
+ }
567
+ // SLIDESHOW:
568
+ slider.play = function() {
569
+ slider.animatedSlides = setInterval(slider.animateSlides, vars.slideshowSpeed);
570
+ slider.playing = true;
571
+ // PAUSEPLAY:
572
+ if (vars.pausePlay) methods.pausePlay.update("pause");
573
+ // SYNC:
574
+ if (slider.syncExists) methods.sync("play");
575
+ }
576
+ slider.canAdvance = function(target, fromNav) {
577
+ // ASNAV:
578
+ var last = (asNav) ? slider.pagingCount - 1 : slider.last;
579
+ return (fromNav) ? true :
580
+ (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true :
581
+ (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false :
582
+ (target === slider.currentSlide && !asNav) ? false :
583
+ (vars.animationLoop) ? true :
584
+ (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false :
585
+ (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false :
586
+ true;
587
+ }
588
+ slider.getTarget = function(dir) {
589
+ slider.direction = dir;
590
+ if (dir === "next") {
591
+ return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1;
592
+ } else {
593
+ return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1;
594
+ }
595
+ }
596
+
597
+ // SLIDE:
598
+ slider.setProps = function(pos, special, dur) {
599
+ var target = (function() {
600
+ var posCheck = (pos) ? pos : ((slider.itemW + vars.itemMargin) * slider.move) * slider.animatingTo,
601
+ posCalc = (function() {
602
+ if (carousel) {
603
+ return (special === "setTouch") ? pos :
604
+ (reverse && slider.animatingTo === slider.last) ? 0 :
605
+ (reverse) ? slider.limit - (((slider.itemW + vars.itemMargin) * slider.move) * slider.animatingTo) :
606
+ (slider.animatingTo === slider.last) ? slider.limit : posCheck;
607
+ } else {
608
+ switch (special) {
609
+ case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos;
610
+ case "setTouch": return (reverse) ? pos : pos;
611
+ case "jumpEnd": return (reverse) ? pos : slider.count * pos;
612
+ case "jumpStart": return (reverse) ? slider.count * pos : pos;
613
+ default: return pos;
614
+ }
615
+ }
616
+ }());
617
+ return (posCalc * -1) + "px";
618
+ }());
619
+
620
+ if (slider.transitions) {
621
+ target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + target + ",0,0)";
622
+ dur = (dur !== undefined) ? (dur/1000) + "s" : "0s";
623
+ slider.container.css("-" + slider.pfx + "-transition-duration", dur);
624
+ }
625
+
626
+ slider.args[slider.prop] = target;
627
+ if (slider.transitions || dur === undefined) slider.container.css(slider.args);
628
+ }
629
+
630
+ slider.setup = function(type) {
631
+ // SLIDE:
632
+ if (!fade) {
633
+ var sliderOffset, arr;
634
+
635
+ if (type === "init") {
636
+ slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);
637
+ // INFINITE LOOP:
638
+ slider.cloneCount = 0;
639
+ slider.cloneOffset = 0;
640
+ // REVERSE:
641
+ if (reverse) {
642
+ arr = $.makeArray(slider.slides).reverse();
643
+ slider.slides = $(arr);
644
+ slider.container.empty().append(slider.slides);
645
+ }
646
+ }
647
+ // INFINITE LOOP && !CAROUSEL:
648
+ if (vars.animationLoop && !carousel) {
649
+ slider.cloneCount = 2;
650
+ slider.cloneOffset = 1;
651
+ // clear out old clones
652
+ if (type !== "init") slider.container.find('.clone').remove();
653
+ slider.container.append(slider.slides.first().clone().addClass('clone')).prepend(slider.slides.last().clone().addClass('clone'));
654
+ }
655
+ slider.newSlides = $(vars.selector, slider);
656
+
657
+ sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset;
658
+ // VERTICAL:
659
+ if (vertical && !carousel) {
660
+ slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%");
661
+ setTimeout(function(){
662
+ slider.newSlides.css({"display": "block"});
663
+ slider.doMath();
664
+ slider.viewport.height(slider.h);
665
+ slider.setProps(sliderOffset * slider.h, "init");
666
+ }, (type === "init") ? 100 : 0);
667
+ } else {
668
+ slider.container.width((slider.count + slider.cloneCount) * 200 + "%");
669
+ slider.setProps(sliderOffset * slider.computedW, "init");
670
+ setTimeout(function(){
671
+ slider.doMath();
672
+ slider.newSlides.css({"width": slider.computedW, "float": "left", "display": "block"});
673
+ // SMOOTH HEIGHT:
674
+ if (vars.smoothHeight) methods.smoothHeight();
675
+ }, (type === "init") ? 100 : 0);
676
+ }
677
+ } else { // FADE:
678
+ slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%", "position": "relative"});
679
+ if (type === "init") {
680
+ if (!touch) {
681
+ slider.slides.eq(slider.currentSlide).fadeIn(vars.animationSpeed, vars.easing);
682
+ } else {
683
+ slider.slides.css({ "opacity": 0, "display": "block", "webkitTransition": "opacity " + vars.animationSpeed / 1000 + "s ease", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2});
684
+ }
685
+ }
686
+ // SMOOTH HEIGHT:
687
+ if (vars.smoothHeight) methods.smoothHeight();
688
+ }
689
+ // !CAROUSEL:
690
+ // CANDIDATE: active slide
691
+ if (!carousel) slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide");
692
+ }
693
+
694
+ slider.doMath = function() {
695
+ var slide = slider.slides.first(),
696
+ slideMargin = vars.itemMargin,
697
+ minItems = vars.minItems,
698
+ maxItems = vars.maxItems;
699
+
700
+ slider.w = slider.width();
701
+ slider.h = slide.height();
702
+ slider.boxPadding = slide.outerWidth() - slide.width();
703
+
704
+ // CAROUSEL:
705
+ if (carousel) {
706
+ slider.itemT = vars.itemWidth + slideMargin;
707
+ slider.minW = (minItems) ? minItems * slider.itemT : slider.w;
708
+ slider.maxW = (maxItems) ? maxItems * slider.itemT : slider.w;
709
+ slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * minItems))/minItems :
710
+ (slider.maxW < slider.w) ? (slider.w - (slideMargin * maxItems))/maxItems :
711
+ (vars.itemWidth > slider.w) ? slider.w : vars.itemWidth;
712
+ slider.visible = Math.floor(slider.w/(slider.itemW + slideMargin));
713
+ slider.move = (vars.move > 0 && vars.move < slider.visible ) ? vars.move : slider.visible;
714
+ slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1);
715
+ slider.last = slider.pagingCount - 1;
716
+ slider.limit = (slider.pagingCount === 1) ? 0 :
717
+ (vars.itemWidth > slider.w) ? ((slider.itemW + (slideMargin * 2)) * slider.count) - slider.w - slideMargin : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin;
718
+ } else {
719
+ slider.itemW = slider.w;
720
+ slider.pagingCount = slider.count;
721
+ slider.last = slider.count - 1;
722
+ }
723
+ slider.computedW = slider.itemW - slider.boxPadding;
724
+ }
725
+
726
+ slider.update = function(pos, action) {
727
+ slider.doMath();
728
+
729
+ // update currentSlide and slider.animatingTo if necessary
730
+ if (!carousel) {
731
+ if (pos < slider.currentSlide) {
732
+ slider.currentSlide += 1;
733
+ } else if (pos <= slider.currentSlide && pos !== 0) {
734
+ slider.currentSlide -= 1;
735
+ }
736
+ slider.animatingTo = slider.currentSlide;
737
+ }
738
+
739
+ // update controlNav
740
+ if (vars.controlNav && !slider.manualControls) {
741
+ if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) {
742
+ methods.controlNav.update("add");
743
+ } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) {
744
+ if (carousel && slider.currentSlide > slider.last) {
745
+ slider.currentSlide -= 1;
746
+ slider.animatingTo -= 1;
747
+ }
748
+ methods.controlNav.update("remove", slider.last);
749
+ }
750
+ }
751
+ // update directionNav
752
+ if (vars.directionNav) methods.directionNav.update();
753
+
754
+ }
755
+
756
+ slider.addSlide = function(obj, pos) {
757
+ var $obj = $(obj);
758
+
759
+ slider.count += 1;
760
+ slider.last = slider.count - 1;
761
+
762
+ // append new slide
763
+ if (vertical && reverse) {
764
+ (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj);
765
+ } else {
766
+ (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj);
767
+ }
768
+
769
+ // update currentSlide, animatingTo, controlNav, and directionNav
770
+ slider.update(pos, "add");
771
+
772
+ // update slider.slides
773
+ slider.slides = $(vars.selector + ':not(.clone)', slider);
774
+ // re-setup the slider to accomdate new slide
775
+ slider.setup();
776
+
777
+ //FlexSlider: added() Callback
778
+ vars.added(slider);
779
+ }
780
+ slider.removeSlide = function(obj) {
781
+ var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj;
782
+
783
+ // update count
784
+ slider.count -= 1;
785
+ slider.last = slider.count - 1;
786
+
787
+ // remove slide
788
+ if (isNaN(obj)) {
789
+ $(obj, slider.slides).remove();
790
+ } else {
791
+ (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove();
792
+ }
793
+
794
+ // update currentSlide, animatingTo, controlNav, and directionNav
795
+ slider.doMath();
796
+ slider.update(pos, "remove");
797
+
798
+ // update slider.slides
799
+ slider.slides = $(vars.selector + ':not(.clone)', slider);
800
+ // re-setup the slider to accomdate new slide
801
+ slider.setup();
802
+
803
+ // FlexSlider: removed() Callback
804
+ vars.removed(slider);
805
+ }
806
+
807
+ //FlexSlider: Initialize
808
+ methods.init();
809
+ }
810
+
811
+ //FlexSlider: Default Settings
812
+ $.flexslider.defaults = {
813
+ namespace: "flex-", //{NEW} String: Prefix string attached to the class of every element generated by the plugin
814
+ selector: ".slides > li", //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril
815
+ animation: "fade", //String: Select your animation type, "fade" or "slide"
816
+ easing: "swing", //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported!
817
+ direction: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical"
818
+ reverse: false, //{NEW} Boolean: Reverse the animation direction
819
+ animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
820
+ smoothHeight: false, //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode
821
+ startAt: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide)
822
+ slideshow: true, //Boolean: Animate slider automatically
823
+ slideshowSpeed: 7000, //Integer: Set the speed of the slideshow cycling, in milliseconds
824
+ animationSpeed: 600, //Integer: Set the speed of animations, in milliseconds
825
+ initDelay: 0, //{NEW} Integer: Set an initialization delay, in milliseconds
826
+ randomize: false, //Boolean: Randomize slide order
827
+
828
+ // Usability features
829
+ pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
830
+ pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering
831
+ useCSS: true, //{NEW} Boolean: Slider will use CSS3 transitions if available
832
+ touch: true, //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices
833
+ video: false, //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches
834
+
835
+ // Primary Controls
836
+ controlNav: true, //Boolean: Create navigation for paging control of each clide? Note: Leave true for manualControls usage
837
+ directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false)
838
+ prevText: "Previous", //String: Set the text for the "previous" directionNav item
839
+ nextText: "Next", //String: Set the text for the "next" directionNav item
840
+
841
+ // Secondary Navigation
842
+ keyboard: true, //Boolean: Allow slider navigating via keyboard left/right keys
843
+ multipleKeyboard: false, //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present.
844
+ mousewheel: false, //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel
845
+ pausePlay: false, //Boolean: Create pause/play dynamic element
846
+ pauseText: "Pause", //String: Set the text for the "pause" pausePlay item
847
+ playText: "Play", //String: Set the text for the "play" pausePlay item
848
+
849
+ // Special properties
850
+ controlsContainer: "", //{UPDATED} jQuery Object/Selector: Declare which container the navigation elements should be appended too. Default container is the FlexSlider element. Example use would be $(".flexslider-container"). Property is ignored if given element is not found.
851
+ manualControls: "", //{UPDATED} jQuery Object/Selector: Declare custom control navigation. Examples would be $(".flex-control-nav li") or "#tabs-nav li img", etc. The number of elements in your controlNav should match the number of slides/tabs.
852
+ sync: "", //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care.
853
+ asNavFor: "", //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider
854
+
855
+ // Carousel Options
856
+ itemWidth: 0, //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding.
857
+ itemMargin: 0, //{NEW} Integer: Margin between carousel items.
858
+ minItems: 0, //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this.
859
+ maxItems: 0, //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit.
860
+ move: 0, //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items.
861
+
862
+ // Callback API
863
+ start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide
864
+ before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation
865
+ after: function(){}, //Callback: function(slider) - Fires after each slider animation completes
866
+ end: function(){}, //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous)
867
+ added: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is added
868
+ removed: function(){} //{NEW} Callback: function(slider) - Fires after a slide is removed
869
+ }
870
+
871
+
872
+ //FlexSlider: Plugin Function
873
+ $.fn.flexslider = function(options) {
874
+ if (options === undefined) options = {};
875
+
876
+ if (typeof options === "object") {
877
+ return this.each(function() {
878
+ var $this = $(this),
879
+ selector = (options.selector) ? options.selector : ".slides > li",
880
+ $slides = $this.find(selector);
881
+
882
+ if ($slides.length === 1) {
883
+ $slides.fadeIn(400);
884
+ if (options.start) options.start($this);
885
+ } else if ($this.data('flexslider') == undefined) {
886
+ new $.flexslider(this, options);
887
+ }
888
+ });
889
+ } else {
890
+ // Helper strings to quickly perform functions on the slider
891
+ var $slider = $(this).data('flexslider');
892
+ switch (options) {
893
+ case "play": $slider.play(); break;
894
+ case "pause": $slider.pause(); break;
895
+ case "next": $slider.flexAnimate($slider.getTarget("next"), true); break;
896
+ case "prev":
897
+ case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break;
898
+ default: if (typeof options === "number") $slider.flexAnimate(options, true);
899
+ }
900
+ }
901
+ }
902
+
903
+ })(jQuery);