PageSourceSearch

http://sjperse.org/jquery/royalslider/jquery.royalslider.min.js

js sjperse.org collected 2026-09-24 23:03:03 UTC 128,757 bytes, 4,542 lines download raw bytes

1(function(jQuery) {
2/*
3 * RoyalSlider
4 *
5 * @version 9.5.7:
6 *
7 * Copyright, Dmitry Semenov
8 * Modified by LMSOFT see modification in _updateBlocksContent/_refreshNumPreloadImages function
9 *
10 */
11(function($) {
12
13	"use strict";
14
15	if(!$.rsModules) {
16		$.rsModules = {uid:0};
17	}
18
19	function RoyalSlider(element, options) {
20		var i,
21			self = this,
22			navigator = window.navigator,
23			ua = navigator.userAgent.toLowerCase();
24
25		self.uid = $.rsModules.uid++;
26		self.ns = '.rs' + self.uid; // unique namespace for events
27
28		// feature detection, some ideas taken from Modernizr
29		var tempStyle = document.createElement('div').style,
30			vendors = ['webkit','Moz','ms','O'],
31			vendor = '',
32			lastTime = 0,
33			tempV;
34
35		for (i = 0; i < vendors.length; i++ ) {
36			tempV = vendors[i];
37			if (!vendor && (tempV + 'Transform') in tempStyle ) {
38				vendor = tempV;
39			}
40			tempV = tempV.toLowerCase();
41			
42			if(!window.requestAnimationFrame) {
43				window.requestAnimationFrame = window[tempV+'RequestAnimationFrame'];
44				window.cancelAnimationFrame = window[tempV+'CancelAnimationFrame'] || window[tempV+'CancelRequestAnimationFrame'];
45			}
46		}
47
48		// requestAnimationFrame polyfill by Erik Möller
49		// fixes from Paul Irish and Tino Zijdel
50		if (!window.requestAnimationFrame) {
51			window.requestAnimationFrame = function(callback, element) {
52				var currTime = new Date().getTime(),
53					timeToCall = Math.max(0, 16 - (currTime - lastTime)),
54					id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall);
55					lastTime = currTime + timeToCall;
56				return id;
57			};
58		}
59
60		if (!window.cancelAnimationFrame) {
61			window.cancelAnimationFrame = function(id) { clearTimeout(id); };
62		}
63			
64
65		self.isIPAD = ua.match(/(ipad)/);
66		self.isIOS = self.isIPAD || ua.match(/(iphone|ipod)/);
67
68
69		// browser UA sniffing, sadly still required
70		var uaMatch = function( ua ) {
71			var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
72				/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
73				/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
74				/(msie) ([\w.]+)/.exec( ua ) ||
75				ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
76				[];
77
78			return {
79				browser: match[ 1 ] || "",
80				version: match[ 2 ] || "0"
81			};
82		};
83		var matched = uaMatch( ua );
84		var br = {};
85		if ( matched.browser ) {
86			br[ matched.browser ] = true;
87			br.version = matched.version;
88		}
89
90		if(br.chrome) { 
91			br.webkit = true;
92		}
93
94		self._browser = br;
95		self.isAndroid = ua.indexOf("android") > -1;
96
97
98
99		self.slider = $(element); // DOM reference
100		self.ev = $(self); // event object
101		self._doc = $(document);
102		self.st = $.extend({}, $.fn.royalSlider.defaults, options); 
103		self._currAnimSpeed = self.st.transitionSpeed;
104		self._minPosOffset = 0;
105		if(self.st.allowCSS3) {
106			if((!br.webkit || self.st.allowCSS3OnWebkit) ) {
107				var bT = vendor + (vendor ? 'T' : 't' );
108				self._useCSS3Transitions = ( (bT + 'ransform') in tempStyle ) && ( (bT + 'ransition') in tempStyle );
109				if(self._useCSS3Transitions) {
110					self._use3dTransform = (vendor + (vendor ? 'P' : 'p'  ) + 'erspective') in tempStyle;
111				}
112			}
113		}
114		
115		vendor = vendor.toLowerCase();
116		self._vendorPref = '-'+vendor+'-';
117		
118		self._slidesHorizontal = (self.st.slidesOrientation === 'vertical') ? false : true;
119		self._reorderProp = self._slidesHorizontal ? 'left' : 'top';
120		self._sizeProp = self._slidesHorizontal ? 'width' : 'height';
121		self._prevNavItemId = -1;
122		self._isMove = (self.st.transitionType === 'fade') ? false : true;
123		if(!self._isMove) {
124			self.st.sliderDrag = false;
125			self._fadeZIndex = 10;
126		}
127		self._opacityCSS = 'z-index:0; display:none; opacity:0;';
128
129		self._newSlideId = 0;
130		self._sPosition = 0;
131		self._nextSlidePos = 0;
132
133		// init modules
134		$.each($.rsModules, function (helper, opts) {
135			if(helper !== 'uid')
136				opts.call(self);
137		});
138
139		// parse all slides
140		self.slides = [];
141		self._idCount = 0;
142		var returnVal;
143		var ts = self.st.slides ? $(self.st.slides) : self.slider.children().detach();
144		
145		ts.each(function() {
146			self._parseNode(this, true);
147		});
148
149		if(self.st.randomizeSlides) {
150			self.slides.sort(function() { return 0.5 - Math.random(); });
151		}
152		self.numSlides = self.slides.length;
153		self._refreshNumPreloadImages();
154
155		if(!self.st.startSlideId) {
156			self.st.startSlideId = 0;
157		} else if(self.st.startSlideId > self.numSlides - 1) {
158			self.st.startSlideId = self.numSlides - 1;
159		}
160
161		self._newSlideId = self.staticSlideId = self.currSlideId = self._realId =  self.st.startSlideId;
162		self.currSlide = self.slides[self.currSlideId];
163
164		self._accelerationPos = 0;
165		self.pointerMultitouch = false;
166		self.slider.addClass( (self._slidesHorizontal ? 'rsHor' : 'rsVer') + (self._isMove ? '' : ' rsFade') );
167
168		var sliderHTML = '<div class="rsOverflow"><div class="rsContainer">';
169		self.slidesSpacing = self.st.slidesSpacing;
170		self._slideSize = ( self._slidesHorizontal ? self.slider.width() : self.slider.height() ) + self.st.slidesSpacing;
171
172		self._preload = Boolean(self._numPreloadImages > 0);
173		
174		if(self.numSlides <= 1) {
175			self._loop = false;
176		}
177		var loopHelpers = (self._loop && self._isMove) ? ( self.numSlides === 2 ? 1 : 2) : 0;
178		self._loopHelpers = loopHelpers;
179
180		self._maxImages = self.numSlides < 6 ? self.numSlides : 6;
181		self._currBlockIndex = 0;
182
183
184		self._idOffset = 0;
185		self.slidesJQ = [];
186		
187		for(i =0; i < self.numSlides; i++) {
188			self.slidesJQ.push( $(createItemHTML(i)) );
189		}
190		self._sliderOverflow = sliderHTML = $(sliderHTML + '</div></div>');
191
192
193		var addCursors = function() {
194			if(self.st.sliderDrag) {
195				self._hasDrag = true;
196				if (br.msie || br.opera) {
197					self._grabCursor = self._grabbingCursor = "move";
198				} else if(br.mozilla) {
199					self._grabCursor = "-moz-grab";
200					self._grabbingCursor = "-moz-grabbing";
201				} else if(br.webkit && (navigator.platform.indexOf("Mac")!=-1)) {
202					self._grabCursor = "-webkit-grab";
203					self._grabbingCursor = "-webkit-grabbing";
204				}
205				self._setGrabCursor();
206			}
207		};
208		var rsNS = self.ns;
209		var addEventNames = function(pref, down, move, up, cancel) {
210			self._downEvent = pref + down + rsNS;
211			self._moveEvent = pref + move + rsNS;
212			self._upEvent = pref + up + rsNS;
213			if(cancel)
214				self._cancelEvent = pref + cancel + rsNS;
215		};
216
217
218		// Pointer events support
219		var nPointerEnabled = navigator.pointerEnabled;
220		self.pointerEnabled = nPointerEnabled || navigator.msPointerEnabled;
221
222		if(self.pointerEnabled) {
223			self.hasTouch = false;
224			self._lastItemFriction = 0.2;
225			// Hardware supports multitouch
226			self.pointerMultitouch = Boolean(navigator[ (nPointerEnabled ? 'm' : 'msM') + 'axTouchPoints' ] > 1);
227			if(nPointerEnabled) {
228				// >= IE11 & other devices that support pointer events
229				addEventNames('pointer', 'down', 'move', 'up', 'cancel');
230			} else {
231				// IE10
232				addEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');
233			}
234		} else {
235
236			// IOS can't handle both touch and mouse events at once
237			if(!self.isIOS) {
238				addEventNames('mouse', 'down', 'move', 'up');
239			} else {
240				self._downEvent = self._moveEvent = self._upEvent = self._cancelEvent = '';
241			}
242
243			if('ontouchstart' in window || 'createTouch' in document) {
244				self.hasTouch = true;
245				self._downEvent += ' touchstart' + rsNS;
246				self._moveEvent += ' touchmove' + rsNS;
247				self._upEvent += ' touchend' + rsNS;
248				self._cancelEvent += ' touchcancel' + rsNS;
249				self._lastItemFriction = 0.5;
250				if(self.st.sliderTouch) {
251					self._hasDrag = true;
252				}
253			} else {
254				self.hasTouch = false;
255				self._lastItemFriction = 0.2;
256			}
257		}
258		addCursors();
259	
260		self.slider.html(sliderHTML);
261
262		
263		self._controlsContainer = self.st.controlsInside ? self._sliderOverflow : self.slider;
264		
265		self._slidesContainer = self._sliderOverflow.children('.rsContainer');
266		if(self.pointerEnabled) {
267			self._slidesContainer.css( (nPointerEnabled ? '' : '-ms-') + 'touch-action', self._slidesHorizontal ? 'pan-y' : 'pan-x');
268		}
269		self._preloader = $('<div class="rsPreloader"></div>');
270		var slides = self._slidesContainer.children('.rsSlide');
271
272		self._currHolder = self.slidesJQ[self.currSlideId];
273		self._selectedSlideHolder = 0;
274
275		function createItemHTML(i, className) {
276			return '<div style="'+ (self._isMove ? '' : (i !== self.currSlideId  ? self._opacityCSS : 'z-index:0;') ) +'" class="rsSlide '+ (className || '')+'"></div>';
277		}
278		
279		if(self._useCSS3Transitions) {
280
281			// some constants for CSS3
282			self._TP = 'transition-property';
283			self._TD = 'transition-duration';
284			self._TTF = 'transition-timing-function';
285
286			self._yProp = self._xProp = self._vendorPref +'transform';
287
288			if(self._use3dTransform) {
289				if(br.webkit && !br.chrome) {
290					self.slider.addClass('rsWebkit3d');
291				}
292
293				self._tPref1 = 'translate3d(';
294				self._tPref2 = 'px, ';
295				self._tPref3 = 'px, 0px)';
296			} else {
297				self._tPref1 = 'translate(';
298				self._tPref2 = 'px, ';
299				self._tPref3 = 'px)';
300			}
301			if(!self._isMove) {
302				var animObj = {};
303				animObj[(self._vendorPref + self._TP)] = 'opacity';
304				animObj[(self._vendorPref + self._TD)] = self.st.transitionSpeed + 'ms';
305				animObj[(self._vendorPref + self._TTF)] = self.st.css3easeInOut;
306				slides.css(animObj);
307			} else {
308				self._slidesContainer[(self._vendorPref + self._TP)] = (self._vendorPref + 'transform');
309			}
310			
311
312		} else {
313			self._xProp = 'left';
314			self._yProp = 'top';
315		}
316
317		
318
319		// window resize
320		var resizeTimer;
321		$(window).on('resize'+self.ns, function() {	
322			if(resizeTimer) {
323				clearTimeout(resizeTimer);			
324			}
325			resizeTimer = setTimeout(function() { self.updateSliderSize(); }, 50);			
326		});	
327		self.ev.trigger('rsAfterPropsSetup'); // navigation (bullets, thumbs...) are created here
328
329		self.updateSliderSize();
330
331
332		// keyboard nav
333		if(self.st.keyboardNavEnabled) {
334			self._bindKeyboardNav();
335		}
336
337		if(self.st.arrowsNavHideOnTouch && (self.hasTouch || self.pointerMultitouch) ) {
338			self.st.arrowsNav = false;
339		}
340
341		//Direction navigation (arrows)
342		if(self.st.arrowsNav) {
343			var rArr = 'rsArrow',
344				container = self._controlsContainer;
345			$('<div class="'+rArr+' '+rArr+'Left"><div class="'+rArr+'Icn"></div></div><div class="'+rArr+' '+rArr+'Right"><div class="'+rArr+'Icn"></div></div>').appendTo(container);
346
347			self._arrowLeft = container.children('.'+rArr+'Left').click(function(e) {
348				e.preventDefault();
349				self.prev();
350			});
351			self._arrowRight = container.children('.'+rArr+'Right').click(function(e) {
352				e.preventDefault();
353				self.next();
354			});
355
356			if(self.st.arrowsNavAutoHide && !self.hasTouch) {
357				self._arrowLeft.addClass('rsHidden');
358				self._arrowRight.addClass('rsHidden');
359
360				var hoverEl = container;
361				hoverEl.one("mousemove.arrowshover",function() {
362					self._arrowLeft.removeClass('rsHidden');
363					self._arrowRight.removeClass('rsHidden');			
364				});
365
366
367				hoverEl.hover(
368					function() {
369						if(!self._arrowsAutoHideLocked) {
370							self._arrowLeft.removeClass('rsHidden');
371							self._arrowRight.removeClass('rsHidden');
372						}
373					},
374					function() {
375						if(!self._arrowsAutoHideLocked) {
376							self._arrowLeft.addClass('rsHidden');
377							self._arrowRight.addClass('rsHidden');
378						}
379					}
380				);	
381			}	
382			self.ev.on('rsOnUpdateNav', function() {
383				self._updateArrowsNav();
384			});
385			self._updateArrowsNav();
386		}
387
388			
389		
390		if( (self.hasTouch && self.st.sliderTouch) || (!self.hasTouch && self.st.sliderDrag) ) {
391			self._slidesContainer.on(self._downEvent, function(e) { self._onDragStart(e); });	
392		} else {
393			self.dragSuccess = false;
394		}
395		var videoClasses = ['rsPlayBtnIcon', 'rsPlayBtn', 'rsCloseVideoBtn', 'rsCloseVideoIcn'];
396		self._slidesContainer.click(function(e) {
397			if(!self.dragSuccess) {
398				var t = $(e.target);
399				var tClass = t.attr('class');
400				if( $.inArray(tClass, videoClasses) !== -1) {
401					if( self.toggleVideo() ) {
402						return false;
403					}
404				}
405				if(self.st.navigateByClick && !self._blockActions) {
406					if($(e.target).closest('.rsNoDrag', self._currHolder).length) {
407						return true;
408					}
409					self._mouseNext(e);
410				} 
411				self.ev.trigger('rsSlideClick', e);
412			} 
413		}).on('click.rs', 'a', function(e) {	
414			if(self.dragSuccess) {						
415				return false;
416			} else {
417				self._blockActions = true;
418				//e.stopPropagation();
419				//e.stopImmediatePropagation();
420				setTimeout(function() {
421					self._blockActions = false;
422				}, 3);
423			}
424		});
425		self.ev.trigger('rsAfterInit');
426	} /* RoyalSlider Constructor End */
427
428	/**
429	 *
430	 * RoyalSlider Core Prototype
431	 * 
432	 */
433	RoyalSlider.prototype = {
434		constructor: RoyalSlider,
435		_mouseNext: function(e) {
436			var self = this,
437				relativePos = e[self._slidesHorizontal ? 'pageX' : 'pageY'] - self._sliderOffset;
438
439			if(relativePos >= self._nextSlidePos) {
440				self.next();
441			} else if(relativePos < 0) {
442				self.prev();
443			}
444		},
445		/**
446		 * This function have been modified by LMSOFT/Abder to force royalslider to add all slides all the time
447		*/
448		_refreshNumPreloadImages: function() {
449			var self = this,
450				n;
451			n = self.st.numImagesToPreload;
452			self._loop = self.st.loop;
453
454			if(self._loop) {
455				if(self.numSlides === 2) {
456					self._loop = false;
457					self.st.loopRewind = true;
458				} else if(self.numSlides < 2) {
459					self.st.loopRewind = self._loop = false;
460				}
461				
462			}
463			if(self._loop && n > 0) {
464				if(self.numSlides <= 4) {
465					n = 1;
466				} else {
467					//if(self.st.numImagesToPreload > (self.numSlides - 1) / 2 ) {
468						n = Math.floor( (self.numSlides - 1) / 2 );
469					//}
470				} 
471			}
472			self._numPreloadImages = n;
473		},
474		_parseNode: function(content, pushToSlides) {
475			var self = this,
476				hasImg,
477				isRoot,
478				hasCover,
479				obj = {},
480				tempEl,
481				first = true;
482			content = $(content);
483			self._currContent = content;
484			self.ev.trigger('rsBeforeParseNode', [content, obj]);
485			if(obj.stopParsing) {
486				return;
487			}
488			content = self._currContent;
489			obj.id = self._idCount;
490			obj.contentAdded = false;
491			self._idCount++;
492			obj.images = [];
493			obj.isBig = false;
494
495			if(!obj.hasCover) {
496				if(content.hasClass('rsImg')) {
497					tempEl = content;
498					hasImg = true;
499				} else {
500					tempEl = content.find('.rsImg');
501					if(tempEl.length) {
502						hasImg = true;
503					}
504				}
505
506				if(hasImg) {
507					obj.bigImage = tempEl.eq(0).attr('data-rsBigImg');
508					tempEl.each(function() {
509						var item = $(this);
510						if(item.is('a')) {
511							parseEl(item, 'href');
512						} else if(item.is('img')) {
513							parseEl(item, 'src');
514						} else {
515							parseEl(item);
516						}
517					});
518				} else if(content.is('img')) {
519					content.addClass('rsImg rsMainSlideImage');
520					parseEl(content, 'src');
521				}
522			}
523			tempEl = content.find('.rsCaption');
524			if(tempEl.length) {
525				obj.caption = tempEl.remove();
526			}
527			obj.content = content;
528
529			self.ev.trigger('rsAfterParseNode', [content, obj]);
530			function parseEl(el, s) {
531				if(s) {
532					obj.images.push( el.attr(s) );
533				} else {
534					obj.images.push( el.text() );
535				}
536				if(first) {
537					first = false;
538					obj.caption = (s === 'src') ? el.attr('alt') : el.contents();
539					obj.image = obj.images[0];
540					obj.videoURL = el.attr('data-rsVideo');
541					
542					
543					var wAtt = el.attr('data-rsw'),
544						hAtt = el.attr('data-rsh');
545					if (typeof wAtt !== 'undefined' && wAtt !== false && typeof hAtt !== 'undefined' && hAtt !== false ) {
546						obj.iW = parseInt(wAtt, 10);
547						obj.iH = parseInt(hAtt, 10);
548					} else if(self.st.imgWidth && self.st.imgHeight ) {
549						obj.iW = self.st.imgWidth;
550						obj.iH = self.st.imgHeight;
551					}
552				}
553			}
554			if(pushToSlides) {
555				self.slides.push(obj);
556			}
557			if(obj.images.length === 0) {
558				obj.isLoaded = true;
559				obj.isRendered = false;
560				obj.isLoading = false;
561				obj.images = null;
562			}
563			return obj;
564		},
565		_bindKeyboardNav: function() {
566			var self = this,
567				interval,
568				keyCode,
569				onKeyboardAction = function (keyCode) {
570					if(keyCode === 37) {
571						self.prev();
572					} else if (keyCode === 39) {
573						self.next();
574					}
575				};
576
577			self._doc.on('keydown' + self.ns, function(e) {
578				if(!self.st.keyboardNavEnabled) {
579					return true;
580				}
581				if(!self._isDragging) {
582					keyCode = e.keyCode;
583					if(keyCode === 37 || keyCode === 39) {
584
585						if(!interval) {
586							if(document.activeElement && (/(INPUT|SELECT|TEXTAREA)/i).test(document.activeElement.tagName)) {
587								return true;
588							}
589							if(self.isFullscreen) {
590								e.preventDefault();
591							}
592							
593							onKeyboardAction(keyCode);
594							interval = setInterval(function() {
595								onKeyboardAction(keyCode);
596							}, 700);
597						}
598					}
599				}
600			}).on('keyup' + self.ns, function(e) {
601				if(interval) {
602					clearInterval(interval); 
603					interval = null;
604				}
605			});
606
607			
608			
609		},
610
611
612
613
614		goTo: function(id, notUserAction) {
615			var self = this;
616			if(id !== self.currSlideId) {
617				self._moveTo(id,self.st.transitionSpeed, true, !notUserAction);
618			}
619		},
620		destroy: function(remove) {
621			var self = this;
622			self.ev.trigger('rsBeforeDestroy');
623			self._doc.off('keydown' +self.ns+ ' keyup' + self.ns + ' ' + self._moveEvent +' '+ self._upEvent );
624			self._slidesContainer.off(self._downEvent + ' click');	
625			self.slider.data('royalSlider', null);
626			$.removeData(self.slider, 'royalSlider');
627			$(window).off('resize' + self.ns);
628			if(self.loadingTimeout) {
629			  clearTimeout(self.loadingTimeout);
630			}
631			if(remove) {
632				self.slider.remove();
633			}
634			self.slides = null;
635			self.slider = null;
636			self.ev = null;
637		},
638		/**
639		 * This function have been modified by LMSOFT/Abder to force royalslider to add all slides all the time
640		*/
641		_updateBlocksContent: function(beforeTransition, getId) {
642			var self = this,
643				item,
644				i,
645				n,
646				pref,
647				group,
648				groupId,
649				slideCode,
650				loop = self._loop,
651				numSlides = self.numSlides;
652			if(!isNaN(getId) ) {
653				return getCorrectLoopedId(getId);
654			}
655
656
657			var id = self.currSlideId;
658			var groupOffset;
659			
660			var itemsOnSide = beforeTransition ? (Math.abs(self._prevSlideId - self.currSlideId) >= self.numSlides - 1 ? 0 : 1) : self._numPreloadImages;
661			// add the same to the leftSide
662			var itemsOnleftSide = itemsOnSide;
663			// si on a un nombre pair de slides on ajoute l'element manquant sur la doite
664			var itemsOnRightSide = (self.numSlides % 2) == 0 ? itemsOnSide + 1 : itemsOnSide;
665			
666			var itemsToCheck = Math.min(2, itemsOnSide); 
667			
668			var updateAfter = false;
669			var updateBefore = false;
670			var tempId;
671			
672			for(i = id; i < id + 1 + itemsToCheck; i++) {
673				tempId = getCorrectLoopedId(i);
674				item = self.slides[tempId];
675				if(item && (!item.isAdded || !item.positionSet) ) {
676					updateAfter = true;
677					break;
678				}
679			}
680			for(i = id - 1; i > id - 1 - itemsToCheck; i--) {
681				tempId = getCorrectLoopedId(i);
682				item = self.slides[tempId];
683				if(item && (!item.isAdded || !item.positionSet) ) {
684					updateBefore = true;
685					break;
686				}
687			}
688			if(updateAfter) {
689				for(i = id; i < id + itemsOnRightSide + 1; i++) {
690					tempId = getCorrectLoopedId(i);
691					groupOffset = Math.floor( (self._realId - (id - i)) / self.numSlides) * self.numSlides;
692					item = self.slides[tempId];
693					if(item) {
694						updateItem(item, tempId);	
695					}
696				}
697			}
698			if(updateBefore) {
699				for(i = id - 1; i > id - 1 - itemsOnleftSide; i--) {
700					tempId = getCorrectLoopedId(i);
701					groupOffset = Math.floor( (self._realId - (id - i) ) / numSlides) * numSlides;
702					item = self.slides[tempId];
703					if(item) {
704						updateItem(item, tempId);
705					}
706				}
707			}
708			if(!beforeTransition) {
709				var start = id;
710				var distance = itemsOnSide;
711				var min = getCorrectLoopedId(id - itemsOnleftSide);
712				var max = getCorrectLoopedId(id + itemsOnRightSide);
713				
714				var nmin = min > max ? 0 : min;
715				
716				for (i = 0; i < numSlides; i++) { 
717					if(min > max) {
718						if(i > min - 1) {
719							continue;
720						}
721					}
722					if(i < nmin || i > max) {
723						item = self.slides[i];
724						if(item && !item.isAdded) {
725							updateItem(item, i);
726						}
727						if(item && item.holder) {
728							item.holder.detach();
729							item.isAdded = false;
730						}     
731					}                               
732				}   
733			}
734
735			
736			
737				
738				
739			function updateItem(item , i, slideCode) {
740
741				if(!item.isAdded) {
742					if(!slideCode)
743						slideCode = self.slidesJQ[i];
744
745					if(!item.holder) {
746						slideCode = self.slidesJQ[i] = $(slideCode);
747						item.holder = slideCode;
748					} else {
749						slideCode = item.holder;
750					}
751
752					item.appendOnLoaded = false;
753
754					
755					updatePos(i, item, slideCode);
756					addContent(i, item);
757					self._addBlockToContainer(item, slideCode, beforeTransition);
758					item.isAdded = true;
759				} else {
760					addContent(i, item);
761					updatePos(i, item);
762				}
763			}
764			function addContent(i, item) {
765				if(!item.contentAdded) {
766					self.setItemHtml(item, beforeTransition);
767					if(!beforeTransition) {
768						item.contentAdded = true;
769					}
770					
771				}
772			}
773			function updatePos(i, item, slideCode) {
774				if(self._isMove) {
775					if(!slideCode) {
776						slideCode = self.slidesJQ[i];
777					}
778
779					slideCode.css(self._reorderProp, (i + self._idOffset + groupOffset) * self._slideSize);
780				}
781			}
782			function getCorrectLoopedId(index) {
783				var changed = false;
784				if(loop) {
785					if(index > numSlides - 1) {
786						return getCorrectLoopedId(index - numSlides);
787					} else  if(index < 0) {
788						return getCorrectLoopedId(numSlides + index);
789					}
790				}
791				return index;
792			}
793			
794		},
795
796		/**
797		 * Sets or loads HTML for specified slide
798		 * @param {Object} currSlideObject  holds data about curr slide (read about rsAfterParseNode for more info)
799		 * @param {Boolean} beforeTransition determines if setItemHTML method is called before or after transition
800		 */
801		setItemHtml: function(currSlideObject, beforeTransition) {
802			var self = this;
803
804			var parseDataAndLoad = function() {
805				if(!currSlideObject.images) {
806					currSlideObject.isRendered = true;
807					currSlideObject.isLoaded = true;
808					currSlideObject.isLoading = false;
809					appendContent(true);
810					return;
811				}
812				if(currSlideObject.isLoading) {
813					return;
814				}
815				
816				var el,
817					isRoot;
818				if(currSlideObject.content.hasClass('rsImg') ) {
819					el = currSlideObject.content;
820					isRoot = true;
821				} else {
822					el = currSlideObject.content.find('.rsImg:not(img)');
823				}
824				if(el && !el.is('img')) {
825					el.each(function() {
826						var item = $(this),
827							newEl = '<img class="rsImg" src="'+ ( item.is('a') ? item.attr('href') : item.text() ) +'" />';
828
829						if(!isRoot) {
830							item.replaceWith( newEl );
831						} else {
832							currSlideObject.content = $(newEl);
833						}
834					});
835				}
836				
837				el = isRoot ? currSlideObject.content : currSlideObject.content.find('img.rsImg');
838				setPreloader();
839				
840				el.eq(0).addClass('rsMainSlideImage');
841				if(currSlideObject.iW && currSlideObject.iH) {
842					if(!currSlideObject.isLoaded) {
843						self._resizeImage( currSlideObject );
844					}
845					appendContent();
846				}
847
848				currSlideObject.isLoading = true;
849				var newEl;
850
851				var eNames = 'load.rs error.rs';
852				if(currSlideObject.isBig) {
853					$('<img />').on(eNames, function(e){
854						$(this).off(eNames);
855						onLoad( [this], true );
856					}).attr('src', currSlideObject.image);
857				} else {
858					currSlideObject.loaded = [];
859					currSlideObject.numStartedLoad = 0;
860					var onLoaded = function(e) {
861						$(this).off(eNames);
862						currSlideObject.loaded.push( this );
863						if(currSlideObject.loaded.length === currSlideObject.numStartedLoad) {
864							onLoad( currSlideObject.loaded, false );
865						}
866					};
867					for(var i = 0; i < currSlideObject.images.length; i++) {
868						var image = $('<img />');
869						currSlideObject.numStartedLoad++;
870						image.on('load.rs error.rs', onLoaded).attr('src', currSlideObject.images[i]);
871					}
872				}
873			};
874
875			var onLoad = function($images, isBig) {
876				if($images.length) {
877					var img = $images[0],
878					src = img.src;
879
880					if(isBig !== currSlideObject.isBig) {
881						var c = currSlideObject.holder.children();
882						if(c && c.length > 1) {
883							removePreloader();
884						}
885						return;
886					}
887
888					if(currSlideObject.iW && currSlideObject.iH) {
889						imageLoadingComplete();
890						return;
891					}
892					currSlideObject.iW = img.width;
893					currSlideObject.iH = img.height;
894					if(currSlideObject.iW && currSlideObject.iH) {
895						imageLoadingComplete();
896						return;
897					} else {
898						// if no size, try again
899						var loader = new Image();
900						loader.onload = function() {
901							if(loader.width) {
902								currSlideObject.iW = loader.width;
903								currSlideObject.iH = loader.height;
904								imageLoadingComplete();
905							} else {
906								setTimeout(function() {
907									if(loader.width) {
908										currSlideObject.iW = loader.width;
909										currSlideObject.iH = loader.height;
910									}
911
912									// failed to get size on last tier, just output image
913									imageLoadingComplete();
914								}, 1000);
915							}
916						};
917						loader.src = img.src;
918					}
919				} else {
920					imageLoadingComplete();
921				}
922			};
923
924			var imageLoadingComplete = function () {
925				currSlideObject.isLoaded = true;
926				currSlideObject.isLoading = false;
927
928				appendContent();
929				removePreloader();
930				triggerLoaded();
931			};
932
933			var waitForTransition = function () {
934				if(!self._isMove && currSlideObject.images && currSlideObject.iW && currSlideObject.iH) {
935					parseDataAndLoad();
936					return;
937				}
938				currSlideObject.holder.isWaiting = true;
939				setPreloader();
940				currSlideObject.holder.slideId = -99;
941			};
942			
943			var appendContent = function() {
944				if(!currSlideObject.isAppended && self.ev) {
945
946					var visibleNearby = self.st.visibleNearby,
947					bId = currSlideObject.id - self._newSlideId;
948					if(!beforeTransition && !currSlideObject.appendOnLoaded && self.st.fadeinLoadedSlide  && ( bId === 0 || ( (visibleNearby || self._isAnimating || self._isDragging) && (bId === -1 || bId === 1) ) ) ) {
949						var css = {
950							visibility: 'visible', 
951							opacity: 0
952						};
953						css[self._vendorPref + 'transition'] = 'opacity 400ms ease-in-out';
954						currSlideObject.content.css(css);
955
956						setTimeout(function() {
957							currSlideObject.content.css('opacity', 1);
958						}, 16);
959					}
960
961					if(currSlideObject.holder.find('.rsPreloader').length) {
962						currSlideObject.holder.append( currSlideObject.content );
963					} else {
964						currSlideObject.holder.html( currSlideObject.content );
965					}
966					
967
968					currSlideObject.isAppended = true;
969					if(currSlideObject.isLoaded) {
970						self._resizeImage(currSlideObject);
971						triggerLoaded();
972					}
973					if(!currSlideObject.sizeReady) {
974						currSlideObject.sizeReady = true;
975						setTimeout(function() {
976							// triggers after content is added, usually is true when page is refreshed from cache
977							self.ev.trigger('rsMaybeSizeReady', currSlideObject);
978						}, 100);
979					}
980					
981				}
982			};
983			var triggerLoaded = function () {
984				if(!currSlideObject.loadedTriggered && self.ev) {
985					currSlideObject.isLoaded = currSlideObject.loadedTriggered = true;
986					currSlideObject.holder.trigger('rsAfterContentSet');
987					self.ev.trigger('rsAfterContentSet', currSlideObject);
988				}
989			};
990			var setPreloader = function () {
991				if(self.st.usePreloader)
992					currSlideObject.holder.html(self._preloader.clone());
993			};
994			var removePreloader = function (now) {
995				if(self.st.usePreloader) {
996					var preloader = currSlideObject.holder.find('.rsPreloader');
997					if(preloader.length) {
998						preloader.remove();
999					}
1000				}
1001			};
1002
1003			if(currSlideObject.isLoaded) {
1004				appendContent();
1005				return;
1006			} else {
1007				if(beforeTransition) {
1008					waitForTransition();
1009				} else {
1010					parseDataAndLoad();
1011				}
1012			}
1013
1014		},
1015		_addBlockToContainer: function(slideObject, content, dontFade) {
1016			var self = this;
1017			var holder = slideObject.holder;
1018			var bId = slideObject.id - self._newSlideId;
1019			var visibleNearby = false;
1020
1021			self._slidesContainer.append(holder);
1022			slideObject.appendOnLoaded = false;
1023		},
1024	
1025		_onDragStart:function(e, isThumbs) {
1026			var self = this,
1027				point,
1028				wasAnimating,
1029				isTouch = (e.type === 'touchstart');
1030
1031
1032			self._isTouchGesture = isTouch;	
1033
1034			self.ev.trigger('rsDragStart');
1035			if($(e.target).closest('.rsNoDrag', self._currHolder).length) {
1036				self.dragSuccess = false;
1037				return true;
1038			}
1039
1040
1041			if(!isThumbs) {
1042				if(self._isAnimating) {
1043					self._wasAnimating = true;
1044
1045					self._stopAnimation();
1046				}
1047			}
1048			self.dragSuccess = false;
1049			if(self._isDragging) {
1050				if(isTouch) {
1051					self._multipleTouches = true;
1052				}
1053				return;
1054			} else {
1055				if(isTouch) {
1056					self._multipleTouches = false;
1057				}
1058			}
1059
1060			self._setGrabbingCursor();
1061			
1062			if(isTouch) {
1063				//parsing touch event
1064				var touches = e.originalEvent.touches;
1065				if(touches && touches.length > 0) {
1066					point = touches[0];
1067					if(touches.length > 1) {
1068						self._multipleTouches = true;
1069					}
1070				}					
1071				else {	
1072					return;						
1073				}
1074			} else {
1075				e.preventDefault();				
1076				point = e;
1077				if(self.pointerEnabled) point = point.originalEvent;		
1078			}
1079
1080			self._isDragging = true;
1081			self._doc.on(self._moveEvent, function(e) { self._onDragMove(e, isThumbs); })
1082						.on(self._upEvent, function(e) { self._onDragRelease(e, isThumbs); });
1083			
1084			self._currMoveAxis = '';
1085			self._hasMoved = false;
1086			self._pageX = point.pageX;
1087			self._pageY = point.pageY;
1088			self._startPagePos = self._accelerationPos = (!isThumbs ? self._slidesHorizontal : self._thumbsHorizontal) ? point.pageX : point.pageY;
1089			
1090			self._horDir = 0;
1091			self._verDir = 0;
1092
1093			self._currRenderPosition = !isThumbs ? self._sPosition : self._thumbsPosition;
1094
1095			self._startTime = new Date().getTime();
1096			if(isTouch) {
1097				self._sliderOverflow.on(self._cancelEvent, function(e) { self._onDragRelease(e, isThumbs); });	
1098			}
1099		},
1100		_renderMovement:function(point, isThumbs) {
1101			var self = this;
1102			if(self._checkedAxis) {
1103
1104				var timeStamp = self._renderMoveTime,
1105					deltaX = point.pageX - self._pageX,
1106					deltaY = point.pageY - self._pageY,
1107					newX = self._currRenderPosition + deltaX,
1108					newY = self._currRenderPosition + deltaY,
1109					isHorizontal = (!isThumbs ? self._slidesHorizontal : self._thumbsHorizontal),
1110					newPos = isHorizontal ? newX : newY,
1111					mAxis = self._currMoveAxis;
1112
1113				self._hasMoved = true;
1114				self._pageX = point.pageX;
1115				self._pageY = point.pageY;
1116
1117				if(mAxis === 'x' && deltaX !== 0) {
1118					self._horDir = deltaX > 0 ? 1 : -1;
1119				} else if(mAxis === 'y' && deltaY !== 0) {
1120					self._verDir = deltaY > 0 ? 1 : -1;
1121				}
1122
1123				var pointPos = isHorizontal ? self._pageX : self._pageY,
1124					deltaPos = isHorizontal ? deltaX : deltaY;
1125				if(!isThumbs) {
1126					if(!self._loop) {
1127						if(self.currSlideId <= 0) {
1128							if(pointPos - self._startPagePos > 0) {
1129								newPos = self._currRenderPosition + deltaPos * self._lastItemFriction;
1130							}
1131						}
1132						if(self.currSlideId >= self.numSlides - 1) {
1133							if(pointPos - self._startPagePos < 0) {
1134								newPos = self._currRenderPosition + deltaPos * self._lastItemFriction ;
1135							}
1136						}
1137					}
1138				} else {
1139					if(newPos > self._thumbsMinPosition) {
1140						newPos = self._currRenderPosition + deltaPos * self._lastItemFriction;
1141					} else if(newPos < self._thumbsMaxPosition) {
1142						newPos = self._currRenderPosition + deltaPos * self._lastItemFriction ;
1143					}
1144				}
1145
1146				self._currRenderPosition = newPos;
1147				
1148				if (timeStamp - self._startTime > 200) {
1149					self._startTime = timeStamp;
1150					self._accelerationPos = pointPos;						
1151				}
1152
1153				if(!isThumbs) {
1154					if(self._isMove) {
1155						self._setPosition(self._currRenderPosition);
1156					}
1157				} else {
1158					self._setThumbsPosition(self._currRenderPosition);
1159				}
1160			}
1161			
1162		},
1163		_onDragMove:function(e, isThumbs) {
1164			var self = this,
1165				point,
1166				isTouch = (e.type === 'touchmove');
1167
1168			if(self._isTouchGesture && !isTouch) {
1169				return;
1170			}
1171
1172			if(isTouch) {
1173				if(self._lockAxis) {
1174					return;
1175				}	
1176				var touches = e.originalEvent.touches;
1177				if(touches) {
1178					if(touches.length > 1) {
1179						return;
1180					} else {
1181						point = touches[0];	
1182					}
1183				} else {
1184					return;
1185				}
1186			} else {
1187				point = e;
1188				if(self.pointerEnabled) point = point.originalEvent;	
1189			}
1190			
1191
1192			if(!self._hasMoved) {
1193				if(self._useCSS3Transitions) {
1194					(!isThumbs ? self._slidesContainer : self._thumbsContainer).css((self._vendorPref + self._TD), '0s');
1195				}
1196				(function animloop(){
1197					if(self._isDragging) {
1198						self._animFrame = requestAnimationFrame(animloop);
1199						if(self._renderMoveEvent)
1200							self._renderMovement(self._renderMoveEvent, isThumbs);
1201					}
1202					
1203				})();
1204			}
1205				
1206			if(!self._checkedAxis) {
1207				
1208				var dir = (!isThumbs ? self._slidesHorizontal : self._thumbsHorizontal),
1209					diff = (Math.abs(point.pageX - self._pageX) - Math.abs(point.pageY - self._pageY) ) - (dir ? -7 : 7);
1210
1211				if(diff > 7) {
1212					// hor movement
1213					if(dir) {
1214						e.preventDefault();
1215						self._currMoveAxis = 'x';
1216					} else if(isTouch) {
1217						self._completeGesture(e);
1218						return;
1219					} 
1220					self._checkedAxis = true;
1221				} else if(diff < -7) {
1222					// ver movement
1223					if(!dir) {
1224						e.preventDefault();
1225						self._currMoveAxis = 'y';
1226					} else if(isTouch) {
1227						self._completeGesture(e);
1228						return;
1229					} 
1230					self._checkedAxis = true;
1231				}
1232				return;
1233			}
1234			
1235			e.preventDefault();	
1236			self._renderMoveTime = new Date().getTime();
1237			self._renderMoveEvent = point;
1238		},
1239		_completeGesture: function(e, isThumbs) {
1240			var self = this;
1241			self._lockAxis = true;
1242			self._hasMoved = self._isDragging = false;
1243			self._onDragRelease(e);
1244		},
1245		_onDragRelease:function(e, isThumbs) {
1246			var self = this,
1247				totalMoveDist,
1248				accDist,
1249				duration,
1250				v0,
1251				newPos,
1252				newDist,
1253				newDuration,
1254				blockLink,
1255				isTouch = (e.type.indexOf('touch') > -1);
1256
1257
1258
1259
1260			if(self._isTouchGesture && !isTouch) {
1261				return;
1262			}
1263
1264			self._isTouchGesture = false;
1265			self.ev.trigger('rsDragRelease');
1266
1267			self._renderMoveEvent = null;
1268			self._isDragging = false;
1269			self._lockAxis = false;
1270			self._checkedAxis = false;
1271			self._renderMoveTime = 0;
1272			cancelAnimationFrame(self._animFrame);
1273			if(self._hasMoved) {
1274				if(!isThumbs) {
1275					if(self._isMove) {
1276						self._setPosition(self._currRenderPosition);
1277					}
1278				} else {
1279					self._setThumbsPosition(self._currRenderPosition);
1280				}
1281			}
1282
1283
1284			self._doc.off(self._moveEvent).off(self._upEvent);
1285
1286			if(isTouch) {
1287				self._sliderOverflow.off(self._cancelEvent);	
1288			}
1289
1290			
1291			self._setGrabCursor();
1292			if (!self._hasMoved && !self._multipleTouches) {
1293				if(isThumbs && self._thumbsEnabled) {
1294					var item = $(e.target).closest('.rsNavItem');
1295					if(item.length) {
1296
1297						self.goTo(item.index());
1298					}	
1299					return;
1300				}
1301			}
1302			var orient = (!isThumbs ? self._slidesHorizontal : self._thumbsHorizontal);
1303			if(!self._hasMoved || (self._currMoveAxis === 'y' && orient) || (self._currMoveAxis === 'x' && !orient) ) {
1304				if(!isThumbs && self._wasAnimating) {
1305					self._wasAnimating = false;
1306					if(!self.st.navigateByClick) {
1307						self.dragSuccess = true;
1308					} else {
1309						self._mouseNext( (self.pointerEnabled ? e.originalEvent : e) );
1310						self.dragSuccess = true;
1311						return;
1312					}
1313				} else {
1314					self._wasAnimating = false;
1315					self.dragSuccess = false;
1316					return;
1317				}
1318				
1319			} else {
1320				self.dragSuccess = true;
1321			}
1322
1323			self._wasAnimating = false;
1324			
1325			
1326			self._currMoveAxis = '';
1327
1328			
1329			function getCorrectSpeed(newSpeed) {
1330				if(newSpeed < 100) {
1331					return 100;
1332				} else if(newSpeed > 500) {
1333					return 500;
1334				} 
1335				return newSpeed;
1336			}
1337			function returnToCurrent(isSlow, v0) {
1338				if(self._isMove || isThumbs) {
1339
1340					newPos = (-self._realId - self._idOffset) * self._slideSize;
1341					newDist = Math.abs(self._sPosition  - newPos);
1342					self._currAnimSpeed = newDist / v0;
1343					if(isSlow) {
1344						self._currAnimSpeed += 250; 
1345					}
1346					self._currAnimSpeed = getCorrectSpeed(self._currAnimSpeed);
1347
1348					self._animateTo(newPos, false);
1349				}
1350			}
1351
1352			var snapDist = self.st.minSlideOffset,
1353				point = isTouch ? e.originalEvent.changedTouches[0] : (self.pointerEnabled ? e.originalEvent : e),
1354				pPos = orient ? point.pageX : point.pageY,
1355				sPos = self._startPagePos,
1356				axPos = self._accelerationPos,
1357				axCurrItem = self.currSlideId,
1358				axNumItems = self.numSlides,
1359				dir = orient ? self._horDir : self._verDir,
1360				loop = self._loop,
1361				changeHash = false,
1362				distOffset = 0;
1363			
1364			totalMoveDist = Math.abs(pPos - sPos);
1365			accDist = pPos - axPos;
1366
1367
1368			duration = (new Date().getTime()) - self._startTime;
1369			v0 = Math.abs(accDist) / duration;	
1370
1371			if(dir === 0 || axNumItems <= 1) {
1372				returnToCurrent(true, v0);
1373				return;
1374			}
1375
1376			if(!loop && !isThumbs) {
1377				if(axCurrItem <= 0) {
1378					if(dir > 0) {
1379						returnToCurrent(true, v0);
1380						return;
1381					}
1382				} else if(axCurrItem >= axNumItems - 1) {
1383					if(dir < 0) {
1384						returnToCurrent(true, v0);
1385						return;
1386					}
1387				}
1388			}
1389
1390			if(!isThumbs) {
1391
1392				var getSwipedSlides = function(dist) {
1393					var numSwipedSlides = Math.floor(dist / self._slideSize);
1394		            var nextSlideOffset = dist - (numSwipedSlides * self._slideSize);
1395		            if (nextSlideOffset > snapDist) {
1396		                numSwipedSlides++;
1397		            }
1398		            return numSwipedSlides;
1399				};
1400
1401				if(sPos + snapDist < pPos) {
1402					if(dir < 0) {		
1403						returnToCurrent(false, v0);
1404						return;					
1405					}
1406					var swipedSlides = getSwipedSlides(pPos - sPos);
1407					self._moveTo(self.currSlideId-swipedSlides, getCorrectSpeed(Math.abs(self._sPosition  - (-self._realId - self._idOffset + swipedSlides) * self._slideSize) / v0), changeHash, true, true);
1408				} else if(sPos - snapDist > pPos) {
1409					if(dir > 0) {		
1410						returnToCurrent(false, v0);
1411						return;					
1412					}
1413					
1414					var swipedSlides = getSwipedSlides(sPos - pPos);
1415		            self._moveTo(self.currSlideId+swipedSlides, getCorrectSpeed(Math.abs(self._sPosition  - (-self._realId - self._idOffset - swipedSlides) * self._slideSize) / v0), changeHash, true, true);
1416				
1417				} else {
1418					returnToCurrent(false, v0);
1419				}
1420			} else {
1421				newPos = self._thumbsPosition;
1422				var transitionSpeed;
1423				
1424				if(newPos > self._thumbsMinPosition) {
1425					newPos = self._thumbsMinPosition;
1426				} else if(newPos < self._thumbsMaxPosition) {
1427					newPos = self._thumbsMaxPosition;
1428				} else {
1429					var friction = 0.003,
1430						S = (v0 * v0) / (friction * 2),
1431						minXDist = -self._thumbsPosition,
1432						maxXDist = self._thumbsContainerSize - self._thumbsViewportSize + self._thumbsPosition;
1433
1434					if (accDist > 0 && S > minXDist) {
1435						minXDist = minXDist + self._thumbsViewportSize / (15 / (S / v0 * friction));
1436						v0 = v0 * minXDist / S;
1437						S = minXDist;
1438					} else if (accDist < 0 && S > maxXDist) {
1439						maxXDist = maxXDist + self._thumbsViewportSize / (15 / (S / v0 * friction));
1440						v0 = v0 * maxXDist / S;
1441						S = maxXDist;
1442					}
1443
1444
1445
1446
1447					transitionSpeed =  Math.max(Math.round(v0 / friction), 50);
1448					newPos = newPos + S * (accDist < 0 ? -1 : 1);
1449
1450
1451					if(newPos > self._thumbsMinPosition) {
1452						self._animateThumbsTo(newPos, transitionSpeed, true, self._thumbsMinPosition, 200);
1453						return;
1454					} else if(newPos < self._thumbsMaxPosition) {
1455						self._animateThumbsTo( newPos, transitionSpeed, true, self._thumbsMaxPosition, 200);
1456						return;
1457					}
1458				}
1459
1460				self._animateThumbsTo(newPos, transitionSpeed, true);
1461
1462			}
1463		},
1464
1465
1466
1467		_setPosition: function(pos) {
1468			var self = this;
1469			pos = self._sPosition = pos;
1470			if(self._useCSS3Transitions) {
1471				self._slidesContainer.css(self._xProp, self._tPref1 + ( self._slidesHorizontal ? (pos + self._tPref2 + 0) : (0 + self._tPref2 + pos) ) + self._tPref3 );		
1472			} else {
1473				self._slidesContainer.css(self._slidesHorizontal ? self._xProp : self._yProp, pos);
1474			}
1475		},
1476		
1477		
1478		updateSliderSize: function(force) {
1479			var self = this,
1480				newWidth,
1481				newHeight;
1482
1483			if(!self.slider) {
1484				return;
1485			}
1486
1487			if(self.st.autoScaleSlider) {
1488				var asw = self.st.autoScaleSliderWidth,
1489					ash = self.st.autoScaleSliderHeight;
1490
1491				if(self.st.autoScaleHeight) {
1492					newWidth = self.slider.width();
1493					if(newWidth != self.width) {
1494						self.slider.css("height", newWidth * (ash / asw) );
1495						newWidth = self.slider.width();
1496					}	
1497					newHeight = self.slider.height();
1498				} else {
1499					newHeight = self.slider.height();
1500					if(newHeight != self.height) {
1501						self.slider.css("width", newHeight * (asw / ash));
1502						newHeight = self.slider.height();
1503					}		
1504					newWidth = self.slider.width();
1505				}
1506			
1507			} else {
1508				newWidth = self.slider.width();
1509				newHeight = self.slider.height();
1510			}
1511			
1512
1513
1514			if(force || newWidth != self.width || newHeight != self.height) {
1515				self.width = newWidth;
1516				self.height = newHeight;
1517
1518				self._wrapWidth = newWidth;
1519				self._wrapHeight = newHeight;
1520
1521				self.ev.trigger('rsBeforeSizeSet');
1522				self.ev.trigger('rsAfterSizePropSet');
1523
1524				self._sliderOverflow.css({
1525					width: self._wrapWidth,
1526					height: self._wrapHeight
1527				});
1528
1529
1530				self._slideSize = (self._slidesHorizontal ? self._wrapWidth : self._wrapHeight) + self.st.slidesSpacing;
1531				
1532
1533				self._imagePadding = self.st.imageScalePadding;
1534				var item,
1535					slideItem,
1536					i,
1537					img;
1538				for(i = 0; i < self.slides.length; i++) {
1539					item = self.slides[i];
1540					item.positionSet = false;
1541
1542					if(item && item.images && item.isLoaded) {
1543						item.isRendered = false;
1544						self._resizeImage(item);
1545					} 
1546				}
1547				if(self._cloneHolders) {
1548					for(i = 0; i < self._cloneHolders.length; i++) {
1549						item = self._cloneHolders[i];
1550						item.holder.css(self._reorderProp, (item.id + self._idOffset) * self._slideSize);
1551					}
1552				}
1553				
1554				self._updateBlocksContent();
1555
1556				if(self._isMove) {
1557					if(self._useCSS3Transitions) {
1558						self._slidesContainer.css(self._vendorPref + 'transition-duration', '0s');
1559					}
1560					self._setPosition( (-self._realId - self._idOffset) * self._slideSize);
1561				}
1562				self.ev.trigger('rsOnUpdateNav');
1563			}
1564			self._sliderOffset = self._sliderOverflow.offset();
1565			self._sliderOffset = self._sliderOffset[self._reorderProp];
1566
1567
1568		},
1569		
1570		/**
1571		 * Adds slide
1572		 * @param  {jQuery object or raw HTML} htmltext 
1573		 * @param  {int} index    (optional) Index where item should be added (last item is removed of not specified)
1574		 */
1575		appendSlide: function(htmltext, index) {
1576			var self = this,
1577				parsedSlide = self._parseNode(htmltext);
1578
1579			if(isNaN(index) || index > self.numSlides) {
1580				index = self.numSlides;
1581			}
1582			self.slides.splice(index, 0, parsedSlide);
1583			self.slidesJQ.splice(index, 0, $('<div style="'+ (self._isMove ? 'position:absolute;' : self._opacityCSS ) +'" class="rsSlide"></div>') );
1584
1585			if(index <= self.currSlideId) {
1586				self.currSlideId++;
1587			}
1588			self.ev.trigger('rsOnAppendSlide', [parsedSlide, index]);
1589			
1590			self._refreshSlides(index);
1591
1592			if(index === self.currSlideId) {
1593				self.ev.trigger('rsAfterSlideChange');
1594			}
1595		},
1596
1597		/**
1598		 * Removes slide
1599		 * @param  {int} Index of item that should be removed
1600		 */
1601		removeSlide: function(index) {
1602			var self = this,
1603				slideToRemove = self.slides[index];
1604
1605			if(slideToRemove) {
1606				if(slideToRemove.holder) {
1607					slideToRemove.holder.remove();
1608				}
1609				if(index < self.currSlideId) {
1610					self.currSlideId--;
1611				}
1612				self.slides.splice(index, 1);
1613				self.slidesJQ.splice(index, 1);
1614
1615				self.ev.trigger('rsOnRemoveSlide', [index]);
1616				self._refreshSlides(index);
1617
1618				if(index === self.currSlideId) {
1619					self.ev.trigger('rsAfterSlideChange');
1620				}
1621			}
1622		},
1623		_refreshSlides: function(refreshIndex) {
1624
1625			// todo: optimize this stuff
1626			var self = this;
1627
1628			var oldNumSlides = self.numSlides;
1629			var numLoops = self._realId <= 0 ? 0 : Math.floor(self._realId / oldNumSlides);
1630
1631			self.numSlides = self.slides.length;
1632			if(self.numSlides === 0) {
1633				self.currSlideId = self._idOffset = self._realId = 0;
1634				self.currSlide = self._oldHolder = null;
1635			} else {
1636				self._realId = numLoops * self.numSlides + self.currSlideId;
1637			}
1638
1639			for(var i = 0; i < self.numSlides; i++) {
1640				self.slides[i].id = i;
1641			}
1642
1643			self.currSlide = self.slides[self.currSlideId];
1644			self._currHolder = self.slidesJQ[self.currSlideId];
1645
1646			if(self.currSlideId >= self.numSlides) {
1647				self.goTo(self.numSlides - 1);
1648			} else if(self.currSlideId < 0) {
1649				self.goTo(0);
1650			}
1651
1652			self._refreshNumPreloadImages();
1653
1654			if(self._isMove/* && self._loop*/) {
1655				self._slidesContainer.css((self._vendorPref + self._TD), '0ms');
1656			}
1657			if(self._refreshSlidesTimeout) {
1658				clearTimeout(self._refreshSlidesTimeout);
1659			}
1660
1661
1662			self._refreshSlidesTimeout = setTimeout(function() {
1663				if(self._isMove) {
1664					self._setPosition( (-self._realId - self._idOffset) * self._slideSize);	
1665				}
1666				self._updateBlocksContent();
1667				if(!self._isMove) {
1668					self._currHolder.css({
1669						display: 'block',
1670						opacity: 1
1671					});
1672				}
1673				
1674			}, 14);
1675			self.ev.trigger('rsOnUpdateNav');
1676		},
1677		_setGrabCursor:function() {	
1678			var self = this;
1679			if(self._hasDrag && self._isMove) {
1680				if(self._grabCursor) {
1681					self._sliderOverflow.css('cursor', self._grabCursor);
1682				} else {
1683					self._sliderOverflow.removeClass('grabbing-cursor');
1684					self._sliderOverflow.addClass('grab-cursor');	
1685				}
1686			}
1687		},
1688		_setGrabbingCursor:function() {		
1689			var self = this;
1690			if(self._hasDrag && self._isMove) {
1691				if(self._grabbingCursor) {
1692					self._sliderOverflow.css('cursor', self._grabbingCursor);
1693				} else {
1694					self._sliderOverflow.removeClass('grab-cursor');
1695					self._sliderOverflow.addClass('grabbing-cursor');	
1696				}	
1697			}
1698		},
1699		next: function(notUserAction) {
1700			var self = this;
1701			self._moveTo('next',  self.st.transitionSpeed, true, !notUserAction);
1702		},
1703		prev: function(notUserAction) {
1704			var self = this;
1705			self._moveTo('prev', self.st.transitionSpeed, true, !notUserAction);
1706		},
1707		_moveTo:function(type,  speed, inOutEasing, userAction, fromSwipe) {
1708			var self = this,
1709				newPos,
1710				difference,
1711				i,
1712				newItemId;
1713			
1714			
1715			self.ev.trigger('rsBeforeMove', [type, userAction]);
1716			if(type === 'next') {
1717				newItemId = self.currSlideId+1;
1718			} else if(type === 'prev') {
1719				newItemId = self.currSlideId-1;
1720			} else {
1721				newItemId = type = parseInt(type, 10);
1722			}
1723
1724			if(!self._loop) {
1725				if(newItemId < 0) {
1726					self._doBackAndForthAnim('left', !userAction);
1727					return;
1728				} else if(newItemId >= self.numSlides ) {
1729					self._doBackAndForthAnim('right', !userAction);
1730					return;
1731				}
1732			}
1733			
1734			if(self._isAnimating) {
1735				self._stopAnimation(true);
1736				inOutEasing = false;
1737			}
1738
1739			difference = newItemId - self.currSlideId;
1740
1741
1742
1743			self._prevSlideId = self.currSlideId;
1744			var prevId = self.currSlideId;
1745			var id = self.currSlideId + difference;
1746			var realId = self._realId;
1747			var temp;
1748			var delayed;
1749			if(self._loop) {
1750				id = self._updateBlocksContent(false, id);
1751				realId += difference;
1752			} else {
1753				realId = id;
1754			}
1755			self._newSlideId = id;
1756
1757			self._oldHolder = self.slidesJQ[self.currSlideId];
1758
1759			
1760			self._realId = realId;
1761			self.currSlideId = self._newSlideId;
1762
1763			self.currSlide = self.slides[self.currSlideId];
1764			self._currHolder = self.slidesJQ[self.currSlideId];
1765
1766			
1767			var checkDist = self.st.slidesDiff;
1768			var next = Boolean(difference > 0);
1769			var absDiff = Math.abs(difference);
1770			var g1 = Math.floor( prevId / self._numPreloadImages);
1771			var g2 = Math.floor( ( prevId + (next ? checkDist : -checkDist  ) ) / self._numPreloadImages);
1772			var biggest = next ? Math.max(g1,g2) : Math.min(g1,g2);
1773			var biggestId = biggest * self._numPreloadImages +  ( next ? (self._numPreloadImages - 1) : 0 );
1774			if(biggestId > self.numSlides - 1) {
1775				biggestId = self.numSlides - 1;
1776			} else if(biggestId < 0) {
1777				biggestId = 0;
1778			}
1779			var toLast =  next ? (biggestId - prevId) :  (prevId - biggestId);
1780			if(toLast > self._numPreloadImages) {
1781				toLast = self._numPreloadImages;
1782			}
1783			if(absDiff > toLast + checkDist) {
1784				self._idOffset +=  ( absDiff - (toLast + checkDist) ) * ( next ? -1 : 1 );
1785				speed = speed * 1.4;
1786				for(i = 0; i < self.numSlides; i++) {
1787					self.slides[i].positionSet = false;
1788				}
1789			}
1790			self._currAnimSpeed = speed;
1791
1792			self._updateBlocksContent(true);
1793			if(!fromSwipe) {
1794				delayed = true;
1795			}
1796
1797
1798			newPos = (-realId - self._idOffset) * self._slideSize;
1799
1800			
1801
1802			if(delayed) {
1803				setTimeout(function() {
1804					self._isWorking = false;
1805					self._animateTo(newPos, type, false, inOutEasing);
1806					self.ev.trigger('rsOnUpdateNav');
1807				}, 0);
1808			} else {
1809				self._animateTo(newPos, type, false, inOutEasing);
1810				self.ev.trigger('rsOnUpdateNav');
1811			}
1812			
1813			
1814			function isSetToCurrent(testId) {
1815				if(testId < 0) {
1816					testId = self.numSlides + testId;
1817				} else if(testId > self.numSlides - 1) {
1818					testId = testId - self.numSlides;
1819				}
1820				if(testId !== self.currSlideId) {
1821					return false;
1822				}
1823				return true;
1824			}
1825			
1826		},
1827		_updateArrowsNav: function() {
1828			var self = this,
1829				arrDisClass = 'rsArrowDisabled';
1830			if(self.st.arrowsNav) {
1831				if(self.numSlides <= 1) {
1832					self._arrowLeft.css('display', 'none');
1833					self._arrowRight.css('display', 'none');
1834					return;
1835				} else {
1836					self._arrowLeft.css('display', 'block');
1837					self._arrowRight.css('display', 'block');
1838				}
1839				if(!self._loop && !self.st.loopRewind) {
1840					if(self.currSlideId === 0) {
1841						self._arrowLeft.addClass(arrDisClass);
1842					} else {
1843						self._arrowLeft.removeClass(arrDisClass);
1844					}
1845					if(self.currSlideId === self.numSlides - 1) {
1846						self._arrowRight.addClass(arrDisClass);
1847					} else {
1848						self._arrowRight.removeClass(arrDisClass);
1849					}
1850				}
1851			}
1852		},
1853		_animateTo:function(pos, dir,  loadAll, inOutEasing, customComplete) {
1854			var self = this,
1855				moveProp,
1856				oldBlock,
1857				animBlock;
1858
1859			var animObj = {};
1860			if(isNaN(self._currAnimSpeed)) {
1861				self._currAnimSpeed = 400;
1862			} 
1863			
1864
1865
1866			self._sPosition = self._currRenderPosition = pos;
1867
1868			self.ev.trigger('rsBeforeAnimStart');
1869
1870			if(!self._useCSS3Transitions) {
1871				if(self._isMove) {
1872					animObj[self._slidesHorizontal ? self._xProp : self._yProp] = pos + 'px';
1873
1874
1875					self._slidesContainer.animate(animObj, self._currAnimSpeed, /*'easeOutQuart'*/ inOutEasing ? self.st.easeInOut : self.st.easeOut);
1876				} else {
1877					oldBlock = self._oldHolder;
1878					animBlock = self._currHolder;					
1879
1880					animBlock.stop(true, true).css({
1881						opacity: 0,
1882						display: 'block',
1883						zIndex: self._fadeZIndex
1884					});
1885					self._currAnimSpeed = self.st.transitionSpeed;
1886					animBlock.animate({opacity: 1}, self._currAnimSpeed, self.st.easeInOut);
1887
1888					
1889					clearTimeouts();
1890					if(oldBlock) {
1891						oldBlock.data('rsTimeout', setTimeout(function() {
1892							oldBlock.stop(true, true).css({
1893								opacity: 0,
1894								display: 'none',
1895								zIndex: 0
1896							});
1897						}, self._currAnimSpeed + 60) );
1898					}
1899				}
1900				
1901			} else {
1902				if(self._isMove) {
1903					
1904					
1905
1906						self._currAnimSpeed = parseInt(self._currAnimSpeed, 10);
1907						var td = self._vendorPref + self._TD;
1908						var ttf = self._vendorPref + self._TTF;
1909
1910						animObj[td] = self._currAnimSpeed+'ms';
1911						animObj[ttf] = inOutEasing ? $.rsCSS3Easing[self.st.easeInOut] : $.rsCSS3Easing[self.st.easeOut];
1912						
1913						self._slidesContainer.css(animObj);
1914					if(inOutEasing || !self.hasTouch) {
1915						setTimeout(function() {
1916							self._setPosition(pos);
1917						}, 5);
1918					} else {
1919						self._setPosition(pos);
1920					} 
1921					
1922					
1923
1924				} else {
1925					//self._currAnimSpeed = 10
1926					self._currAnimSpeed = self.st.transitionSpeed;
1927					oldBlock = self._oldHolder;
1928					animBlock = self._currHolder;		
1929					if(animBlock.data('rsTimeout')) {
1930						animBlock.css('opacity', 0);
1931					}
1932					clearTimeouts();
1933					if(oldBlock) {
1934						//if(oldBlock)
1935						oldBlock.data('rsTimeout', setTimeout(function() {
1936							animObj[self._vendorPref + self._TD] = '0ms';
1937							animObj.zIndex = 0;
1938							animObj.display = 'none';
1939							oldBlock.data('rsTimeout', '');
1940							oldBlock.css(animObj);
1941							setTimeout(function() {
1942								oldBlock.css('opacity', 0);
1943							}, 16);
1944						}, self._currAnimSpeed + 60) );
1945					}
1946
1947					animObj.display = 'block';
1948					animObj.zIndex = self._fadeZIndex;
1949					animObj.opacity = 0;
1950					animObj[self._vendorPref + self._TD] = '0ms';
1951					animObj[self._vendorPref + self._TTF] = $.rsCSS3Easing[self.st.easeInOut];
1952					animBlock.css(animObj);
1953					animBlock.data('rsTimeout', setTimeout(function() {
1954						//animBlock.css('opacity', 0);
1955						animBlock.css(self._vendorPref + self._TD,  self._currAnimSpeed+'ms');
1956
1957						//oldBlock.css(self._vendorPref + self._TD,  '0ms');
1958						animBlock.data('rsTimeout', setTimeout(function() {
1959							animBlock.css('opacity', 1);
1960							animBlock.data('rsTimeout', '');
1961						}, 20) );
1962					}, 20) );
1963				}
1964			}
1965			self._isAnimating = true;
1966			if(self.loadingTimeout) {
1967				clearTimeout(self.loadingTimeout);
1968			}
1969			if(customComplete) {
1970				self.loadingTimeout = setTimeout(function() {
1971					self.loadingTimeout = null;
1972					customComplete.call();
1973
1974				}, self._currAnimSpeed + 60);
1975			} else {
1976				self.loadingTimeout = setTimeout(function() {
1977					self.loadingTimeout = null;
1978					self._animationComplete(dir);
1979				}, self._currAnimSpeed + 60);
1980			}
1981
1982			function clearTimeouts() {
1983				var t;
1984				if(oldBlock) {
1985					t = oldBlock.data('rsTimeout');
1986					if(t) {
1987						if(oldBlock !== animBlock) {
1988							oldBlock.css({
1989									opacity: 0,
1990									display: 'none',
1991									zIndex: 0
1992								});
1993						}
1994						clearTimeout(t);
1995						oldBlock.data('rsTimeout', '');
1996					}
1997				}
1998				
1999				t = animBlock.data('rsTimeout');
2000				if(t) {
2001					clearTimeout(t);
2002					animBlock.data('rsTimeout', '');
2003				}
2004			}
2005		},
2006		_stopAnimation: function(noCSS3) {
2007			var self = this;
2008			self._isAnimating = false;
2009			clearTimeout(self.loadingTimeout);
2010			if(self._isMove) {
2011
2012				if(!self._useCSS3Transitions) {
2013					self._slidesContainer.stop(true);
2014					self._sPosition = parseInt(self._slidesContainer.css(self._slidesHorizontal ? self._xProp : self._yProp), 10);
2015				} else if (!noCSS3) {
2016					var oldPos = self._sPosition;
2017					var newPos =  self._currRenderPosition = self._getTransformProp();
2018					self._slidesContainer.css((self._vendorPref + self._TD), '0ms');
2019					if(oldPos !==newPos) {
2020						self._setPosition(newPos);
2021					}
2022				}
2023			} else {
2024				// kung fu
2025				if(self._fadeZIndex > 20) {
2026					self._fadeZIndex = 10;
2027				} else {
2028					self._fadeZIndex++;
2029				}
2030			}
2031			
2032			
2033		},
2034		// Thanks to @benpbarnett
2035		_getTransformProp:function(){
2036			var self = this,
2037				transform = window.getComputedStyle(self._slidesContainer.get(0), null).getPropertyValue(self._vendorPref + 'transform'),			
2038				explodedMatrix = transform.replace(/^matrix\(/i, '').split(/, |\)$/g),
2039				isMatrix3d = (explodedMatrix[0].indexOf('matrix3d') === 0);
2040			return parseInt(explodedMatrix[(self._slidesHorizontal ? (isMatrix3d ? 12 : 4) : (isMatrix3d ? 13 : 5) )], 10);
2041		},
2042		_getCSS3Prop: function(pos, hor) {
2043			var self = this;
2044			return self._useCSS3Transitions ? self._tPref1 + ( hor ? (pos + self._tPref2 + 0) : (0 + self._tPref2 + pos) ) + self._tPref3 : pos;
2045		},
2046		_animationComplete: function(dir) {
2047			var self = this;
2048			if(!self._isMove) {
2049				self._currHolder.css('z-index', 0);
2050				self._fadeZIndex = 10;
2051			}
2052			self._isAnimating = false;
2053			
2054			self.staticSlideId = self.currSlideId;
2055			self._updateBlocksContent();
2056
2057
2058			self._slidesMoved = false;
2059			
2060			self.ev.trigger('rsAfterSlideChange');
2061		},
2062		_doBackAndForthAnim:function(type, userAction) {
2063			var self = this,
2064				newPos = (-self._realId - self._idOffset) * self._slideSize;
2065
2066			if(self.numSlides === 0 || self._isAnimating) {
2067				return;
2068			} 
2069			if(self.st.loopRewind) {
2070				self.goTo(type === 'left' ? self.numSlides - 1 : 0, userAction);
2071				return;
2072			}
2073
2074			if(self._isMove) {
2075				self._currAnimSpeed = 200;
2076
2077				var allAnimComplete = function () {
2078					self._isAnimating = false;
2079				};
2080				var firstAnimComplete = function () {
2081					self._isAnimating = false;
2082					self._animateTo(newPos, '', false, true, allAnimComplete);
2083				};
2084				self._animateTo(newPos + (type === 'left' ? 30 : -30),'', false, true, firstAnimComplete);
2085			}
2086			
2087		},
2088
2089		_resizeImage:function(slideObject, useClone) {
2090
2091			var isRoot = true;
2092			if(slideObject.isRendered) {
2093				return;
2094			}
2095			var img = slideObject.content;
2096			var classToFind = 'rsMainSlideImage';
2097			var isVideo;
2098			var self = this,
2099				imgAlignCenter = $.isFunction(self.st.imageAlignCenter) ? self.st.imageAlignCenter(slideObject) : self.st.imageAlignCenter,
2100				imgScaleMode =  $.isFunction(self.st.imageScaleMode) ? self.st.imageScaleMode(slideObject) : self.st.imageScaleMode,
2101				tempEl,
2102				bMargin;
2103
2104			if(slideObject.videoURL) {
2105				classToFind = 'rsVideoContainer';
2106				if(imgScaleMode !== 'fill') {
2107					isVideo = true;
2108				} else {
2109					tempEl = img;
2110					if(!tempEl.hasClass(classToFind)) {
2111						tempEl = tempEl.find('.'+classToFind);
2112					}
2113					tempEl.css({width:'100%',height: '100%'});
2114					classToFind = 'rsMainSlideImage';
2115				}
2116			}
2117			if(!img.hasClass(classToFind)) {
2118				isRoot = false;
2119				img = img.find('.'+classToFind);
2120			}
2121			if(!img) {
2122				return;
2123			}
2124
2125			var baseImageWidth = slideObject.iW,
2126				baseImageHeight = slideObject.iH;
2127
2128			slideObject.isRendered = true;
2129			if(imgScaleMode === 'none' && !imgAlignCenter) {
2130				return;
2131			}
2132			if(imgScaleMode !== 'fill') {
2133				bMargin = self._imagePadding;
2134			} else {
2135				bMargin = 0;
2136			}
2137			//var block = img.parent('.block-inside').css('margin', bMargin);
2138			var containerWidth = self._wrapWidth - bMargin * 2,
2139				containerHeight = self._wrapHeight - bMargin * 2,
2140				hRatio,
2141				vRatio,
2142				ratio,
2143				nWidth,
2144				nHeight,
2145				cssObj = {};
2146
2147			if(imgScaleMode === 'fit-if-smaller') {
2148				if(baseImageWidth > containerWidth || baseImageHeight > containerHeight) {
2149					imgScaleMode = 'fit';
2150				}
2151			}
2152			if(imgScaleMode === 'fill' || imgScaleMode === 'fit') {		
2153				hRatio = containerWidth / baseImageWidth;
2154				vRatio = containerHeight / baseImageHeight;
2155
2156				if (imgScaleMode  == "fill") {
2157					ratio = hRatio > vRatio ? hRatio : vRatio;
2158				} else if (imgScaleMode  == "fit") {
2159					ratio = hRatio < vRatio ? hRatio : vRatio;
2160				} else {
2161					ratio = 1;
2162				}
2163
2164				nWidth = Math.ceil(baseImageWidth * ratio, 10);
2165				nHeight = Math.ceil(baseImageHeight * ratio, 10);
2166			} else {								
2167				nWidth = baseImageWidth;
2168				nHeight = baseImageHeight;		
2169			}
2170			if(imgScaleMode !== 'none') {
2171				cssObj.width = nWidth;
2172				cssObj.height = nHeight;
2173				if(isVideo) {
2174					img.find('.rsImg').css({width: '100%', height:'100%'});
2175				}
2176			}
2177			if (imgAlignCenter) {     
2178				cssObj.marginLeft = Math.floor((containerWidth - nWidth) / 2) +  bMargin;
2179				cssObj.marginTop = Math.floor((containerHeight - nHeight) / 2) +  bMargin;
2180			}
2181			img.css(cssObj);
2182		}
2183	}; /* RoyalSlider core prototype end */
2184	$.rsProto = RoyalSlider.prototype;
2185
2186	$.fn.royalSlider = function(options) {
2187		var args = arguments;
2188		return this.each(function(){
2189			var self = $(this);
2190			if (typeof options === "object" ||  !options) {
2191				if( !self.data('royalSlider') ) {
2192					self.data('royalSlider', new RoyalSlider(self, options));
2193				}
2194			} else {
2195				var royalSlider = self.data('royalSlider');
2196				if (royalSlider && royalSlider[options]) {
2197					return royalSlider[options].apply(royalSlider, Array.prototype.slice.call(args, 1));
2198				}
2199			}
2200		});
2201	};
2202
2203	$.fn.royalSlider.defaults = {    
2204		slidesSpacing: 8,
2205		startSlideId: 0,
2206		loop: false,
2207		loopRewind: false,
2208		numImagesToPreload: 4,
2209		fadeinLoadedSlide: true,
2210		slidesOrientation: 'horizontal',
2211		transitionType: 'move', 
2212		transitionSpeed: 600,
2213		controlNavigation: 'bullets',
2214		controlsInside: true, 
2215		arrowsNav: true,
2216		arrowsNavAutoHide: true,
2217		navigateByClick: true,
2218		randomizeSlides: false,
2219		sliderDrag: true, 
2220		sliderTouch: true,
2221		keyboardNavEnabled: false,
2222		fadeInAfterLoaded: true,
2223
2224		allowCSS3: true,
2225		allowCSS3OnWebkit: true,
2226
2227		
2228		addActiveClass: false,
2229		autoHeight: false,
2230
2231		easeOut: 'easeOutSine',
2232		easeInOut: 'easeInOutSine',
2233
2234		minSlideOffset: 10,
2235
2236		imageScaleMode:"fit-if-smaller",
2237		imageAlignCenter:true,
2238		imageScalePadding: 4,
2239		usePreloader: true,
2240
2241		autoScaleSlider: false,
2242
2243		autoScaleSliderWidth: 800,
2244		autoScaleSliderHeight: 400,
2245
2246		autoScaleHeight: true,
2247
2248		arrowsNavHideOnTouch: false,
2249		globalCaption: false,
2250
2251		slidesDiff: 2
2252	}; /* default options end */
2253
2254	$.rsCSS3Easing = {
2255		easeOutSine: 'cubic-bezier(0.390, 0.575, 0.565, 1.000)',
2256		easeInOutSine: 'cubic-bezier(0.445, 0.050, 0.550, 0.950)'
2257	};
2258
2259	$.extend(jQuery.easing, {
2260		easeInOutSine: function (x, t, b, c, d) {
2261			return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
2262		},
2263		easeOutSine: function (x, t, b, c, d) {
2264			return c * Math.sin(t/d * (Math.PI/2)) + b;
2265		},
2266		easeOutCubic: function (x, t, b, c, d) {
2267			return c*((t=t/d-1)*t*t + 1) + b;
2268		}
2269	});
2270
2271
2272})(jQuery, window);
2273
2274
2275// jquery.rs.active-class v1.0.1
2276(function($) {
2277
2278	"use strict";
2279
2280	/**
2281	 *
2282	 * RoyalSlider active class module 
2283	 * @version 1.0.1:
2284	 *
2285	 * 1.0.1
2286	 * - Simplified code
2287	 * - Fixed bug when slide with activeClass is removed
2288	 */ 
2289	$.rsProto._initActiveClass = function() {
2290		var updClassTimeout,
2291			self = this,
2292			aSlideClass = 'rsActiveSlide';
2293		if(self.st.addActiveClass) {
2294
2295			self.ev.on('rsOnUpdateNav', function() {
2296
2297				if(updClassTimeout) clearTimeout(updClassTimeout);
2298				updClassTimeout = setTimeout(function() {
2299					if(self._oldHolder) self._oldHolder.removeClass(aSlideClass);
2300					if(self._currHolder) self._currHolder.addClass(aSlideClass);
2301					updClassTimeout = null;
2302				}, 50);
2303			});
2304
2305		}
2306	};
2307	$.rsModules.activeClass = $.rsProto._initActiveClass;
2308})(jQuery);
2309
2310// jquery.rs.animated-blocks v1.0.7
2311(function($) {
2312
2313	"use strict";
2314
2315	/**
2316	 *
2317	 * RoyalSlider animated blocks module
2318	 * @version 1.0.7:
2319	 *
2320	 * 1.0.2:
2321	 * - Fixed mistake from prev fix :/
2322	 * 
2323	 * 1.0.3:
2324	 * - Fixed animated block appearing in Firefox
2325	 *
2326	 * 1.0.4
2327	 * - Fixed bug that could cause incorrect block when randomizeSlides is enabled
2328	 *
2329	 * 1.0.5
2330	 * - moveEffect:none' bug
2331	 *
2332	 * 1.0.6
2333	 * - Fixed issue that could cause incorrect position of blocks in IE
2334	 *
2335	 * 1.0.7
2336	 * - Move offset fix
2337	 */ 
2338	$.extend($.rsProto, {
2339		_initAnimatedBlocks: function() {
2340			var self = this,
2341				i;
2342
2343			self._blockDefaults = {
2344				fadeEffect: true,
2345				moveEffect: 'top', 
2346				moveOffset:20,               
2347				speed:400,               
2348				easing:'easeOutSine',      
2349				delay:200                 
2350			};
2351			self.st.block = $.extend({}, self._blockDefaults, self.st.block);
2352
2353			self._blockAnimProps = [];
2354			self._animatedBlockTimeouts = [];
2355
2356			self.ev.on('rsAfterInit', function() {
2357				runBlocks();
2358			});
2359
2360			self.ev.on('rsBeforeParseNode', function(e, content, obj) {
2361				content = $(content);
2362
2363				obj.animBlocks = content.find('.rsABlock').css('display', 'none');
2364				if(!obj.animBlocks.length) {
2365					if(content.hasClass('rsABlock')) {
2366						obj.animBlocks = content.css('display', 'none');
2367					} else {
2368						obj.animBlocks = false;
2369					}
2370				}
2371			});
2372			self.ev.on('rsAfterContentSet', function(e, slideObject) {
2373				var currId = self.slides[self.currSlideId].id; 
2374				if(slideObject.id === currId) {
2375					setTimeout(function() {
2376						runBlocks();
2377					}, self.st.fadeinLoadedSlide ? 300 : 0);
2378				}
2379			});
2380		
2381			self.ev.on('rsAfterSlideChange', function() {
2382				runBlocks();
2383			});
2384			function runBlocks() {
2385				var slide = self.currSlide;
2386				if(!self.currSlide || !self.currSlide.isLoaded) {
2387					return;
2388				}
2389
2390				// clear previous animations
2391				if(self._slideWithBlocks !== slide) {
2392					if(self._animatedBlockTimeouts.length > 0) {
2393						for(i = 0; i < self._animatedBlockTimeouts.length; i++) { 
2394							clearTimeout(self._animatedBlockTimeouts[i]);
2395						}
2396						self._animatedBlockTimeouts = [];
2397					}
2398					
2399					if(self._blockAnimProps.length > 0) {						
2400						var cItemTemp;
2401						for(i = 0; i < self._blockAnimProps.length; i++) {  
2402							cItemTemp = self._blockAnimProps[i];							
2403							if(cItemTemp) {								
2404								if(!self._useCSS3Transitions) {
2405									cItemTemp.block.stop(true).css(cItemTemp.css);
2406								} else {
2407									cItemTemp.block.css(self._vendorPref + self._TD, '0s');
2408									cItemTemp.block.css(cItemTemp.css);
2409								}
2410								self._slideWithBlocks = null;
2411								slide.animBlocksDisplayed = false;
2412							}
2413						}
2414						self._blockAnimProps = [];
2415					}
2416					if(slide.animBlocks) {
2417						slide.animBlocksDisplayed = true;
2418						self._slideWithBlocks = slide;
2419						self._animateBlocks(slide.animBlocks);
2420					}
2421				}
2422			}
2423		},
2424		_updateAnimBlockProps: function(obj, props) {
2425			setTimeout(function() {
2426				obj.css(props);
2427			}, 6);
2428		},
2429		_animateBlocks: function(animBlocks) {
2430			var self = this,
2431				item,
2432				animObj,
2433				newPropObj,
2434				transitionData;
2435
2436			var currItem,
2437				fadeEnabled,
2438				moveEnabled,				
2439				effectName,	
2440				effectsObject,
2441				moveEffectProperty,
2442				currEffects,
2443				newEffectObj,	
2444				moveOffset,
2445				delay,
2446				speed,
2447				easing,
2448				moveProp,
2449				i,
2450				moveEffect,
2451				isOppositeProp;
2452
2453			self._animatedBlockTimeouts = [];
2454
2455			animBlocks.each(function(index) {
2456
2457				item = $(this);
2458				
2459
2460				animObj = {};
2461				newPropObj = {};
2462				transitionData = null;
2463
2464					var moveOffset = item.attr('data-move-offset');
2465					if(!moveOffset) {
2466						moveOffset = self.st.block.moveOffset;
2467					} else {
2468						moveOffset = parseInt(moveOffset, 10);
2469					}
2470
2471					if(moveOffset > 0) {
2472						moveEffect = item.data('move-effect');
2473						if(moveEffect) {
2474							moveEffect = moveEffect.toLowerCase();
2475							if(moveEffect === 'none') {
2476								moveEffect = false;
2477							} else if(moveEffect !== 'left' && moveEffect !== 'top' && moveEffect !== 'bottom' && moveEffect !== 'right') {
2478								moveEffect = self.st.block.moveEffect;
2479								if(moveEffect === 'none') {
2480									moveEffect = false;
2481								}
2482							}
2483						} else {
2484							moveEffect = self.st.block.moveEffect;
2485						}
2486						if(moveEffect && moveEffect !== 'none') {
2487							var moveHorizontal;
2488							if(moveEffect === 'right' || moveEffect === 'left') {
2489								moveHorizontal = true;
2490							} else {
2491								moveHorizontal = false;
2492							}
2493							var currPos,
2494								startPos;
2495							
2496							isOppositeProp = false;
2497							
2498							if(self._useCSS3Transitions) {
2499								currPos = 0;
2500								moveProp = self._xProp;
2501							} else {
2502								if(moveHorizontal) {
2503									if( !isNaN( parseInt(item.css('right'), 10) ) ) {
2504										moveProp = 'right';
2505										isOppositeProp = true;
2506									} else {
2507										moveProp = 'left';
2508									}
2509								} else {
2510
2511									if( !isNaN( parseInt(item.css('bottom'), 10) ) ) {
2512										moveProp = 'bottom';
2513										isOppositeProp = true;
2514									} else {
2515										moveProp = 'top';
2516									}
2517								}
2518								moveProp = 'margin-'+moveProp;
2519								if(isOppositeProp) {
2520									moveOffset = -moveOffset;
2521								}
2522
2523								if(!self._useCSS3Transitions) {
2524									currPos = item.data('rs-start-move-prop');
2525									if( currPos === undefined ) {
2526										currPos = parseInt(item.css(moveProp), 10); 
2527										item.data('rs-start-move-prop', currPos);
2528									}
2529								} else {
2530									currPos = parseInt(item.css(moveProp), 10); 
2531								}
2532								
2533								
2534							}
2535
2536							if(moveEffect === 'top' || moveEffect === 'left') {
2537								startPos = currPos - moveOffset;
2538							} else {
2539								startPos = currPos + moveOffset;
2540							}
2541							
2542							newPropObj[moveProp] = self._getCSS3Prop(startPos, moveHorizontal);
2543							animObj[moveProp] = self._getCSS3Prop(currPos, moveHorizontal);
2544							
2545						}
2546					}
2547					
2548
2549					var fadeEffect = item.attr('data-fade-effect');
2550					if(!fadeEffect) {
2551						fadeEffect = self.st.block.fadeEffect;
2552					} else if(fadeEffect.toLowerCase() === 'none' || fadeEffect.toLowerCase() === 'false') {
2553						fadeEffect = false;
2554					}
2555					if(fadeEffect) {
2556						newPropObj.opacity = 0;
2557						animObj.opacity = 1;
2558					}
2559
2560					if(fadeEffect || moveEffect) {
2561						transitionData = {};
2562						transitionData.hasFade = Boolean(fadeEffect);
2563						if(Boolean(moveEffect)) {
2564							transitionData.moveProp = moveProp;
2565							transitionData.hasMove = true;
2566						}
2567
2568						transitionData.speed = item.data('speed');
2569						if(isNaN(transitionData.speed)) {
2570							transitionData.speed = self.st.block.speed;
2571						}
2572						transitionData.easing = item.data('easing');
2573						if(!transitionData.easing) {
2574							transitionData.easing = self.st.block.easing;
2575						}
2576						transitionData.css3Easing = $.rsCSS3Easing[transitionData.easing];
2577
2578						transitionData.delay =  item.data('delay');
2579						if(isNaN(transitionData.delay)) {
2580							transitionData.delay = self.st.block.delay * index;
2581						}
2582
2583					}
2584
2585					var blockPropsObj = {};
2586					if(self._useCSS3Transitions) {
2587						blockPropsObj[(self._vendorPref + self._TD)] =  '0ms';
2588					}
2589					blockPropsObj.moveProp = animObj.moveProp;
2590					blockPropsObj.opacity = animObj.opacity;
2591					blockPropsObj.display = 'none';
2592
2593
2594					self._blockAnimProps.push({block:item, css:blockPropsObj});
2595
2596					self._updateAnimBlockProps(item, newPropObj);
2597
2598					// animate caption
2599					self._animatedBlockTimeouts.push(setTimeout((function (cItem, animateData, transitionData, index) {	
2600						return function() {	
2601							cItem.css('display', 'block');
2602							if(transitionData) {
2603								var animObj = {};
2604								if(!self._useCSS3Transitions) {
2605									setTimeout(function() {
2606										cItem.animate(animateData, transitionData.speed, transitionData.easing);
2607									}, 16);
2608								} else {
2609									var prop = '';
2610									if(transitionData.hasMove) {
2611										prop += transitionData.moveProp;
2612									} 
2613									if(transitionData.hasFade) {
2614										if(transitionData.hasMove) {
2615											prop += ', ';
2616										}
2617										prop += 'opacity';
2618									}
2619									animObj[(self._vendorPref + self._TP)] = prop;
2620									animObj[(self._vendorPref + self._TD)] =  transitionData.speed + 'ms';
2621									animObj[(self._vendorPref + self._TTF)] = transitionData.css3Easing;
2622									cItem.css(animObj);
2623									setTimeout(function() {
2624										cItem.css(animateData);
2625									}, 24);
2626								}
2627							}
2628					
2629							delete self._animatedBlockTimeouts[index];
2630						};
2631					})(item, animObj, transitionData, index), transitionData.delay <= 6 ? 12 : transitionData.delay));				
2632				//}	
2633
2634
2635
2636			});
2637		}
2638	});
2639	$.rsModules.animatedBlocks = $.rsProto._initAnimatedBlocks;
2640})(jQuery);
2641
2642// jquery.rs.auto-height v1.0.2
2643(function($) {
2644
2645	"use strict";
2646
2647	/**
2648	 *
2649	 * RoyalSlider auto height module
2650	 * @version 1.0.2:
2651	 *
2652	 * 1.0.2
2653	 * - Changed "on" to "one" in afterInit event listener
2654	 * - Removed id="clear"
2655	 */ 
2656	$.extend($.rsProto, {
2657		_initAutoHeight: function() {
2658			var self = this;
2659			if(self.st.autoHeight) {
2660				var holder,
2661					tH,
2662					currSlide,
2663					currHeight,
2664					updHeight = function(animate) {
2665						currSlide = self.slides[self.currSlideId];
2666						holder = currSlide.holder;
2667
2668						if(holder) {
2669							tH = holder.height();
2670							if(tH && tH !== currHeight) {
2671								self._wrapHeight = tH;
2672								if(self._useCSS3Transitions || !animate) {
2673									self._sliderOverflow.css('height', tH);
2674								} else {
2675									self._sliderOverflow.stop(true,true).animate({height: tH}, self.st.transitionSpeed);
2676								}
2677							}
2678						}
2679					};
2680
2681				self.ev.on('rsMaybeSizeReady.rsAutoHeight', function(e, slideObject) {
2682					if(currSlide === slideObject) {
2683						updHeight();
2684					}
2685				});
2686
2687				self.ev.on('rsAfterContentSet.rsAutoHeight', function(e, slideObject) {
2688					if(currSlide === slideObject) {
2689						updHeight();
2690					}
2691				});
2692				
2693
2694
2695				self.slider.addClass('rsAutoHeight');
2696				self.ev.one('rsAfterInit', function() {
2697					setTimeout(function() {
2698						updHeight(false);
2699						setTimeout(function() {
2700							self.slider.append('<div style="clear:both; float: none;"></div>');
2701							if(self._useCSS3Transitions) {
2702								self._sliderOverflow.css(self._vendorPref + 'transition', 'height ' + self.st.transitionSpeed + 'ms ease-in-out');
2703							}
2704						}, 16);
2705					}, 16);
2706				});
2707				self.ev.on('rsBeforeAnimStart', function() {
2708					updHeight(true);
2709				});
2710				self.ev.on('rsBeforeSizeSet' , function() {
2711					setTimeout(function() {
2712						updHeight(false);
2713					}, 16);
2714				});
2715			}
2716			
2717		}
2718	});
2719	$.rsModules.autoHeight = $.rsProto._initAutoHeight;
2720})(jQuery);
2721// jquery.rs.autoplay v1.0.5
2722(function($) {
2723
2724	"use strict";
2725
2726	/**
2727	 *
2728	 * RoyalSlider auto play module
2729	 * @version 1.0.5:
2730	 *
2731	 * 1.0.3:
2732	 * - added support for 'autoplay' property name. 
2733	 *
2734	 * 1.0.4
2735	 * - added toggleAutoPlay public method
2736	 *
2737	 * 1.0.5
2738	 * - Fixed issue when autoPlay may not pause when switching browser tabs
2739	 */
2740	$.extend($.rsProto, {
2741		_initAutoplay: function() {
2742			var self = this,
2743				del;
2744
2745			self._autoPlayDefaults = {
2746				enabled: false,
2747				stopAtAction: true,
2748				pauseOnHover: true,
2749				delay: 2000
2750			};
2751
2752			// fix deprecated name
2753			if(!self.st.autoPlay && self.st.autoplay) {
2754				self.st.autoPlay = self.st.autoplay;
2755			}
2756			self.st.autoPlay = $.extend({}, self._autoPlayDefaults, self.st.autoPlay);
2757
2758			if(self.st.autoPlay.enabled) {
2759				self.ev.on('rsBeforeParseNode', function(e, content, obj) {
2760					content = $(content);
2761					del = content.attr('data-rsDelay');
2762					if(del) {
2763						obj.customDelay = parseInt(del, 10);
2764					}
2765				});
2766				self.ev.one('rsAfterInit', function() {
2767					self._setupAutoPlay();
2768				});
2769				self.ev.on('rsBeforeDestroy', function() {
2770					self.stopAutoPlay();
2771					self.slider.off('mouseenter mouseleave');
2772					$(window).off('blur'+self.ns + ' focus' + self.ns);
2773				});
2774				
2775			}
2776		},
2777		_setupAutoPlay: function() {
2778			var self = this;
2779				
2780			self.startAutoPlay();
2781
2782			self.ev.on('rsAfterContentSet', function(e, slideObject) {
2783				if(!self._isDragging && !self._isAnimating && self._autoPlayEnabled && slideObject === self.currSlide ) {
2784					self._play();
2785				}
2786			});
2787			self.ev.on('rsDragRelease', function() {
2788				if(self._autoPlayEnabled && self._autoPlayPaused) {
2789					self._autoPlayPaused = false;
2790					self._play();
2791				}
2792			});
2793			self.ev.on('rsAfterSlideChange', function() {
2794				if(self._autoPlayEnabled) {
2795					if(self._autoPlayPaused) {
2796						self._autoPlayPaused = false; 
2797
2798						if(self.currSlide.isLoaded) {
2799							self._play();
2800						}
2801					}
2802				}
2803			});
2804			self.ev.on('rsDragStart', function() {
2805				if(self._autoPlayEnabled) {
2806					if(self.st.autoPlay.stopAtAction) {
2807						self.stopAutoPlay();
2808					} else {
2809						self._autoPlayPaused = true;
2810						self._pause();
2811					}
2812				}
2813			});
2814			self.ev.on('rsBeforeMove', function(e, type, userAction) {
2815				if(self._autoPlayEnabled) {
2816					if(userAction && self.st.autoPlay.stopAtAction) {
2817						self.stopAutoPlay();
2818					} else {
2819						self._autoPlayPaused = true;
2820						self._pause();
2821					}
2822				}
2823			});
2824
2825			self._pausedByVideo = false;
2826			self.ev.on('rsVideoStop', function() {
2827				if(self._autoPlayEnabled) {
2828					self._pausedByVideo = false;
2829					self._play();
2830				}
2831			});
2832			self.ev.on('rsVideoPlay', function() {
2833				if(self._autoPlayEnabled) {
2834					self._autoPlayPaused = false;
2835					self._pause();
2836					self._pausedByVideo = true;
2837				} 
2838			});
2839
2840			$(window).on('blur'+self.ns, function(){
2841				if(self._autoPlayEnabled) {
2842					self._autoPlayPaused = true;
2843					self._pause();
2844				}
2845			}).on('focus'+self.ns, function(){
2846				if(self._autoPlayEnabled && self._autoPlayPaused) {
2847					self._autoPlayPaused = false;
2848					self._play();
2849				}
2850			});
2851
2852			if(self.st.autoPlay.pauseOnHover) {
2853				self._pausedByHover = false;
2854				self.slider.hover(
2855					function() {
2856						if(self._autoPlayEnabled) {
2857							self._autoPlayPaused = false;
2858							self._pause();
2859							self._pausedByHover = true;
2860						} 
2861					},
2862					function() {
2863						if(self._autoPlayEnabled) {
2864							self._pausedByHover = false;
2865							self._play();
2866						}
2867					}
2868				);	
2869			}
2870			
2871		},
2872		toggleAutoPlay: function() {
2873			var self = this;
2874			if(self._autoPlayEnabled) {
2875				self.stopAutoPlay();
2876			} else {
2877				self.startAutoPlay();
2878			}
2879		},
2880		startAutoPlay: function() {
2881			var self = this;
2882			self._autoPlayEnabled = true;
2883			if(self.currSlide.isLoaded) {
2884				self._play();
2885			}
2886		},
2887		stopAutoPlay: function() {
2888			var self = this;
2889			self._pausedByVideo = self._pausedByHover = self._autoPlayPaused = self._autoPlayEnabled = false;
2890			self._pause();
2891		},
2892		_play: function() {
2893			var self = this;
2894			if(!self._pausedByHover && !self._pausedByVideo) {
2895				self._autoPlayRunning = true;
2896				if(self._autoPlayTimeout) {
2897					clearTimeout(self._autoPlayTimeout);
2898				}
2899				self._autoPlayTimeout = setTimeout(function() {
2900					var changed;
2901					if(!self._loop && !self.st.loopRewind) {
2902						changed = true;
2903						self.st.loopRewind = true;
2904					}
2905					self.next(true);
2906					if(changed) {
2907						changed = false;
2908						self.st.loopRewind = false;
2909					}
2910				}, !self.currSlide.customDelay ? self.st.autoPlay.delay : self.currSlide.customDelay);
2911			}
2912			
2913		},
2914		_pause: function() {
2915			var self = this;
2916			if(!self._pausedByHover && !self._pausedByVideo) {
2917				self._autoPlayRunning = false;
2918				if(self._autoPlayTimeout) {
2919					clearTimeout(self._autoPlayTimeout);
2920					self._autoPlayTimeout = null;
2921				}
2922			}
2923		}
2924	});
2925	$.rsModules.autoplay = $.rsProto._initAutoplay;
2926})(jQuery);
2927
2928// jquery.rs.bullets v1.0.1
2929(function($) {
2930
2931	"use strict";
2932
2933	/**
2934	 *
2935	 * RoyalSlider bullets module
2936	 * @version 1.0.1:
2937	 *
2938	 * 1.0.1
2939	 * - Minor optimizations
2940	 * 
2941	 */ 
2942	$.extend($.rsProto, {
2943		_initBullets: function() {
2944			var self = this;
2945			if(self.st.controlNavigation === 'bullets') {
2946				var itemHTML = '<div class="rsNavItem rsBullet"><span></span></div>';
2947				self.ev.one('rsAfterPropsSetup', function() {
2948
2949					self._controlNavEnabled = true;
2950					self.slider.addClass('rsWithBullets');
2951					var out = '<div class="rsNav rsBullets">';
2952					for(var i = 0; i < self.numSlides; i++) {
2953						out += itemHTML;
2954					}
2955					self._controlNav = out = $(out + '</div>');
2956					self._controlNavItems = out.appendTo(self.slider).children();
2957
2958					self._controlNav.on('click.rs','.rsNavItem',function(e) {
2959						if(!self._thumbsDrag ) {
2960							self.goTo( $(this).index() );
2961						}
2962					});
2963				});
2964
2965				self.ev.on('rsOnAppendSlide', function(e, parsedSlide, index) {
2966					if(index >= self.numSlides) {
2967						self._controlNav.append(itemHTML);
2968					} else {
2969						self._controlNavItems.eq(index).before(itemHTML);
2970					}
2971					self._controlNavItems = self._controlNav.children();
2972				});
2973				self.ev.on('rsOnRemoveSlide', function(e, index) {
2974					var itemToRemove = self._controlNavItems.eq(index);
2975					if(itemToRemove && itemToRemove.length) {
2976						itemToRemove.remove();
2977						self._controlNavItems = self._controlNav.children();
2978					}
2979					
2980				});	
2981
2982				self.ev.on('rsOnUpdateNav', function() {
2983					var id = self.currSlideId,
2984						currItem,
2985						prevItem;
2986					if(self._prevNavItem) {
2987						self._prevNavItem.removeClass('rsNavSelected');
2988					}
2989					currItem = self._controlNavItems.eq(id);
2990
2991					currItem.addClass('rsNavSelected');
2992					self._prevNavItem = currItem;
2993				});
2994			}
2995		}
2996	});
2997	$.rsModules.bullets = $.rsProto._initBullets;
2998})(jQuery);
2999
3000// jquery.rs.deeplinking v1.0.6 + jQuery hashchange plugin v1.3 Copyright (c) 2010 Ben Alman
3001(function($) {
3002
3003  "use strict";
3004
3005	/**
3006	 *
3007	 * RoyalSlider Deep Linking Module
3008	 * @version 1.0.6 + jQuery hashchange plugin v1.3 Copyright (c) 2010 Ben Alman:
3009   *
3010   * 1.0.1:
3011   * - Added timeout before hash changes to 750ms to avoid reloading animation.
3012   *
3013   * 1.0.2:
3014   * - Added multiple slider with hash support
3015   *
3016   * 1.0.3
3017   * - Removed hashchange listener on destroy()
3018   *
3019   * 1.0.4
3020   * - Decreased timeout from 750 to 400ms
3021   *
3022   * 1.0.5
3023   * - History state is now replaced instead of pushing to avoid back button confusion
3024   * - jQuery 1.9.0 compability
3025   *
3026   * 1.0.6
3027   * - Namespaced hashchange event
3028	 */ 
3029	$.extend($.rsProto, {
3030		_initDeeplinking: function() {
3031			var self = this,
3032        isBlocked,
3033        hashTimeout,
3034        hashChangeTimeout;
3035			
3036			self._hashDefaults = {
3037				enabled: false,
3038				change: false,
3039				prefix: ''
3040			};
3041
3042			self.st.deeplinking = $.extend({}, self._hashDefaults, self.st.deeplinking);
3043
3044			if(self.st.deeplinking.enabled) {
3045
3046				var hashChange = self.st.deeplinking.change,
3047				    prefix = '#' + self.st.deeplinking.prefix,
3048				    getSlideIdByHash = function() {
3049    					var hash = window.location.hash;
3050    					if(hash) {
3051    						hash = parseInt( hash.substring(prefix.length), 10 ); 
3052    						if(hash >= 0) {
3053    							return hash - 1;
3054    						}
3055    					}
3056    					return -1;
3057    				};
3058
3059
3060				var id = getSlideIdByHash();
3061				if(id !== -1) {
3062					self.st.startSlideId = id;
3063				}
3064
3065				if(hashChange) {
3066					$(window).on('hashchange'+self.ns, function(e){
3067						if(!isBlocked) {
3068							var id = getSlideIdByHash();
3069              if(id < 0) {
3070                return;
3071              }
3072              if(id > self.numSlides - 1)
3073                id = self.numSlides - 1;
3074              self.goTo( id );
3075						}
3076					});
3077          self.ev.on('rsBeforeAnimStart', function() {
3078            if(hashTimeout) {
3079              clearTimeout(hashTimeout);
3080            }
3081            if(hashChangeTimeout) {
3082              clearTimeout(hashChangeTimeout);
3083            }
3084          });
3085
3086  				self.ev.on('rsAfterSlideChange', function() {
3087  					if(hashTimeout) {
3088  						clearTimeout(hashTimeout);
3089  					}
3090            if(hashChangeTimeout) {
3091              clearTimeout(hashChangeTimeout);
3092            }
3093            hashChangeTimeout = setTimeout(function() {
3094              isBlocked = true;
3095              window.location.replace( (''+window.location).split('#')[0] + prefix + (self.currSlideId + 1) );
3096              hashTimeout = setTimeout(function() {
3097                isBlocked = false;
3098                hashTimeout = null;
3099              }, 60);
3100            }, 400);
3101  				
3102  				});
3103        }
3104        self.ev.on('rsBeforeDestroy', function() {
3105          hashChangeTimeout = null;
3106          hashTimeout = null;
3107          if(hashChange) {
3108            $(window).off('hashchange' + self.ns);
3109          }
3110        });
3111				
3112			}
3113		}
3114	});
3115	$.rsModules.deeplinking = $.rsProto._initDeeplinking;
3116})(jQuery);
3117
3118/*!
3119 * jQuery hashchange event - v1.3 - 7/21/2010
3120 * http://benalman.com/projects/jquery-hashchange-plugin/
3121 * 
3122 * Copyright (c) 2010 "Cowboy" Ben Alman
3123 * Dual licensed under the MIT and GPL licenses.
3124 * http://benalman.com/about/license/
3125 */
3126(function($,window,undefined){
3127  '$:nomunge'; // Used by YUI compressor.
3128  
3129  // Reused string.
3130  var str_hashchange = 'hashchange',
3131    
3132    // Method / object references.
3133    doc = document,
3134    fake_onhashchange,
3135    special = $.event.special,
3136    
3137    // Does the browser support window.onhashchange? Note that IE8 running in
3138    // IE7 compatibility mode reports true for 'onhashchange' in window, even
3139    // though the event isn't supported, so also test document.documentMode.
3140    doc_mode = doc.documentMode,
3141    supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );
3142  
3143  // Get location.hash (or what you'd expect location.hash to be) sans any
3144  // leading #. Thanks for making this necessary, Firefox!
3145  function get_fragment( url ) {
3146    url = url || location.href;
3147    return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
3148  };
3149 
3150  $.fn[ str_hashchange ] = function( fn ) {
3151    return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );
3152  };
3153  
3154  $.fn[ str_hashchange ].delay = 50;
3155 
3156  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
3157    
3158    // Called only when the first 'hashchange' event is bound to window.
3159    setup: function() {
3160      // If window.onhashchange is supported natively, there's nothing to do..
3161      if ( supports_onhashchange ) { return false; }
3162      
3163      // Otherwise, we need to create our own. And we don't want to call this
3164      // until the user binds to the event, just in case they never do, since it
3165      // will create a polling loop and possibly even a hidden Iframe.
3166      $( fake_onhashchange.start );
3167    },
3168    
3169    // Called only when the last 'hashchange' event is unbound from window.
3170    teardown: function() {
3171      // If window.onhashchange is supported natively, there's nothing to do..
3172      if ( supports_onhashchange ) { return false; }
3173      
3174      // Otherwise, we need to stop ours (if possible).
3175      $( fake_onhashchange.stop );
3176    }
3177    
3178  });
3179  
3180  // fake_onhashchange does all the work of triggering the window.onhashchange
3181  // event for browsers that don't natively support it, including creating a
3182  // polling loop to watch for hash changes and in IE 6/7 creating a hidden
3183  // Iframe to enable back and forward.
3184  fake_onhashchange = (function(){
3185    var self = {},
3186      timeout_id,
3187      
3188      // Remember the initial hash so it doesn't get triggered immediately.
3189      last_hash = get_fragment(),
3190      
3191      fn_retval = function(val){ return val; },
3192      history_set = fn_retval,
3193      history_get = fn_retval;
3194    
3195    // Start the polling loop.
3196    self.start = function() {
3197      timeout_id || poll();
3198    };
3199    
3200    // Stop the polling loop.
3201    self.stop = function() {
3202      timeout_id && clearTimeout( timeout_id );
3203      timeout_id = undefined;
3204    };
3205    
3206    // This polling loop checks every $.fn.hashchange.delay milliseconds to see
3207    // if location.hash has changed, and triggers the 'hashchange' event on
3208    // window when necessary.
3209    function poll() {
3210      var hash = get_fragment(),
3211        history_hash = history_get( last_hash );
3212      
3213      if ( hash !== last_hash ) {
3214        history_set( last_hash = hash, history_hash );
3215        
3216        $(window).trigger( str_hashchange );
3217        
3218      } else if ( history_hash !== last_hash ) {
3219        location.href = location.href.replace( /#.*/, '' ) + history_hash;
3220      }
3221      
3222      timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );
3223    };
3224    
3225    window.attachEvent && !window.addEventListener && !supports_onhashchange && (function(){
3226      // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8
3227      // when running in "IE7 compatibility" mode.
3228      
3229      var iframe,
3230        iframe_src;
3231      
3232      // When the event is bound and polling starts in IE 6/7, create a hidden
3233      // Iframe for history handling.
3234      self.start = function(){
3235        if ( !iframe ) {
3236          iframe_src = $.fn[ str_hashchange ].src;
3237          iframe_src = iframe_src && iframe_src + get_fragment();
3238          
3239          // Create hidden Iframe. Attempt to make Iframe as hidden as possible
3240          // by using techniques from http://www.paciellogroup.com/blog/?p=604.
3241          iframe = $('<iframe tabindex="-1" title="empty"/>').hide()
3242            
3243            // When Iframe has completely loaded, initialize the history and
3244            // start polling.
3245            .one( 'load', function(){
3246              iframe_src || history_set( get_fragment() );
3247              poll();
3248            })
3249            
3250            // Load Iframe src if specified, otherwise nothing.
3251            .attr( 'src', iframe_src || 'javascript:0' )
3252            
3253            // Append Iframe after the end of the body to prevent unnecessary
3254            // initial page scrolling (yes, this works).
3255            .insertAfter( 'body' )[0].contentWindow;
3256          
3257          // Whenever `document.title` changes, update the Iframe's title to
3258          // prettify the back/next history menu entries. Since IE sometimes
3259          // errors with "Unspecified error" the very first time this is set
3260          // (yes, very useful) wrap this with a try/catch block.
3261          doc.onpropertychange = function(){
3262            try {
3263              if ( event.propertyName === 'title' ) {
3264                iframe.document.title = doc.title;
3265              }
3266            } catch(e) {}
3267          };
3268          
3269        }
3270      };
3271      
3272      // Override the "stop" method since an IE6/7 Iframe was created. Even
3273      // if there are no longer any bound event handlers, the polling loop
3274      // is still necessary for back/next to work at all!
3275      self.stop = fn_retval;
3276      
3277      // Get history by looking at the hidden Iframe's location.hash.
3278      history_get = function() {
3279        return get_fragment( iframe.location.href );
3280      };
3281      
3282      // Set a new history item by opening and then closing the Iframe
3283      // document, *then* setting its location.hash. If document.domain has
3284      // been set, update that as well.
3285      history_set = function( hash, history_hash ) {
3286        var iframe_doc = iframe.document,
3287          domain = $.fn[ str_hashchange ].domain;
3288        
3289        if ( hash !== history_hash ) {
3290          // Update Iframe with any initial `document.title` that might be set.
3291          iframe_doc.title = doc.title;
3292          
3293          // Opening the Iframe's document after it has been closed is what
3294          // actually adds a history entry.
3295          iframe_doc.open();
3296          
3297          // Set document.domain for the Iframe document as well, if necessary.
3298          domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' );
3299          
3300          iframe_doc.close();
3301          
3302          // Update the Iframe's hash, for great justice.
3303          iframe.location.hash = hash;
3304        }
3305      };
3306      
3307    })();
3308    
3309    return self;
3310  })();
3311  
3312})(jQuery,this);
3313
3314// jquery.rs.fullscreen v1.0.5
3315(function($) {
3316
3317	"use strict";
3318
3319	/**
3320	 *
3321	 * RoyalSlider fullscreen module
3322	 * @version 1.0.5:
3323	 *
3324	 * 1.0.1:
3325	 * - Added rsEnterFullscreen and rsExitFullscreen events
3326	 *
3327	 * 1.0.2
3328	 * - Added window scroll detection
3329	 *
3330	 * 1.0.3
3331	 * - Fullscreen button now is added to _controlsContainer element
3332	 *
3333	 * 1.0.4
3334	 * - Fixed issue that could cause small image be loaded in fullscreen
3335	 *
3336	 * 1.0.5
3337	 * - Fix "false" native fullscreen on Android
3338	 * 
3339	 */
3340	$.extend($.rsProto, {
3341		_initFullscreen: function() {
3342			var self = this;
3343
3344			self._fullscreenDefaults = {
3345				enabled: false,
3346				keyboardNav: true,
3347				buttonFS: true,
3348				nativeFS: false,
3349				doubleTap: true
3350			};
3351			self.st.fullscreen = $.extend({}, self._fullscreenDefaults, self.st.fullscreen);
3352
3353			if(self.st.fullscreen.enabled) {
3354				self.ev.one('rsBeforeSizeSet', function() {
3355					self._setupFullscreen();
3356				});
3357			}
3358		},
3359		_setupFullscreen: function() {
3360			var self = this;
3361			self._fsKeyboard = (!self.st.keyboardNavEnabled && self.st.fullscreen.keyboardNav);
3362
3363			if(self.st.fullscreen.nativeFS) {
3364				// Thanks to John Dyer http://j.hn/
3365				self._fullScreenApi = {
3366					supportsFullScreen: false,
3367					isFullScreen: function() { return false; },
3368					requestFullScreen: function() {},
3369					cancelFullScreen: function() {},
3370					fullScreenEventName: '',
3371					prefix: ''
3372				};
3373
3374				var browserPrefixes = 'webkit moz o ms khtml'.split(' ');
3375				// check for native support
3376				if(!self.isAndroid) {
3377					if (typeof document.cancelFullScreen != 'undefined') {
3378						self._fullScreenApi.supportsFullScreen = true;
3379					} else {
3380						// check for fullscreen support by vendor prefix
3381						for (var i = 0; i < browserPrefixes.length; i++ ) {
3382							self._fullScreenApi.prefix = browserPrefixes[i];
3383							if (typeof document[ self._fullScreenApi.prefix + 'CancelFullScreen' ] != 'undefined' ) {
3384								self._fullScreenApi.supportsFullScreen = true;
3385								break;
3386							}
3387						}
3388					}
3389				}
3390			 
3391				// update methods to do something useful
3392				if ( self._fullScreenApi.supportsFullScreen) {
3393					self.nativeFS = true;
3394					self._fullScreenApi.fullScreenEventName =  self._fullScreenApi.prefix + 'fullscreenchange' + self.ns;
3395
3396					self._fullScreenApi.isFullScreen = function() {
3397						switch (this.prefix) {
3398							case '':
3399								return document.fullScreen;
3400							case 'webkit':
3401								return document.webkitIsFullScreen;
3402							default:
3403								return document[this.prefix + 'FullScreen'];
3404						}
3405					};
3406					self._fullScreenApi.requestFullScreen = function(el) {
3407						return (this.prefix === '') ? el.requestFullScreen() : el[this.prefix + 'RequestFullScreen']();
3408					};
3409					self._fullScreenApi.cancelFullScreen = function(el) {
3410						return (this.prefix === '') ? document.cancelFullScreen() : document[this.prefix + 'CancelFullScreen']();
3411					};
3412				} else {
3413					self._fullScreenApi = false;
3414				}
3415			}
3416
3417
3418			if(self.st.fullscreen.buttonFS) {
3419				self._fsBtn = $('<div class="rsFullscreenBtn"><div class="rsFullscreenIcn"></div></div>')
3420					.appendTo(self._controlsContainer)
3421					.on('click.rs', function() {
3422						if(self.isFullscreen) {
3423							self.exitFullscreen();
3424						} else {
3425
3426							self.enterFullscreen();
3427						}
3428					});
3429			}
3430		},
3431		enterFullscreen: function(preventNative) {
3432			var self = this;
3433			if( self._fullScreenApi ) {
3434				if(!preventNative) {
3435					self._doc.on( self._fullScreenApi.fullScreenEventName, function(e) {
3436						if(!self._fullScreenApi.isFullScreen()) {
3437							self.exitFullscreen(true);
3438						} else {
3439							self.enterFullscreen(true);
3440						}
3441					});
3442					self._fullScreenApi.requestFullScreen($('html')[0]);
3443					return;
3444				} else {
3445					self._fullScreenApi.requestFullScreen($('html')[0]);
3446				}
3447			}
3448
3449			if(self._isFullscreenUpdating) {
3450				return;
3451			}
3452			self._isFullscreenUpdating = true;
3453
3454			self._doc.on('keyup' + self.ns + 'fullscreen', function(e) {
3455				if(e.keyCode === 27) {
3456					self.exitFullscreen();
3457				}
3458			});
3459			if(self._fsKeyboard) {
3460				self._bindKeyboardNav();
3461			}
3462
3463			var win = $(window);
3464			self._fsScrollTopOnEnter = win.scrollTop();
3465			self._fsScrollLeftOnEnter = win.scrollLeft();
3466
3467			self._htmlStyle = $('html').attr('style');
3468			self._bodyStyle = $('body').attr('style');
3469			self._sliderStyle = self.slider.attr('style');
3470
3471			$('body, html').css({
3472				overflow: 'hidden',
3473				height: '100%',
3474				width: '100%',
3475				margin: '0',
3476				padding: '0'
3477			});
3478
3479			self.slider.addClass('rsFullscreen');
3480			
3481		
3482			var item,
3483				i;
3484			for(i = 0; i < self.numSlides; i++) {
3485				item = self.slides[i];
3486				
3487				item.isRendered = false;
3488				if(item.bigImage) {
3489					item.isBig = true;
3490					item.isMedLoaded = item.isLoaded;
3491					item.isMedLoading = item.isLoading;
3492					item.medImage = item.image;
3493					item.medIW = item.iW;
3494					item.medIH = item.iH;
3495					item.slideId = -99;
3496
3497					if(item.bigImage !== item.medImage) {
3498						item.sizeType = 'big';
3499					}
3500
3501					item.isLoaded = item.isBigLoaded;
3502					item.isLoading = false;
3503					item.image = item.bigImage;
3504					item.images[0] = item.bigImage;
3505					item.iW = item.bigIW;
3506					item.iH = item.bigIH;
3507
3508					item.isAppended = item.contentAdded = false;
3509					self._updateItemSrc(item);
3510				}
3511				
3512			}
3513
3514			
3515			self.isFullscreen = true;
3516			
3517			self._isFullscreenUpdating = false;
3518			self.updateSliderSize();
3519			self.ev.trigger('rsEnterFullscreen');
3520			
3521		},
3522		exitFullscreen: function(preventNative) {
3523			var self = this;
3524
3525			if( self._fullScreenApi ) {
3526				if(!preventNative) {
3527					self._fullScreenApi.cancelFullScreen($('html')[0]);
3528					return;
3529				}
3530				self._doc.off( self._fullScreenApi.fullScreenEventName );
3531			}
3532			if(self._isFullscreenUpdating) {
3533				return;
3534			}
3535			self._isFullscreenUpdating = true;
3536
3537			self._doc.off('keyup'  + self.ns + 'fullscreen');
3538			if(self._fsKeyboard) {
3539				self._doc.off('keydown' + self.ns);
3540			}
3541
3542			$('html').attr('style', self._htmlStyle || '');
3543			$('body').attr('style', self._bodyStyle || '');
3544			
3545
3546			
3547			var item,
3548				i;
3549			for(i = 0; i < self.numSlides; i++) {
3550				item = self.slides[i];
3551				
3552				
3553				item.isRendered = false;
3554				if(item.bigImage) {
3555					item.isBig = false;
3556					item.slideId = -99;
3557					item.isBigLoaded = item.isLoaded;
3558					item.isBigLoading = item.isLoading;
3559					item.bigImage = item.image;
3560					item.bigIW = item.iW;
3561					item.bigIH = item.iH;
3562					item.isLoaded = item.isMedLoaded;
3563					item.isLoading = false;
3564					item.image = item.medImage;
3565					item.images[0] = item.medImage;
3566					item.iW = item.medIW;
3567					item.iH = item.medIH;
3568
3569					item.isAppended = item.contentAdded = false;
3570
3571					self._updateItemSrc(item, true);
3572					
3573					
3574					if(item.bigImage !== item.medImage) {
3575						item.sizeType = 'med';
3576					}
3577				}
3578			}
3579			
3580			self.isFullscreen = false;
3581
3582			var win = $(window);
3583			win.scrollTop( self._fsScrollTopOnEnter );
3584			win.scrollLeft( self._fsScrollLeftOnEnter );
3585			
3586			self._isFullscreenUpdating = false;
3587			self.slider.removeClass('rsFullscreen');
3588
3589			self.updateSliderSize();
3590			// fix overflow bug
3591			setTimeout(function() {
3592				self.updateSliderSize();
3593			},1);
3594			self.ev.trigger('rsExitFullscreen');
3595		},
3596		_updateItemSrc: function(item, exit) {
3597			var newHTML = (!item.isLoaded && !item.isLoading) ? '<a class="rsImg rsMainSlideImage" href="'+item.image+'"></a>' : '<img class="rsImg rsMainSlideImage" src="'+item.image+'"/>';
3598			
3599			if(item.content.hasClass('rsImg')) {
3600				item.content = $(newHTML);
3601			} else {
3602				item.content.find('.rsImg').eq(0).replaceWith(newHTML);
3603			}
3604			if(!item.isLoaded && !item.isLoading && item.holder) {
3605				item.holder.html(item.content);
3606			}
3607		}
3608	});
3609	$.rsModules.fullscreen = $.rsProto._initFullscreen;
3610})(jQuery);
3611
3612// jquery.rs.global-caption v1.0
3613(function($) {
3614
3615	"use strict";
3616
3617	/**
3618	 *
3619	 * RoyalSlider global caption module
3620	 * @version 1.0:
3621	 * 
3622	 */ 
3623	$.extend($.rsProto, {
3624		_initGlobalCaption: function() {
3625			var self = this;
3626			if(self.st.globalCaption) {
3627				var setCurrCaptionHTML = function () {
3628					self.globalCaption.html(self.currSlide.caption);
3629				};
3630				self.ev.on('rsAfterInit', function() {
3631					self.globalCaption = $('<div class="rsGCaption"></div>').appendTo( !self.st.globalCaptionInside ? self.slider : self._sliderOverflow );
3632					setCurrCaptionHTML();
3633				});
3634				self.ev.on('rsBeforeAnimStart' , function() {
3635					setCurrCaptionHTML();
3636				});
3637			}
3638		}
3639	});
3640	$.rsModules.globalCaption = $.rsProto._initGlobalCaption;
3641})(jQuery);
3642// jquery.rs.nav-auto-hide v1.0
3643(function($) {
3644
3645	"use strict";
3646	
3647	/**
3648	 *
3649	 * RoyalSlider auto hide nav module
3650	 * @version 1.0:
3651	 * 
3652	 */ 
3653	$.extend($.rsProto, {
3654		_initAutoHideControlNav: function() {
3655			var self = this;
3656			if(self.st.navAutoHide && !self.hasTouch) {
3657				self.ev.one('rsAfterInit', function() {
3658					if(self._controlNav) {
3659						self._controlNav.addClass('rsHidden');
3660
3661						var hoverEl = self.slider;
3662						hoverEl.one("mousemove.controlnav",function() {
3663							self._controlNav.removeClass('rsHidden');
3664						});
3665
3666						hoverEl.hover(
3667							function() {
3668								self._controlNav.removeClass('rsHidden');
3669							},
3670							function() {
3671								self._controlNav.addClass('rsHidden');
3672							}
3673						);
3674					}
3675					
3676				});
3677			}
3678		}
3679	});
3680	$.rsModules.autoHideNav = $.rsProto._initAutoHideControlNav;
3681})(jQuery);
3682
3683// jquery.rs.tabs v1.0.2
3684(function($) {
3685
3686	"use strict";
3687	
3688	/**
3689	 *
3690	 * RoyalSlider tabs module
3691	 * @version 1.0.2:
3692	 *
3693	 * 1.0.1:
3694	 * - Dynamic adding/removing tabs.
3695	 *
3696	 * 1.0.2
3697	 * - jQuery 1.9.0 compability
3698	 */ 
3699	$.extend($.rsProto, {
3700		_initTabs: function() {
3701			var self = this;
3702			if(self.st.controlNavigation === 'tabs') {
3703				self.ev.on('rsBeforeParseNode', function(e, content, obj) {
3704					content = $(content);
3705					obj.thumbnail = content.find('.rsTmb').remove();
3706					if(!obj.thumbnail.length) {
3707
3708						obj.thumbnail = content.attr('data-rsTmb');
3709						if(!obj.thumbnail) {
3710							obj.thumbnail = content.find('.rsImg').attr('data-rsTmb');
3711						}
3712						if(!obj.thumbnail) {
3713							obj.thumbnail = '';
3714						} else {
3715							obj.thumbnail = '<img src="'+obj.thumbnail+'"/>';
3716						}
3717					} else {
3718						obj.thumbnail = $(document.createElement('div')).append(obj.thumbnail).html();
3719					}
3720				});
3721
3722				self.ev.one('rsAfterPropsSetup', function() {
3723					self._createTabs();
3724				});
3725
3726				self.ev.on('rsOnAppendSlide', function(e, parsedSlide, index) {
3727					if(index >= self.numSlides) {
3728						self._controlNav.append('<div class="rsNavItem rsTab">' + parsedSlide.thumbnail + '</div>');
3729					} else {
3730						self._controlNavItems.eq(index).before('<div class="rsNavItem rsTab">' + item.thumbnail + '</div>');
3731					}
3732					self._controlNavItems = self._controlNav.children();
3733				});
3734				self.ev.on('rsOnRemoveSlide', function(e, index) {
3735					var itemToRemove = self._controlNavItems.eq(index);
3736					if(itemToRemove) {
3737						itemToRemove.remove();
3738						self._controlNavItems = self._controlNav.children();
3739					}
3740				});	
3741
3742				self.ev.on('rsOnUpdateNav', function() {
3743					var id = self.currSlideId,
3744						currItem,
3745						prevItem;
3746					if(self._prevNavItem) {
3747						self._prevNavItem.removeClass('rsNavSelected');
3748					}
3749
3750					currItem = self._controlNavItems.eq(id);
3751
3752					currItem.addClass('rsNavSelected');
3753					self._prevNavItem = currItem;
3754				});
3755			}
3756			
3757		},
3758		_createTabs: function() {
3759			var self = this, 
3760				out = '',
3761				item;
3762
3763			self._controlNavEnabled = true;
3764			out += '<div class="rsNav rsTabs">';
3765			for(var i = 0; i < self.numSlides; i++) {
3766				out += '<div class="rsNavItem rsTab">'+self.slides[i].thumbnail+'</div>';
3767			}
3768			out += '</div>';
3769
3770			out = $(out);
3771			
3772
3773			self._controlNav = out;
3774			self._controlNavItems = out.children('.rsNavItem');
3775			self.slider.append(out);
3776
3777
3778			self._controlNav.click(function(e) {
3779				var item = $(e.target).closest('.rsNavItem');
3780				if(item.length) {
3781					self.goTo(item.index());
3782				}
3783			});
3784		}
3785	});
3786	$.rsModules.tabs = $.rsProto._initTabs;
3787})(jQuery);
3788
3789// jquery.rs.thumbnails v1.0.5
3790(function($) {
3791
3792	"use strict";
3793
3794	/**
3795	 *
3796	 * RoyalSlider thumbnails module
3797	 * @version 1.0.5:
3798	 *
3799	 * 1.0.1
3800	 * - Fixed bug with vertical thumbs caused by latest update
3801	 * 
3802	 * 1.0.2:
3803	 * - Dynamic adding/removing tabs.
3804	 *
3805	 * 1.0.3
3806	 * - Removed first transition at slider initialization
3807	 *
3808	 * 1.0.4
3809	 * - Added paddingTop & bottom
3810	 * - firstMargin now accepts number which is min distance of first/last thumbnail
3811	 *
3812	 * 1.0.5
3813	 * - IE10 touch support
3814	 *
3815	 */ 
3816	$.extend($.rsProto, {
3817		_initThumbs: function() {
3818			var self = this;
3819			if(self.st.controlNavigation === 'thumbnails') {
3820
3821				self._thumbsDefaults = {
3822					drag: true,
3823					touch: true,
3824					orientation: 'horizontal',
3825					navigation: true,
3826					arrows: true,
3827					arrowLeft: null,
3828					arrowRight: null,
3829					spacing: 4,
3830					arrowsAutoHide: false,
3831					appendSpan: false,
3832					transitionSpeed:600,
3833					autoCenter: true,
3834					fitInViewport: true, 
3835					firstMargin: true,
3836					paddingTop: 0,
3837					paddingBottom: 0
3838				};
3839
3840				self.st.thumbs = $.extend({}, self._thumbsDefaults, self.st.thumbs);
3841				self._firstThumbMoved = true;
3842				if(self.st.thumbs.firstMargin === false) { self.st.thumbs.firstMargin = 0; }
3843				else if(self.st.thumbs.firstMargin === true) { self.st.thumbs.firstMargin = self.st.thumbs.spacing; }
3844
3845				self.ev.on('rsBeforeParseNode', function(e, content, obj) {
3846					content = $(content);
3847					obj.thumbnail = content.find('.rsTmb').remove();
3848					if(!obj.thumbnail.length) {
3849						obj.thumbnail = content.attr('data-rsTmb');
3850						if(!obj.thumbnail) {
3851							obj.thumbnail = content.find('.rsImg').attr('data-rsTmb');
3852						}
3853						if(!obj.thumbnail) {
3854							obj.thumbnail = '';
3855						} else {
3856							obj.thumbnail = '<img src="'+obj.thumbnail+'"/>';
3857						}
3858					} else {
3859						obj.thumbnail = $(document.createElement('div')).append(obj.thumbnail).html();
3860					}
3861				});
3862
3863				self.ev.one('rsAfterPropsSetup', function() {
3864					self._createThumbs();
3865				});
3866
3867				self._prevNavItem = null;
3868				
3869				self.ev.on('rsOnUpdateNav', function() {
3870					var currItem = $(self._controlNavItems[self.currSlideId]);
3871					if(currItem === self._prevNavItem) {
3872						return;
3873					}
3874					if(self._prevNavItem) {
3875						self._prevNavItem.removeClass('rsNavSelected');
3876						self._prevNavItem = null;
3877					}
3878					if(self._thumbsNavigation) {					
3879						self._setCurrentThumb(self.currSlideId);
3880					}
3881					self._prevNavItem = currItem.addClass('rsNavSelected');
3882				});
3883
3884				self.ev.on('rsOnAppendSlide', function(e, parsedSlide, index) {
3885					var html = '<div'+self._thumbsMargin+' class="rsNavItem rsThumb">'+self._addThumbHTML+parsedSlide.thumbnail+'</div>';
3886					if(index >= self.numSlides) {
3887						self._thumbsContainer.append(html);
3888					} else {
3889						self._controlNavItems.eq(index).before(html);
3890					}
3891					self._controlNavItems = self._thumbsContainer.children();
3892					self.updateThumbsSize();
3893				});
3894				self.ev.on('rsOnRemoveSlide', function(e, index) {
3895					var itemToRemove = self._controlNavItems.eq(index);
3896					if(itemToRemove) {
3897						itemToRemove.remove();
3898						self._controlNavItems = self._thumbsContainer.children();
3899						self.updateThumbsSize();
3900					}
3901				});	
3902				
3903
3904			}	
3905		},
3906		_createThumbs: function() {
3907			var self = this, 
3908				tText = 'rsThumbs',
3909				thumbSt = self.st.thumbs,
3910				out = '',
3911				style,
3912				item,
3913				spacing = thumbSt.spacing;
3914			
3915			self._controlNavEnabled = true;
3916			self._thumbsHorizontal = (thumbSt.orientation === 'vertical') ? false : true;
3917			
3918			self._thumbsMargin = style = spacing ? ' style="margin-' + (self._thumbsHorizontal ? 'right' : 'bottom') + ':'+ spacing+'px;"' : ''; 
3919			
3920			self._thumbsPosition = 0;
3921			self._isThumbsAnimating = false;
3922			self._thumbsDrag = false;
3923			self._thumbsNavigation = false;
3924
3925			self._thumbsArrows = (thumbSt.arrows && thumbSt.navigation);
3926
3927			var pl = (self._thumbsHorizontal ? 'Hor' : 'Ver');
3928			self.slider.addClass('rsWithThumbs' + ' rsWithThumbs'+ pl );
3929			
3930			out += '<div class="rsNav rsThumbs rsThumbs'+pl +'"><div class="'+tText+'Container">';
3931			self._addThumbHTML = thumbSt.appendSpan ? '<span class="thumbIco"></span>' : '';
3932			for(var i = 0; i < self.numSlides; i++) {
3933				item = self.slides[i];
3934				out += '<div'+style+' class="rsNavItem rsThumb">'+item.thumbnail+self._addThumbHTML+'</div>';
3935			}
3936			out = $(out +'</div></div>');
3937
3938			var o = {};
3939			if(thumbSt.paddingTop) {
3940				o[self._thumbsHorizontal ? 'paddingTop' : 'paddingLeft'] = thumbSt.paddingTop;
3941			} 
3942			if(thumbSt.paddingBottom) {
3943				o[self._thumbsHorizontal ? 'paddingBottom' : 'paddingRight'] = thumbSt.paddingBottom;
3944			} 
3945			out.css(o);
3946
3947			self._thumbsContainer = $(out).find('.' + tText + 'Container');
3948
3949			if(self._thumbsArrows) {
3950				tText += 'Arrow';
3951				if(thumbSt.arrowLeft) {
3952					self._thumbsArrowLeft = thumbSt.arrowLeft;
3953				} else {
3954					self._thumbsArrowLeft = $('<div class="'+ tText +' ' + tText +'Left"><div class="'+tText+'Icn"></div></div>');
3955					out.append(self._thumbsArrowLeft);
3956				}
3957
3958				if(thumbSt.arrowRight) {
3959					self._thumbsArrowRight = thumbSt.arrowRight;
3960				} else {
3961					self._thumbsArrowRight = $('<div class="'+ tText +' ' + tText +'Right"><div class="'+tText+'Icn"></div></div>');
3962					out.append(self._thumbsArrowRight);
3963				}
3964
3965				
3966				self._thumbsArrowLeft.click(function() {
3967					var viewportSize = Math.floor(self._thumbsViewportSize / self._thumbSize),
3968						thumbId = Math.floor(self._thumbsPosition / self._thumbSize),
3969						newPos = (thumbId + self._visibleThumbsPerView) * self._thumbSize;
3970					self._animateThumbsTo( newPos > self._thumbsMinPosition ? self._thumbsMinPosition : newPos );
3971				});
3972				self._thumbsArrowRight.click(function() {
3973					var viewportSize = Math.floor(self._thumbsViewportSize / self._thumbSize),
3974						thumbId = Math.floor(self._thumbsPosition / self._thumbSize),
3975						newPos = (thumbId - self._visibleThumbsPerView) * self._thumbSize;
3976					self._animateThumbsTo( newPos < self._thumbsMaxPosition ? self._thumbsMaxPosition : newPos );
3977				});
3978				if(thumbSt.arrowsAutoHide && !self.hasTouch) {
3979					self._thumbsArrowLeft.css('opacity', 0);
3980					self._thumbsArrowRight.css('opacity', 0);
3981
3982					out.one("mousemove.rsarrowshover",function() {
3983						if(self._thumbsNavigation) {
3984							self._thumbsArrowLeft.css('opacity', 1);
3985							self._thumbsArrowRight.css('opacity', 1);		
3986						}		
3987					});
3988
3989					out.hover(
3990						function() {
3991							if(self._thumbsNavigation) {
3992								self._thumbsArrowLeft.css('opacity', 1);
3993								self._thumbsArrowRight.css('opacity', 1);
3994							}
3995						},
3996						function() {
3997							if(self._thumbsNavigation) {
3998								self._thumbsArrowLeft.css('opacity', 0);
3999								self._thumbsArrowRight.css('opacity', 0);
4000							}
4001						}
4002					);	
4003				}	
4004			}
4005
4006			self._controlNav = out;
4007			self._controlNavItems = self._thumbsContainer.children();
4008			
4009
4010			if(self.msEnabled && self.st.thumbs.navigation) {
4011				self._thumbsContainer.css('-ms-touch-action', self._thumbsHorizontal ? 'pan-y' : 'pan-x');
4012			}
4013
4014			self.slider.append(out);
4015			
4016			self._thumbsEnabled = true;
4017			self._thumbsSpacing = spacing;
4018
4019			
4020			if(thumbSt.navigation) {
4021				if(self._useCSS3Transitions) {
4022					self._thumbsContainer.css(self._vendorPref + 'transition-property', self._vendorPref + 'transform');
4023				}
4024			}
4025			
4026			self._controlNav.on('click.rs','.rsNavItem',function(e) {
4027				if(!self._thumbsDrag ) {
4028					self.goTo( $(this).index() );
4029				}
4030			});
4031
4032			self.ev.off('rsBeforeSizeSet.thumbs').on('rsBeforeSizeSet.thumbs', function() {
4033				self._realWrapSize = self._thumbsHorizontal ? self._wrapHeight : self._wrapWidth;
4034				self.updateThumbsSize(true);
4035
4036			});
4037
4038			
4039		},
4040		updateThumbsSize: function(isResize) {
4041			var self = this,
4042				firstThumb = self._controlNavItems.first(),
4043				cssObj = {};
4044
4045			var numItems = self._controlNavItems.length;
4046			self._thumbSize = ( self._thumbsHorizontal ? firstThumb.outerWidth() : firstThumb.outerHeight() ) + self._thumbsSpacing;
4047			self._thumbsContainerSize = numItems * self._thumbSize - self._thumbsSpacing;
4048			cssObj[self._thumbsHorizontal ? 'width' : 'height'] = self._thumbsContainerSize + self._thumbsSpacing;
4049			self._thumbsViewportSize = self._thumbsHorizontal ? self._controlNav.width() : self._controlNav.height();
4050			self._thumbsMaxPosition = -(self._thumbsContainerSize - self._thumbsViewportSize) - (self.st.thumbs.firstMargin);
4051			self._thumbsMinPosition = self.st.thumbs.firstMargin;
4052			self._visibleThumbsPerView = Math.floor(self._thumbsViewportSize / self._thumbSize);
4053
4054			if(self._thumbsContainerSize < self._thumbsViewportSize) {
4055				if(self.st.thumbs.autoCenter) {
4056					self._setThumbsPosition((self._thumbsViewportSize - self._thumbsContainerSize) / 2);
4057				}
4058				if(self.st.thumbs.arrows && self._thumbsArrowLeft) {
4059					var arrDisClass = 'rsThumbsArrowDisabled';
4060					self._thumbsArrowLeft.addClass(arrDisClass);
4061					self._thumbsArrowRight.addClass(arrDisClass);
4062				}
4063				self._thumbsNavigation = false;
4064				self._thumbsDrag = false;
4065				self._controlNav.off(self._downEvent);	
4066
4067			} else if(self.st.thumbs.navigation && !self._thumbsNavigation) {
4068				self._thumbsNavigation = true;
4069				if( (!self.hasTouch && self.st.thumbs.drag) ||  (self.hasTouch && self.st.thumbs.touch)) {
4070					self._thumbsDrag = true;
4071					self._controlNav.on(self._downEvent, function(e) { self._onDragStart(e, true); });	
4072				}
4073			}
4074
4075			if(self._useCSS3Transitions) {
4076				cssObj[(self._vendorPref + 'transition-duration')] = '0ms';
4077			}
4078
4079
4080
4081			self._thumbsContainer.css(cssObj);
4082
4083			if(self._thumbsEnabled && (self.isFullscreen || self.st.thumbs.fitInViewport)) {
4084				if(self._thumbsHorizontal) {
4085					self._wrapHeight = self._realWrapSize - self._controlNav.outerHeight();
4086				} else {
4087					self._wrapWidth = self._realWrapSize - self._controlNav.outerWidth();
4088				}
4089			}
4090		},
4091		setThumbsOrientation: function(newPlacement, dontUpdateSize) {
4092			var self = this;
4093			if(self._thumbsEnabled) {
4094				self.st.thumbs.orientation = newPlacement;
4095				self._controlNav.remove();
4096				self.slider.removeClass('rsWithThumbsHor rsWithThumbsVer');
4097				self._createThumbs();
4098				self._controlNav.off(self._downEvent);	
4099				if(!dontUpdateSize) {
4100					self.updateSliderSize(true);
4101				}
4102			}
4103		},
4104		_setThumbsPosition: function(pos) {
4105			var self = this;
4106			self._thumbsPosition = pos;
4107			if(self._useCSS3Transitions) {
4108				self._thumbsContainer.css(self._xProp, self._tPref1 + ( self._thumbsHorizontal ? (pos + self._tPref2 + 0) : (0 + self._tPref2 + pos) ) + self._tPref3 );		
4109			} else {
4110				self._thumbsContainer.css(self._thumbsHorizontal ? self._xProp : self._yProp, pos);
4111			}
4112		},
4113		_animateThumbsTo: function(pos, speed, outEasing, bounceAnimPosition, bounceAnimSpeed) {
4114			var self = this;
4115			if(!self._thumbsNavigation) {
4116				return;
4117			}
4118			if(!speed) {
4119				speed = self.st.thumbs.transitionSpeed;
4120			}
4121			self._thumbsPosition = pos;
4122			if(self._thumbsAnimTimeout) {
4123				clearTimeout(self._thumbsAnimTimeout);
4124			}
4125			if(self._isThumbsAnimating) {
4126				if(!self._useCSS3Transitions) {
4127					self._thumbsContainer.stop();
4128				}
4129				outEasing = true;
4130			}
4131			var animObj = {};
4132			self._isThumbsAnimating = true;
4133			if(!self._useCSS3Transitions) {
4134				animObj[self._thumbsHorizontal ? self._xProp : self._yProp] = pos + 'px';
4135				self._thumbsContainer.animate(animObj, speed, outEasing ? 'easeOutCubic' : self.st.easeInOut);
4136			} else { 
4137				animObj[(self._vendorPref + 'transition-duration')] = speed+'ms';
4138				animObj[(self._vendorPref + 'transition-timing-function')] = outEasing ? $.rsCSS3Easing[self.st.easeOut] : $.rsCSS3Easing[self.st.easeInOut];
4139				self._thumbsContainer.css(animObj);
4140				self._setThumbsPosition(pos);
4141			}
4142			if(bounceAnimPosition) {
4143				self._thumbsPosition = bounceAnimPosition;
4144			}
4145			self._updateThumbsArrows();
4146			
4147			
4148			self._thumbsAnimTimeout = setTimeout(function() {
4149				self._isThumbsAnimating = false;
4150				if(bounceAnimSpeed) {
4151					self._animateThumbsTo(bounceAnimPosition, bounceAnimSpeed, true);
4152					bounceAnimSpeed = null;
4153				}
4154			}, speed);
4155		},
4156		_updateThumbsArrows: function() {
4157			var self = this;
4158			if(self._thumbsArrows) {
4159				var arrDisClass = 'rsThumbsArrowDisabled';
4160				
4161				if(self._thumbsPosition === self._thumbsMinPosition) {
4162					self._thumbsArrowLeft.addClass(arrDisClass);
4163				} else {
4164					self._thumbsArrowLeft.removeClass(arrDisClass);
4165				}
4166				if(self._thumbsPosition === self._thumbsMaxPosition) {
4167					self._thumbsArrowRight.addClass(arrDisClass);
4168				} else {
4169					self._thumbsArrowRight.removeClass(arrDisClass);
4170				}
4171			}
4172		},
4173		_setCurrentThumb: function(id, justSet) {
4174			
4175			var self = this,
4176				incr = 0,
4177				newPos,
4178				nextThumbEndPos = (id * self._thumbSize + self._thumbSize * 2 - self._thumbsSpacing + self._thumbsMinPosition),
4179				thumbId = Math.floor(self._thumbsPosition / self._thumbSize);
4180			
4181			if(!self._thumbsNavigation) {
4182				return;
4183			}
4184			if(self._firstThumbMoved) {
4185				justSet = true;
4186				self._firstThumbMoved = false;
4187			}
4188
4189			if(nextThumbEndPos  + self._thumbsPosition > self._thumbsViewportSize) {
4190				if(id === self.numSlides - 1) {
4191					incr = 1;
4192				}
4193				thumbId = -id + self._visibleThumbsPerView - 2 + incr;
4194				newPos = thumbId * self._thumbSize + (self._thumbsViewportSize % self._thumbSize) + self._thumbsSpacing - self._thumbsMinPosition;
4195			} else {
4196				if(id !== 0) {
4197					if( (id-1) * self._thumbSize <= -self._thumbsPosition + self._thumbsMinPosition && (id-1) <= self.numSlides - self._visibleThumbsPerView) {
4198						thumbId = -id + 1;
4199						newPos = thumbId * self._thumbSize + self._thumbsMinPosition;
4200					}
4201				} else {
4202					thumbId = 0;
4203					newPos = self._thumbsMinPosition;
4204				}
4205			}
4206
4207			if(newPos !== self._thumbsPosition) {
4208				var checkPos = (newPos === undefined) ? self._thumbsPosition : newPos;
4209				if(checkPos > self._thumbsMinPosition) {
4210					self._setThumbsPosition(self._thumbsMinPosition);
4211				} else if(checkPos < self._thumbsMaxPosition) {
4212					self._setThumbsPosition(self._thumbsMaxPosition);
4213				} else  if(newPos !== undefined) {
4214					if(!justSet) {
4215						self._animateThumbsTo(newPos);
4216					} else {
4217						self._setThumbsPosition(newPos);
4218					}
4219				}
4220			}
4221			self._updateThumbsArrows();
4222		}
4223	});
4224	$.rsModules.thumbnails = $.rsProto._initThumbs;
4225})(jQuery);
4226
4227// jquery.rs.video v1.1.1
4228(function($) {
4229
4230	"use strict";
4231
4232	/**
4233	 *
4234	 * RoyalSlider video module
4235	 * @version 1.1.1:
4236	 *
4237	 * 1.0.3:
4238	 * - Added rsOnDestroyVideoElement event
4239	 *
4240	 * 1.0.4:
4241	 * - Added wmode=transparent to default YouTube video embed code
4242	 *
4243	 * 1.0.5
4244	 * - Fixed bug: HTMl5 YouTube player sometimes keeps playing in ie9 after closing
4245	 *
4246	 * 1.0.6
4247	 * - A bit lightened Vimeo and YouTube regex 
4248	 *
4249	 * 1.0.7
4250	 * - Minor optimizations
4251	 * - Added autoHideCaption option
4252	 *
4253	 * 1.0.9
4254	 * - Fixed error that could appear if updateSliderSize method is called directly after video close
4255	 *
4256	 * 1.1.0
4257	 * - Video is now removed in rsAfterSlideChange event to avoid transition lag
4258	 * - Fixed bug that could cause appearing of arrows with auto-hide
4259	 *
4260	 * 1.1.1
4261	 * - Added option disableCSS3inFF
4262	 */
4263	$.extend($.rsProto, {
4264		_initVideo: function() {
4265			var self = this;
4266			self._videoDefaults = {
4267				autoHideArrows: true,
4268				autoHideControlNav: false,
4269				autoHideBlocks: false,
4270				autoHideCaption: false,
4271				disableCSS3inFF: true,
4272				youTubeCode: '<iframe src="http://www.youtube.com/embed/%id%?rel=1&autoplay=1&showinfo=0&autoplay=1&wmode=transparent" frameborder="no"></iframe>',
4273				vimeoCode: '<iframe src="http://player.vimeo.com/video/%id%?byline=0&amp;portrait=0&amp;autoplay=1" frameborder="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>'
4274			};
4275
4276			self.st.video = $.extend({}, self._videoDefaults, self.st.video);
4277
4278			self.ev.on('rsBeforeSizeSet', function() {
4279				if(self._isVideoPlaying) {
4280					setTimeout(function() {
4281						var content = self._currHolder;
4282						content = content.hasClass('rsVideoContainer') ? content : content.find('.rsVideoContainer');
4283						if(self._videoFrameHolder) {
4284							self._videoFrameHolder.css({
4285								width: content.width(),
4286								height: content.height()
4287							});
4288						}
4289					}, 32);
4290				}
4291			});
4292			var isFF = self._browser.mozilla;
4293			self.ev.on('rsAfterParseNode', function(e, content, obj) {
4294				var jqcontent = $(content),
4295					tempEl,
4296					hasVideo;
4297
4298				if(obj.videoURL) {
4299					if(self.st.video.disableCSS3inFF && !hasVideo && isFF) {
4300						hasVideo = true;
4301						self._useCSS3Transitions = self._use3dTransform = false;
4302					}
4303					var wrap = $('<div class="rsVideoContainer"></div>'),
4304						playBtn = $('<div class="rsBtnCenterer"><div class="rsPlayBtn"><div class="rsPlayBtnIcon"></div></div></div>');
4305					if(jqcontent.hasClass('rsImg')) {
4306						obj.content = wrap.append(jqcontent).append(playBtn);
4307					} else {
4308						obj.content.find('.rsImg').wrap(wrap).after(playBtn);
4309					}
4310				}
4311			});
4312
4313			self.ev.on('rsAfterSlideChange', function() {
4314				self.stopVideo();
4315			});
4316
4317		},
4318		toggleVideo: function() {
4319			var self = this;
4320			if(!self._isVideoPlaying) {
4321				return self.playVideo();
4322			} else {
4323				return self.stopVideo();
4324			}
4325		},
4326		playVideo: function() {
4327			var self = this;
4328			if(!self._isVideoPlaying) {
4329				var currSlide = self.currSlide;
4330				if(!currSlide.videoURL) {
4331					return false;
4332				}
4333
4334				
4335				var content = self._currVideoContent = currSlide.content;
4336				var url = currSlide.videoURL,
4337					videoId,
4338					regExp,
4339					match;
4340
4341				if( url.match(/youtu\.be/i) || url.match(/youtube\.com/i) ) {
4342
4343					regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
4344
4345
4346					match = url.match(regExp);
4347					if (match && match[7].length==11){
4348						videoId = match[7];
4349					}
4350
4351					if(videoId !== undefined) {
4352						self._videoFrameHolder = self.st.video.youTubeCode.replace("%id%", videoId);
4353					}
4354				} else if(url.match(/vimeo\.com/i)) {
4355					regExp = /(www\.)?vimeo.com\/(\d+)($|\/)/;
4356					match = url.match(regExp);
4357					if(match) {
4358						videoId = match[2];
4359					}
4360					if(videoId !== undefined) {
4361						self._videoFrameHolder = self.st.video.vimeoCode.replace("%id%", videoId);
4362					}
4363				}
4364				self.videoObj = $(self._videoFrameHolder);
4365
4366				self.ev.trigger('rsOnCreateVideoElement', [url]);
4367
4368
4369				if(self.videoObj.length) {
4370					self._videoFrameHolder = $('<div class="rsVideoFrameHolder"><div class="rsPreloader"></div><div class="rsCloseVideoBtn"><div class="rsCloseVideoIcn"></div></div></div>');
4371					self._videoFrameHolder.find('.rsPreloader').after(self.videoObj);
4372					content = content.hasClass('rsVideoContainer') ? content : content.find('.rsVideoContainer');
4373					self._videoFrameHolder.css({
4374						width: content.width(),
4375						height: content.height()
4376					}).find('.rsCloseVideoBtn').off('click.rsv').on('click.rsv', function(e) {
4377						self.stopVideo();
4378						e.preventDefault();
4379						e.stopPropagation();
4380						return false;
4381					});
4382					content.append(self._videoFrameHolder);
4383					if(self.isIPAD) {
4384						content.addClass('rsIOSVideo');
4385					}
4386
4387					self._toggleHiddenClass(false);
4388
4389					setTimeout(function() {
4390						self._videoFrameHolder.addClass('rsVideoActive');
4391					}, 10);
4392					self.ev.trigger('rsVideoPlay');
4393					self._isVideoPlaying = true;
4394				}
4395				return true;
4396			}
4397			return false;
4398		},
4399		stopVideo: function() {
4400			var self = this;
4401			if(self._isVideoPlaying) {
4402				if(self.isIPAD) {
4403					self.slider.find('.rsCloseVideoBtn').remove();
4404				}
4405				
4406				self._toggleHiddenClass(true);
4407
4408				setTimeout(function() {
4409					self.ev.trigger('rsOnDestroyVideoElement', [self.videoObj]);
4410					var ifr = self._videoFrameHolder.find('iframe');
4411					if(ifr.length) {
4412						try {
4413							ifr.attr('src', "");
4414						} catch(ex) { }
4415					}
4416					self._videoFrameHolder.remove();
4417					self._videoFrameHolder = null;
4418				}, 16);
4419				self.ev.trigger('rsVideoStop');
4420				self._isVideoPlaying = false;
4421				return true;
4422			} 
4423			return false;
4424		},
4425		_toggleHiddenClass: function(remove) {
4426			var arr = [],
4427				self = this,
4428				vst = self.st.video;
4429			if(vst.autoHideArrows) {
4430				if(self._arrowLeft) {
4431					arr.push(self._arrowLeft, self._arrowRight);
4432					self._arrowsAutoHideLocked = !remove;
4433				}
4434				if(self._fsBtn) {
4435					arr.push(self._fsBtn);
4436				}
4437			}
4438			if(vst.autoHideControlNav && self._controlNav) {
4439				arr.push(self._controlNav);
4440			}
4441			if(vst.autoHideBlocks && self.currSlide.animBlocks) {
4442				arr.push(self.currSlide.animBlocks);
4443			}
4444			if(vst.autoHideCaption && self.globalCaption) {
4445				arr.push(self.globalCaption);
4446			}
4447
4448			if(arr.length) {
4449				for(var i = 0; i < arr.length; i++) {
4450					if(!remove) {
4451						arr[i].addClass('rsHidden');
4452					} else {
4453						arr[i].removeClass('rsHidden');
4454					}
4455				}
4456			}
4457		}
4458	});
4459	$.rsModules.video = $.rsProto._initVideo;
4460})(jQuery);
4461
4462// jquery.rs.visible-nearby v1.0.2
4463(function($) {
4464
4465	"use strict";
4466
4467	/**
4468	 *
4469	 * RoyalSlider module that makes nearby slides visible
4470	 * @version 1.0.2:
4471	 *
4472	 * 1.0.1
4473	 * - Added navigateByCenterClick, breakpoint options
4474	 *
4475	 * 1.0.2
4476	 * - Added hiddenOverflow option
4477	 *
4478	 */ 
4479	$.rsProto._initVisibleNearby = function() {
4480		var self = this;
4481		if(self.st.visibleNearby && self.st.visibleNearby.enabled) {
4482			self._vnDefaults = {
4483				enabled: true,
4484				centerArea: 0.6, // Area of center image. By default 60% will get center image, 20% for each image on side
4485
4486				center: true,
4487
4488				breakpoint: 0, // this option will be trigger change of centerArea parameter
4489				breakpointCenterArea: 0.8,
4490
4491				hiddenOverflow: true,
4492				navigateByCenterClick: false
4493			};
4494			self.st.visibleNearby = $.extend({}, self._vnDefaults, self.st.visibleNearby);
4495
4496			self.ev.one('rsAfterPropsSetup', function() {
4497				self._sliderVisibleNearbyWrap = self._sliderOverflow.css('overflow', 'visible').wrap('<div class="rsVisibleNearbyWrap"></div>').parent();
4498				if(!self.st.visibleNearby.hiddenOverflow) {
4499					self._sliderVisibleNearbyWrap.css('overflow', 'visible');
4500				}
4501				self._controlsContainer = self.st.controlsInside ? self._sliderVisibleNearbyWrap : self.slider;
4502			});
4503
4504			self.ev.on('rsAfterSizePropSet', function() {
4505				var centerRatio,
4506					o = self.st.visibleNearby;
4507
4508				if(o.breakpoint && self.width < o.breakpoint) {
4509					centerRatio = o.breakpointCenterArea;
4510				} else {
4511					centerRatio = o.centerArea;
4512				}
4513				if(self._slidesHorizontal) {
4514					self._wrapWidth = self._wrapWidth * centerRatio;
4515					self._sliderVisibleNearbyWrap.css({
4516						height: self._wrapHeight,
4517						width: self._wrapWidth / centerRatio
4518					});
4519					self._minPosOffset = self._wrapWidth * (1 - centerRatio) / 2 / centerRatio;
4520				} else {
4521					self._wrapHeight = self._wrapHeight * centerRatio;
4522					self._sliderVisibleNearbyWrap.css({
4523						height: self._wrapHeight / centerRatio,
4524						width: self._wrapWidth
4525					});
4526					self._minPosOffset = self._wrapHeight * (1 - centerRatio) / 2 / centerRatio;
4527				}
4528				if(!o.navigateByCenterClick) {
4529					self._nextSlidePos = self._slidesHorizontal ? self._wrapWidth : self._wrapHeight;
4530				}
4531				if(o.center) {
4532					self._sliderOverflow.css('margin-' + (self._slidesHorizontal ? 'left' : 'top' ), self._minPosOffset);
4533				}
4534			});
4535
4536		}
4537	};
4538	$.rsModules.visibleNearby = $.rsProto._initVisibleNearby;
4539})(jQuery);
4540
4541
4542})(jQuery18);

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.