PageSourceSearch

https://modernmag.com/wp-content/themes/braxton/js/jquery.iosslider.js?ver=7.0.5

js modernmag.com collected 2026-09-25 23:55:34 UTC 89,621 bytes, 2,632 lines download raw bytes

1/*
2 * iosSlider - http://iosscripts.com/iosslider/
3 * 
4 * Touch Enabled, Responsive jQuery Horizontal Content Slider/Carousel/Image Gallery Plugin
5 *
6 * A jQuery plugin which allows you to integrate a customizable, cross-browser 
7 * content slider into your web presence. Designed for use as a content slider, carousel, 
8 * scrolling website banner, or image gallery.
9 * 
10 * Copyright (c) 2013 Marc Whitbread
11 * 
12 * Version: v1.3.16 (09/24/2013)
13 * Minimum requirements: jQuery v1.4+
14 *
15 * Advanced requirements:
16 * 1) jQuery bind() click event override on slide requires jQuery v1.6+
17 *
18 * Terms of use:
19 *
20 * 1) iosSlider is licensed under the Creative Commons – Attribution-NonCommercial 3.0 License.
21 * 2) You may use iosSlider free for personal or non-profit purposes, without restriction.
22 *	  Attribution is not required but always appreciated. For commercial projects, you
23 *	  must purchase a license. You may download and play with the script before deciding to
24 *	  fully implement it in your project. Making sure you are satisfied, and knowing iosSlider
25 *	  is the right script for your project is paramount.
26 * 3) You are not permitted to make the resources found on iosscripts.com available for
27 *    distribution elsewhere "as is" without prior consent. If you would like to feature
28 *    iosSlider on your site, please do not link directly to the resource zip files. Please
29 *    link to the appropriate page on iosscripts.com where users can find the download.
30 *
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
32 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
33 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
34 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
35 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
36 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
37 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
38 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39 * OF THE POSSIBILITY OF SUCH DAMAGE.
40 */
41
42;(function($) {
43	
44	/* global variables */
45	var scrollbarNumber = 0;
46	var xScrollDistance = 0;
47	var yScrollDistance = 0;
48	var scrollIntervalTime = 10;
49	var scrollbarDistance = 0;
50	var isTouch = 'ontouchstart' in window;
51	var supportsOrientationChange = 'onorientationchange' in window;
52	var isWebkit = false;
53	var has3DTransform = false;
54	var isIe7 = false;
55	var isIe8 = false;
56	var isIe9 = false;
57	var isIe = false;
58	var isGecko = false;
59	var grabOutCursor = 'pointer';
60	var grabInCursor = 'pointer';
61	var onChangeEventLastFired = new Array();
62	var autoSlideTimeouts = new Array();
63	var iosSliders = new Array();
64	var iosSliderSettings = new Array();
65	var isEventCleared = new Array();
66	var slideTimeouts = new Array();
67	var activeChildOffsets = new Array();
68	var activeChildInfOffsets = new Array();
69	var infiniteSliderOffset = new Array();
70	var sliderMin = new Array();
71	var sliderMax = new Array();
72	var sliderAbsMax = new Array();
73	var touchLocks = new Array();
74	
75	/* private functions */
76	var helpers = {
77    
78        showScrollbar: function(settings, scrollbarClass) {
79			
80			if(settings.scrollbarHide) {
81				$('.' + scrollbarClass).css({
82					opacity: settings.scrollbarOpacity,
83					filter: 'alpha(opacity:' + (settings.scrollbarOpacity * 100) + ')'
84				});
85			}
86			
87		},
88		
89		hideScrollbar: function(settings, scrollTimeouts, j, distanceOffsetArray, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber) {
90			
91			if(settings.scrollbar && settings.scrollbarHide) {
92					
93				for(var i = j; i < j+25; i++) {
94					
95					scrollTimeouts[scrollTimeouts.length] = helpers.hideScrollbarIntervalTimer(scrollIntervalTime * i, distanceOffsetArray[j], ((j + 24) - i) / 24, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber, settings);
96					
97				}
98			
99			}
100			
101		},
102		
103		hideScrollbarInterval: function(newOffset, opacity, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber, settings) {
104	
105			scrollbarDistance = (newOffset * -1) / (sliderMax[sliderNumber]) * (stageWidth - scrollMargin - scrollBorder - scrollbarWidth);
106			
107			helpers.setSliderOffset('.' + scrollbarClass, scrollbarDistance);
108			
109			$('.' + scrollbarClass).css({
110				opacity: settings.scrollbarOpacity * opacity,
111				filter: 'alpha(opacity:' + (settings.scrollbarOpacity * opacity * 100) + ')'
112			});
113			
114		},
115		
116		slowScrollHorizontalInterval: function(node, slideNodes, newOffset, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, activeChildOffset, originalOffsets, childrenOffsets, infiniteSliderWidth, numberOfSlides, slideNodeOuterWidths, sliderNumber, centeredSlideOffset, endOffset, settings) {
117			
118			if(settings.infiniteSlider) {
119				
120				if(newOffset <= (sliderMax[sliderNumber] * -1)) {
121					
122					var scrollerWidth = $(node).width();
123
124					if(newOffset <= (sliderAbsMax[sliderNumber] * -1)) {
125						
126						var sum = originalOffsets[0] * -1;
127						$(slideNodes).each(function(i) {
128							
129							helpers.setSliderOffset($(slideNodes)[i], sum + centeredSlideOffset);
130							if(i < childrenOffsets.length) {
131								childrenOffsets[i] = sum * -1;
132							}
133							sum = sum + slideNodeOuterWidths[i];
134							
135						});
136						
137						newOffset = newOffset + childrenOffsets[0] * -1;
138						sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset;
139						sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
140						infiniteSliderOffset[sliderNumber] = 0;
141						
142					} else {
143						
144						var lowSlideNumber = 0;
145						var lowSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x');
146						$(slideNodes).each(function(i) {
147							
148							if(helpers.getSliderOffset(this, 'x') < lowSlideOffset) {
149								lowSlideOffset = helpers.getSliderOffset(this, 'x');
150								lowSlideNumber = i;
151							}
152							
153						});
154						
155						var tempOffset = sliderMin[sliderNumber] + scrollerWidth;
156						helpers.setSliderOffset($(slideNodes)[lowSlideNumber], tempOffset);
157						
158						sliderMin[sliderNumber] = childrenOffsets[1] * -1 + centeredSlideOffset;
159						sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
160
161						childrenOffsets.splice(0, 1);
162						childrenOffsets.splice(childrenOffsets.length, 0, tempOffset * -1 + centeredSlideOffset);
163
164						infiniteSliderOffset[sliderNumber]++;
165						
166					}
167					
168				}
169				
170				if((newOffset >= (sliderMin[sliderNumber] * -1)) || (newOffset >= 0)) {
171					
172					var scrollerWidth = $(node).width();
173					
174					if(newOffset >= 0) {
175
176						var sum = originalOffsets[0] * -1;
177						$(slideNodes).each(function(i) {
178							
179							helpers.setSliderOffset($(slideNodes)[i], sum + centeredSlideOffset);
180							if(i < childrenOffsets.length) {
181								childrenOffsets[i] = sum * -1;
182							}
183							sum = sum + slideNodeOuterWidths[i];
184							
185						});
186						
187						newOffset = newOffset - childrenOffsets[0] * -1;
188						sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset;
189						sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
190						infiniteSliderOffset[sliderNumber] = numberOfSlides;
191						
192						while(((childrenOffsets[0] * -1 - scrollerWidth + centeredSlideOffset) > 0)) {
193
194							var highSlideNumber = 0;
195							var highSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x');
196							$(slideNodes).each(function(i) {
197								
198								if(helpers.getSliderOffset(this, 'x') > highSlideOffset) {
199									highSlideOffset = helpers.getSliderOffset(this, 'x');
200									highSlideNumber = i;
201								}
202								
203							});
204
205							var tempOffset = sliderMin[sliderNumber] - slideNodeOuterWidths[highSlideNumber];
206							helpers.setSliderOffset($(slideNodes)[highSlideNumber], tempOffset);
207							
208							childrenOffsets.splice(0, 0, tempOffset * -1 + centeredSlideOffset);
209							childrenOffsets.splice(childrenOffsets.length-1, 1);
210
211							sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset;
212							sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
213
214							infiniteSliderOffset[sliderNumber]--;
215							activeChildOffsets[sliderNumber]++;
216							
217						}
218
219					} 
220					
221					if(newOffset < 0) {
222
223						var highSlideNumber = 0;
224						var highSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x');
225						$(slideNodes).each(function(i) {
226							
227							if(helpers.getSliderOffset(this, 'x') > highSlideOffset) {
228								highSlideOffset = helpers.getSliderOffset(this, 'x');
229								highSlideNumber = i;
230							}
231							
232						});						
233					
234						var tempOffset = sliderMin[sliderNumber] - slideNodeOuterWidths[highSlideNumber];
235						helpers.setSliderOffset($(slideNodes)[highSlideNumber], tempOffset);
236
237						childrenOffsets.splice(0, 0, tempOffset * -1 + centeredSlideOffset);
238						childrenOffsets.splice(childrenOffsets.length-1, 1);
239
240						sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset;
241						sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
242
243						infiniteSliderOffset[sliderNumber]--;
244						
245					}
246				
247				}
248				
249			}
250
251			var slideChanged = false;
252			var newChildOffset = helpers.calcActiveOffset(settings, newOffset, childrenOffsets, stageWidth, infiniteSliderOffset[sliderNumber], numberOfSlides, activeChildOffset, sliderNumber);
253			var tempOffset = (newChildOffset + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides;
254			
255			if(settings.infiniteSlider) {
256								
257				if(tempOffset != activeChildInfOffsets[sliderNumber]) slideChanged = true;
258					
259			} else {
260			
261				if(newChildOffset != activeChildOffsets[sliderNumber]) slideChanged = true;
262			
263			}
264			
265			if(slideChanged) {
266
267				var args = new helpers.args('change', settings, node, $(node).children(':eq(' + tempOffset + ')'), tempOffset, endOffset);
268				$(node).parent().data('args', args);
269				
270				if(settings.onSlideChange != '') {
271				
272					settings.onSlideChange(args);
273				
274				}
275			
276			}
277			
278			activeChildOffsets[sliderNumber] = newChildOffset;
279			activeChildInfOffsets[sliderNumber] = tempOffset;
280			
281			newOffset = Math.floor(newOffset);
282
283			helpers.setSliderOffset(node, newOffset);
284
285			if(settings.scrollbar) {
286				
287				scrollbarDistance = Math.floor((newOffset * -1 - sliderMin[sliderNumber] + centeredSlideOffset) / (sliderMax[sliderNumber] - sliderMin[sliderNumber] + centeredSlideOffset) * (scrollbarStageWidth - scrollMargin - scrollbarWidth));
288				var width = scrollbarWidth - scrollBorder;
289				
290				if(newOffset >= (sliderMin[sliderNumber] * -1 + centeredSlideOffset)) {
291
292					width = scrollbarWidth - scrollBorder - (scrollbarDistance * -1);
293					
294					helpers.setSliderOffset($('.' + scrollbarClass), 0);
295					
296					$('.' + scrollbarClass).css({
297						width: width + 'px'
298					});
299				
300				} else if(newOffset <= ((sliderMax[sliderNumber] * -1) + 1)) {
301					
302					width = scrollbarStageWidth - scrollMargin - scrollBorder - scrollbarDistance;
303					
304					helpers.setSliderOffset($('.' + scrollbarClass), scrollbarDistance);
305					
306					$('.' + scrollbarClass).css({
307						width: width + 'px'
308					});
309					
310				} else {
311					
312					helpers.setSliderOffset($('.' + scrollbarClass), scrollbarDistance);
313					
314					$('.' + scrollbarClass).css({
315						width: width + 'px'
316					});
317				
318				}
319				
320			}
321			
322		},
323		
324		slowScrollHorizontal: function(node, slideNodes, scrollTimeouts, scrollbarClass, xScrollDistance, yScrollDistance, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, currentEventNode, snapOverride, centeredSlideOffset, settings) {
325			
326			var nodeOffset = helpers.getSliderOffset(node, 'x');
327			var distanceOffsetArray = new Array();
328			var xScrollDistanceArray = new Array();
329			var snapDirection = 0;
330			var maxSlideVelocity = 25 / 1024 * stageWidth;
331			var changeSlideFired = false;
332			frictionCoefficient = settings.frictionCoefficient;
333			elasticFrictionCoefficient = settings.elasticFrictionCoefficient;
334			snapFrictionCoefficient = settings.snapFrictionCoefficient;
335				
336			if((xScrollDistance > settings.snapVelocityThreshold) && settings.snapToChildren && !snapOverride) {
337				snapDirection = 1;
338			} else if((xScrollDistance < (settings.snapVelocityThreshold * -1)) && settings.snapToChildren && !snapOverride) {
339				snapDirection = -1;
340			}
341			
342			if(xScrollDistance < (maxSlideVelocity * -1)) {
343				xScrollDistance = maxSlideVelocity * -1;
344			} else if(xScrollDistance > maxSlideVelocity) {
345				xScrollDistance = maxSlideVelocity;
346			}
347			
348			if(!($(node)[0] === $(currentEventNode)[0])) {
349				snapDirection = snapDirection * -1;
350				xScrollDistance = xScrollDistance * -2;
351			}
352			
353			var tempInfiniteSliderOffset = infiniteSliderOffset[sliderNumber];
354			
355			if(settings.infiniteSlider) {
356			
357				var tempSliderMin = sliderMin[sliderNumber];
358				var tempSliderMax = sliderMax[sliderNumber];
359			
360			}
361			
362			var tempChildrenOffsets = new Array();
363			var tempSlideNodeOffsets = new Array();
364
365			for(var i = 0; i < childrenOffsets.length; i++) {
366				
367				tempChildrenOffsets[i] = childrenOffsets[i];
368				
369				if(i < slideNodes.length) {
370					tempSlideNodeOffsets[i] = helpers.getSliderOffset($(slideNodes[i]), 'x');
371				}
372				
373			}
374			
375			while((xScrollDistance > 1) || (xScrollDistance < -1)) {
376				
377				xScrollDistance = xScrollDistance * frictionCoefficient;
378				nodeOffset = nodeOffset + xScrollDistance;
379
380				if(((nodeOffset > (sliderMin[sliderNumber] * -1)) || (nodeOffset < (sliderMax[sliderNumber] * -1))) && !sett
380ings.infiniteSlider) {
381					xScrollDistance = xScrollDistance * elasticFrictionCoefficient;
382					nodeOffset = nodeOffset + xScrollDistance;
383				}
384				
385				if(settings.infiniteSlider) {
386					
387					if(nodeOffset <= (tempSliderMax * -1)) {
388						
389						var scrollerWidth = $(node).width();
390							
391						var lowSlideNumber = 0;
392						var lowSlideOffset = tempSlideNodeOffsets[0];
393						for(var i = 0; i < tempSlideNodeOffsets.length; i++) {
394							
395							if(tempSlideNodeOffsets[i] < lowSlideOffset) {
396								lowSlideOffset = tempSlideNodeOffsets[i];
397								lowSlideNumber = i;
398							}
399							
400						}
401						
402						var newOffset = tempSliderMin + scrollerWidth;
403						tempSlideNodeOffsets[lowSlideNumber] = newOffset;
404						
405						tempSliderMin = tempChildrenOffsets[1] * -1 + centeredSlideOffset;
406						tempSliderMax = tempSliderMin + scrollerWidth - stageWidth;
407						
408						tempChildrenOffsets.splice(0, 1);
409						tempChildrenOffsets.splice(tempChildrenOffsets.length, 0, newOffset * -1 + centeredSlideOffset);
410
411						tempInfiniteSliderOffset++;
412						
413					}
414					
415					if(nodeOffset >= (tempSliderMin * -1)) {
416						
417						var scrollerWidth = $(node).width();
418						
419						var highSlideNumber = 0;
420						var highSlideOffset = tempSlideNodeOffsets[0];
421						for(var i = 0; i < tempSlideNodeOffsets.length; i++) {
422							
423							if(tempSlideNodeOffsets[i] > highSlideOffset) {
424								highSlideOffset = tempSlideNodeOffsets[i];
425								highSlideNumber = i;
426							}
427							
428						}
429
430						var newOffset = tempSliderMin - slideNodeOuterWidths[highSlideNumber];
431						tempSlideNodeOffsets[highSlideNumber] = newOffset;
432						
433						tempChildrenOffsets.splice(0, 0, newOffset * -1 + centeredSlideOffset);
434						tempChildrenOffsets.splice(tempChildrenOffsets.length-1, 1);
435
436						tempSliderMin = tempChildrenOffsets[0] * -1 + centeredSlideOffset;
437						tempSliderMax = tempSliderMin + scrollerWidth - stageWidth;
438
439						tempInfiniteSliderOffset--;
440					
441					}
442						
443				}
444
445				distanceOffsetArray[distanceOffsetArray.length] = nodeOffset;
446				xScrollDistanceArray[xScrollDistanceArray.length] = xScrollDistance;
447				
448			}
449
450			var slideChanged = false;
451			var newChildOffset = helpers.calcActiveOffset(settings, nodeOffset, tempChildrenOffsets, stageWidth, tempInfiniteSliderOffset, numberOfSlides, activeChildOffsets[sliderNumber], sliderNumber);
452
453			var tempOffset = (newChildOffset + tempInfiniteSliderOffset + numberOfSlides)%numberOfSlides;
454
455			if(settings.snapToChildren) {
456			
457				if(settings.infiniteSlider) {
458				
459					if(tempOffset != activeChildInfOffsets[sliderNumber]) {
460						slideChanged = true;
461					}
462						
463				} else {
464				
465					if(newChildOffset != activeChildOffsets[sliderNumber]) {
466						slideChanged = true;
467					}
468				
469				}
470
471				if((snapDirection < 0) && !slideChanged) {
472				
473					newChildOffset++;
474					
475					if((newChildOffset >
475= childrenOffsets.length) && !settings.infiniteSlider) newChildOffset = childrenOffsets.length - 1;
476					
477				} else if((snapDirection > 0) && !slideChanged) {
478				
479					newChildOffset--;
480					
481					if((newChildOffset < 0) && !settings.infiniteSlider) newChildOffset = 0;
482					
483				}
484				
485			}
486
487			if(settings.snapToChildren || (((nodeOffset > (sliderMin[sliderNumber] * -1)) || (nodeOffset < (sliderMax[sliderNumber] * -1))) && !settings.infiniteSlider)) {
488				
489				if(((nodeOffset > (sliderMin[sliderNumber] * -1)) || (nodeOffset < (sliderMax[sliderNumber] * -1))) && !settings.infiniteSlider) {
490					distanceOffsetArray.splice(0, distanceOffsetArray.length);					
491				} else {
492					distanceOffsetArray.splice(distanceOffsetArray.length * 0.10, distanceOffsetArray.length);
493					nodeOffset = (distanceOffsetArray.length > 0) ? distanceOffsetArray[distanceOffsetArray.length-1] : nodeOffset;
494				}
495
496				while((nodeOffset < (tempChildrenOffsets[newChildOffset] - 0.5)) || (nodeOffset > (tempChildrenOffsets[newChildOffset] + 0.5))) {
497					
498					nodeOffset = ((nodeOffset - (tempChildrenOffsets[newChildOffset])) * snapFrictionCoefficient) + (tempChildrenOffsets[newChildOffset]);
499					distanceOffsetArray[distanceOffsetArray.length] = nodeOffset;
500
501				}
502				
503				distanceOffsetArray[distanceOffsetArray.length] = tempChildrenOffsets[newChildOffset];
504			}
505
506			var jStart = 1;
507			if((distanceOffsetArray.length%2) != 0) {
508				jStart = 0;
509			}
510			
511			var lastTimeoutRegistered = 0;
512			var count = 0;
513			
514			for(var j = 0; j < scrollTimeouts.length; j++) {
515				clearTimeout(scrollTimeouts[j]);
516			}
517			
518			var endOffset = (newChildOffset + tempInfiniteSliderOffset + numberOfSlides)%numberOfSlides;
519			
520			var lastCheckOffset = 0;
521			for(var j = jStart; j < distanceOffsetArray.length; j = j + 2) {
522				
523				if((j == jStart) || (Math.abs(distanceOffsetArray[j] - lastCheckOffset) > 1) || (j >= (distanceOffsetArray.length - 2))) {
524				
525					lastCheckOffset	= distanceOffsetArray[j];
526					
527					scrollTimeouts[scrollTimeouts.length] = helpers.slowScrollHorizontalIntervalTimer(scrollIntervalTime * j, node, slideNodes, distanceOffsetArray[j], scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, newChildOffset, originalOffsets, childrenOffsets, infiniteSliderWidth, numberOfSlides, slideNodeOuterWidths, sliderNumber, centeredSlideOffset, endOffset, settings);
528				
529				}
530				
531			}
532			
533			var slideChanged = false;
534			var tempOffset = (newChildOffset + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides;
535			
536			if(settings.infiniteSlider) {
537				
538				if(tempOffset != activeChildInfOffsets[sliderNumber]) {
539					slideChanged = true;
540				}
541					
542			} else {
543			
544				if(newChildOffset != activeChildOffsets[sliderNumber]) {
545					slideChanged = true;
546				}
547			
548			}
549
550			if(settings.onSlideComplete != '' && (distanceOffsetArray.length > 1)) {
551				
552				scrollTimeouts[scrollTimeouts.length] = helpers.onSlideCompleteTimer(scrollIntervalTime * (j + 1), settings, node, $(node).children(':eq(' + tempOffset + ')'), endOffset, sliderNumber);
553				
554			}
555			
556			slideTimeouts[sliderNumber] = scrollTimeouts;
557			
558			helpers.hideScrollbar(settings, scrollTimeouts, j, distanceOffsetArray, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber);
559				
560		},
561		
562		onSlideComplete: function(settings, node, slideNode, newChildOffset, sliderNumber) {
563			
564			var isChanged = (onChangeEventLastFired[sliderNumber] != newChildOffset) ? true : false;
565			var args = new helpers.args('complete', settings, $(node), slideNode, newChildOffset, newChildOffset);
566			$(node).parent().data('args', args);
567				
568			if(settings.onSlideComplete != '') {
569				settings.onSlideComplete(args);
570			
571			}
572			
573			onChangeEventLastFired[sliderNumber] = newChildOffset;
574		
575		},
576		
577		getSliderOffset: function(node, xy) {
578			
579			var sliderOffset = 0;
580			xy = (xy == 'x') ? 4 : 5;
581			
582			if(has3DTransform && !isIe7 && !isIe8) {
583				
584				var transforms = new Array('-webkit-transform', '-moz-transform', 'transform');
585				var transformArray;
586				
587				for(var i = 0; i < transforms.length; i++) {
588					
589					if($(node).css(transforms[i]) != undefined) {
590						
591						if($(node).css(transforms[i]).length > 0) {
592						
593							transformArray = $(node).css(transforms[i]).split(',');
594							
595							break;
596							
597						}
598					
599					}
600				
601				}
602				
603				sliderOffset = (transformArray[xy] == undefined) ? 0 : parseInt(transformArray[xy], 10);
604
605			} else {
606			
607				sliderOffset = parseInt($(node).css('left'), 10);
608			
609			}
610			
611			return sliderOffset;
612		
613		},
614		
615		setSliderOffset: function(node, sliderOffset) {
616			
617			sliderOffset = parseInt(sliderOffset, 10);
618			
619			if(has3DTransform && !isIe7 && !isIe8) {
620				
621				$(node).css({
622					'webkitTransform': 'matrix(1,0,0,1,' + sliderOffset + ',0)',
623					'MozTransform': 'matrix(1,0,0,1,' + sliderOffset + ',0)',
624					'transform': 'matrix(1,0,0,1,' + sliderOffset + ',0)'
625				});
626			
627			} else {
628
629				$(node).css({
630					left: sliderOffset + 'px'
631				});
632			
633			}
634						
635		},
636		
637		setBrowserInfo: function() {
638			
639			if(navigator.userAgent.match('WebKit') != null) {
640				isWebkit = true;
641				grabOutCursor = '-webkit-grab';
642				grabInCursor = '-webkit-grabbing';
643			} else if(navigator.userAgent.match('Gecko') != null) {
644				isGecko = true;
645				grabOutCursor = 'move';
646				grabInCursor = '-moz-grabbing';
647			} else if(navigator.userAgent.match('MSIE 7') != null) {
648				isIe7 = true;
649				isIe = true;
650			} else if(navigator.userAgent.match('MSIE 8') != null) {
651				isIe8 = true;
652				isIe = true;
653			} else if(navigator.userAgent.match('MSIE 9') != null) {
654				isIe9 = true;
655				isIe = true;
656			}
657			
658		},
659		
660		has3DTransform: function() {
661			
662			var has3D = false;
663			
664			var testElement = $('<div />').css({
665				'webkitTransform': 'matrix(1,1,1,1,1,1)',
666				'MozTransform': 'matrix(1,1,1,1,1,1)',
667				'transform': 'matrix(1,1,1,1,1,1)'
668			});
669			
670			if(testElement.attr('style') == '') {
671				has3D = false;
672			} else if(isGecko && !isTouch && (parseInt(navigator.userAgent.split('/')[3], 10) >= 21)) {
673				//bug in v21+ which does not render slides properly in 3D
674				has3D = false;
675			} else if(testElement.attr('style') != undefined) {
676				has3D = true;
677			}
678			
679			return has3D;
680			
681		},
682		
683		getSlideNumber: function(slide, sliderNumber, numberOfSlides) {
684			
685			return (slide - infiniteSliderOffset[sliderNumber] + numberOfSlides) % numberOfSlides;
686		
687		}, 
688
689        calcActiveOffset: function(settings, offset, childrenOffsets, stageWidth, infiniteSliderOffset, numberOfSlides, activeChildOffset, sliderNumber) {
690
691			var isFirst = false;
692			var arrayOfOffsets = new Array();
693			var newChildOffset;
694			
695			if(offset > childrenOffsets[0]) newChildOffset = 0;
696			if(offset < (childrenOffsets[childrenOffsets.length-1])) newChildOffset = numberOfSlides - 1;
697			
698			for(var i = 0; i < childrenOffsets.length; i++) {
699								
700				if((childrenOffsets[i] <= offset) && (childrenOffsets[i] > (offset - stageWidth))) {
701				
702					if(!isFirst && (childrenOffsets[i] != offset)) {
703						
704						arrayOfOffsets[arrayOfOffsets.length] = childrenOffsets[i-1];
705						
706					}
707					
708					arrayOfOffsets[arrayOfOffsets.length] = childrenOffsets[i];
709					
710					isFirst = true;
711						
712				}
713			
714			}
715			
716			if(arrayOfOffsets.length == 0) {
717				arrayOfOffsets[0] = childrenOffsets[childrenOffsets.length - 1];
718			}
719			
720			var distance = stageWidth;
721			var closestChildOffset = 0;
722			
723			for(var i = 0; i < arrayOfOffsets.length; i++) {
724				
725				var newDistance = Math.abs(offset - arrayOfOffsets[i]);
726
727				if(newDistance < distance) {
728					closestChildOffset = arrayOfOffsets[i];
729					distance = newDistance;
730				}
731				
732			}
733			
734			for(var i = 0; i < childrenOffsets.length; i++) {
735				
736				if(closestChildOffset == childrenOffsets[i]) {
737					newChildOffset = i;
738						
739				}
740				
741			}
742			
743			return newChildOffset;
744		
745		},
746		
747		changeSlide: function(slide, node, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings) {
748
749			helpers.autoSlidePause(sliderNumber);
750			
751			for(var j = 0; j < scrollTimeouts.length; j++) {
752				clearTimeout(scrollTimeouts[j]);
753			}
754			
755			var steps = Math.ceil(settings.autoSlideTransTimer / 10) + 1;
756			var startOffset = helpers.getSliderOffset(node, 'x');
757			var endOffset = childrenOffsets[slide];
758			var offsetDiff = endOffset - startOffset;
759			var direction = slide - (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides;
760
761			if(settings.infiniteSlider) {
762				
763				slide = (slide - infiniteSliderOffset[sliderNumber] + numberOfSlides * 2)%numberOfSlides;
764				
765				var appendArray = false;
766				if((slide == 0) && (numberOfSlides == 2)) {
767					
768					slide = numberOfSlides;
769					childrenOffsets[slide] = childrenOffsets[slide-1] - $(slideNodes).eq(0).outerWidth(true);
770					appendArray = true;
771					
772				}
773				
774				endOffset = childrenOffsets[slide];
775				offsetDiff = endOffset - startOffset;
776								
777				var offsets = new Array(childrenOffsets[slide] - $(node).width(), childrenOffsets[slide] + $(node).width());
778				
779				if(appendArray) {
780					childrenOffsets.splice(childrenOffsets.length-1, 1);
781				}
782				
783				for(var i = 0; i < offsets.length; i++) {
784					
785					if(Math.abs(offsets[i] - startOffset) < Math.abs(offsetDiff)) {
786						offsetDiff = (offsets[i] - startOffset);
787					}
788				
789				}
790				
791			}
792			
793			var stepArray = new Array();
794			var t;
795			var nextStep;
796
797			helpers.showScrollbar(settings, scrollbarClass);
798
799			for(var i = 0; i <= steps; i++) {
800
801				t = i;
802				t /= steps;
803				t--;
804				nextStep = startOffset + offsetDiff*(Math.pow(t,5) + 1);
805				
806				stepArray[stepArray.length] = nextStep;
807				
808			}
809			
810			var tempOffset = (slide + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides;
811
812			var lastCheckOffset = 0;
813			for(var i = 0; i < stepArray.length; i++) {
814				
815				if((i == 0) || (Math.abs(stepArray[i] - lastCheckOffset) > 1) || (i >= (stepArray.length - 2))) {
816
817					lastCheckOffset	= stepArray[i];
818					
819					scrollTimeouts[i] = helpers.slowScrollHorizontalIntervalTimer(scrollIntervalTime * (i + 1), node, slideNo
819des, stepArray[i], scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, slide, originalOffsets, childrenOffsets, infiniteSliderWidth, numberOfSlides, slideNodeOuterWidths, sliderNumber, centeredSlideOffset, tempOffset, settings);
820						
821				}
822				
823				if((i == 0) && (settings.onSlideStart != '')) {
824				
825					var tempOffset2 = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides;	
826					settings.onSlideStart(new helpers.args('start', settings, node, $(node).children(':eq(' + tempOffset2 + ')'), tempOffset2, slide));
827					
828				}
829					
830			}
831
832			var slideChanged = false;
833			
834			if(settings.infiniteSlider) {
835				
836				if(tempOffset != activeChildInfOffsets[sliderNumber]) {
837					slideChanged = true;
838				}
839					
840			} else {
841			
842				if(slide != activeChildOffsets[sliderNumber]) {
843					slideChanged = true;
844				}
845			
846			}
847	
848			if(slideChanged && (settings.onSlideComplete != '')) {
849
850				scrollTimeouts[scrollTimeouts.length] = helpers.onSlideCompleteTimer(scrollIntervalTime * (i + 1), settings, node, $(node).children(':eq(' + tempOffset + ')'), tempOffset, sliderNumber);
851				
852			}
853			
854			/*scrollTimeouts[scrollTimeouts.length] = setTimeout(function() {
855				activeChildOffsets[sliderNumber] = activeChildOffsets[sliderNumber];
856			}, scrollIntervalTime * (i + 1));*/
857			
858			slideTimeouts[sliderNumber] = scrollTimeouts;
859			
860			helpers.hideScrollbar(settings, scrollTimeouts, i, stepArray, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber);
861			
862			helpers.autoSlide(node, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings);
863			
864		},
865		
866		autoSlide: function(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings) {
867			
868			if(!iosSliderSettings[sliderNumber].autoSlide) return false;
869			
870			helpers.autoSlidePause(sliderNumber);
871
872			autoSlideTimeouts[sliderNumber] = setTimeout(function() {
873
874				if(!settings.infiniteSlider && (activeChildOffsets[sliderNumber] > childrenOffsets.length-1)) {
875					activeChildOffsets[sliderNumber] = activeChildOffsets[sliderNumber] - numberOfSlides;
876				}
877				
878				var nextSlide = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + childrenOffsets.length + 1)%childrenOffsets.length;
879
880				helpers.changeSlide(nextSlide, scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings);
881				
882				helpers.autoSlide(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings);
883				
884			}, settings.autoSlideTimer + settings.autoSlideTransTimer);
885			
886		},
887		
888		autoSlidePause: function(sliderNumber) {
889
890			clearTimeout(autoSlideTimeouts[sliderNumber]);
891
892		},
893		
894		isUnselectable: function(node, settings) {
895
896			if(settings.unselectableSelector != '') {
897				if($(node).closest(settings.unselectableSelector).length == 1) return true;
898			}
899			
900			return false;
901			
902		},
903		
904		/* timers */
905		slowScrollHorizontalIntervalTimer: function(scrollIntervalTime, node, slideNodes, step, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, slide, originalOffsets, childrenOffsets, infiniteSliderWidth, numberOfSlides, slideNodeOuterWidths, sliderNumber, centeredSlideOffset, endOffset, settings) {
906		
907			var scrollTimeout = setTimeout(function() {
908				helpers.slowScrollHorizontalInterval(node, slideNodes, step, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, slide, originalOffsets, childrenOffsets, infiniteSliderWidth, numberOfSlides, slideNodeOuterWidths, sliderNumber, centeredSlideOffset, endOffset, settings);
909			}, scrollIntervalTime);
910			
911			return scrollTimeout;
912		
913		},
914		
915		onSlideCompleteTimer: function(scrollIntervalTime, settings, node, slideNode, slide, scrollbarNumber) {
916
917			var scrollTimeout = setTimeout(function() {
918				helpers.onSlideComplete(settings, node, slideNode, slide, scrollbarNumber);
919			}, scrollIntervalTime);
920			
921			return scrollTimeout;
922		
923		},
924		
925		hideScrollbarIntervalTimer: function(scrollIntervalTime, newOffset, opacity, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber, settings) {
926
927			var scrollTimeout = setTimeout(function() {
928				helpers.hideScrollbarInterval(newOffset, opacity, scrollbarClass, scrollbarWidth, stageWidth, scrollMargin, scrollBorder, sliderNumber, settings);
929			}, scrollIntervalTime);
930		
931			return scrollTimeout;
932		
933		},
934						
935		args: function(func, settings, node, activeSlideNode, newChildOffset, targetSlideOffset) {
936			
937			this.prevSlideNumber = ($(node).parent().data('args') == undefined) ? undefined : $(node).parent().data('args').prevSlideNumber;
938			this.prevSlideObject = ($(node).parent().data('args') == undefined) ? undefined : $(node).parent().data('args').prevSlideObject;
939			this.targetSlideNumber = targetSlideOffset + 1;
940			this.targetSlideObject = $(node).children(':eq(' + targetSlideOffset + ')');
941			this.slideChanged = false;
942			
943			if(func == 'load') {
944				this.targetSlideNumber = undefined;
945				this.targetSlideObject = undefined;
946			} else if(func == 'start') {
947				this.targetSlideNumber = undefined;
948				this.targetSlideObject = undefined;
949			} else if(func == 'change') {
950				this.slideChanged = true;
951				this.prevSlideNumber = ($(node).parent().data('args') == undefined) ? settings.startAtSlide : $(node).parent().data('args').currentSlideNumber;
952				this.prevSlideObject = $(node).children(':eq(' + this.prevSlideNumber + ')');
953			} else if(func == 'complete') {
954				this.slideChanged = $(node).parent().data('args').slideChanged;
955			}
956			
957			this.settings = settings;
958			this.data = $(node).parent().data('iosslider');
959			this.sliderObject = node;
960			this.sliderContainerObject = $(node).parent();
961
962			this.currentSlideObject = activeSlideNode;
963			this.currentSlideNumber = newChildOffset + 1;
964			this.currentSliderOffset = helpers.getSliderOffset(node, 'x') * -1;
965			
966		},
967		
968		preventDrag: function(event) {
969			event.preventDefault();
970		},
971		
972		preventClick: function(event) {
973			event.stopImmediatePropagation();
974			return false;
975		},
976		
977		enableClick: function() {
978			return true;
979		}
980        
981    }
982    
983    helpers.setBrowserInfo();
984    
985    var methods = {
986		
987		init: function(options, node) {
988
989			has3DTransform = helpers.has3DTransform();
990			
991			var settings = $.extend(true, {
992				'elasticPullResistance': 0.6, 		
993				'frictionCoefficient': 0.92,
994				'elasticFrictionCoefficient': 0.6,
995				'snapFrictionCoefficient': 0.92,
996				'snapToChildren': false,
997				'snapSlideCenter': false,
998				'startAtSlide': 1,
999				'scrollbar': false,
1000				'scrollbarDrag': false,
1001				'scrollbarHide': true,
1002				'scrollbarLocation': 'top',
1003				'scrollbarContainer': '',
1004				'scrollbarOpacity': 0.4,
1005				'scrollbarHeight': '4px',
1006				'scrollbarBorder': '0',
1007				'scrollbarMargin': '5px',
1008				'scrollbarBackground': '#000',
1009				'scrollbarBorderRadius': '100px',
1010				'scrollbarShadow': '0 0 0 #000',
1011				'scrollbarElasticPullResistance': 0.9,
1012				'desktopClickDrag': false,
1013				'keyboardControls': false,
1014				'tabToAdvance': false,
1015				'responsiveSlideContainer': true,
1016				'responsiveSlides': true,
1017				'navSlideSelector': '',
1018				'navPrevSelector': '',
1019				'navNextSelector': '',
1020				'autoSlideToggleSelector': '',
1021				'autoSlide': false,
1022				'autoSlideTimer': 5000,
1023				'autoSlideTransTimer': 750,
1024				'autoSlideHoverPause': true,
1025				'infiniteSlider': false,
1026				'snapVelocityThreshold': 5,
1027				'slideStartVelocityThreshold': 0,
1028				'horizontalSlideLockThreshold': 5,
1029				'verticalSlideLockThreshold': 3,
1030				'stageCSS': {
1031					position: 'relative',
1032					top: '0',
1033					left: '0',
1034					overflow: 'hidden',
1035					zIndex: 1
1036				},
1037				'unselectableSelector': '',
1038				'onSliderLoaded': '',
1039				'onSliderUpdate': '',
1040				'onSliderResize': '',
1041				'onSlideStart': '',
1042				'onSlideChange': '',
1043				'onSlideComplete': ''
1044			}, options);
1045			
1046			if(node == undefined) {
1047				node = this;
1048			}
1049			
1050			return $(node).each(function(i) {
1051				
1052				scrollbarNumber++;
1053				var sliderNumber = scrollbarNumber;
1054				var scrollTimeouts = new Array();
1055				iosSliderSettings[sliderNumber] = $.extend({}, settings);
1056				sliderMin[sliderNumber] = 0;
1057				sliderMax[sliderNumber] = 0;
1058				var minTouchpoints = 0;
1059				var xCurrentScrollRate = new Array(0, 0);
1060				var yCurrentScrollRate = new Array(0, 0);
1061				var scrollbarBlockClass = 'scrollbarBlock' + scrollbarNumber;
1062				var scrollbarClass = 'scrollbar' + scrollbarNumber;
1063				var scrollbarNode;
1064				var scrollbarBlockNode;
1065				var scrollbarStageWidth;
1066				var scrollbarWidth;
1067				var containerWidth;
1068				var containerHeight;
1069				var centeredSlideOffset = 0;
1070				var stageNode = $(this);
1071				var stageWidth;
1072				var stageHeight;
1073				var slideWidth;
1074				var scrollMargin;
1075				var scrollBorder;
1076				var lastTouch;
1077				var isFirstInit = true;
1078				var newChildOffset = -1;
1079				var webkitTransformArray = new Array();
1080				var childrenOffsets;
1081				var originalOffsets = new Array();
1082				var scrollbarStartOpacity = 0;
1083				var xScrollStartPosition = 0;
1084				var yScrollStartPosition = 0;
1085				var currentTouches = 0;
1086				var scrollerNode = $(this).children(':first-child');
1087				var slideNodes;
1088				var slideNodeWidths;
1089				var slideNodeOuterWidths;
1090				var numberOfSlides = $(scrollerNode).children().not('script').length;
1091				var xScrollStarted = false;
1092				var lastChildOffset = 0;
1093				var isMouseDown = false;
1094				var currentSlider = undefined;
1095				var sliderStopLocation = 0;
1096				var infiniteSliderWidth;
1097				infiniteSliderOffset[sliderNumber] = 0;
1098				var shortContent = false;
1099				onChangeEventLastFired[sliderNumber] = -1;
1100				var isAutoSlideToggleOn = false;
1101				iosSliders[sliderNumber] = stageNode;
1102				isEventCleared[sliderNumber] = false;
1103				var currentEventNode;
1104				var intermediateChildOffset = 0;
1105				var tempInfiniteSliderOffset = 0;
1106				var preventXScroll = false;
1107				var snapOverride = false;
1108				var clickEvent = 'touchstart.iosSliderEvent click.iosSliderEvent';
1109				var scrollerWidth;
1110				var anchorEvents;
1111				var onclickEvents;
1112				var allScrollerNodeChildren;
1113				touchLocks[sliderNumber] = false;
1114				slideTimeouts[sliderNumber] = new Array();
1115				if(settings.scrollbarDrag) {
1116					settings.scrollbar = true;
1117					settings.scrollbarHide = false;
1118				}
1119				var $this = $(this);
1120				var data = $this.data('iosslider');	
1121				if(data != undefined) return true;
1122           		
1123           		$(this).find('img').bind('dragstart.iosSliderEvent', function(event) { event.preventDefault(); });
1124
1125				if(settings.infiniteSlider) {
1126					settings.scrollbar = false;
1127				}
1128				
1129				if(settings.infiniteSlider && (numberOfSlides == 1)) {
1130					settings.infiniteSlider = false;
1131				}
1132						
1133				if(settings.scrollbar) {
1134					
1135					if(settings.scrollbarContainer != '') {
1136						$(settings.scrollbarContainer).append("<div class = '" + scrollbarBlockClass + "'><div class = '" + scrollbarClass + "'></div></div>");
1137					} else {
1138						$(scrollerNode).parent().append("<div class = '" + scrollbarBlockClass + "'><div class = '" + scrollbarClass + "'></div></div>");
1139					}
1140				
1141				}
1142				
1143				if(!init()) return true;
1144				
1145				$(this).find('a').bind('mousedown', helpers.preventDrag);
1146				$(this).find("[onclick]").bind('click', helpers.preventDrag).each(function() {
1147						
1148					$(this).data('onclick', this.onclick);
1149				
1150				});
1151				
1152				var newChildOffset = helpers.calcActiveOffset(settings, helpers.getSliderOffset($(scrollerNode), 'x'), childrenOffsets, stageWidth, infiniteSliderOffset[sliderNumber], numberOfSlides, undefined, sliderNumber);
1153				var tempOffset = (newChildOffset + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides;
1154				
1155				var args = new helpers.args('load', settings, scrollerNode, $(scrollerNode).children(':eq(' + tempOffset + ')'), tempOffset, tempOffset);
1156				$(stageNode).data('args', args);
1157
1158				if(settings.onSliderLoaded != '') {
1159
1160					settings.onSliderLoaded(args);
1161					
1162				}
1163				
1164				onChangeEventLastFired[sliderNumber] = tempOffset;
1165
1166				function init() {
1167					
1168					helpers.autoSlidePause(sliderNumber);
1169					
1170					anchorEvents = $(scrollerNode).find('a');
1171					onclickEvents = $(scrollerNode).find('[onclick]');
1172					allScrollerNodeChildren = $(scrollerNode).find('*');
1173					
1174					$(stageNode).css('width', '');
1175					$(stageNode).css('height', '');
1176					$(scrollerNode).css('width', '');
1177					slideNodes = $(scrollerNode).children().not('script').get();
1178					slideNodeWidths = new Array();
1179					slideNodeOuterWidths = new Array();
1180					
1181					if(settings.responsiveSlides) {
1182						$(slideNodes).css('width', '');
1183					}
1184					
1185					sliderMax[sliderNumber] = 0;
1186					childrenOffsets = new Array();
1187					containerWidth = $(stageNode).parent().width();
1188					stageWidth = $(stageNode).outerWidth(true);
1189					
1190					if(settings.responsiveSlideContainer) {
1191						stageWidth = ($(stageNode).outerWidth(true) > containerWidth) ? containerWidth : $(stageNode).width();
1192					}
1193
1194					$(stageNode).css({
1195						position: settings.stageCSS.position,
1196						top: settings.stageCSS.top,
1197						left: settings.stageCSS.left,
1198						overflow: settings.stageCSS.overflow,
1199						zIndex: settings.stageCSS.zIndex,
1200						'webkitPerspective': 1000,
1201						'webkitBackfaceVisibility': 'hidden',
1202						'msTouchAction': 'pan-y',
1203						width: stageWidth
1204					});
1205					
1206					$(settings.unselectableSelector).css({
1207						cursor: 'default'
1208					});
1209						
1210					for(var j = 0; j < slideNodes.length; j++) {
1211						
1212						slideNodeWidths[j] = $(slideNodes[j]).width();
1213						slideNodeOuterWidths[j] = $(slideNodes[j]).outerWidth(true);
1214						var newWidth = slideNodeOuterWidths[j];
1215						
1216						if(settings.responsiveSlides) {
1217
1218							if(slideNodeOuterWidths[j] > stageWidth) {
1219								
1220								newWidth = stageWidth + (slideNodeOuterWidths[j] - slideNodeWidths[j]) * -1;
1221								slideNodeWidths[j] = newWidth;
1222								slideNodeOuterWidths[j] = stageWidth;
1223								
1224							} else {
1225
1226								newWidth = slideNodeWidths[j];
1227								
1228							}
1229							
1230							$(slideNodes[j]).css({
1231								width: newWidth
1232							});
1233					
1234						}
1235						
1236						$(slideNodes[j]).css({
1237							'webkitBackfaceVisibility': 'hidden',
1238							overflow: 'hidden',
1239							position: 'absolute'
1240						});
1241						
1242						childrenOffsets[j] = sliderMax[sliderNumber] * -1;
1243						
1244						sliderMax[sliderNumber] = sliderMax[sliderNumber] + newWidth + (slideNodeOuterWidths[j] - slideNodeWidths[j]);
1245					
1246					}
1247					
1248					if(settings.snapSlideCenter) {
1249						centeredSlideOffset = (stageWidth - slideNodeOuterWidths[0]) * 0.5;
1250						
1251						if(settings.responsiveSlides && (slideNodeOuterWidths[0] > stageWidth)) {
1252							centeredSlideOffset = 0;
1253						}
1254					}
1255					
1256					sliderAbsMax[sliderNumber] = sliderMax[sliderNumber] * 2;
1257					
1258					for(var j = 0; j < slideNodes.length; j++) {
1259						
1260						helpers.setSliderOffset($(slideNodes[j]), childrenOffsets[j] * -1 + sliderMax[sliderNumber] + centeredSlideOffset);
1261						
1262						childrenOffsets[j] = childrenOffsets[j] - sliderMax[sliderNumber];
1263					
1264					}
1265					
1266					if(!settings.infiniteSlider && !settings.snapSlideCenter) {
1267					
1268						for(var i = 0; i < childrenOffsets.length; i++) {
1269							
1270							if(childrenOffsets[i] <= ((sliderMax[sliderNumber] * 2 - stageWidth) * -1)) {
1271								break;
1272							}
1273							
1274							lastChildOffset = i;
1275							
1276						}
1277						
1278						childrenOffsets.splice(lastChildOffset + 1, childrenOffsets.length);
1279						childrenOffsets[childrenOffsets.length] = (sliderMax[sliderNumber] * 2 - stageWidth) * -1;
1280					
1281					}
1282					
1283					for(var i = 0; i < childrenOffsets.length; i++) {
1284						originalOffsets[i] = childrenOffsets[i];
1285					}
1286					
1287					if(isFirstInit) {
1288						
1289						iosSliderSettings[sliderNumber].startAtSlide = (iosSliderSettings[sliderNumber].startAtSlide > childrenOffsets.length) ? childrenOffsets.length : iosSliderSettings[sliderNumber].startAtSlide;
1290						if(settings.infiniteSlider) {
1291							iosSliderSettings[sliderNumber].startAtSlide = (iosSliderSettings[sliderNumber].startAtSlide - 1 + numberOfSlides)%numberOfSlides;
1292							activeChildOffsets[sliderNumber] = (iosSliderSettings[sliderNumber].startAtSlide);
1293						} else {
1294							iosSliderSettings[sliderNumber].startAtSlide = ((iosSliderSettings[sliderNumber].startAtSlide - 1) < 0) ? childrenOffsets.length-1 : iosSliderSettings[sliderNumber].startAtSlide;	
1295							activeChildOffsets[sliderNumber] = (iosSliderSettings[sliderNumber].startAtSlide-1);
1296						}
1297						activeChildInfOffsets[sliderNumber] = activeChildOffsets[sliderNumber];
1298					}
1299					
1300					sliderMin[sliderNumber] = sliderMax[sliderNumber] + centeredSlideOffset;
1301
1302					$(scrollerNode).css({
1303						position: 'relative',
1304						cursor: grabOutCursor,
1305						'webkitPerspective': '0',
1306						'webkitBackfaceVisibility': 'hidden',
1307						width: sliderMax[sliderNumber] + 'px'
1308					});
1309					
1310					scrollerWidth = sliderMax[sliderNumber];
1311					sliderMax[sliderNumber] = sliderMax[sliderNumber] * 2 - stageWidth + centeredSlideOffset * 2;
1312					
1313					shortContent = ((scrollerWidth < stageWidth) || (stageWidth == 0)) ? true : false;
1314
1315					if(shortContent) {
1316						
1317						$(scrollerNode).css({
1318							cursor: 'default'
1319						});
1320						
1321					}
1322					
1323					containerHeight = $(stageNode).parent().outerHeight(true);
1324					stageHeight = $(stageNode).height();
1325					
1326					if(settings.responsiveSlideContainer) {
1327						stageHeight = (stageHeight > containerHeight) ? containerHeight : stageHeight;
1328					}
1329					
1330					$(stageNode).css({
1331						height: stageHeight
1332					});
1333
1334					helpers.setSliderOffset(scrollerNode, childrenOffsets[activeChildOffsets[sliderNumber]]);
1335					
1336					if(settings.infiniteSlider && !shortContent) {
1337						
1338						var currentScrollOffset = helpers.getSliderOffset($(scrollerNode), 'x');
1339						var count = (infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides * -1;
1340						
1341						while(count < 0) {
1342							
1343							var lowSlideNumber = 0;
1344							var lowSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x');
1345							$(slideNodes).each(function(i) {
1346								
1347								if(helpers.getSliderOffset(this, 'x') < lowSlideOffset) {
1348									lowSlideOffset = helpers.getSliderOffset(this, 'x');
1349									lowSlideNumber = i;
1350								}
1351								
1352							});
1353							
1354							var newOffset = sliderMin[sliderNumber] + scrollerWidth;
1355							helpers.setSliderOffset($(slideNodes)[lowSlideNumber], newOffset);
1356							
1357							sliderMin[sliderNumber] = childrenOffsets[1] * -1 + centeredSlideOffset;
1358							sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
1359
1360							childrenOffsets.splice(0, 1);
1361							childrenOffsets.splice(childrenOffsets.length, 0, newOffset * -1 + centeredSlideOffset);
1362
1363							count++;
1364							
1365						}
1366						
1367						while(((childrenOffsets[0] * -1 - scrollerWidth + centeredSlideOffset) > 0) && settings.snapSlideCenter && isFirstInit) {
1368							
1369							var highSlideNumber = 0;
1370							var highSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x');
1371							$(slideNodes).each(function(i) {
1372								
1373								if(helpers.getSliderOffset(this, 'x') > highSlideOffset) {
1374									highSlideOffset = helpers.getSliderOffset(this, 'x');
1375									highSlideNumber = i;
1376								}
1377								
1378							});
1379
1380							var newOffset = sliderMin[sliderNumber] - slideNodeOuterWidths[highSlideNumber];
1381							helpers.setSliderOffset($(slideNodes)[highSlideNumber], newOffset);
1382							
1383							childrenOffsets.splice(0, 0, newOffset * -1 + centeredSlideOffset);
1384							childrenOffsets.splice(childrenOffsets.length-1, 1);
1385
1386							sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset;
1387							sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
1388
1389							infiniteSliderOffset[sliderNumber]--;
1390							activeChildOffsets[sliderNumber]++;
1391							
1392						}
1393						
1394						while(currentScrollOffset <= (sliderMax[sliderNumber] * -1)) {
1395							
1396							var lowSlideNumber = 0;
1397							var lowSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x');
1398							$(slideNodes).each(function(i) {
1399								
1400								if(helpers.getSliderOffset(this, 'x') < lowSlideOffset) {
1401									lowSlideOffset = helpers.getSliderOffset(this, 'x');
1402									lowSlideNumber = i;
1403								}
1404								
1405							});
1406							
1407							var newOffset = sliderMin[sliderNumber] + scrollerWidth;
1408							helpers.setSliderOffset($(slideNodes)[lowSlideNumber], newOffset);	
1409							
1410							sliderMin[sliderNumber] = childrenOffsets[1] * -1 + centeredSlideOffset;
1411							sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
1412
1413							childrenOffsets.splice(0, 1);
1414							childrenOffsets.splice(childrenOffsets.length, 0, newOffset * -1 + centeredSlideOffset);
1415
1416							infiniteSliderOffset[sliderNumber]++;
1417							activeChildOffsets[sliderNumber]--;
1418							
1419						}
1420					
1421					}
1422					
1423					helpers.setSliderOffset(scrollerNode, childrenOffsets[activeChildOffsets[sliderNumber]]);
1424					
1425					if(!settings.desktopClickDrag) {
1426						
1427						$(scrollerNode).css({
1428							cursor: 'default'
1429						});
1430						
1431					}
1432					
1433					if(settings.scrollbar) {
1434						
1435						$('.' + scrollbarBlockClass).css({ 
1436							margin: settings.scrollbarMargin,
1437							overflow: 'hidden',
1438							display: 'none'
1439						});
1440						
1441						$('.' + scrollbarBlockClass + ' .' + scrollbarClass).css({ 
1442							border: settings.scrollbarBorder
1443						});
1444						
1445						scrollMargin = parseInt($('.' + scrollbarBlockClass).css('marginLeft')) + parseInt($('.' + scrollbarBlockClass).css('marginRight'));
1446						scrollBorder = parseInt($('.' + scrollbarBlockClass + ' .' + scrollbarClass).css('borderLeftWidth'), 10) + parseInt($('.' + scrollbarBlockClass + ' .' + scrollbarClass).css('borderRightWidth'), 10);
1447						scrollbarStageWidth = (settings.scrollbarContainer != '') ? $(settings.scrollbarContainer).width() : stageWidth;
1448						scrollbarWidth = (stageWidth / scrollerWidth) * (scrollbarStageWidth - scrollMargin);
1449		
1450						if(!settings.scrollbarHide) {
1451							scrollbarStartOpacity = settings.scrollbarOpacity;
1452						}
1453						
1454						$('.' + scrollbarBlockClass).css({ 
1455							position: 'absolute',
1456							left: 0,
1457							width: scrollbarStageWidth - scrollMargin + 'px',
1458							margin: settings.scrollbarMargin
1459						});
1460						
1461						if(settings.scrollbarLocation == 'top') {
1462							$('.' + scrollbarBlockClass).css('top', '0');
1463						} else {
1464							$('.' + scrollbarBlockClass).css('bottom', '0');
1465						}
1466
1467						$('.' + scrollbarBlockClass + ' .' + scrollbarClass).css({ 
1468							borderRadius: settings.scrollbarBorderRadius,
1469							background: settings.scrollbarBackground,
1470							height: settings.scrollbarHeight,
1471							width: scrollbarWidth - scrollBorder + 'px',
1472							minWidth: settings.scrollbarHeight,
1473							border: settings.scrollbarBorder,
1474							'webkitPerspective': 1000,
1475							'webkitBackfaceVisibility': 'hidden',
1476							'position': 'relative',
1477							opacity: scrollbarStartOpacity,
1478							filter: 'alpha(opacity:' + (scrollbarStartOpacity * 100) + ')',
1479							boxShadow: settings.scrollbarShadow
1480						});
1481						
1482						helpers.setSliderOffset($('.' + scrollbarBlockClass + ' .' + scrollbarClass), Math.floor((childrenOffsets[activeChildOffsets[sliderNumber]] * -1 - sliderMin[sliderNumber] + centeredSlideOffset) / (sliderMax[sliderNumber] - sliderMin[sliderNumber] + centeredSlideOffset) * (scrollbarStageWidth - scrollMargin - scrollbarWidth)));
1483		
1484						$('.' + scrollbarBlockClass).css({
1485							display: 'block'
1486						});
1487						
1488						scrollbarNode = $('.' + scrollbarBlockClass + ' .' + scrollbarClass);
1489						scrollbarBlockNode = $('.' + scrollbarBlockClass);						
1490						
1491					}
1492					
1493					if(settings.scrollbarDrag && !shortContent) {
1494						$('.' + scrollbarBlockClass + ' .' + scrollbarClass).css({
1495							cursor: grabOutCursor
1496						});
1497					}
1498					
1499					if(settings.infiniteSlider) {
1500					
1501						infiniteSliderWidth = (sliderMax[sliderNumber] + stageWidth) / 3;
1502						
1503					}
1504					
1505					if(settings.navSlideSelector != '') {
1506								
1507						$(settings.navSlideSelector).each(function(j) {
1508						
1509							$(this).css({
1510								cursor: 'pointer'
1511							});
1512							
1513							$(this).unbind(clickEvent).bind(clickEvent, function(e) {
1514								
1515								if(e.type == 'touchstart') {
1516									$(this).unbind('click.iosSliderEvent');
1517								} else {
1518									$(this).unbind('touchstart.iosSliderEvent');
1519								}
1520								clickEvent = e.type + '.iosSliderEvent';
1521
1522								helpers.changeSlide(j, scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings);
1523								
1524							});
1525						
1526						});
1527								
1528					}	
1529					
1530					if(settings.navPrevSelector != '') {
1531						
1532						$(settings.navPrevSelector).css({
1533							cursor: 'pointer'
1534						});
1535						
1536						$(settings.navPrevSelector).unbind(clickEvent).bind(clickEvent, function(e) {	
1537							
1538							if(e.type == 'touchstart') {
1539								$(this).unbind('click.iosSliderEvent');
1540							} else {
1541								$(this).unbind('touchstart.iosSliderEvent');
1542							}
1543							clickEvent = e.type + '.iosSliderEvent';
1544
1545							var slide = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides;
1546											
1547							if((slide > 0) || settings.infiniteSlider) {
1548								helpers.changeSlide(slide - 1, scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings);
1549							}
1550						});
1551					
1552					}
1553					
1554					if(settings.navNextSelector != '') {
1555						
1556						$(settings.navNextSelector).css({
1557							cursor: 'pointer'
1558						});
1559						
1560						$(settings.navNextSelector).unbind(clickEvent).bind(clickEvent, function(e) {
1561							
1562							if(e.type == 'touchstart') {
1563								$(this).unbind('click.iosSliderEvent');
1564							} else {
1565								$(this).unbind('touchstart.iosSliderEvent');
1566							}
1567							clickEvent = e.type + '.iosSliderEvent';
1568							
1569							var slide = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides;
1570							
1571							if((slide < childrenOffsets.length-1) || settings.infiniteSlider) {
1572								helpers.changeSlide(slide + 1, scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings);
1573							}
1574						});
1575					
1576					}
1577					
1578					if(settings.autoSlide && !shortContent) {
1579						
1580						if(settings.autoSlideToggleSelector != '') {
1581						
1582							$(settings.autoSlideToggleSelector).css({
1583								cursor: 'pointer'
1584							});
1585							
1586							$(settings.autoSlideToggleSelector).unbind(clickEvent).bind(clickEvent, function(e) {
1587								
1588								if(e.type == 'touchstart') {
1589									$(this).unbind('click.iosSliderEvent');
1590								} else {
1591									$(this).unbind('touchstart.iosSliderEvent');
1592								}
1593								clickEvent = e.type + '.iosSliderEvent';
1594							
1595								if(!isAutoSlideToggleOn) {
1596								
1597									helpers.autoSlidePause(sliderNumber);
1598									isAutoSlideToggleOn = true;
1599									
1600									$(settings.autoSlideToggleSelector).addClass('on');
1601									
1602								} else {
1603									
1604									helpers.autoSlide(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings);
1605									
1606									isAutoSlideToggleOn = false;
1607									
1608									$(settings.autoSlideToggleSelector).removeClass('on');
1609									
1610								}
1611							
1612							});
1613						
1614						}
1615					
1616					}
1617					
1618					helpers.autoSlide(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings);
1619
1620					$(stageNode).bind('mouseleave.iosSliderEvent', function() {
1621
1622						helpers.autoSlide(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings);
1623						
1624					});
1625					
1626					$(stageNode).bind('touchend.iosSliderEvent', function() {
1627					
1628						helpers.autoSlide(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings);
1629					
1630					});
1631
1632					if(settings.autoSlideHoverPause) {
1633						$(stageNode).bind('mouseenter.iosSliderEvent', function() {
1634							helpers.autoSlidePause(sliderNumber);
1635						});
1636					}
1637					
1638					$(stageNode).data('iosslider', {
1639						obj: $this,
1640						settings: settings,
1641						scrollerNode: scrollerNode,
1642						slideNodes: slideNodes,
1643						numberOfSlides: numberOfSlides,
1644						centeredSlideOffset: centeredSlideOffset,
1645						sliderNumber: sliderNumber,
1646						originalOffsets: originalOffsets,
1647						childrenOffsets: childrenOffsets,
1648						sliderMax: sliderMax[sliderNumber],
1649						scrollbarClass: scrollbarClass,
1650						scrollbarWidth: scrollbarWidth, 
1651						scrollbarStageWidth: scrollbarStageWidth,
1652						stageWidth: stageWidth, 
1653						scrollMargin: scrollMargin, 
1654						scrollBorder: scrollBorder, 
1655						infiniteSliderOffset: infiniteSliderOffset[sliderNumber], 
1656						infiniteSliderWidth: infiniteSliderWidth,
1657						slideNodeOuterWidths: slideNodeOuterWidths
1658					});
1659					
1660					isFirstInit = false;
1661					
1662					return true;
1663				
1664				}
1665				
1666				if(iosSliderSettings[sliderNumber].responsiveSlides || iosSliderSettings[sliderNumber].responsiveSlideContainer) {
1667					
1668					var orientationEvent = supportsOrientationChange ? 'orientationchange' : 'resize';
1669					
1670					$(window).bind(orientationEvent + '.iosSliderEvent-' + sliderNumber, function() {
1671
1672						if(!init()) return true;
1673						
1674						var args = $(stageNode).data('args');
1675				
1676						if(settings.onSliderResize != '') {
1677					    	settings.onSliderResize(args);
1678					    }
1679						
1680					});
1681					
1682				}
1683				
1684				if((settings.keyboardControls || settings.tabToAdvance) && !shortContent) {
1685
1686					$(document).bind('keydown.iosSliderEvent', function(e) {
1687						
1688						if((!isIe7) && (!isIe8)) {
1689							var e = e.originalEvent;
1690						}
1691						
1692						if((e.keyCode == 37) && settings.keyboardControls) {
1693							
1694							e.preventDefault();
1695							
1696							var slide = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides;
1697
1698							if((slide > 0) || settings.infiniteSlider) {
1699								helpers.changeSlide(slide - 1, scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings);
1700							} 
1701								
1702						} else if(((e.keyCode == 39) && settings.keyboardControls) || ((e.keyCode == 9) && settings.tabToAdvance)) {
1703							
1704							e.preventDefault();
1705							
1706							var slide = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides;
1707								
1708							if((slide < childrenOffsets.length-1) || settings.infiniteSlider) {
1709								helpers.changeSlide(slide + 1, scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, centeredSlideOffset, settings);
1710							}
1711								
1712						}
1713					
1714					});
1715					
1716				}
1717					
1718				if(isTouch || settings.desktopClickDrag) {
1719					
1720					var touchStartFlag = false;
1721					var touchSelection = $(scrollerNode);
1722					var touchSelectionMove = $(scrollerNode);
1723					var preventDefault = null;
1724					var isUnselectable = false;
1725					
1726					if(settings.scrollbarDrag) {
1727					
1728						touchSelection = touchSelection.add(scrollbarNode);
1729						touchSelectionMove = touchSelectionMove.add(scrollbarBlockNode);
1730
1731					}
1732					
1733					$(touchSelection).bind('mousedown.iosSliderEvent touchstart.iosSliderEvent', function(e) {
1734						
1735						if(touchStartFlag) return true;
1736						touchStartFlag = true;
1737						
1738						if(e.type == 'touchstart') {
1739							$(touchSelectionMove).unbind('mousedown.iosSliderEvent');
1740						} else {
1741							$(touchSelectionMove).unbind('touchstart.iosSliderEvent');
1742						}
1743						
1744						if(touchLocks[sliderNumber] || shortContent) {
1745							touchStartFlag = false;
1746							xScrollStarted = false;
1747							return true;
1748						}
1749						
1750						isUnselectable = helpers.isUnselectable(e.target, settings);
1751						
1752						if(isUnselectable) {
1753							touchStartFlag = false;
1754							xScrollStarted = false;
1755							return true;
1756						}
1757						
1758						currentEventNode = ($(this)[0] === $(scrollbarNode)[0]) ? scrollbarNode : scrollerNode;
1759
1760						if((!isIe7) && (!isIe8)) {
1761							var e = e.originalEvent;
1762						}
1763
1764						helpers.autoSlidePause(sliderNumber);
1765						
1766						allScrollerNodeChildren.unbind('.disableClick');
1767						
1768						if(e.type == 'touchstart') {
1769							
1770							eventX = e.touches[0].pageX;
1771							eventY = e.touches[0].pageY;
1772							
1773						} else {
1774						
1775							if (window.getSelection) {
1776								if (window.getSelection().empty) {
1777									window.getSelection().empty();
1778								} else if (window.getSelection().removeAllRanges) {
1779									window.getSelection().removeAllRanges();
1780								}
1781							} else if (document.selection) {
1782								if(isIe8) {
1783									try { document.selection.empty(); } catch(e) { /* absorb ie8 bug */ }
1784								} else {
1785									document.selection.empty();
1786								}
1787							}
1788							
1789							eventX = e.pageX;
1790							eventY = e.pageY;
1791							
1792							isMouseDown = true;
1793							currentSlider = scrollerNode;
1794
1795							$(this).css({
1796								cursor: grabInCursor
1797							});
1798
1799						}
1800						
1801						xCurrentScrollRate = new Array(0, 0);
1802						yCurrentScrollRate = new Array(0, 0);
1803						xScrollDistance = 0;
1804						xScrollStarted = false;
1805						
1806						for(var j = 0; j < scrollTimeouts.length; j++) {
1807							clearTimeout(scrollTimeouts[j]);
1808						}
1809						
1810						var scrollPosition = helpers.getSliderOffset(scrollerNode, 'x');
1811
1812						if(scrollPosition > (sliderMin[sliderNumber] * -1 + centeredSlideOffset + scrollerWidth)) {
1813							
1814							scrollPosition = sliderMin[sliderNumber] * -1 + centeredSlideOffset + scrollerWidth;
1815
1816							helpers.setSliderOffset($('.' + scrollbarClass), scrollPosition);
1817							
1818							$('.' + scrollbarClass).css({
1819								width: (scrollbarWidth - scrollBorder) + 'px'
1820							});
1821							
1822						} else if(scrollPosition < (sliderMax[sliderNumber] * -1)) {
1823						
1824							scrollPosition = sliderMax[sliderNumber] * -1;
1825
1826							helpers.setSliderOffset($('.' + scrollbarClass), (scrollbarStageWidth - scrollMargin - scrollbarWidth));
1827							
1828							$('.' + scrollbarClass).css({
1829								width: (scrollbarWidth - scrollBorder) + 'px'
1830							});
1831							
1832						}
1833						
1834						var scrollbarSubtractor = ($(this)[0] === $(scrollbarNode)[0]) ? (sliderMin[sliderNumber]) : 0;
1835						
1836						xScrollStartPosition = (helpers.getSliderOffset(this, 'x') - eventX - scrollbarSubtractor) * -1;
1837						yScrollStartPosition = (helpers.getSliderOffset(this, 'y') - eventY) * -1;
1838						
1839						xCurrentScrollRate[1] = eventX;
1840						yCurrentScrollRate[1] = eventY;
1841						
1842						snapOverride = false;
1843
1844					});
1845					
1846					$(touchSelectionMove).bind('touchmove.iosSliderEvent mousemove.iosSliderEvent', function(e) {
1847						
1848						if((!isIe7) && (!isIe8)) {
1849							var e = e.originalEvent;
1850						}
1851						
1852						if(touchLocks[sliderNumber] || shortContent) return true;
1853						
1854						if(isUnselectable) return true;
1855						
1856						var edgeDegradation = 0;
1857						
1858						if(e.type == 'touchmove') {
1859						
1860							eventX = e.touches[0].pageX;
1861							eventY = e.touches[0].pageY;
1862							
1863						} else {
1864						
1865							if(window.getSelection) {
1866								if(window.getSelection().empty) {
1867									//window.getSelection().empty(); /* removed to enable input fields within the slider */
1868								} else if(window.getSelection().removeAllRanges) {
1869									window.getSelection().removeAllRanges();
1870								}
1871							} else if(document.selection) {
1872								if(isIe8) {
1873									try { document.selection.empty(); } catch(e) { /* absorb ie8 bug */ }
1874								} else {
1875									document.selection.empty();
1876								}
1877							}
1878						
1879							eventX = e.pageX;
1880							eventY = e.pageY;
1881							
1882							if(!isMouseDown) {
1883								return true;
1884							}
1885							
1886							if(!isIe) {
1887								if((typeof e.webkitMovementX != 'undefined' || typeof e.webkitMovementY != 'undefined') && e.
1887webkitMovementY === 0 && e.webkitMovementX === 0) {
1888									return true;
1889								}
1890							}
1891							
1892						}
1893						
1894						xCurrentScrollRate[0] = xCurrentScrollRate[1];
1895						xCurrentScrollRate[1] = eventX;
1896						xScrollDistance = (xCurrentScrollRate[1] - xCurrentScrollRate[0]) / 2;
1897						
1898						yCurrentScrollRate[0] = yCurrentScrollRate[1];
1899						yCurrentScrollRate[1] = eventY;
1900						yScrollDistance = (yCurrentScrollRate[1] - yCurrentScrollRate[0]) / 2;
1901
1902						if(!xScrollStarted) {
1903
1904							var slide = (activeChildOffsets[sliderNumber] + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides;
1905							var args = new helpers.args('start', settings, scrollerNode, $(scrollerNode).children(':eq(' + slide + ')'), slide, undefined);
1906							$(stageNode).data('args', args);
1907
1908							if(settings.onSlideStart != '') {
1909								settings.onSlideStart(args);
1910							}
1911							
1912						}
1913						
1914						if(((yScrollDistance > settings.verticalSlideLockThreshold) || (yScrollDistance < (settings.verticalSlideLockThreshold * -1))) && (e.type == 'touchmove') && (!xScrollStarted)) {
1915						
1916							preventXScroll = true;
1917							
1918						}
1919						
1920						if(((xScrollDistance > settings.horizontalSlideLockThreshold) || (xScrollDistance < (settings.horizontalSlideLockThreshold * -1))) && (e.type == 'touchmove')) {
1921						
1922							e.preventDefault();
1923							
1924						}
1925						
1926						if(((xScrollDistance > settings.slideStartVelocityThreshold) || (xScrollDistance < (settings.slideStartVelocityThreshold * -1)))) {
1927						
1928							xScrollStarted = true;
1929						
1930						}
1931						
1932						if(xScrollStarted && !preventXScroll) {
1933							
1934							var scrollPosition = helpers.getSliderOffset(scrollerNode, 'x');
1935							var scrollbarSubtractor = ($(currentEventNode)[0] === $(scrollbarNode)[0]) ? (sliderMin[sliderNumber]) : centeredSlideOffset;
1936							var scrollbarMultiplier = ($(currentEventNode)[0] === $(scrollbarNode)[0]) ? ((sliderMin[sliderNumber] - sliderMax[sliderNumber] - centeredSlideOffset) / (scrollbarStageWidth - scrollMargin - scrollbarWidth)) : 1;
1937							var elasticPullResistance = ($(currentEventNode)[0] === $(scrollbarNode)[0]) ? settings.scrollbarElasticPullResistance : settings.elasticPullResistance;
1938							var snapCenteredSlideOffset = (settings.snapSlideCenter && ($(currentEventNode)[0] === $(scrollbarNode)[0])) ? 0 : centeredSlideOffset;
1939							var snapCenteredSlideOffsetScrollbar = (settings.snapSlideCenter && ($(currentEventNode)[0] === $(scrollbarNode)[0])) ? centeredSlideOffset : 0;
1940
1941							if(e.type == 'touchmove') {
1942								if(currentTouches != e.touches.length) {
1943									xScrollStartPosition = (scrollPosition * -1) + eventX;
1944								}
1945								
1946								currentTouches = e.touches.length;
1947							}
1948
1949							if(settings.infiniteSlider) {
1950
1951								if(scrollPosition <= (sliderMax[sliderNumber] * -1)) {
1952									
1953									var scrollerWidth = $(scrollerNode).width();
1954									
1955									if(scrollPosition <= (sliderAbsMax[sliderNumber] * -1)) {
1956
1957										var sum = originalOffsets[0] * -1;
1958										$(slideNodes).each(function(i) {
1959											
1960											helpers.setSliderOffset($(slideNodes)[i], sum + centeredSlideOffset);
1961											if(i < childrenOffsets.length) {
1962												childrenOffsets[i] = sum * -1;
1963											}
1964											sum = sum + slideNodeOuterWidths[i];
1965											
1966										});
1967										
1968										xScrollStartPosition = xScrollStartPosition - childrenOffsets[0] * -1;
1969										sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset;
1970										sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
1971										infiniteSliderOffset[sliderNumber] = 0;
1972										
1973									} else {
1974
1975										var lowSlideNumber = 0;
1976										var lowSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x');
1977										$(slideNodes).each(function(i) {
1978											
1979											if(helpers.getSliderOffset(this, 'x') < lowSlideOffset) {
1980												lowSlideOffset = helpers.getSliderOffset(this, 'x');
1981												lowSlideNumber = i;
1982											}
1983											
1984										});
1985
1986										var newOffset = sliderMin[sliderNumber] + scrollerWidth;
1987										helpers.setSliderOffset($(slideNodes)[lowSlideNumber], newOffset);
1988										
1989										sliderMin[sliderNumber] = childrenOffsets[1] * -1 + centeredSlideOffset;
1990										sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
1991
1992										childrenOffsets.splice(0, 1);
1993										childrenOffsets.splice(childrenOffsets.length, 0, newOffset * -1 + centeredSlideOffset);
1994
1995										infiniteSliderOffset[sliderNumber]++;
1996										
1997									}
1998									
1999								}
2000								
2001								if((scrollPosition >= (sliderMin[sliderNumber] * -1)) || (scrollPosition >= 0)) {
2002		
2003									var scrollerWidth = $(scrollerNode).width();
2004									
2005									if(scrollPosition >= 0) {
2006
2007										var sum = originalOffsets[0] * -1;
2008										$(slideNodes).each(function(i) {
2009											
2010											helpers.setSliderOffset($(slideNodes)[i], sum + centeredSlideOffset);
2011											if(i < childrenOffsets.length) {
2012												childrenOffsets[i] = sum * -1;
2013											}
2014											sum = sum + slideNodeOuterWidths[i];
2015											
2016										});
2017										
2018										xScrollStartPosition = xScrollStartPosition + childrenOffsets[0] * -1;
2019										sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset;
2020										sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
2021										infiniteSliderOffset[sliderNumber] = numberOfSlides;
2022										
2023										while(((childrenOffsets[0] * -1 - scrollerWidth + centeredSlideOffset) > 0)) {
2024				
2025											var highSlideNumber = 0;
2026											var highSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x');
2027											$(slideNodes).each(function(i) {
2028												
2029												if(helpers.getSliderOffset(this, 'x') > highSlideOffset) {
2030													highSlideOffset = helpers.getSliderOffset(this, 'x');
2031													highSlideNumber = i;
2032												}
2033												
2034											});
2035				
2036											var newOffset = sliderMin[sliderNumber] - slideNodeOuterWidths[highSlideNumber];
2037											helpers.setSliderOffset($(slideNodes)[highSlideNumber], newOffset);
2038											
2039											childrenOffsets.splice(0, 0, newOffset * -1 + centeredSlideOffset);
2040											childrenOffsets.splice(childrenOffsets.length-1, 1);
2041				
2042											sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset;
2043											sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
2044				
2045											infiniteSliderOffset[sliderNumber]--;
2046											activeChildOffsets[sliderNumber]++;
2047											
2048										}
2049
2050									} else {
2051
2052										var highSlideNumber = 0;
2053										var highSlideOffset = helpers.getSliderOffset($(slideNodes[0]), 'x');
2054										$(slideNodes).each(function(i) {
2055											
2056											if(helpers.getSliderOffset(this, 'x') > highSlideOffset) {
2057												highSlideOffset = helpers.getSliderOffset(this, 'x');
2058												highSlideNumber = i;
2059											}
2060											
2061										});
2062										
2063										var newOffset = sliderMin[sliderNumber] - slideNodeOuterWidths[highSlideNumber];
2064										helpers.setSliderOffset($(slideNodes)[highSlideNumber], newOffset);									
2065
2066										childrenOffsets.splice(0, 0, newOffset * -1 + centeredSlideOffset);
2067										childrenOffsets.splice(childrenOffsets.length-1, 1);
2068
2069										sliderMin[sliderNumber] = childrenOffsets[0] * -1 + centeredSlideOffset;
2070										sliderMax[sliderNumber] = sliderMin[sliderNumber] + scrollerWidth - stageWidth;
2071
2072										infiniteSliderOffset[sliderNumber]--;
2073
2074									}
2075								
2076								}
2077								
2078							} else {
2079								
2080								var scrollerWidth = $(scrollerNode).width();
2081								
2082								if(scrollPosition > (sliderMin[sliderNumber] * -1 + centeredSlideOffset)) {
2083
2084									edgeDegradation = (sliderMin[sliderNumber] + ((xScrollStartPosition - scrollbarSubtractor - eventX + snapCenteredSlideOffset) * -1 * scrollbarMultiplier) - scrollbarSubtractor) * elasticPullResistance * -1 / scrollbarMultiplier;
2085									
2086								}
2087								
2088								if(scrollPosition < (sliderMax[sliderNumber] * -1)) {
2089									
2090									edgeDegradation = (sliderMax[sliderNumber] + snapCenteredSlideOffsetScrollbar + ((xScrollStartPosition - scrollbarSubtractor - eventX) * -1 * scrollbarMultiplier) - scrollbarSubtractor) * elasticPullResistance * -1 / scrollbarMultiplier;
2091										
2092								}
2093							
2094							}
2095							
2096							helpers.setSliderOffset(scrollerNode, ((xScrollStartPosition - scrollbarSubtractor - eventX - edgeDegradation) * -1 * scrollbarMultiplier) - scrollbarSubtractor + snapCenteredSlideOffsetScrollbar);
2097							
2098							if(settings.scrollbar) {
2099								
2100								helpers.showScrollbar(settings, scrollbarClass);
2101
2102								scrollbarDistance = Math.floor((xScrollStartPosition - eventX - edgeDegradation - sliderMin[sliderNumber] + snapCenteredSlideOffset) / (sliderMax[sliderNumber] - sliderMin[sliderNumber] + centeredSlideOffset) * (scrollbarStageWidth - scrollMargin - scrollbarWidth) * scrollbarMultiplier);
2103
2104								var width = scrollbarWidth;
2105								
2106								if(scrollbarDistance <= 0) {
2107
2108									width = scrollbarWidth - scrollBorder - (scrollbarDistance * -1);
2109									
2110									helpers.setSliderOffset($('.' + scrollbarClass), 0);
2111									
2112									$('.' + scrollbarClass).css({
2113										width: width + 'px'
2114									});
2115									
2116								} else if(scrollbarDistance >= (scrollbarStageWidth - scrollMargin - scrollBorder - scrollbarWidth)) {
2117
2118									width = scrollbarStageWidth - scrollMargin - scrollBorder - scrollbarDistance;
2119									
2120									helpers.setSliderOffset($('.' + scrollbarClass), scrollbarDistance);
2121									
2122									$('.' + scrollbarClass).css({
2123										width: width + 'px'
2124									});
2125									
2126								} else {
2127								
2128									helpers.setSliderOffset($('.' + scrollbarClass), scrollbarDistance);
2129									
2130								}
2131								
2132							}
2133							
2134							if(e.type == 'touchmove') {
2135								lastTouch = e.touches[0].pageX;
2136							}
2137							
2138							var slideChanged = false;
2139							var newChildOffset = helpers.calcActiveOffset(settings, (xScrollStartPosition - eventX - edgeDegradation) * -1, childrenOffsets, stageWidth, infiniteSliderOffset[sliderNumber], numberOfSlides, undefined, sliderNumber);
2140							var tempOffset = (newChildOffset + infiniteSliderOffset[sliderNumber] + numberOfSlides)%numberOfSlides;
2141							
2142							if(settings.infiniteSlider) {
2143								
2144								if(tempOffset != activeChildInfOffsets[sliderNumber]) {
2145									slideChanged = true;
2146								}
2147									
2148							} else {
2149							
2150								if(newChildOffset != activeChildOffsets[sliderNumber]) {
2151									slideChanged = true;
2152								}
2153							
2154							}
2155
2156							if(slideChanged) {
2157								
2158								activeChildOffsets[sliderNumber] = newChildOffset;
2159								activeChildInfOffsets[sliderNumber] = tempOffset;
2160								snapOverride = true;
2161								
2162								var args = new helpers.args('change', settings, scrollerNode, $(scrollerNode).children(':eq(' + tempOffset + ')'), tempOffset, tempOffset);
2163								$(stageNode).data('args', args);
2164								
2165								if(settings.onSlideChange != '') {
2166									settings.onSlideChange(args);
2167								}
2168								
2169							}
2170							
2171						}
2172						
2173						touchStartFlag = false;
2174						
2175					});
2176					
2177					var eventObject = $(window);
2178
2179					if(isIe8 || isIe7) {
2180						var eventObject = $(document); 
2181					}
2182					
2183					$(touchSelection).bind('touchend.iosSliderEvent', function(e) {
2184						
2185						var e = e.originalEvent;
2186						
2187						if(touchLocks[sliderNumber] || shortContent) return true;
2188						
2189						if(isUnselectable) return true;
2190						
2191						if(e.touches.length != 0) {
2192							
2193							for(var j = 0; j < e.touches.length; j++) {
2194								
2195								if(e.touches[j].pageX == lastTouch) {
2196									helpers.slowScrollHorizontal(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, xScrollDistance, yScrollDistance, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, currentEventNode, snapOverride, centeredSlideOffset, settings);
2197								}
2198								
2199							}
2200							
2201						} else {
2202							
2203							helpers.slowScrollHorizontal(scrollerNode, slideNodes, scrollTimeouts, scrollbarClass, xScrollDistance, yScrollDistance, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, currentEventNode, snapOverride, centeredSlideOffset, settings);
2204							
2205						}
2206						
2207						preventXScroll = false;
2208						touchStartFlag = false;
2209						
2210					});
2211						
2212					$(eventObject).bind('mouseup.iosSliderEvent-' + sliderNumber, function(e) {
2213						
2214						if(xScrollStarted) {
2215							anchorEvents.unbind('click.disableClick').bind('click.disableClick', helpers.preventClick);
2216						} else {
2217							anchorEvents.unbind('click.disableClick').bind('click.disableClick', helpers.enableClick);
2218						}
2219						
2220						onclickEvents.each(function() {
2221							
2222							this.onclick = function(event) {
2223								if(xScrollStarted) { 
2224									return false;
2225								}
2226							
2227								$(this).data('onclick').call(this, event || window.event);
2228							}
2229							
2230							this.onclick = $(this).data('onclick');
2231							
2232						});
2233						
2234						if(parseFloat($().jquery) >= 1.8) {
2235							
2236							allScrollerNodeChildren.each(function() {
2237									
2238								var clickObject = $._data(this, 'events');
2239								
2240								if(clickObject != undefined) {
2241									if(clickObject.click != undefined) {
2242
2243										if(clickObject.click[0].namespace != 'iosSliderEvent') {
2244											
2245											if(!xScrollStarted) { 
2246												return false;
2247											}
2248
2249											$(this).one('click.disableClick', helpers.preventClick);
2250										    var handlers = $._data(this, 'events').click;
2251										    var handler = handlers.pop();
2252										    handlers.splice(0, 0, handler);
2253											
2254										}
2255										
2256									}
2257								}
2258								
2259							});
2260						
2261						} else if(parseFloat($().jquery) >= 1.6) {
2262						
2263							allScrollerNodeChildren.each(function() {
2264									
2265								var clickObject = $(this).data('events');
2266								
2267								if(clickObject != undefined) {
2268									if(clickObject.click != undefined) {
2269
2270										if(clickObject.click[0].namespace != 'iosSliderEvent') {
2271											
2272											if(!xScrollStarted) { 
2273												return false;
2274											}
2275										
2276											$(this).one('click.disableClick', helpers.preventClick);
2277										    var handlers = $(this).data('events').click;
2278										    var handler = handlers.pop();
2279										    handlers.splice(0, 0, handler);
2280											
2281										}
2282										
2283									}
2284								}
2285								
2286							});
2287						
2288						} else {
2289						}
2290						
2291						if(!isEventCleared[sliderNumber]) {
2292						
2293							if(shortContent) return true;
2294							
2295							$(touchSelection).css({
2296								cursor: grabOutCursor
2297							});
2298							
2299							isMouseDown = false;
2300							
2301							if(currentSlider == undefined) {
2302								return true;
2303							}
2304
2305							helpers.slowScrollHorizontal(currentSlider, slideNodes, scrollTimeouts, scrollbarClass, xScrollDistance, yScrollDistance, scrollbarWidth, stageWidth, scrollbarStageWidth, scrollMargin, scrollBorder, originalOffsets, childrenOffsets, slideNodeOuterWidths, sliderNumber, infiniteSliderWidth, numberOfSlides, currentEventNode, snapOverride, centeredSlideOffset, settings);
2306							
2307							currentSlider = undefined;
2308						
2309						}
2310						
2311						preventXScroll = false;
2312						touchStartFlag = false;
2313						
2314					});
2315				
2316				}
2317				
2318			});	
2319			
2320		},
2321		
2322		destroy: function(clearStyle, node) {
2323			
2324			if(node == undefined) {
2325				node = this;
2326			}
2327			
2328			return $(node).each(function() {
2329			
2330				var $this = $(this);
2331				var data = $this.data('iosslider');
2332				if(data == undefined) return false;
2333				
2334				if(clearStyle == undefined) {
2335		    		clearStyle = true;
2336		    	}
2337		    	
2338	    		helpers.autoSlidePause(data.sliderNumber);
2339		    	isEventCleared[data.sliderNumber] = true;
2340		    	$(window).unbind('.iosSliderEvent-' + data.sliderNumber);
2341		    	$(document).unbind('.iosSliderEvent-' + data.sliderNumber);
2342		    	$(document).unbind('keydown.iosSliderEvent');
2343		    	$(this).unbind('.iosSliderEvent');
2344	    		$(this).children(':first-child').unbind('.iosSliderEvent');
2345	    		$(this).children(':first-child').children().unbind('.iosSliderEvent');
2346		    	
2347		    	if(clearStyle) {
2348	    			$(this).attr('style', '');
2349		    		$(this).children(':first-child').attr('style', '');
2350		    		$(this).children(':first-child').children().attr('style', '');
2351		    		
2352		    		$(data.settings.navSlideSelector).attr('style', '');
2353		    		$(data.settings.navPrevSelector).attr('style', '');
2354		    		$(data.settings.navNextSelector).attr('style', '');
2355		    		$(data.settings.autoSlideToggleSelector).attr('style', '');
2356		    		$(data.settings.unselectableSelector).attr('style', '');
2357	    		}
2358	    		
2359	    		if(data.settings.scrollbar) {
2360	    			$('.scrollbarBlock' + data.sliderNumber).remove();
2361	    		}
2362	    		
2363	    		var scrollTimeouts = slideTimeouts[data.sliderNumber];
2364	    		
2365	    		for(var i = 0; i < scrollTimeouts.length; i++) {
2366					clearTimeout(scrollTimeouts[i]);
2367				}
2368	    		
2369	    		$this.removeData('iosslider');
2370	    		$this.removeData('args');
2371		    	
2372			});
2373		
2374		},
2375		
2376		update: function(node) {
2377			
2378			if(node == undefined) {
2379				node = this;
2380			}
2381			
2382			return $(node).each(function() {
2383
2384				var $this = $(this);
2385				var data = $this.data('iosslider');
2386				if(data == undefined) return false;
2387				
2388				data.settings.startAtSlide = $this.data('args').currentSlideNumber;
2389				
2390				methods.destroy(false, this);
2391				
2392				if((data.numberOfSlides != 1) && data.settings.infiniteSlider) {
2393				 	data.settings.startAtSlide = (activeChildOffsets[data.sliderNumber] + 1 + infiniteSliderOffset[data.sliderNumber] + data.numberOfSlides)%data.numberOfSlides;
2394				}
2395
2396				methods.init(data.settings, this);
2397				
2398				var args = new helpers.args('update', data.settings, data.scrollerNode, $(data.scrollerNode).children(':eq(' + (data.settings.startAtSlide - 1) + ')'), data.settings.startAtSlide - 1, data.settings.startAtSlide - 1);
2399				$(data.stageNode).data('args', args);
2400				
2401				if(data.settings.onSliderUpdate != '') {
2402			    	data.settings.onSliderUpdate(args);
2403			    }
2404		    	
2405			});
2406		
2407		},
2408		
2409		addSlide: function(slideNode, slidePosition) {
2410
2411			return this.each(function() {
2412				
2413				var $this = $(this);
2414				var data = $this.data('iosslider');
2415				if(data == undefined) return false;
2416				
2417				if($(data.scrollerNode).children().length == 0) {
2418				
2419					$(data.scrollerNode).append(slideNode);
2420					$this.data('args').currentSlideNumber = 1;
2421					
2422				} else if(!data.settings.infiniteSlider) {
2423				
2424					if(slidePosition <= data.numberOfSlides) {
2425						$(data.scrollerNode).children(':eq(' + (slidePosition - 1) + ')').before(slideNode);
2426					} else {
2427						$(data.scrollerNode).children(':eq(' + (slidePosition - 2) + ')').after(slideNode);
2428					}
2429					
2430					if($this.data('args').currentSlideNumber >= slidePosition) {
2431						$this.data('args').currentSlideNumber++;
2432					}
2433					
2434				} else {
2435					
2436					if(slidePosition == 1) {
2437						$(data.scrollerNode).children(':eq(0)').before(slideNode);
2438					} else {
2439						$(data.scrollerNode).children(':eq(' + (slidePosition - 2) + ')').after(slideNode);
2440					}
2441					
2442					if((infiniteSliderOffset[data.sliderNumber] < -1) && (true)) {
2443						activeChildOffsets[data.sliderNumber]--;
2444					}
2445					
2446					if($this.data('args').currentSlideNumber >= slidePosition) {
2447						activeChildOffsets[data.sliderNumber]++;
2448					}
2449					
2450				}
2451					
2452				$this.data('iosslider').numberOfSlides++;
2453				
2454				methods.update(this);
2455			
2456			});
2457		
2458		},
2459		
2460		removeSlide: function(slideNumber) {
2461		
2462			return this.each(function() {
2463			
2464				var $this = $(this);
2465				var data = $this.data('iosslider');
2466				if(data == undefined) return false;
2467
2468				$(data.scrollerNode).children(':eq(' + (slideNumber - 1) + ')').remove();
2469				if(activeChildOffsets[data.sliderNumber] > (slideNumber - 1)) {
2470					activeChildOffsets[data.sliderNumber]--;
2471				}
2472
2473				methods.update(this);
2474			
2475			});
2476		
2477		},
2478		
2479		goToSlide: function(slide, node) {
2480			
2481			if(node == undefined) {
2482				node = this;
2483			}
2484			
2485			return $(node).each(function() {
2486					
2487				var $this = $(this);
2488				var data = $this.data('iosslider');
2489				if(data == undefined) return false;
2490				
2491				slide = (slide > data.childrenOffsets.length) ? data.childrenOffsets.length - 1 : slide - 1;
2492				
2493				helpers.changeSlide(slide, $(data.scrollerNode), $(data.slideNodes), slideTimeouts[data.sliderNumber], data.scrollbarClass, data.scrollbarWidth, data.stageWidth, data.scrollbarStageWidth, data.scrollMargin, data.scrollBorder, data.originalOffsets, data.childrenOffsets, data.slideNodeOuterWidths, data.sliderNumber, data.infiniteSliderWidth, data.numberOfSlides, data.centeredSlideOffset, data.settings);
2494
2495			});
2496			
2497		},
2498		
2499		prevSlide: function() {
2500			
2501			return this.each(function() {
2502					
2503				var $this = $(this);
2504				var data = $this.data('iosslider');
2505				if(data == undefined) return false;
2506				
2507				var slide = (activeChildOffsets[data.sliderNumber] + infiniteSliderOffset[data.sliderNumber] + data.numberOfSlides)%data.numberOfSlides;
2508				
2509				if((slide > 0) || data.settings.infiniteSlider) {
2510					helpers.changeSlide(slide - 1, $(data.scrollerNode), $(data.slideNodes), slideTimeouts[data.sliderNumber], data.scrollbarClass, data.scrollbarWidth, data.stageWidth, data.scrollbarStageWidth, data.scrollMargin, data.scrollBorder, data.originalOffsets, data.childrenOffsets, data.slideNodeOuterWidths, data.sliderNumber, data.infiniteSliderWidth, data.numberOfSlides, data.centeredSlideOffset, data.settings);
2511				}
2512				
2513				activeChildOffsets[data.sliderNumber] = slide;
2514
2515			});
2516			
2517		},
2518		
2519		nextSlide: function() {
2520			
2521			return this.each(function() {
2522					
2523				var $this = $(this);
2524				var data = $this.data('iosslider');
2525				if(data == undefined) return false;
2526				
2527				var slide = (activeChildOffsets[data.sliderNumber] + infiniteSliderOffset[data.sliderNumber] + data.numberOfSlides)%data.numberOfSlides;
2528				
2529				if((slide < data.childrenOffsets.length-1) || data.settings.infiniteSlider) {
2530					helpers.changeSlide(slide + 1, $(data.scrollerNode), $(data.slideNodes), slideTimeouts[data.sliderNumber], data.scrollbarClass, data.scrollbarWidth, data.stageWidth, data.scrollbarStageWidth, data.scrollMargin, data.scrollBorder, data.originalOffsets, data.childrenOffsets, data.slideNodeOuterWidths, data.sliderNumber, data.infiniteSliderWidth, data.numberOfSlides, data.centeredSlideOffset, data.settings);
2531				}
2532				
2533				activeChildOffsets[data.sliderNumber] = slide;
2534
2535			});
2536			
2537		},
2538		
2539		lock: function() {
2540			
2541			return this.each(function() {
2542			
2543				var $this = $(this);
2544				var data = $this.data('iosslider');
2545				if(data == undefined) return false;
2546
2547				touchLocks[data.sliderNumber] = true;
2548			
2549			});
2550			
2551		},
2552		
2553		unlock: function() {
2554		
2555			return this.each(function() {
2556
2557				var $this = $(this);
2558				var data = $this.data('iosslider');
2559				if(data == undefined) return false;
2560
2561				touchLocks[data.sliderNumber] = false;
2562			
2563			});
2564		
2565		},
2566		
2567		getData: function() {
2568		
2569			return this.each(function() {
2570			
2571				var $this = $(this);
2572				var data = $this.data('iosslider');
2573				if(data == undefined) return false;
2574				
2575				return data;
2576			
2577			});	
2578		
2579		},
2580		
2581		autoSlidePause: function() {
2582			
2583			return this.each(function() {
2584			
2585				var $this = $(this);
2586				var data = $this.data('iosslider');
2587				if(data == undefined) return false;
2588				
2589				iosSliderSettings[data.sliderNumber].autoSlide = false;
2590				
2591				helpers.autoSlidePause(data.sliderNumber);
2592				
2593				return data;
2594			
2595			});	
2596		
2597		},
2598		
2599		autoSlidePlay: function() {
2600			
2601			return this.each(function() {
2602			
2603				var $this = $(this);
2604				var data = $this.data('iosslider');
2605				if(data == undefined) return false;
2606				
2607				iosSliderSettings[data.sliderNumber].autoSlide = true;
2608				
2609				helpers.autoSlide($(data.scrollerNode), $(data.slideNodes), slideTimeouts[data.sliderNumber], data.scrollbarClass, data.scrollbarWidth, data.stageWidth, data.scrollbarStageWidth, data.scrollMargin, data.scrollBorder, data.originalOffsets, data.childrenOffsets, data.slideNodeOuterWidths, data.sliderNumber, data.infiniteSliderWidth, data.numberOfSlides, data.centeredSlideOffset, data.settings);
2610				
2611				return data;
2612			
2613			});	
2614			
2615		}
2616	
2617	}
2618	
2619	/* public functions */
2620	$.fn.iosSlider = function(method) {
2621
2622		if(methods[method]) {
2623			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
2624		} else if (typeof method === 'object' || !method) {
2625			return methods.init.apply(this, arguments);
2626		} else {
2627			$.error('invalid method call!');
2628		}
2629	
2630    };
2631
2632}) (jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.