jquery.royalslider.js 140 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808
  1. /**
  2. * Created by duhuan on 2017/9/14.
  3. */
  4. (function($) {
  5. if(!$.rsModules) {
  6. $.rsModules = {uid:0};
  7. }
  8. function RoyalSlider(element, options) {
  9. var i,
  10. self = this,
  11. ua = navigator.userAgent.toLowerCase();
  12. self.uid = $.rsModules.uid++;
  13. self.ns = '.rs' + self.uid; // unique namespace for events
  14. // feature detection, some ideas taken from Modernizr
  15. var tempStyle = document.createElement('div').style,
  16. vendors = ['webkit','Moz','ms','O'],
  17. vendor = '',
  18. lastTime = 0,
  19. tempV;
  20. for (i = 0; i < vendors.length; i++ ) {
  21. tempV = vendors[i];
  22. if (!vendor && (tempV + 'Transform') in tempStyle ) {
  23. vendor = tempV;
  24. }
  25. tempV = tempV.toLowerCase();
  26. if(!window.requestAnimationFrame) {
  27. window.requestAnimationFrame = window[tempV+'RequestAnimationFrame'];
  28. window.cancelAnimationFrame = window[tempV+'CancelAnimationFrame']
  29. || window[tempV+'CancelRequestAnimationFrame'];
  30. }
  31. }
  32. // requestAnimationFrame polyfill by Erik M枚ller
  33. // fixes from Paul Irish and Tino Zijdel
  34. if (!window.requestAnimationFrame) {
  35. window.requestAnimationFrame = function(callback, element) {
  36. var currTime = new Date().getTime(),
  37. timeToCall = Math.max(0, 16 - (currTime - lastTime)),
  38. id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall);
  39. lastTime = currTime + timeToCall;
  40. return id;
  41. };
  42. }
  43. if (!window.cancelAnimationFrame)
  44. window.cancelAnimationFrame = function(id) { clearTimeout(id); };
  45. self.isIPAD = ua.match(/(ipad)/);
  46. // browser UA sniffing, sadly still required
  47. var uaMatch = function( ua ) {
  48. var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
  49. /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
  50. /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
  51. /(msie) ([\w.]+)/.exec( ua ) ||
  52. ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
  53. [];
  54. return {
  55. browser: match[ 1 ] || "",
  56. version: match[ 2 ] || "0"
  57. };
  58. };
  59. var matched = uaMatch( ua );
  60. var br = {};
  61. if ( matched.browser ) {
  62. br[ matched.browser ] = true;
  63. br.version = matched.version;
  64. }
  65. if(br.chrome) { br.webkit = true; };
  66. self._browser = br;
  67. self.isAndroid = ua.indexOf("android") > -1;
  68. self.slider = $(element); // DOM reference
  69. self.ev = $(self); // event object
  70. self._doc = $(document);
  71. self.st = $.extend({}, $.fn.royalSlider.defaults, options);
  72. self._currAnimSpeed = self.st.transitionSpeed;
  73. self._minPosOffset = 0;
  74. if(self.st.allowCSS3) {
  75. if((!br.webkit || self.st.allowCSS3OnWebkit) ) {
  76. var bT = vendor + (vendor ? 'T' : 't' );
  77. self._useCSS3Transitions = ( (bT + 'ransform') in tempStyle ) && ( (bT + 'ransition') in tempStyle );
  78. if(self._useCSS3Transitions) {
  79. self._use3dTransform = (vendor + (vendor ? 'P' : 'p' ) + 'erspective') in tempStyle;
  80. }
  81. }
  82. }
  83. vendor = vendor.toLowerCase();
  84. self._vendorPref = '-'+vendor+'-';
  85. self._slidesHorizontal = (self.st.slidesOrientation === 'vertical') ? false : true;
  86. self._reorderProp = self._slidesHorizontal ? 'left' : 'top';
  87. self._sizeProp = self._slidesHorizontal ? 'width' : 'height';
  88. self._prevNavItemId = -1;
  89. self._isMove = (self.st.transitionType === 'fade') ? false : true;
  90. if(!self._isMove) {
  91. self.st.sliderDrag = false;
  92. self._fadeZIndex = 10;
  93. }
  94. self._opacityCSS = 'z-index:0; display:none; opacity:0;';
  95. self._newSlideId = 0;
  96. self._sPosition = 0;
  97. self._nextSlidePos = 0;
  98. // init modules
  99. $.each($.rsModules, function (helper, opts) {
  100. if(helper !== 'uid')
  101. opts.call(self);
  102. });
  103. // parse all slides
  104. self.slides = [];
  105. self._idCount = 0;
  106. var returnVal;
  107. var ts = self.st.slides ? $(self.st.slides) : self.slider.children().detach();
  108. ts.each(function() {
  109. self._parseNode(this, true);
  110. });
  111. if(self.st.randomizeSlides) {
  112. self.slides.sort(function() { return 0.5 - Math.random() });
  113. }
  114. self.numSlides = self.slides.length;
  115. self._refreshNumPreloadImages();
  116. if(!self.st.startSlideId) {
  117. self.st.startSlideId = 0;
  118. } else if(self.st.startSlideId > self.numSlides - 1) {
  119. self.st.startSlideId = self.numSlides - 1;
  120. }
  121. self._newSlideId = self.staticSlideId = self.currSlideId = self._realId = self.st.startSlideId;
  122. self.currSlide = self.slides[self.currSlideId];
  123. self._accelerationPos = 0;
  124. self.msTouch = false;
  125. self.slider.addClass( (self._slidesHorizontal ? 'rsHor' : 'rsVer') + (self._isMove ? '' : ' rsFade') );
  126. var sliderHTML = '<div class="rsOverflow"><div class="rsContainer">';
  127. self.slidesSpacing = self.st.slidesSpacing;
  128. self._slideSize = ( self._slidesHorizontal ? self.slider.width() : self.slider.height() ) + self.st.slidesSpacing;
  129. self._preload = Boolean(self._numPreloadImages > 0);
  130. if(self.numSlides <= 1) {
  131. self._loop = false;
  132. }
  133. var loopHelpers = (self._loop && self._isMove) ? ( self.numSlides === 2 ? 1 : 2) : 0;
  134. self._loopHelpers = loopHelpers;
  135. self._maxImages = self.numSlides < 6 ? self.numSlides : 6;
  136. self._currBlockIndex = 0;
  137. self._idOffset = 0;
  138. self.slidesJQ = [];
  139. for(i =0; i < self.numSlides; i++) {
  140. self.slidesJQ.push( $(createItemHTML(i)) );
  141. }
  142. self._sliderOverflow = sliderHTML = $(sliderHTML + '</div></div>');
  143. var addCursors = function() {
  144. if(self.st.sliderDrag) {
  145. self._hasDrag = true;
  146. if (br.msie || br.opera) {
  147. self._grabCursor = self._grabbingCursor = "move";
  148. } else if(br.mozilla) {
  149. self._grabCursor = "-moz-grab";
  150. self._grabbingCursor = "-moz-grabbing";
  151. } else if(br.webkit && (navigator.platform.indexOf("Mac")!=-1)) {
  152. self._grabCursor = "-webkit-grab";
  153. self._grabbingCursor = "-webkit-grabbing";
  154. }
  155. self._setGrabCursor();
  156. }
  157. };
  158. var rsNS = self.ns;
  159. var addEventNames = function(pref, down, move, up, cancel) {
  160. self._downEvent = pref + down + rsNS;
  161. self._moveEvent = pref + move + rsNS;
  162. self._upEvent = pref + up + rsNS;
  163. if(cancel)
  164. self._cancelEvent = pref + cancel + rsNS;
  165. };
  166. // ie10
  167. self.msEnabled = window.navigator.msPointerEnabled;
  168. if(self.msEnabled) {
  169. self.msTouch = Boolean(window.navigator.msMaxTouchPoints > 1);
  170. self.hasTouch = false;
  171. self._lastItemFriction = 0.2;
  172. addEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');
  173. } else {
  174. addEventNames('mouse', 'down', 'move', 'up', 'up');
  175. if('ontouchstart' in window || 'createTouch' in document) {
  176. self.hasTouch = true;
  177. self._downEvent += ' touchstart' + rsNS;
  178. self._moveEvent += ' touchmove' + rsNS;
  179. self._upEvent += ' touchend' + rsNS;
  180. self._cancelEvent += ' touchcancel' + rsNS;
  181. self._lastItemFriction = 0.5;
  182. if(self.st.sliderTouch) {
  183. self._hasDrag = true;
  184. }
  185. } else {
  186. self.hasTouch = false;
  187. self._lastItemFriction = 0.2;
  188. }
  189. }
  190. addCursors();
  191. self.slider.html(sliderHTML);
  192. self._controlsContainer = self.st.controlsInside ? self._sliderOverflow : self.slider;
  193. self._slidesContainer = self._sliderOverflow.children('.rsContainer');
  194. if(self.msEnabled) {
  195. self._slidesContainer.css('-ms-touch-action', self._slidesHorizontal ? 'pan-y' : 'pan-x');
  196. }
  197. self._preloader = $('<div class="rsPreloader"><svg class="fa-spinner" viewBox="0 0 48 48" ><path d="M23.98,0.04c-13.055,0-23.673,10.434-23.973,23.417C0.284,12.128,8.898,3.038,19.484,3.038c10.76,0,19.484,9.395,19.484,20.982c0,2.483,2.013,4.497,4.496,4.497c2.482,0,4.496-2.014,4.496-4.497C47.96,10.776,37.224,0.04,23.98,0.04z M23.98,48c13.055,0,23.673-10.434,23.972-23.417c-0.276,11.328-8.89,20.42-19.476,20.42 c-10.76,0-19.484-9.396-19.484-20.983c0-2.482-2.014-4.496-4.497-4.496C2.014,19.524,0,21.537,0,24.02C0,37.264,10.736,48,23.98,48z"/></svg></div>');
  198. var slides = self._slidesContainer.children('.rsSlide');
  199. self._currHolder = self.slidesJQ[self.currSlideId]
  200. self._selectedSlideHolder = 0;
  201. function createItemHTML(i, className) {
  202. return '<div style="'+ (self._isMove ? '' : (i !== self.currSlideId ? self._opacityCSS : 'z-index:0;') ) +'" class="rsSlide '+ (className || '')+'"></div>';
  203. }
  204. if(self._useCSS3Transitions) {
  205. // some constants for CSS3
  206. self._TP = 'transition-property';
  207. self._TD = 'transition-duration';
  208. self._TTF = 'transition-timing-function';
  209. self._yProp = self._xProp = self._vendorPref +'transform';
  210. if(self._use3dTransform) {
  211. if(br.webkit && !br.chrome) {
  212. self.slider.addClass('rsWebkit3d');
  213. }
  214. self._tPref1 = 'translate3d(';
  215. self._tPref2 = 'px, ';
  216. self._tPref3 = 'px, 0px)';
  217. } else {
  218. self._tPref1 = 'translate(';
  219. self._tPref2 = 'px, ';
  220. self._tPref3 = 'px)';
  221. }
  222. if(!self._isMove) {
  223. var animObj = {};
  224. animObj[(self._vendorPref + self._TP)] = 'opacity';
  225. animObj[(self._vendorPref + self._TD)] = self.st.transitionSpeed + 'ms';
  226. animObj[(self._vendorPref + self._TTF)] = self.st.css3easeInOut;
  227. slides.css(animObj);
  228. } else {
  229. self._slidesContainer[(self._vendorPref + self._TP)] = (self._vendorPref + 'transform');
  230. }
  231. } else {
  232. self._xProp = 'left';
  233. self._yProp = 'top';
  234. }
  235. // !Responsiveness (on window resize)
  236. if (!self.st.disableResponsiveness) {
  237. var resizeTimer;
  238. $(window).on('resize'+self.ns, function() {
  239. if(resizeTimer) {
  240. clearTimeout(resizeTimer);
  241. }
  242. resizeTimer = setTimeout(function() { self.updateSliderSize(); }, 50);
  243. });
  244. }
  245. self.ev.trigger('rsAfterPropsSetup'); // navigation (bullets, thumbs...) are created here
  246. self.updateSliderSize();
  247. // keyboard nav
  248. if(self.st.keyboardNavEnabled) {
  249. self._bindKeyboardNav();
  250. }
  251. if(self.st.arrowsNavHideOnTouch && (self.hasTouch || self.msTouch) ) {
  252. self.st.arrowsNav = false;
  253. }
  254. //Direction navigation (arrows)
  255. if(self.st.arrowsNav) {
  256. var rArr = 'rsArrow',
  257. container = self._controlsContainer;
  258. $('<div class="'+rArr+' '+rArr+'Left"><div class="'+rArr+'Icn"></div></div><div class="'+rArr+' '+rArr+'Right"><div class="'+rArr+'Icn"></div></div>').appendTo(container);
  259. self._arrowLeft = container.children('.'+rArr+'Left').click(function(e) {
  260. e.preventDefault();
  261. self.prev();
  262. });
  263. self._arrowRight = container.children('.'+rArr+'Right').click(function(e) {
  264. e.preventDefault();
  265. self.next();
  266. });
  267. if(self.st.arrowsNavAutoHide && !self.hasTouch) {
  268. self._arrowLeft.addClass('rsHidden');
  269. self._arrowRight.addClass('rsHidden');
  270. var hoverEl = container;
  271. hoverEl.one("mousemove.arrowshover",function() {
  272. self._arrowLeft.removeClass('rsHidden');
  273. self._arrowRight.removeClass('rsHidden');
  274. });
  275. hoverEl.hover(
  276. function() {
  277. if(!self._arrowsAutoHideLocked) {
  278. self._arrowLeft.removeClass('rsHidden');
  279. self._arrowRight.removeClass('rsHidden');
  280. }
  281. },
  282. function() {
  283. if(!self._arrowsAutoHideLocked) {
  284. self._arrowLeft.addClass('rsHidden');
  285. self._arrowRight.addClass('rsHidden');
  286. }
  287. }
  288. );
  289. }
  290. self.ev.on('rsOnUpdateNav', function() {
  291. self._updateArrowsNav();
  292. });
  293. self._updateArrowsNav();
  294. }
  295. if( self._hasDrag ) {
  296. self._slidesContainer.on(self._downEvent, function(e) { self._onDragStart(e); });
  297. } else {
  298. self.dragSuccess = false;
  299. }
  300. var videoClasses = ['rsPlayBtnIcon', 'rsPlayBtn', 'rsCloseVideoBtn', 'rsCloseVideoIcn'];
  301. self._slidesContainer.click(function(e) {
  302. if(!self.dragSuccess) {
  303. var t = $(e.target);
  304. var tClass = t.attr('class');
  305. if( $.inArray(tClass, videoClasses) !== -1) {
  306. if( self.toggleVideo() ) {
  307. return false;
  308. }
  309. }
  310. if(self.st.navigateByClick && !self._blockActions) {
  311. if($(e.target).closest('.rsNoDrag', self._currHolder).length) {
  312. return true;
  313. }
  314. self._mouseNext(e);
  315. }
  316. self.ev.trigger('rsSlideClick');
  317. }
  318. }).on('click.rs', 'a', function(e) {
  319. if(self.dragSuccess) {
  320. return false;
  321. } else {
  322. self._blockActions = true;
  323. //e.stopPropagation();
  324. //e.stopImmediatePropagation();
  325. setTimeout(function() {
  326. self._blockActions = false;
  327. }, 3);
  328. }
  329. });
  330. self.ev.trigger('rsAfterInit');
  331. } /* RoyalSlider Constructor End */
  332. /**
  333. *
  334. * RoyalSlider Core Prototype
  335. *
  336. */
  337. RoyalSlider.prototype = {
  338. constructor: RoyalSlider,
  339. _mouseNext: function(e) {
  340. var self = this,
  341. relativePos = e[self._slidesHorizontal ? 'pageX' : 'pageY'] - self._sliderOffset;
  342. if(relativePos >= self._nextSlidePos) {
  343. self.next();
  344. } else if(relativePos < 0) {
  345. self.prev();
  346. }
  347. },
  348. _refreshNumPreloadImages: function() {
  349. var self = this,
  350. n;
  351. n = self.st.numImagesToPreload;
  352. self._loop = self.st.loop;
  353. if(self._loop) {
  354. if(self.numSlides === 2) {
  355. self._loop = false;
  356. self.st.loopRewind = true;
  357. } else if(self.numSlides < 2) {
  358. self.st.loopRewind = self._loop = false;
  359. }
  360. }
  361. if(self._loop && n > 0) {
  362. if(self.numSlides <= 4) {
  363. n = 1;
  364. } else {
  365. if(self.st.numImagesToPreload > (self.numSlides - 1) / 2 ) {
  366. n = Math.floor( (self.numSlides - 1) / 2 );
  367. }
  368. }
  369. }
  370. self._numPreloadImages = n;
  371. },
  372. _parseNode: function(content, pushToSlides) {
  373. var self = this,
  374. hasImg,
  375. isRoot,
  376. hasCover,
  377. obj = {},
  378. tempEl,
  379. first = true;
  380. content = $(content);
  381. self._currContent = content;
  382. self.ev.trigger('rsBeforeParseNode', [content, obj]);
  383. if(obj.stopParsing) {
  384. return;
  385. }
  386. content = self._currContent;
  387. obj.id = self._idCount;
  388. obj.contentAdded = false;
  389. self._idCount++;
  390. obj.images = [];
  391. obj.isBig = false;
  392. if(!obj.hasCover) {
  393. if(content.hasClass('rsImg')) {
  394. tempEl = content;
  395. hasImg = true;
  396. } else {
  397. tempEl = content.find('.rsImg');
  398. if(tempEl.length) {
  399. hasImg = true;
  400. }
  401. }
  402. if(hasImg) {
  403. obj.bigImage = tempEl.eq(0).attr('data-rsBigImg');
  404. tempEl.each(function() {
  405. var item = $(this);
  406. if(item.is('a')) {
  407. parseEl(item, 'href');
  408. } else if(item.is('img')) {
  409. parseEl(item, 'src');
  410. } else {
  411. parseEl(item);
  412. }
  413. });
  414. } else if(content.is('img')) {
  415. content.addClass('rsImg rsMainSlideImage');
  416. parseEl(content, 'src');
  417. }
  418. }
  419. tempEl = content.find('.rsCaption');
  420. if(tempEl.length) {
  421. obj.caption = tempEl.remove();
  422. }
  423. obj.content = content;
  424. self.ev.trigger('rsAfterParseNode', [content, obj]);
  425. function parseEl(el, s) {
  426. if(s) {
  427. obj.images.push( el.attr(s) );
  428. } else {
  429. obj.images.push( el.text() );
  430. }
  431. if(first) {
  432. first = false;
  433. obj.caption = (s === 'src') ? el.attr('alt') : el.contents();
  434. obj.image = obj.images[0];
  435. obj.videoURL = el.attr('data-rsVideo');
  436. var wAtt = el.attr('data-rsw'),
  437. hAtt = el.attr('data-rsh');
  438. if (typeof wAtt !== 'undefined' && wAtt !== false && typeof hAtt !== 'undefined' && hAtt !== false ) {
  439. obj.iW = parseInt(wAtt);
  440. obj.iH = parseInt(hAtt);
  441. } else if(self.st.imgWidth && self.st.imgHeight ) {
  442. obj.iW = self.st.imgWidth;
  443. obj.iH = self.st.imgHeight;
  444. }
  445. }
  446. }
  447. if(pushToSlides) {
  448. self.slides.push(obj);
  449. }
  450. if(obj.images.length === 0) {
  451. obj.isLoaded = true;
  452. obj.isRendered = false;
  453. obj.isLoading = false;
  454. obj.images = null;
  455. }
  456. return obj;
  457. },
  458. _bindKeyboardNav: function() {
  459. var self = this,
  460. interval,
  461. keyCode,
  462. onKeyboardAction = function (keyCode) {
  463. if (keyCode === 37) {
  464. self.prev();
  465. } else if (keyCode === 39) {
  466. self.next();
  467. }
  468. };
  469. self._doc.on('keydown' + self.ns, function(e) {
  470. if(!self._isDragging) {
  471. keyCode = e.keyCode;
  472. if(keyCode === 37 || keyCode === 39) {
  473. if(!interval) {
  474. onKeyboardAction(keyCode);
  475. interval = setInterval(function() {
  476. onKeyboardAction(keyCode);
  477. }, 700);
  478. }
  479. }
  480. }
  481. }).on('keyup' + self.ns, function(e) {
  482. if(interval) {
  483. clearInterval(interval);
  484. interval = null;
  485. }
  486. });
  487. },
  488. goTo: function(id, notUserAction) {
  489. var self = this;
  490. if(id !== self.currSlideId) {
  491. self._moveTo(id,self.st.transitionSpeed, true, !notUserAction);
  492. }
  493. },
  494. destroy: function(remove) {
  495. var self = this;
  496. self.ev.trigger('rsBeforeDestroy');
  497. self._doc.off('keydown' +self.ns+ ' keyup' + self.ns + ' ' + self._moveEvent +' '+ self._upEvent );
  498. self._slidesContainer.off(self._downEvent + ' click');
  499. self.slider.data('royalSlider', null);
  500. $.removeData(self.slider, 'royalSlider');
  501. $(window).off('resize' + self.ns);
  502. if(remove) {
  503. self.slider.remove();
  504. }
  505. self.slides = null;
  506. self.slider = null;
  507. self.ev = null;
  508. },
  509. _updateBlocksContent: function(beforeTransition, getId) {
  510. var self = this,
  511. item,
  512. i,
  513. n,
  514. pref,
  515. group,
  516. groupId,
  517. slideCode,
  518. loop = self._loop,
  519. numSlides = self.numSlides;
  520. if(!isNaN(getId) ) {
  521. return getCorrectLoopedId(getId);
  522. }
  523. var id = self.currSlideId;
  524. var groupOffset;
  525. var itemsOnSide = beforeTransition ? (Math.abs(self._prevSlideId - self.currSlideId) >= self.numSlides - 1 ? 0 : 1) : self._numPreloadImages;
  526. var itemsToCheck = Math.min(2, itemsOnSide);
  527. var updateAfter = false;
  528. var updateBefore = false;
  529. var tempId;
  530. for(i = id; i < id + 1 + itemsToCheck; i++) {
  531. tempId = getCorrectLoopedId(i);
  532. item = self.slides[tempId];
  533. if(item && (!item.isAdded || !item.positionSet) ) {
  534. updateAfter = true;
  535. break;
  536. }
  537. }
  538. for(i = id - 1; i > id - 1 - itemsToCheck; i--) {
  539. tempId = getCorrectLoopedId(i);
  540. item = self.slides[tempId];
  541. if(item && (!item.isAdded || !item.positionSet) ) {
  542. updateBefore = true;
  543. break;
  544. }
  545. }
  546. if(updateAfter) {
  547. for(i = id; i < id + itemsOnSide + 1; i++) {
  548. tempId = getCorrectLoopedId(i);
  549. groupOffset = Math.floor( (self._realId - (id - i)) / self.numSlides) * self.numSlides;
  550. item = self.slides[tempId];
  551. if(item) {
  552. updateItem(item, tempId);
  553. }
  554. }
  555. }
  556. if(updateBefore) {
  557. for(i = id - 1; i > id - 1 - itemsOnSide; i--) {
  558. tempId = getCorrectLoopedId(i);
  559. groupOffset = Math.floor( (self._realId - (id - i) ) / numSlides) * numSlides;
  560. item = self.slides[tempId];
  561. if(item) {
  562. updateItem(item, tempId);
  563. }
  564. }
  565. }
  566. if(!beforeTransition) {
  567. var start = id;
  568. var distance = itemsOnSide;
  569. var min = getCorrectLoopedId(id - itemsOnSide);
  570. var max = getCorrectLoopedId(id + itemsOnSide);
  571. var nmin = min > max ? 0 : min;
  572. for (i = 0; i < numSlides; i++) {
  573. if(min > max) {
  574. if(i > min - 1) {
  575. continue;
  576. }
  577. }
  578. if(i < nmin || i > max) {
  579. item = self.slides[i];
  580. if(item && item.holder) {
  581. //slideCode = self.slidesJQ[i];
  582. //if(typeof slideCode !== "string") {
  583. item.holder.detach();
  584. item.isAdded = false;
  585. //}
  586. }
  587. }
  588. }
  589. }
  590. function updateItem(item , i, slideCode) {
  591. if(!item.isAdded) {
  592. if(!slideCode)
  593. slideCode = self.slidesJQ[i];
  594. if(!item.holder) {
  595. slideCode = self.slidesJQ[i] = $(slideCode);
  596. item.holder = slideCode;
  597. } else {
  598. slideCode = item.holder;
  599. }
  600. item.appendOnLoaded = false;
  601. updatePos(i, item, slideCode);
  602. addContent(i, item);
  603. self._addBlockToContainer(item, slideCode, beforeTransition);
  604. item.isAdded = true;
  605. appended = true;
  606. } else {
  607. addContent(i, item);
  608. updatePos(i, item);
  609. }
  610. }
  611. function addContent(i, item) {
  612. if(!item.contentAdded) {
  613. self.setItemHtml(item, beforeTransition);
  614. if(!beforeTransition) {
  615. item.contentAdded = true;
  616. }
  617. }
  618. }
  619. function updatePos(i, item, slideCode) {
  620. if(self._isMove) {
  621. if(!slideCode) {
  622. slideCode = self.slidesJQ[i];
  623. }
  624. slideCode.css(self._reorderProp, (i + self._idOffset + groupOffset) * self._slideSize);
  625. }
  626. }
  627. function getCorrectLoopedId(index) {
  628. var changed = false;
  629. if(loop) {
  630. if(index > numSlides - 1) {
  631. return getCorrectLoopedId(index - numSlides);
  632. } else if(index < 0) {
  633. return getCorrectLoopedId(numSlides + index);
  634. }
  635. }
  636. return index;
  637. }
  638. },
  639. /**
  640. * Sets or loads HTML for specified slide
  641. * @param {Object} currSlideObject holds data about curr slide (read about rsAfterParseNode for more info)
  642. * @param {Boolean} beforeTransition determines if setItemHTML method is called before or after transition
  643. */
  644. setItemHtml: function(currSlideObject, beforeTransition) {
  645. var self = this;
  646. if(currSlideObject.isLoaded) {
  647. appendContent();
  648. return;
  649. } else {
  650. if(beforeTransition) {
  651. waitForTransition();
  652. } else {
  653. parseDataAndLoad();
  654. }
  655. }
  656. function parseDataAndLoad() {
  657. if(!currSlideObject.images) {
  658. currSlideObject.isRendered = true;
  659. currSlideObject.isLoaded = true;
  660. currSlideObject.isLoading = false;
  661. appendContent(true);
  662. return;
  663. }
  664. if(currSlideObject.isLoading) {
  665. return;
  666. }
  667. var el,
  668. isRoot;
  669. if(currSlideObject.content.hasClass('rsImg') ) {
  670. el = currSlideObject.content;
  671. isRoot = true;
  672. } else {
  673. el = currSlideObject.content.find('.rsImg:not(img)')
  674. }
  675. if(el && !el.is('img')) {
  676. el.each(function() {
  677. var item = $(this),
  678. newEl = '<img class="rsImg" src="'+ ( item.is('a') ? item.attr('href') : item.text() ) +'" />';
  679. if(!isRoot) {
  680. item.replaceWith( newEl );
  681. } else {
  682. currSlideObject.content = $(newEl);
  683. }
  684. });
  685. }
  686. el = isRoot ? currSlideObject.content : currSlideObject.content.find('img.rsImg');
  687. setPreloader();
  688. el.eq(0).addClass('rsMainSlideImage');
  689. if(currSlideObject.iW && currSlideObject.iH) {
  690. if(!currSlideObject.isLoaded) {
  691. self._resizeImage( currSlideObject );
  692. }
  693. appendContent();
  694. }
  695. currSlideObject.isLoading = true;
  696. var newEl;
  697. if(currSlideObject.isBig) {
  698. $('<img />').on('load.rs error.rs', function(e){
  699. onLoad( [this], true );
  700. }).attr('src', currSlideObject.image);
  701. } else {
  702. currSlideObject.loaded = [];
  703. currSlideObject.imgLoaders = [];
  704. for(var i = 0; i < currSlideObject.images.length; i++) {
  705. var image = $('<img />');
  706. currSlideObject.imgLoaders.push( this );
  707. image.on('load.rs error.rs', function(e){
  708. currSlideObject.loaded.push( this );
  709. if(currSlideObject.loaded.length === currSlideObject.imgLoaders.length) {
  710. onLoad( currSlideObject.loaded, false );
  711. }
  712. }).attr('src', currSlideObject.images[i]);
  713. }
  714. }
  715. // old images loading
  716. // el.imagesLoaded( function( $images, $proper, $broken ) {
  717. // if($broken.length) {
  718. // currSlideObject.isLoading = false;
  719. // var img = $images[0],
  720. // src = img.src;
  721. // if(src && src.indexOf(currSlideObject.image) === -1 ) {
  722. // return;
  723. // }
  724. // if(!currSlideObject.tryAgainCount) { currSlideObject.tryAgainCount = 0; }
  725. // if(currSlideObject.tryAgainCount < 3) {
  726. // currSlideObject.tryAgainCount++;
  727. // self.setItemHtml(currSlideObject, beforeTransition);
  728. // return;
  729. // }
  730. // }
  731. // onLoad($images);
  732. // });
  733. }
  734. function onLoad($images, isBig) {
  735. if($images.length) {
  736. var img = $images[0],
  737. src = img.src;
  738. if(isBig !== currSlideObject.isBig) {
  739. var c = currSlideObject.holder.children();
  740. if(c && c.length > 1) {
  741. removePreloader();
  742. }
  743. return;
  744. }
  745. if(currSlideObject.iW && currSlideObject.iH) {
  746. imageLoadingComplete();
  747. return;
  748. }
  749. currSlideObject.iW = img.width;
  750. currSlideObject.iH = img.height;
  751. if(currSlideObject.iW && currSlideObject.iH) {
  752. imageLoadingComplete();
  753. return;
  754. } else {
  755. // if no size, try again
  756. var loader = new Image();
  757. loader.onload = function() {
  758. if(loader.width) {
  759. currSlideObject.iW = loader.width;
  760. currSlideObject.iH = loader.height;
  761. imageLoadingComplete();
  762. } else {
  763. setTimeout(function() {
  764. if(loader.width) {
  765. currSlideObject.iW = loader.width;
  766. currSlideObject.iH = loader.height;
  767. }
  768. // failed to get size on last tier, just output image
  769. imageLoadingComplete();
  770. }, 1000);
  771. }
  772. };
  773. loader.src = img.src;
  774. }
  775. } else {
  776. imageLoadingComplete();
  777. }
  778. }
  779. function imageLoadingComplete() {
  780. currSlideObject.isLoaded = true;
  781. currSlideObject.isLoading = false;
  782. appendContent();
  783. removePreloader();
  784. triggerLoaded();
  785. }
  786. function waitForTransition() {
  787. if(!self._isMove && currSlideObject.images && currSlideObject.iW && currSlideObject.iH) {
  788. parseDataAndLoad();
  789. return;
  790. }
  791. currSlideObject.holder.isWaiting = true;
  792. setPreloader();
  793. currSlideObject.holder.slideId = -99;
  794. }
  795. function appendContent() {
  796. if(!currSlideObject.isAppended) {
  797. var visibleNearby = self.st.visibleNearby,
  798. bId = currSlideObject.id - self._newSlideId;
  799. if(!beforeTransition && !currSlideObject.appendOnLoaded && self.st.fadeinLoadedSlide && ( bId === 0 || ( (visibleNearby || self._isAnimating || self._isDragging) && (bId === -1 || bId === 1) ) ) ) {
  800. var css = {
  801. visibility: 'visible',
  802. opacity: 0
  803. };
  804. css[self._vendorPref + 'transition'] = 'opacity 400ms ease-in-out';
  805. currSlideObject.content.css(css);
  806. setTimeout(function() {
  807. currSlideObject.content.css('opacity', 1);
  808. }, 16);
  809. }
  810. if(currSlideObject.holder.find('.rsPreloader').length) {
  811. currSlideObject.holder.append( currSlideObject.content );
  812. } else {
  813. currSlideObject.holder.html( currSlideObject.content );
  814. }
  815. currSlideObject.isAppended = true;
  816. if(currSlideObject.isLoaded) {
  817. self._resizeImage(currSlideObject);
  818. triggerLoaded();
  819. }
  820. if(!currSlideObject.sizeReady) {
  821. currSlideObject.sizeReady = true;
  822. setTimeout(function() {
  823. // triggers after content is added, usually is true when page is refreshed from cache
  824. self.ev.trigger('rsMaybeSizeReady', currSlideObject);
  825. }, 100);
  826. }
  827. }
  828. }
  829. function triggerLoaded() {
  830. if(!currSlideObject.loadedTriggered) {
  831. currSlideObject.isLoaded = currSlideObject.loadedTriggered = true;
  832. currSlideObject.holder.trigger('rsAfterContentSet');
  833. self.ev.trigger('rsAfterContentSet', currSlideObject);
  834. }
  835. }
  836. function setPreloader() {
  837. if(self.st.usePreloader)
  838. currSlideObject.holder.html(self._preloader.clone());
  839. }
  840. function removePreloader(now) {
  841. if(self.st.usePreloader) {
  842. var preloader = currSlideObject.holder.find('.rsPreloader');
  843. if(preloader.length) {
  844. preloader.remove();
  845. }
  846. }
  847. }
  848. },
  849. _addBlockToContainer: function(slideObject, content, dontFade) {
  850. var self = this;
  851. var holder = slideObject.holder;
  852. var bId = slideObject.id - self._newSlideId;
  853. var visibleNearby = false;
  854. // if(self._isMove && !dontFade && self.st.fadeinLoadedSlide && ( bId === 0 || ( (visibleNearby || self._isAnimating || self._isDragging) && (bId === -1 || bId === 1) ) ) ) {
  855. // var content = slideObject.content;
  856. // content.css(self._vendorPref + 'transition', 'opacity 400ms ease-in-out').css({visibility: 'visible', opacity: 0});
  857. // //holder.css('opacity', 0);
  858. // self._slidesContainer.append(holder);
  859. // setTimeout(function() {
  860. // content.css('opacity', 1);
  861. // //self.ev.trigger('rsAfterContentSet', holder);
  862. // }, 6);
  863. // } else {
  864. self._slidesContainer.append(holder);
  865. //}
  866. slideObject.appendOnLoaded = false;
  867. },
  868. _onDragStart:function(e, isThumbs) {
  869. var self = this,
  870. point,
  871. wasAnimating,
  872. isTouch = (e.type === 'touchstart');
  873. self._isTouchGesture = isTouch;
  874. self.ev.trigger('rsDragStart');
  875. if($(e.target).closest('.rsNoDrag', self._currHolder).length) {
  876. self.dragSuccess = false;
  877. return true;
  878. }
  879. if(!isThumbs) {
  880. if(self._isAnimating) {
  881. self._wasAnimating = true;
  882. self._stopAnimation();
  883. }
  884. }
  885. self.dragSuccess = false;
  886. if(self._isDragging) {
  887. if(isTouch) {
  888. self._multipleTouches = true;
  889. }
  890. return;
  891. } else {
  892. if(isTouch) {
  893. self._multipleTouches = false;
  894. }
  895. }
  896. self._setGrabbingCursor();
  897. if(isTouch) {
  898. //parsing touch event
  899. var touches = e.originalEvent.touches;
  900. if(touches && touches.length > 0) {
  901. point = touches[0];
  902. if(touches.length > 1) {
  903. self._multipleTouches = true;
  904. }
  905. }
  906. else {
  907. return;
  908. }
  909. } else {
  910. e.preventDefault();
  911. point = e;
  912. if(self.msEnabled) point = point.originalEvent;
  913. }
  914. self._isDragging = true;
  915. self._doc.on(self._moveEvent, function(e) { self._onDragMove(e, isThumbs); })
  916. .on(self._upEvent, function(e) { self._onDragRelease(e, isThumbs); });
  917. self._currMoveAxis = '';
  918. self._hasMoved = false;
  919. self._pageX = point.pageX;
  920. self._pageY = point.pageY;
  921. self._startPagePos = self._accelerationPos = (!isThumbs ? self._slidesHorizontal : self._thumbsHorizontal) ? point.pageX : point.pageY;
  922. self._horDir = 0;
  923. self._verDir = 0;
  924. self._currRenderPosition = !isThumbs ? self._sPosition : self._thumbsPosition;
  925. self._startTime = new Date().getTime();
  926. if(isTouch) {
  927. self._sliderOverflow.on(self._cancelEvent, function(e) { self._onDragRelease(e, isThumbs); });
  928. }
  929. },
  930. _renderMovement:function(point, isThumbs) {
  931. var self = this;
  932. if(self._checkedAxis) {
  933. var timeStamp = self._renderMoveTime,
  934. deltaX = point.pageX - self._pageX,
  935. deltaY = point.pageY - self._pageY,
  936. newX = self._currRenderPosition + deltaX,
  937. newY = self._currRenderPosition + deltaY,
  938. isHorizontal = (!isThumbs ? self._slidesHorizontal : self._thumbsHorizontal),
  939. newPos = isHorizontal ? newX : newY,
  940. mAxis = self._currMoveAxis;
  941. self._hasMoved = true;
  942. self._pageX = point.pageX;
  943. self._pageY = point.pageY;
  944. if(mAxis === 'x' && deltaX !== 0) {
  945. self._horDir = deltaX > 0 ? 1 : -1;
  946. } else if(mAxis === 'y' && deltaY !== 0) {
  947. self._verDir = deltaY > 0 ? 1 : -1;
  948. }
  949. var pointPos = isHorizontal ? self._pageX : self._pageY,
  950. deltaPos = isHorizontal ? deltaX : deltaY;
  951. if(!isThumbs) {
  952. if(!self._loop) {
  953. if(self.currSlideId <= 0) {
  954. if(pointPos - self._startPagePos > 0) {
  955. newPos = self._currRenderPosition + deltaPos * self._lastItemFriction;
  956. }
  957. }
  958. if(self.currSlideId >= self.numSlides - 1) {
  959. if(pointPos - self._startPagePos < 0) {
  960. newPos = self._currRenderPosition + deltaPos * self._lastItemFriction ;
  961. }
  962. }
  963. }
  964. } else {
  965. if(newPos > self._thumbsMinPosition) {
  966. newPos = self._currRenderPosition + deltaPos * self._lastItemFriction;
  967. } else if(newPos < self._thumbsMaxPosition) {
  968. newPos = self._currRenderPosition + deltaPos * self._lastItemFriction ;
  969. }
  970. }
  971. self._currRenderPosition = newPos;
  972. if (timeStamp - self._startTime > 200) {
  973. self._startTime = timeStamp;
  974. self._accelerationPos = pointPos;
  975. }
  976. if(!isThumbs) {
  977. if(self._isMove) {
  978. self._setPosition(self._currRenderPosition);
  979. }
  980. } else {
  981. self._setThumbsPosition(self._currRenderPosition);
  982. }
  983. }
  984. },
  985. _onDragMove:function(e, isThumbs) {
  986. var self = this,
  987. point,
  988. isTouch = (e.type === 'touchmove');
  989. if(self._isTouchGesture && !isTouch) {
  990. return;
  991. }
  992. if(isTouch) {
  993. if(self._lockAxis) {
  994. return;
  995. }
  996. var touches = e.originalEvent.touches;
  997. if(touches) {
  998. if(touches.length > 1) {
  999. return;
  1000. } else {
  1001. point = touches[0];
  1002. }
  1003. } else {
  1004. return;
  1005. }
  1006. } else {
  1007. point = e;
  1008. if(self.msEnabled) point = point.originalEvent;
  1009. }
  1010. if(!self._hasMoved) {
  1011. if(self._useCSS3Transitions) {
  1012. (!isThumbs ? self._slidesContainer : self._thumbsContainer).css((self._vendorPref + self._TD), '0s');
  1013. }
  1014. (function animloop(){
  1015. if(self._isDragging) {
  1016. self._animFrame = requestAnimationFrame(animloop);
  1017. if(self._renderMoveEvent)
  1018. self._renderMovement(self._renderMoveEvent, isThumbs);
  1019. }
  1020. })();
  1021. }
  1022. if(!self._checkedAxis) {
  1023. var dir = (!isThumbs ? self._slidesHorizontal : self._thumbsHorizontal),
  1024. diff = (Math.abs(point.pageX - self._pageX) - Math.abs(point.pageY - self._pageY) ) - (dir ? -7 : 7);
  1025. if(diff > 7) {
  1026. // hor movement
  1027. if(dir) {
  1028. e.preventDefault();
  1029. self._currMoveAxis = 'x';
  1030. } else if(isTouch) {
  1031. self._completeGesture();
  1032. return;
  1033. }
  1034. self._checkedAxis = true;
  1035. } else if(diff < -7) {
  1036. // ver movement
  1037. if(!dir) {
  1038. e.preventDefault();
  1039. self._currMoveAxis = 'y';
  1040. } else if(isTouch) {
  1041. self._completeGesture();
  1042. return;
  1043. }
  1044. self._checkedAxis = true;
  1045. }
  1046. return;
  1047. }
  1048. e.preventDefault();
  1049. self._renderMoveTime = new Date().getTime();
  1050. self._renderMoveEvent = point;
  1051. },
  1052. _completeGesture: function() {
  1053. var self = this;
  1054. self._lockAxis = true;
  1055. self._hasMoved = self._isDragging = false;
  1056. self._onDragRelease();
  1057. },
  1058. _onDragRelease:function(e, isThumbs) {
  1059. var self = this,
  1060. totalMoveDist,
  1061. accDist,
  1062. duration,
  1063. v0,
  1064. newPos,
  1065. newDist,
  1066. newDuration,
  1067. blockLink,
  1068. isTouch = (e.type === 'touchend' || e.type === 'touchcancel');
  1069. if(self._isTouchGesture && !isTouch) {
  1070. return;
  1071. }
  1072. self._isTouchGesture = false;
  1073. self.ev.trigger('rsDragRelease');
  1074. self._renderMoveEvent = null;
  1075. self._isDragging = false;
  1076. self._lockAxis = false;
  1077. self._checkedAxis = false;
  1078. self._renderMoveTime = 0;
  1079. cancelAnimationFrame(self._animFrame);
  1080. if(self._hasMoved) {
  1081. if(!isThumbs) {
  1082. if(self._isMove) {
  1083. self._setPosition(self._currRenderPosition);
  1084. }
  1085. } else {
  1086. self._setThumbsPosition(self._currRenderPosition);
  1087. }
  1088. }
  1089. self._doc.off(self._moveEvent).off(self._upEvent);
  1090. if(isTouch) {
  1091. self._sliderOverflow.off(self._cancelEvent);
  1092. }
  1093. self._setGrabCursor();
  1094. if (!self._hasMoved && !self._multipleTouches) {
  1095. if(isThumbs && self._thumbsEnabled) {
  1096. var item = $(e.target).closest('.rsNavItem');
  1097. if(item.length) {
  1098. self.goTo(item.index());
  1099. }
  1100. return;
  1101. }
  1102. }
  1103. var orient = (!isThumbs ? self._slidesHorizontal : self._thumbsHorizontal);
  1104. if(!self._hasMoved || (self._currMoveAxis === 'y' && orient) || (self._currMoveAxis === 'x' && !orient) ) {
  1105. if(!isThumbs && self._wasAnimating) {
  1106. self._wasAnimating = false;
  1107. if(!self.st.navigateByClick) {
  1108. self.dragSuccess = true;
  1109. } else {
  1110. self._mouseNext( (self.msEnabled ? e.originalEvent : e) );
  1111. self.dragSuccess = true;
  1112. return;
  1113. }
  1114. } else {
  1115. self._wasAnimating = false;
  1116. self.dragSuccess = false;
  1117. return;
  1118. }
  1119. } else {
  1120. self.dragSuccess = true;
  1121. }
  1122. self._wasAnimating = false;
  1123. self._currMoveAxis = '';
  1124. function getCorrectSpeed(newSpeed) {
  1125. if(newSpeed < 100) {
  1126. return 100;
  1127. } else if(newSpeed > 500) {
  1128. return 500;
  1129. }
  1130. return newSpeed;
  1131. }
  1132. function returnToCurrent(isSlow, v0) {
  1133. if(self._isMove || isThumbs) {
  1134. newPos = (-self._realId - self._idOffset) * self._slideSize;
  1135. newDist = Math.abs(self._sPosition - newPos);
  1136. self._currAnimSpeed = newDist / v0;
  1137. if(isSlow) {
  1138. self._currAnimSpeed += 250;
  1139. }
  1140. self._currAnimSpeed = getCorrectSpeed(self._currAnimSpeed);
  1141. self._animateTo(newPos, false);
  1142. }
  1143. }
  1144. var snapDist = self.st.minSlideOffset,
  1145. point = isTouch ? e.originalEvent.changedTouches[0] : (self.msEnabled ? e.originalEvent : e),
  1146. pPos = orient ? point.pageX : point.pageY,
  1147. sPos = self._startPagePos,
  1148. axPos = self._accelerationPos,
  1149. axCurrItem = self.currSlideId,
  1150. axNumItems = self.numSlides,
  1151. dir = orient ? self._horDir : self._verDir,
  1152. loop = self._loop,
  1153. changeHash = false,
  1154. distOffset = 0;
  1155. totalMoveDist = Math.abs(pPos - sPos);
  1156. accDist = pPos - axPos;
  1157. duration = (new Date().getTime()) - self._startTime;
  1158. v0 = Math.abs(accDist) / duration;
  1159. if(dir === 0 || axNumItems <= 1) {
  1160. returnToCurrent(true, v0);
  1161. return;
  1162. }
  1163. if(!loop && !isThumbs) {
  1164. if(axCurrItem <= 0) {
  1165. if(dir > 0) {
  1166. returnToCurrent(true, v0);
  1167. return;
  1168. }
  1169. } else if(axCurrItem >= axNumItems - 1) {
  1170. if(dir < 0) {
  1171. returnToCurrent(true, v0);
  1172. return;
  1173. }
  1174. }
  1175. }
  1176. if(!isThumbs) {
  1177. if(sPos + snapDist < pPos) {
  1178. if(dir < 0) {
  1179. returnToCurrent(false, v0);
  1180. return;
  1181. }
  1182. self._moveTo('prev', getCorrectSpeed(Math.abs(self._sPosition - (-self._realId - self._idOffset + 1) * self._slideSize) / v0), changeHash, true, true);
  1183. } else if(sPos - snapDist > pPos) {
  1184. if(dir > 0) {
  1185. returnToCurrent(false, v0);
  1186. return;
  1187. }
  1188. self._moveTo('next', getCorrectSpeed(Math.abs(self._sPosition - (-self._realId - self._idOffset - 1) * self._slideSize) / v0), changeHash, true, true);
  1189. } else {
  1190. returnToCurrent(false, v0);
  1191. }
  1192. } else {
  1193. var newPos = self._thumbsPosition;
  1194. var transitionSpeed;
  1195. if(newPos > self._thumbsMinPosition) {
  1196. newPos = self._thumbsMinPosition;
  1197. } else if(newPos < self._thumbsMaxPosition) {
  1198. newPos = self._thumbsMaxPosition;
  1199. } else {
  1200. var friction = 0.003,
  1201. S = (v0 * v0) / (friction * 2),
  1202. minXDist = -self._thumbsPosition,
  1203. maxXDist = self._thumbsContainerSize - self._thumbsViewportSize + self._thumbsPosition;
  1204. if (accDist > 0 && S > minXDist) {
  1205. minXDist = minXDist + self._thumbsViewportSize / (15 / (S / v0 * friction));
  1206. v0 = v0 * minXDist / S;
  1207. S = minXDist;
  1208. } else if (accDist < 0 && S > maxXDist) {
  1209. maxXDist = maxXDist + self._thumbsViewportSize / (15 / (S / v0 * friction));
  1210. v0 = v0 * maxXDist / S;
  1211. S = maxXDist;
  1212. }
  1213. transitionSpeed = Math.max(Math.round(v0 / friction), 50);
  1214. newPos = newPos + S * (accDist < 0 ? -1 : 1);
  1215. if(newPos > self._thumbsMinPosition) {
  1216. self._animateThumbsTo(newPos, transitionSpeed, true, self._thumbsMinPosition, 200);
  1217. return;
  1218. } else if(newPos < self._thumbsMaxPosition) {
  1219. self._animateThumbsTo( newPos, transitionSpeed, true, self._thumbsMaxPosition, 200);
  1220. return;
  1221. }
  1222. }
  1223. self._animateThumbsTo(newPos, transitionSpeed, true);
  1224. }
  1225. },
  1226. _setPosition: function(pos) {
  1227. var self = this;
  1228. pos = self._sPosition = pos;
  1229. if(self._useCSS3Transitions) {
  1230. self._slidesContainer.css(self._xProp, self._tPref1 + ( self._slidesHorizontal ? (pos + self._tPref2 + 0) : (0 + self._tPref2 + pos) ) + self._tPref3 );
  1231. } else {
  1232. self._slidesContainer.css(self._slidesHorizontal ? self._xProp : self._yProp, pos);
  1233. }
  1234. },
  1235. updateSliderSize: function(force) {
  1236. var self = this,
  1237. newWidth,
  1238. newHeight;
  1239. if(self.st.autoScaleSlider) {
  1240. var asw = self.st.autoScaleSliderWidth,
  1241. ash = self.st.autoScaleSliderHeight;
  1242. if(self.st.autoScaleHeight) {
  1243. newWidth = self.slider.width();
  1244. if(newWidth != self.width) {
  1245. self.slider.css("height", newWidth * (ash / asw) );
  1246. newWidth = self.slider.width();
  1247. }
  1248. newHeight = self.slider.height();
  1249. } else {
  1250. newHeight = self.slider.height();
  1251. if(newHeight != self.height) {
  1252. self.slider.css("width", newHeight * (asw / ash));
  1253. newHeight = self.slider.height();
  1254. }
  1255. newWidth = self.slider.width();
  1256. }
  1257. } else {
  1258. newWidth = self.slider.width();
  1259. newHeight = self.slider.height();
  1260. }
  1261. if(force || newWidth != self.width || newHeight != self.height) {
  1262. self.width = newWidth;
  1263. self.height = newHeight;
  1264. self._wrapWidth = newWidth;
  1265. self._wrapHeight = newHeight;
  1266. self.ev.trigger('rsBeforeSizeSet');
  1267. self.ev.trigger('rsAfterSizePropSet');
  1268. self._sliderOverflow.css({
  1269. width: self._wrapWidth,
  1270. height: self._wrapHeight
  1271. });
  1272. self._slideSize = (self._slidesHorizontal ? self._wrapWidth : self._wrapHeight) + self.st.slidesSpacing;
  1273. self._imagePadding = self.st.imageScalePadding;
  1274. var item,
  1275. slideItem,
  1276. i,
  1277. img;
  1278. for(i = 0; i < self.slides.length; i++) {
  1279. item = self.slides[i];
  1280. item.positionSet = false;
  1281. if(item && item.images && item.isLoaded) {
  1282. item.isRendered = false;
  1283. self._resizeImage(item);
  1284. }
  1285. }
  1286. if(self._cloneHolders) {
  1287. for(i = 0; i < self._cloneHolders.length; i++) {
  1288. item = self._cloneHolders[i];
  1289. item.holder.css(self._reorderProp, (item.id + self._idOffset) * self._slideSize);
  1290. }
  1291. }
  1292. self._updateBlocksContent();
  1293. if(self._isMove) {
  1294. if(self._useCSS3Transitions) {
  1295. self._slidesContainer.css(self._vendorPref + 'transition-duration', '0s');
  1296. }
  1297. self._setPosition( (-self._realId - self._idOffset) * self._slideSize);
  1298. }
  1299. self.ev.trigger('rsOnUpdateNav');
  1300. }
  1301. self._sliderOffset = self._sliderOverflow.offset();
  1302. self._sliderOffset = self._sliderOffset[self._reorderProp];
  1303. },
  1304. //setSlidesOrientation: function(orient) {
  1305. // TODO
  1306. // var self = this,
  1307. // newHor = Boolean(orient === 'horizontal');
  1308. // if(self._slidesHorizontal !== newHor) {
  1309. // self._setPosition(0);
  1310. // if(self._isMove) {
  1311. // for(var i = 0; i < self._slideHolders.length; i++) {
  1312. // self._slideHolders[i].block.css(self._reorderProp, '');
  1313. // }
  1314. // }
  1315. // self.slider.removeClass(self._slidesHorizontal ? 'rsHor' : 'rsVer').addClass(newHor ? 'rsHor' : 'rsVer');
  1316. // self._slidesHorizontal = newHor;
  1317. // self._reorderProp = newHor ? 'left' : 'top';
  1318. // self.updateSliderSize(true);
  1319. // }
  1320. //},
  1321. /**
  1322. * Adds slide
  1323. * @param {jQuery object or raw HTML} htmltext
  1324. * @param {int} index (optional) Index where item should be added (last item is removed of not specified)
  1325. */
  1326. appendSlide: function(htmltext, index) {
  1327. var self = this,
  1328. parsedSlide = self._parseNode(htmltext);
  1329. if(isNaN(index) || index > self.numSlides) {
  1330. index = self.numSlides;
  1331. }
  1332. self.slides.splice(index, 0, parsedSlide);
  1333. self.slidesJQ.splice(index, 0, '<div style="'+ (self._isMove ? 'position:absolute;' : self._opacityCSS ) +'" class="rsSlide"></div>');
  1334. if(index < self.currSlideId) {
  1335. self.currSlideId++;
  1336. }
  1337. self.ev.trigger('rsOnAppendSlide', [parsedSlide, index]);
  1338. self._refreshSlides(index);
  1339. if(index === self.currSlideId) {
  1340. self.ev.trigger('rsAfterSlideChange');
  1341. }
  1342. },
  1343. /**
  1344. * Removes slide
  1345. * @param {int} Index of item that should be removed
  1346. */
  1347. removeSlide: function(index) {
  1348. var self = this,
  1349. slideToRemove = self.slides[index];
  1350. if(slideToRemove) {
  1351. if(slideToRemove.holder) {
  1352. slideToRemove.holder.remove();
  1353. }
  1354. if(index < self.currSlideId) {
  1355. self.currSlideId--;
  1356. }
  1357. self.slides.splice(index, 1);
  1358. self.slidesJQ.splice(index, 1);
  1359. self.ev.trigger('rsOnRemoveSlide', [index]);
  1360. self._refreshSlides(index);
  1361. if(index === self.currSlideId) {
  1362. self.ev.trigger('rsAfterSlideChange');
  1363. }
  1364. }
  1365. },
  1366. _refreshSlides: function(refreshIndex) {
  1367. // todo: optimize this stuff
  1368. var self = this;
  1369. var oldNumSlides = self.numSlides;
  1370. var numLoops = self._realId <= 0 ? 0 : Math.floor(self._realId / oldNumSlides);
  1371. self.numSlides = self.slides.length;
  1372. if(self.numSlides === 0) {
  1373. self.currSlideId = self._idOffset = self._realId = 0;
  1374. self.currSlide = self._oldHolder = null;
  1375. } else {
  1376. self._realId = numLoops * self.numSlides + self.currSlideId;
  1377. }
  1378. for(var i = 0; i < self.numSlides; i++) {
  1379. self.slides[i].id = i;
  1380. }
  1381. self.currSlide = self.slides[self.currSlideId];
  1382. self._currHolder = self.slidesJQ[self.currSlideId];
  1383. if(self.currSlideId >= self.numSlides) {
  1384. self.goTo(self.numSlides - 1);
  1385. } else if(self.currSlideId < 0) {
  1386. self.goTo(0);
  1387. }
  1388. self._refreshNumPreloadImages();
  1389. if(self._isMove && self._loop) {
  1390. self._slidesContainer.css((self._vendorPref + self._TD), '0ms');
  1391. }
  1392. if(self._refreshSlidesTimeout) {
  1393. clearTimeout(self._refreshSlidesTimeout);
  1394. }
  1395. self._refreshSlidesTimeout = setTimeout(function() {
  1396. if(self._isMove) {
  1397. self._setPosition( (-self._realId - self._idOffset) * self._slideSize);
  1398. }
  1399. self._updateBlocksContent();
  1400. if(!self._isMove) {
  1401. self._currHolder.css({
  1402. display: 'block',
  1403. opacity: 1
  1404. });
  1405. }
  1406. }, 14);
  1407. self.ev.trigger('rsOnUpdateNav');
  1408. },
  1409. _setGrabCursor:function() {
  1410. var self = this;
  1411. if(self._hasDrag && self._isMove) {
  1412. if(self._grabCursor) {
  1413. self._sliderOverflow.css('cursor', self._grabCursor);
  1414. } else {
  1415. self._sliderOverflow.removeClass('grabbing-cursor');
  1416. self._sliderOverflow.addClass('grab-cursor');
  1417. }
  1418. }
  1419. },
  1420. _setGrabbingCursor:function() {
  1421. var self = this;
  1422. if(self._hasDrag && self._isMove) {
  1423. if(self._grabbingCursor) {
  1424. self._sliderOverflow.css('cursor', self._grabbingCursor);
  1425. } else {
  1426. self._sliderOverflow.removeClass('grab-cursor');
  1427. self._sliderOverflow.addClass('grabbing-cursor');
  1428. }
  1429. }
  1430. },
  1431. next: function(notUserAction) {
  1432. var self = this;
  1433. self._moveTo('next', self.st.transitionSpeed, true, !notUserAction);
  1434. },
  1435. prev: function(notUserAction) {
  1436. var self = this;
  1437. self._moveTo('prev', self.st.transitionSpeed, true, !notUserAction);
  1438. },
  1439. _moveTo:function(type, speed, inOutEasing, userAction, fromSwipe) {
  1440. var self = this,
  1441. newPos,
  1442. difference,
  1443. i;
  1444. self.ev.trigger('rsBeforeMove', [type, userAction]);
  1445. if(type === 'next') {
  1446. newItemId = self.currSlideId+1;
  1447. } else if(type === 'prev') {
  1448. newItemId = self.currSlideId-1;
  1449. } else {
  1450. newItemId = type = parseInt(type, 10);
  1451. }
  1452. if(!self._loop) {
  1453. if(newItemId < 0) {
  1454. self._doBackAndForthAnim('left', !userAction);
  1455. return;
  1456. } else if(newItemId >= self.numSlides ) {
  1457. self._doBackAndForthAnim('right', !userAction);
  1458. return;
  1459. }
  1460. }
  1461. if(self._isAnimating) {
  1462. self._stopAnimation(true);
  1463. inOutEasing = false;
  1464. }
  1465. difference = newItemId - self.currSlideId;
  1466. self._prevSlideId = self.currSlideId;
  1467. var prevId = self.currSlideId;
  1468. var id = self.currSlideId + difference;
  1469. var realId = self._realId;
  1470. var temp;
  1471. var delayed;
  1472. if(self._loop) {
  1473. id = self._updateBlocksContent(false, id);
  1474. realId += difference;
  1475. } else {
  1476. realId = id;
  1477. }
  1478. self._newSlideId = id;
  1479. self._oldHolder = self.slidesJQ[self.currSlideId];
  1480. self._realId = realId;
  1481. self.currSlideId = self._newSlideId;
  1482. self.currSlide = self.slides[self.currSlideId];
  1483. self._currHolder = self.slidesJQ[self.currSlideId];
  1484. var checkDist = self.st.slidesDiff;
  1485. var next = Boolean(difference > 0);
  1486. var absDiff = Math.abs(difference);
  1487. var g1 = Math.floor( prevId / self._numPreloadImages);
  1488. var g2 = Math.floor( ( prevId + (next ? checkDist : -checkDist ) ) / self._numPreloadImages);
  1489. var biggest = next ? Math.max(g1,g2) : Math.min(g1,g2);
  1490. var biggestId = biggest * self._numPreloadImages + ( next ? (self._numPreloadImages - 1) : 0 );
  1491. if(biggestId > self.numSlides - 1) {
  1492. biggestId = self.numSlides - 1;
  1493. } else if(biggestId < 0) {
  1494. biggestId = 0;
  1495. }
  1496. var toLast = next ? (biggestId - prevId) : (prevId - biggestId);
  1497. if(toLast > self._numPreloadImages) {
  1498. toLast = self._numPreloadImages;
  1499. }
  1500. if(absDiff > toLast + checkDist) {
  1501. self._idOffset += ( absDiff - (toLast + checkDist) ) * ( next ? -1 : 1 );
  1502. speed = speed * 1.4;
  1503. for(i = 0; i < self.numSlides; i++) {
  1504. self.slides[i].positionSet = false;
  1505. }
  1506. }
  1507. self._currAnimSpeed = speed;
  1508. self._updateBlocksContent(true);
  1509. if(!fromSwipe) {
  1510. delayed = true;
  1511. }
  1512. newPos = (-realId - self._idOffset) * self._slideSize;
  1513. if(delayed) {
  1514. setTimeout(function() {
  1515. self._isWorking = false;
  1516. self._animateTo(newPos, type, false, inOutEasing);
  1517. self.ev.trigger('rsOnUpdateNav');
  1518. }, 0);
  1519. } else {
  1520. self._animateTo(newPos, type, false, inOutEasing);
  1521. self.ev.trigger('rsOnUpdateNav');
  1522. }
  1523. function isSetToCurrent(testId) {
  1524. if(testId < 0) {
  1525. testId = self.numSlides + testId;
  1526. } else if(testId > self.numSlides - 1) {
  1527. testId = testId - self.numSlides;
  1528. }
  1529. if(testId !== self.currSlideId) {
  1530. return false;
  1531. }
  1532. return true;
  1533. }
  1534. },
  1535. _updateArrowsNav: function() {
  1536. var self = this,
  1537. arrDisClass = 'rsArrowDisabled';
  1538. if(self.st.arrowsNav) {
  1539. if(self.numSlides <= 1) {
  1540. self._arrowLeft.css('display', 'none');
  1541. self._arrowRight.css('display', 'none');
  1542. return;
  1543. } else {
  1544. self._arrowLeft.css('display', 'block');
  1545. self._arrowRight.css('display', 'block');
  1546. }
  1547. if(!self._loop && !self.st.loopRewind) {
  1548. if(self.currSlideId === 0) {
  1549. self._arrowLeft.addClass(arrDisClass);
  1550. } else {
  1551. self._arrowLeft.removeClass(arrDisClass);
  1552. }
  1553. if(self.currSlideId === self.numSlides - 1) {
  1554. self._arrowRight.addClass(arrDisClass);
  1555. } else {
  1556. self._arrowRight.removeClass(arrDisClass);
  1557. }
  1558. }
  1559. }
  1560. },
  1561. _animateTo:function(pos, dir, loadAll, inOutEasing, customComplete) {
  1562. var self = this,
  1563. moveProp,
  1564. oldBlock,
  1565. animBlock;
  1566. var animObj = {};
  1567. if(isNaN(self._currAnimSpeed)) {
  1568. self._currAnimSpeed = 400;
  1569. }
  1570. self._sPosition = self._currRenderPosition = pos;
  1571. self.ev.trigger('rsBeforeAnimStart');
  1572. if(!self._useCSS3Transitions) {
  1573. if(self._isMove) {
  1574. animObj[self._slidesHorizontal ? self._xProp : self._yProp] = pos + 'px';
  1575. self._slidesContainer.animate(animObj, self._currAnimSpeed, /*'easeOutQuart'*/ inOutEasing ? self.st.easeInOut : self.st.easeOut);
  1576. } else {
  1577. oldBlock = self._oldHolder;
  1578. animBlock = self._currHolder;
  1579. animBlock.stop(true, true).css({
  1580. opacity: 0,
  1581. display: 'block',
  1582. zIndex: self._fadeZIndex
  1583. });
  1584. self._currAnimSpeed = self.st.transitionSpeed;
  1585. animBlock.animate({opacity: 1}, self._currAnimSpeed, self.st.easeInOut);
  1586. clearTimeouts();
  1587. if(oldBlock) {
  1588. oldBlock.data('rsTimeout', setTimeout(function() {
  1589. oldBlock.stop(true, true).css({
  1590. opacity: 0,
  1591. display: 'none',
  1592. zIndex: 0
  1593. });
  1594. }, self._currAnimSpeed + 60) );
  1595. }
  1596. }
  1597. } else {
  1598. if(self._isMove) {
  1599. self._currAnimSpeed = parseInt(self._currAnimSpeed);
  1600. var td = self._vendorPref + self._TD;
  1601. var ttf = self._vendorPref + self._TTF;
  1602. animObj[td] = self._currAnimSpeed+'ms';
  1603. animObj[ttf] = inOutEasing ? $.rsCSS3Easing[self.st.easeInOut] : $.rsCSS3Easing[self.st.easeOut];
  1604. self._slidesContainer.css(animObj);
  1605. if(inOutEasing || !self.hasTouch) {
  1606. setTimeout(function() {
  1607. self._setPosition(pos);
  1608. }, 5);
  1609. } else {
  1610. self._setPosition(pos);
  1611. }
  1612. } else {
  1613. //self._currAnimSpeed = 10
  1614. self._currAnimSpeed = self.st.transitionSpeed;
  1615. oldBlock = self._oldHolder;
  1616. animBlock = self._currHolder;
  1617. if(animBlock.data('rsTimeout')) {
  1618. animBlock.css('opacity', 0);
  1619. }
  1620. clearTimeouts();
  1621. if(oldBlock) {
  1622. //if(oldBlock)
  1623. oldBlock.data('rsTimeout', setTimeout(function() {
  1624. animObj[self._vendorPref + self._TD] = '0ms';
  1625. animObj.zIndex = 0;
  1626. animObj.display = 'none';
  1627. oldBlock.data('rsTimeout', '');
  1628. oldBlock.css(animObj);
  1629. setTimeout(function() {
  1630. oldBlock.css('opacity', 0);
  1631. }, 16);
  1632. }, self._currAnimSpeed + 60) );
  1633. }
  1634. animObj.display = 'block';
  1635. animObj.zIndex = self._fadeZIndex;
  1636. animObj.opacity = 0;
  1637. animObj[self._vendorPref + self._TD] = '0ms';
  1638. animObj[self._vendorPref + self._TTF] = $.rsCSS3Easing[self.st.easeInOut];
  1639. animBlock.css(animObj);
  1640. animBlock.data('rsTimeout', setTimeout(function() {
  1641. //animBlock.css('opacity', 0);
  1642. animBlock.css(self._vendorPref + self._TD, self._currAnimSpeed+'ms');
  1643. //oldBlock.css(self._vendorPref + self._TD, '0ms');
  1644. animBlock.data('rsTimeout', setTimeout(function() {
  1645. animBlock.css('opacity', 1);
  1646. animBlock.data('rsTimeout', '');
  1647. }, 20) );
  1648. }, 20) );
  1649. }
  1650. }
  1651. self._isAnimating = true;
  1652. if(self.loadingTimeout) {
  1653. clearTimeout(self.loadingTimeout);
  1654. }
  1655. if(customComplete) {
  1656. self.loadingTimeout = setTimeout(function() {
  1657. self.loadingTimeout = null;
  1658. customComplete.call();
  1659. }, self._currAnimSpeed + 60);
  1660. } else {
  1661. self.loadingTimeout = setTimeout(function() {
  1662. self.loadingTimeout = null;
  1663. self._animationComplete(dir);
  1664. }, self._currAnimSpeed + 60);
  1665. }
  1666. function clearTimeouts() {
  1667. var t;
  1668. if(oldBlock) {
  1669. t = oldBlock.data('rsTimeout');
  1670. if(t) {
  1671. if(oldBlock !== animBlock) {
  1672. oldBlock.css({
  1673. opacity: 0,
  1674. display: 'none',
  1675. zIndex: 0
  1676. });
  1677. }
  1678. clearTimeout(t);
  1679. oldBlock.data('rsTimeout', '');
  1680. }
  1681. }
  1682. t = animBlock.data('rsTimeout');
  1683. if(t) {
  1684. clearTimeout(t);
  1685. animBlock.data('rsTimeout', '');
  1686. }
  1687. }
  1688. },
  1689. _stopAnimation: function(noCSS3) {
  1690. var self = this;
  1691. self._isAnimating = false;
  1692. clearTimeout(self.loadingTimeout);
  1693. if(self._isMove) {
  1694. if(!self._useCSS3Transitions) {
  1695. self._slidesContainer.stop(true);
  1696. self._sPosition = parseInt(self._slidesContainer.css(self._xProp), 10);
  1697. } else if (!noCSS3) {
  1698. var oldPos = self._sPosition;
  1699. var newPos = self._currRenderPosition = self._getTransformProp();
  1700. self._slidesContainer.css((self._vendorPref + self._TD), '0ms');
  1701. if(oldPos !==newPos) {
  1702. self._setPosition(newPos);
  1703. }
  1704. }
  1705. } else {
  1706. // kung fu
  1707. if(self._fadeZIndex > 20) {
  1708. self._fadeZIndex = 10;
  1709. } else {
  1710. self._fadeZIndex++;
  1711. }
  1712. }
  1713. },
  1714. // Thanks to @benpbarnett
  1715. _getTransformProp:function(){
  1716. var self = this,
  1717. transform = window.getComputedStyle(self._slidesContainer.get(0), null).getPropertyValue(self._vendorPref + 'transform'),
  1718. explodedMatrix = transform.replace(/^matrix\(/i, '').split(/, |\)$/g),
  1719. isMatrix3d = (explodedMatrix[0].indexOf('matrix3d') === 0);
  1720. return parseInt(explodedMatrix[(self._slidesHorizontal ? (isMatrix3d ? 12 : 4) : (isMatrix3d ? 13 : 5) )], 10);
  1721. },
  1722. _getCSS3Prop: function(pos, hor) {
  1723. var self = this;
  1724. return self._useCSS3Transitions ? self._tPref1 + ( hor ? (pos + self._tPref2 + 0) : (0 + self._tPref2 + pos) ) + self._tPref3 : pos;
  1725. },
  1726. _animationComplete: function(dir) {
  1727. var self = this;
  1728. if(!self._isMove) {
  1729. self._currHolder.css('z-index', 0);
  1730. self._fadeZIndex = 10;
  1731. }
  1732. self._isAnimating = false;
  1733. self.staticSlideId = self.currSlideId;
  1734. self._updateBlocksContent();
  1735. self._slidesMoved = false;
  1736. self.ev.trigger('rsAfterSlideChange');
  1737. },
  1738. _doBackAndForthAnim:function(type, userAction) {
  1739. var self = this,
  1740. newPos = (-self._realId - self._idOffset) * self._slideSize;
  1741. if(self.numSlides === 0 || self._isAnimating) {
  1742. return;
  1743. }
  1744. if(self.st.loopRewind) {
  1745. self.goTo(type === 'left' ? self.numSlides - 1 : 0, userAction);
  1746. return;
  1747. }
  1748. if(self._isMove) {
  1749. self._currAnimSpeed = 200;
  1750. function allAnimComplete() {
  1751. self._isAnimating = false;
  1752. }
  1753. function firstAnimComplete() {
  1754. self._isAnimating = false;
  1755. self._animateTo(newPos, '', false, true, allAnimComplete);
  1756. }
  1757. self._animateTo(newPos + (type === 'left' ? 30 : -30),'', false, true, firstAnimComplete);
  1758. }
  1759. },
  1760. _resizeImage:function(slideObject, useClone) {
  1761. var isRoot = true;
  1762. if(slideObject.isRendered) {
  1763. return;
  1764. }
  1765. var img = slideObject.content;
  1766. var classToFind = 'rsMainSlideImage';
  1767. var isVideo;
  1768. var self = this,
  1769. imgAlignCenter = self.st.imageAlignCenter,
  1770. imgScaleMode = self.st.imageScaleMode,
  1771. tempEl;
  1772. if(slideObject.videoURL) {
  1773. classToFind = 'rsVideoContainer';
  1774. if(imgScaleMode !== 'fill') {
  1775. isVideo = true;
  1776. } else {
  1777. tempEl = img;
  1778. if(!tempEl.hasClass(classToFind)) {
  1779. tempEl = tempEl.find('.'+classToFind);
  1780. }
  1781. tempEl.css({width:'100%',height: '100%'});
  1782. classToFind = 'rsMainSlideImage';
  1783. }
  1784. }
  1785. if(!img.hasClass(classToFind)) {
  1786. isRoot = false;
  1787. img = img.find('.'+classToFind);
  1788. }
  1789. if(!img) {
  1790. return;
  1791. }
  1792. var baseImageWidth = slideObject.iW,
  1793. baseImageHeight = slideObject.iH;
  1794. slideObject.isRendered = true;
  1795. if(imgScaleMode === 'none' && !imgAlignCenter) {
  1796. return;
  1797. }
  1798. if(imgScaleMode !== 'fill') {
  1799. bMargin = self._imagePadding;
  1800. } else {
  1801. bMargin = 0;
  1802. }
  1803. //var block = img.parent('.block-inside').css('margin', bMargin);
  1804. var containerWidth = self._wrapWidth - bMargin * 2,
  1805. containerHeight = self._wrapHeight - bMargin * 2,
  1806. hRatio,
  1807. vRatio,
  1808. ratio,
  1809. nWidth,
  1810. nHeight,
  1811. cssObj = {};
  1812. if(imgScaleMode === 'fit-if-smaller') {
  1813. if(baseImageWidth > containerWidth || baseImageHeight > containerHeight) {
  1814. imgScaleMode = 'fit';
  1815. }
  1816. }
  1817. if(imgScaleMode === 'fill' || imgScaleMode === 'fit') {
  1818. hRatio = containerWidth / baseImageWidth;
  1819. vRatio = containerHeight / baseImageHeight;
  1820. if (imgScaleMode == "fill") {
  1821. ratio = hRatio > vRatio ? hRatio : vRatio;
  1822. } else if (imgScaleMode == "fit") {
  1823. ratio = hRatio < vRatio ? hRatio : vRatio;
  1824. } else {
  1825. ratio = 1;
  1826. }
  1827. nWidth = Math.ceil(baseImageWidth * ratio, 10);
  1828. nHeight = Math.ceil(baseImageHeight * ratio, 10);
  1829. } else {
  1830. nWidth = baseImageWidth;
  1831. nHeight = baseImageHeight;
  1832. }
  1833. if(imgScaleMode !== 'none') {
  1834. cssObj.width = nWidth;
  1835. cssObj.height = nHeight;
  1836. if(isVideo) {
  1837. img.find('.rsImg').css({width: '100%', height:'100%'});
  1838. }
  1839. }
  1840. if (imgAlignCenter) {
  1841. cssObj.marginLeft = Math.floor((containerWidth - nWidth) / 2) + bMargin;
  1842. cssObj.marginTop = Math.floor((containerHeight - nHeight) / 2) + bMargin;
  1843. }
  1844. img.css(cssObj);
  1845. }
  1846. }; /* RoyalSlider core prototype end */
  1847. $.rsProto = RoyalSlider.prototype;
  1848. $.fn.royalSlider = function(options) {
  1849. var args = arguments;
  1850. return this.each(function(){
  1851. var self = $(this);
  1852. if (typeof options === "object" || !options) {
  1853. if( !self.data('royalSlider') ) {
  1854. self.data('royalSlider', new RoyalSlider(self, options));
  1855. }
  1856. } else {
  1857. var royalSlider = self.data('royalSlider');
  1858. if (royalSlider && royalSlider[options]) {
  1859. return royalSlider[options].apply(royalSlider, Array.prototype.slice.call(args, 1));
  1860. }
  1861. }
  1862. });
  1863. };
  1864. $.fn.royalSlider.defaults = {
  1865. slidesSpacing: 8,
  1866. startSlideId: 0,
  1867. loop: false,
  1868. loopRewind: false,
  1869. numImagesToPreload: 4,
  1870. fadeinLoadedSlide: true,
  1871. slidesOrientation: 'horizontal',
  1872. transitionType: 'move',
  1873. transitionSpeed: 600,
  1874. controlNavigation: 'bullets',
  1875. controlsInside: true,
  1876. arrowsNav: true,
  1877. arrowsNavAutoHide: true,
  1878. navigateByClick: true,
  1879. randomizeSlides: false,
  1880. sliderDrag: true,
  1881. sliderTouch: true,
  1882. keyboardNavEnabled: false,
  1883. fadeInAfterLoaded: true,
  1884. allowCSS3: true,
  1885. allowCSS3OnWebkit: true,
  1886. addActiveClass: false,
  1887. autoHeight: false,
  1888. easeOut: 'easeOutSine',
  1889. easeInOut: 'easeInOutSine',
  1890. minSlideOffset: 10,
  1891. imageScaleMode:"fit-if-smaller",
  1892. imageAlignCenter:true,
  1893. imageScalePadding: 4,
  1894. usePreloader: true,
  1895. autoScaleSlider: false,
  1896. autoScaleSliderWidth: 800,
  1897. autoScaleSliderHeight: 400,
  1898. autoScaleHeight: true,
  1899. arrowsNavHideOnTouch: false,
  1900. globalCaption: false,
  1901. slidesDiff: 2,
  1902. disableResponsiveness: false // !disable responsiveness option
  1903. }; /* default options end */
  1904. $.rsCSS3Easing = {
  1905. easeOutSine: 'cubic-bezier(0.390, 0.575, 0.565, 1.000)',
  1906. easeInOutSine: 'cubic-bezier(0.445, 0.050, 0.550, 0.950)'
  1907. };
  1908. $.extend(jQuery.easing, {
  1909. easeInOutSine: function (x, t, b, c, d) {
  1910. return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
  1911. },
  1912. easeOutSine: function (x, t, b, c, d) {
  1913. return c * Math.sin(t/d * (Math.PI/2)) + b;
  1914. },
  1915. easeOutCubic: function (x, t, b, c, d) {
  1916. return c*((t=t/d-1)*t*t + 1) + b;
  1917. }
  1918. });
  1919. /****************************************************************************************************************/
  1920. /**
  1921. *
  1922. * RoyalSlider fullscreen module
  1923. * @version 1.0.5:
  1924. *
  1925. * 1.0.1:
  1926. * - Added rsEnterFullscreen and rsExitFullscreen events
  1927. *
  1928. * 1.0.2
  1929. * - Added window scroll detection
  1930. *
  1931. * 1.0.3
  1932. * - Fullscreen button now is added to _controlsContainer element
  1933. *
  1934. * 1.0.4
  1935. * - Fixed issue that could cause small image be loaded in fullscreen
  1936. *
  1937. * 1.0.5
  1938. * - Fix "false" native fullscreen on Android
  1939. *
  1940. */
  1941. $.extend($.rsProto, {
  1942. _initFullscreen: function() {
  1943. var self = this;
  1944. self._fullscreenDefaults = {
  1945. enabled: false,
  1946. keyboardNav: true,
  1947. buttonFS: true,
  1948. nativeFS: false,
  1949. doubleTap: true
  1950. };
  1951. self.st.fullscreen = $.extend({}, self._fullscreenDefaults, self.st.fullscreen);
  1952. if(self.st.fullscreen.enabled) {
  1953. self.ev.one('rsBeforeSizeSet', function() {
  1954. self._setupFullscreen();
  1955. });
  1956. }
  1957. },
  1958. _setupFullscreen: function() {
  1959. var self = this;
  1960. self._fsKeyboard = (!self.st.keyboardNavEnabled && self.st.fullscreen.keyboardNav);
  1961. if(self.st.fullscreen.nativeFS) {
  1962. // Thanks to John Dyer http://j.hn/
  1963. self._fullScreenApi = {
  1964. supportsFullScreen: false,
  1965. isFullScreen: function() { return false; },
  1966. requestFullScreen: function() {},
  1967. cancelFullScreen: function() {},
  1968. fullScreenEventName: '',
  1969. prefix: ''
  1970. };
  1971. var browserPrefixes = 'webkit moz o ms khtml'.split(' ');
  1972. // check for native support
  1973. if(!self.isAndroid) {
  1974. if (typeof document.cancelFullScreen != 'undefined') {
  1975. self._fullScreenApi.supportsFullScreen = true;
  1976. } else {
  1977. // check for fullscreen support by vendor prefix
  1978. for (var i = 0; i < browserPrefixes.length; i++ ) {
  1979. self._fullScreenApi.prefix = browserPrefixes[i];
  1980. if (typeof document[ self._fullScreenApi.prefix + 'CancelFullScreen' ] != 'undefined' ) {
  1981. self._fullScreenApi.supportsFullScreen = true;
  1982. break;
  1983. }
  1984. }
  1985. }
  1986. }
  1987. // update methods to do something useful
  1988. if ( self._fullScreenApi.supportsFullScreen) {
  1989. self.nativeFS = true;
  1990. self._fullScreenApi.fullScreenEventName = self._fullScreenApi.prefix + 'fullscreenchange' + self.ns;
  1991. self._fullScreenApi.isFullScreen = function() {
  1992. switch (this.prefix) {
  1993. case '':
  1994. return document.fullScreen;
  1995. case 'webkit':
  1996. return document.webkitIsFullScreen;
  1997. default:
  1998. return document[this.prefix + 'FullScreen'];
  1999. }
  2000. };
  2001. self._fullScreenApi.requestFullScreen = function(el) {
  2002. return (this.prefix === '') ? el.requestFullScreen() : el[this.prefix + 'RequestFullScreen']();
  2003. };
  2004. self._fullScreenApi.cancelFullScreen = function(el) {
  2005. return (this.prefix === '') ? document.cancelFullScreen() : document[this.prefix + 'CancelFullScreen']();
  2006. };
  2007. } else {
  2008. self._fullScreenApi = false;
  2009. }
  2010. }
  2011. if(self.st.fullscreen.buttonFS) {
  2012. self._fsBtn = $('<div class="rsFullscreenBtn"><div class="rsFullscreenIcn"></div></div>')
  2013. .appendTo(self._controlsContainer)
  2014. .on('click.rs', function() {
  2015. if(self.isFullscreen) {
  2016. self.exitFullscreen();
  2017. } else {
  2018. self.enterFullscreen();
  2019. }
  2020. });
  2021. }
  2022. },
  2023. enterFullscreen: function(preventNative) {
  2024. var self = this;
  2025. if( self._fullScreenApi ) {
  2026. if(!preventNative) {
  2027. self._doc.on( self._fullScreenApi.fullScreenEventName, function(e) {
  2028. if(!self._fullScreenApi.isFullScreen()) {
  2029. self.exitFullscreen(true);
  2030. } else {
  2031. self.enterFullscreen(true);
  2032. }
  2033. });
  2034. self._fullScreenApi.requestFullScreen($('html')[0]);
  2035. return;
  2036. } else {
  2037. self._fullScreenApi.requestFullScreen($('html')[0]);
  2038. }
  2039. }
  2040. if(self._isFullscreenUpdating) {
  2041. return;
  2042. }
  2043. self._isFullscreenUpdating = true;
  2044. self._doc.on('keyup' + self.ns + 'fullscreen', function(e) {
  2045. if(e.keyCode === 27) {
  2046. self.exitFullscreen();
  2047. }
  2048. });
  2049. if(self._fsKeyboard) {
  2050. self._bindKeyboardNav();
  2051. }
  2052. var win = $(window);
  2053. self._fsScrollTopOnEnter = win.scrollTop();
  2054. self._fsScrollLeftOnEnter = win.scrollLeft();
  2055. self._htmlStyle = $('html').attr('style');
  2056. self._bodyStyle = $('body').attr('style');
  2057. self._sliderStyle = self.slider.attr('style');
  2058. $('body, html').css({
  2059. overflow: 'hidden',
  2060. height: '100%',
  2061. width: '100%',
  2062. margin: '0',
  2063. padding: '0'
  2064. });
  2065. self.slider.addClass('rsFullscreen');
  2066. var item,
  2067. i;
  2068. for(i = 0; i < self.numSlides; i++) {
  2069. item = self.slides[i];
  2070. item.isRendered = false;
  2071. if(item.bigImage) {
  2072. item.isBig = true;
  2073. item.isMedLoaded = item.isLoaded;
  2074. item.isMedLoading = item.isLoading;
  2075. item.medImage = item.image;
  2076. item.medIW = item.iW;
  2077. item.medIH = item.iH;
  2078. item.slideId = -99;
  2079. if(item.bigImage !== item.medImage) {
  2080. item.sizeType = 'big';
  2081. }
  2082. item.isLoaded = item.isBigLoaded;
  2083. item.isLoading = false;
  2084. item.image = item.bigImage;
  2085. item.images[0] = item.bigImage;
  2086. item.iW = item.bigIW;
  2087. item.iH = item.bigIH;
  2088. item.isAppended = item.contentAdded = false;
  2089. self._updateItemSrc(item);
  2090. }
  2091. }
  2092. self.isFullscreen = true;
  2093. self._isFullscreenUpdating = false;
  2094. self.updateSliderSize();
  2095. self.ev.trigger('rsEnterFullscreen');
  2096. },
  2097. exitFullscreen: function(preventNative) {
  2098. var self = this;
  2099. if( self._fullScreenApi ) {
  2100. if(!preventNative) {
  2101. self._fullScreenApi.cancelFullScreen($('html')[0]);
  2102. return;
  2103. }
  2104. self._doc.off( self._fullScreenApi.fullScreenEventName );
  2105. }
  2106. if(self._isFullscreenUpdating) {
  2107. return;
  2108. }
  2109. self._isFullscreenUpdating = true;
  2110. self._doc.off('keyup' + self.ns + 'fullscreen');
  2111. if(self._fsKeyboard) {
  2112. self._doc.off('keydown' + self.ns);
  2113. }
  2114. $('html').attr('style', self._htmlStyle || '');
  2115. $('body').attr('style', self._bodyStyle || '');
  2116. var item,
  2117. i;
  2118. for(i = 0; i < self.numSlides; i++) {
  2119. item = self.slides[i];
  2120. item.isRendered = false;
  2121. if(item.bigImage) {
  2122. item.isBig = false;
  2123. item.slideId = -99;
  2124. item.isBigLoaded = item.isLoaded;
  2125. item.isBigLoading = item.isLoading;
  2126. item.bigImage = item.image;
  2127. item.bigIW = item.iW;
  2128. item.bigIH = item.iH;
  2129. item.isLoaded = item.isMedLoaded;
  2130. item.isLoading = false;
  2131. item.image = item.medImage;
  2132. item.images[0] = item.medImage;
  2133. item.iW = item.medIW;
  2134. item.iH = item.medIH;
  2135. item.isAppended = item.contentAdded = false;
  2136. self._updateItemSrc(item, true);
  2137. if(item.bigImage !== item.medImage) {
  2138. item.sizeType = 'med';
  2139. }
  2140. }
  2141. }
  2142. self.isFullscreen = false;
  2143. var win = $(window);
  2144. win.scrollTop( self._fsScrollTopOnEnter );
  2145. win.scrollLeft( self._fsScrollLeftOnEnter );
  2146. self._isFullscreenUpdating = false;
  2147. self.slider.removeClass('rsFullscreen');
  2148. self.updateSliderSize();
  2149. // fix overflow bug
  2150. setTimeout(function() {
  2151. self.updateSliderSize();
  2152. },1);
  2153. self.ev.trigger('rsExitFullscreen');
  2154. },
  2155. _updateItemSrc: function(item, exit) {
  2156. var newHTML = (!item.isLoaded && !item.isLoading) ? '<a class="rsImg rsMainSlideImage" href="'+item.image+'"></a>' : '<img class="rsImg rsMainSlideImage" src="'+item.image+'"/>';
  2157. if(item.content.hasClass('rsImg')) {
  2158. item.content = $(newHTML);
  2159. } else {
  2160. item.content.find('.rsImg').eq(0).replaceWith(newHTML);
  2161. }
  2162. if(!item.isLoaded && !item.isLoading && item.holder) {
  2163. item.holder.html(item.content);
  2164. }
  2165. }
  2166. });
  2167. $.rsModules.fullscreen = $.rsProto._initFullscreen;
  2168. /****************************************************************************************************************/
  2169. /**
  2170. *
  2171. * RoyalSlider bullets module
  2172. * @version 1.0.1:
  2173. *
  2174. * 1.0.1
  2175. * - Minor optimizations
  2176. *
  2177. */
  2178. $.extend($.rsProto, {
  2179. _initBullets: function() {
  2180. var self = this;
  2181. if(self.st.controlNavigation === 'bullets') {
  2182. var itemHTML = '<div class="rsNavItem rsBullet"><span></span></div>';
  2183. self.ev.one('rsAfterPropsSetup', function() {
  2184. self._controlNavEnabled = true;
  2185. self.slider.addClass('rsWithBullets');
  2186. var out = '<div class="rsNav rsBullets">';
  2187. for(var i = 0; i < self.numSlides; i++) {
  2188. out += itemHTML;
  2189. }
  2190. self._controlNav = out = $(out + '</div>');
  2191. self._controlNavItems = out.appendTo(self.slider).children();
  2192. self._controlNav.on('click.rs','.rsNavItem',function(e) {
  2193. if(!self._thumbsDrag ) {
  2194. self.goTo( $(this).index() );
  2195. }
  2196. });
  2197. });
  2198. self.ev.on('rsOnAppendSlide', function(e, parsedSlide, index) {
  2199. if(index >= self.numSlides) {
  2200. self._controlNav.append(itemHTML);
  2201. } else {
  2202. self._controlNavItems.eq(index).before(itemHTML);
  2203. }
  2204. self._controlNavItems = self._controlNav.children();
  2205. });
  2206. self.ev.on('rsOnRemoveSlide', function(e, index) {
  2207. var itemToRemove = self._controlNavItems.eq(index);
  2208. if(itemToRemove && itemToRemove.length) {
  2209. itemToRemove.remove();
  2210. self._controlNavItems = self._controlNav.children();
  2211. }
  2212. });
  2213. self.ev.on('rsOnUpdateNav', function() {
  2214. var id = self.currSlideId,
  2215. currItem,
  2216. prevItem;
  2217. if(self._prevNavItem) {
  2218. self._prevNavItem.removeClass('rsNavSelected');
  2219. }
  2220. currItem = self._controlNavItems.eq(id);
  2221. currItem.addClass('rsNavSelected');
  2222. self._prevNavItem = currItem;
  2223. });
  2224. }
  2225. }
  2226. });
  2227. $.rsModules.bullets = $.rsProto._initBullets;
  2228. /****************************************************************************************************************/
  2229. /**
  2230. *
  2231. * RoyalSlider auto height module
  2232. * @version 1.0.2:
  2233. *
  2234. * 1.0.2
  2235. * - Changed "on" to "one" in afterInit event listener
  2236. * - Removed id="clear"
  2237. */
  2238. $.extend($.rsProto, {
  2239. _initAutoHeight: function() {
  2240. var self = this;
  2241. if(self.st.autoHeight) {
  2242. var holder,
  2243. tH,
  2244. currSlide,
  2245. currHeight,
  2246. updHeight = function(animate) {
  2247. currSlide = self.slides[self.currSlideId];
  2248. holder = currSlide.holder;
  2249. if(holder) {
  2250. tH = holder.height();
  2251. if(tH && tH !== currHeight) {
  2252. self._wrapHeight = tH;
  2253. if(self._useCSS3Transitions || !animate) {
  2254. self._sliderOverflow.css('height', tH);
  2255. } else {
  2256. self._sliderOverflow.stop(true,true).animate({height: tH}, self.st.transitionSpeed);
  2257. }
  2258. }
  2259. }
  2260. };
  2261. self.ev.on('rsMaybeSizeReady.rsAutoHeight', function(e, slideObject) {
  2262. if(currSlide === slideObject) {
  2263. updHeight();
  2264. }
  2265. });
  2266. self.ev.on('rsAfterContentSet.rsAutoHeight', function(e, slideObject) {
  2267. if(currSlide === slideObject) {
  2268. updHeight();
  2269. }
  2270. });
  2271. self.slider.addClass('rsAutoHeight');
  2272. self.ev.one('rsAfterInit', function() {
  2273. setTimeout(function() {
  2274. updHeight(false);
  2275. setTimeout(function() {
  2276. self.slider.append('<div style="clear:both; float: none;"></div>');
  2277. if(self._useCSS3Transitions) {
  2278. self._sliderOverflow.css(self._vendorPref + 'transition', 'height ' + self.st.transitionSpeed + 'ms ease-in-out');
  2279. }
  2280. }, 16);
  2281. }, 16);
  2282. });
  2283. self.ev.on('rsBeforeAnimStart', function() {
  2284. updHeight(true);
  2285. });
  2286. self.ev.on('rsBeforeSizeSet' , function() {
  2287. setTimeout(function() {
  2288. updHeight(false);
  2289. }, 16);
  2290. });
  2291. }
  2292. }
  2293. });
  2294. $.rsModules.autoHeight = $.rsProto._initAutoHeight;
  2295. /****************************************************************************************************************/
  2296. /**
  2297. *
  2298. * RoyalSlider video module
  2299. * @version 1.1.0:
  2300. *
  2301. * 1.0.3:
  2302. * - Added rsOnDestroyVideoElement event
  2303. *
  2304. * 1.0.4:
  2305. * - Added wmode=transparent to default YouTube video embed code
  2306. *
  2307. * 1.0.5
  2308. * - Fixed bug: HTMl5 YouTube player sometimes keeps playing in ie9 after closing
  2309. *
  2310. * 1.0.6
  2311. * - A bit lightened Vimeo and YouTube regex
  2312. *
  2313. * 1.0.7
  2314. * - Minor optimizations
  2315. * - Added autoHideCaption option
  2316. *
  2317. * 1.0.9
  2318. * - Fixed error that could appear if updateSliderSize method is called directly after video close
  2319. *
  2320. * 1.1.0
  2321. * - Video is now removed in rsAfterSlideChange event to avoid transition lag
  2322. * - Fixed bug that could cause appearing of arrows with auto-hide
  2323. */
  2324. $.extend($.rsProto, {
  2325. _initVideo: function() {
  2326. var self = this;
  2327. self._videoDefaults = {
  2328. autoHideArrows: true,
  2329. autoHideControlNav: false,
  2330. autoHideBlocks: false,
  2331. autoHideCaption: false,
  2332. youTubeCode: '<iframe src="http://www.youtube.com/embed/%id%?rel=1&autoplay=1&showinfo=0&autoplay=1&wmode=transparent" frameborder="no"></iframe>',
  2333. vimeoCode: '<iframe src="http://player.vimeo.com/video/%id%?byline=0&amp;portrait=0&amp;autoplay=1" frameborder="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>'
  2334. };
  2335. self.st.video = $.extend({}, self._videoDefaults, self.st.video);
  2336. self.ev.on('rsBeforeSizeSet', function() {
  2337. if(self._isVideoPlaying) {
  2338. setTimeout(function() {
  2339. var content = self._currHolder;
  2340. content = content.hasClass('rsVideoContainer') ? content : content.find('.rsVideoContainer');
  2341. if(self._videoFrameHolder) {
  2342. self._videoFrameHolder.css({
  2343. width: content.width(),
  2344. height: content.height()
  2345. });
  2346. }
  2347. }, 32);
  2348. }
  2349. });
  2350. var isFF = self._browser.mozilla;
  2351. self.ev.on('rsAfterParseNode', function(e, content, obj) {
  2352. var jqcontent = $(content),
  2353. tempEl,
  2354. hasVideo;
  2355. if(obj.videoURL) {
  2356. if(!hasVideo && isFF) {
  2357. hasVideo = true;
  2358. self._useCSS3Transitions = self._use3dTransform = false;
  2359. }
  2360. var wrap = $('<div class="rsVideoContainer"></div>'),
  2361. playBtn = $('<div class="rsBtnCenterer"><div class="rsPlayBtn"><div class="rsPlayBtnIcon"></div></div></div>');
  2362. if(jqcontent.hasClass('rsImg')) {
  2363. obj.content = wrap.append(jqcontent).append(playBtn);
  2364. } else {
  2365. obj.content.find('.rsImg').wrap(wrap).after(playBtn);
  2366. }
  2367. }
  2368. });
  2369. self.ev.on('rsAfterSlideChange', function() {
  2370. self.stopVideo();
  2371. });
  2372. },
  2373. toggleVideo: function() {
  2374. var self = this;
  2375. if(!self._isVideoPlaying) {
  2376. return self.playVideo();
  2377. } else {
  2378. return self.stopVideo();
  2379. }
  2380. },
  2381. playVideo: function() {
  2382. var self = this;
  2383. if(!self._isVideoPlaying) {
  2384. var currSlide = self.currSlide;
  2385. if(!currSlide.videoURL) {
  2386. return false;
  2387. }
  2388. var content = self._currVideoContent = currSlide.content;
  2389. var url = currSlide.videoURL,
  2390. videoId,
  2391. regExp,
  2392. match;
  2393. if( url.match(/youtu\.be/i) || url.match(/youtube\.com/i) ) {
  2394. regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
  2395. match = url.match(regExp);
  2396. if (match && match[7].length==11){
  2397. videoId = match[7];
  2398. }
  2399. if(videoId !== undefined) {
  2400. self._videoFrameHolder = self.st.video.youTubeCode.replace("%id%", videoId);
  2401. }
  2402. } else if(url.match(/vimeo\.com/i)) {
  2403. regExp = /(www\.)?vimeo.com\/(\d+)($|\/)/;
  2404. match = url.match(regExp);
  2405. if(match) {
  2406. videoId = match[2];
  2407. }
  2408. if(videoId !== undefined) {
  2409. self._videoFrameHolder = self.st.video.vimeoCode.replace("%id%", videoId);
  2410. }
  2411. }
  2412. self.videoObj = $(self._videoFrameHolder);
  2413. self.ev.trigger('rsOnCreateVideoElement', [url]);
  2414. if(self.videoObj.length) {
  2415. self._videoFrameHolder = $('<div class="rsVideoFrameHolder"><div class="rsPreloader"></div><div class="rsCloseVideoBtn"><div class="rsCloseVideoIcn"></div></div></div>');
  2416. self._videoFrameHolder.find('.rsPreloader').after(self.videoObj);
  2417. content = content.hasClass('rsVideoContainer') ? content : content.find('.rsVideoContainer');
  2418. self._videoFrameHolder.css({
  2419. width: content.width(),
  2420. height: content.height()
  2421. }).find('.rsCloseVideoBtn').off('click.rsv').on('click.rsv', function(e) {
  2422. self.stopVideo();
  2423. e.preventDefault();
  2424. e.stopPropagation();
  2425. return false;
  2426. });
  2427. content.append(self._videoFrameHolder);
  2428. if(self.isIPAD) {
  2429. content.addClass('rsIOSVideo');
  2430. }
  2431. self._toggleHiddenClass(false);
  2432. setTimeout(function() {
  2433. self._videoFrameHolder.addClass('rsVideoActive');
  2434. }, 10);
  2435. self.ev.trigger('rsVideoPlay');
  2436. self._isVideoPlaying = true;
  2437. }
  2438. return true;
  2439. }
  2440. return false;
  2441. },
  2442. stopVideo: function() {
  2443. var self = this;
  2444. if(self._isVideoPlaying) {
  2445. if(self.isIPAD) {
  2446. self.slider.find('.rsCloseVideoBtn').remove();
  2447. }
  2448. self._toggleHiddenClass(true);
  2449. setTimeout(function() {
  2450. self.ev.trigger('rsOnDestroyVideoElement', [self.videoObj]);
  2451. var ifr = self._videoFrameHolder.find('iframe');
  2452. if(ifr.length) {
  2453. try {
  2454. ifr.attr('src', "");
  2455. } catch(ex) { }
  2456. }
  2457. self._videoFrameHolder.remove();
  2458. self._videoFrameHolder = null;
  2459. }, 16);
  2460. self.ev.trigger('rsVideoStop');
  2461. self._isVideoPlaying = false;
  2462. return true;
  2463. }
  2464. return false;
  2465. },
  2466. _toggleHiddenClass: function(remove) {
  2467. var arr = [],
  2468. self = this,
  2469. vst = self.st.video;
  2470. if(vst.autoHideArrows) {
  2471. if(self._arrowLeft) {
  2472. arr.push(self._arrowLeft, self._arrowRight);
  2473. self._arrowsAutoHideLocked = !remove;
  2474. }
  2475. if(self._fsBtn) {
  2476. arr.push(self._fsBtn);
  2477. }
  2478. }
  2479. if(vst.autoHideControlNav && self._controlNav) {
  2480. arr.push(self._controlNav);
  2481. }
  2482. if(vst.autoHideBlocks && self.currSlide.animBlocks) {
  2483. arr.push(self.currSlide.animBlocks);
  2484. }
  2485. if(vst.autoHideCaption && self.globalCaption) {
  2486. arr.push(self.globalCaption);
  2487. }
  2488. if(arr.length) {
  2489. for(var i = 0; i < arr.length; i++) {
  2490. if(!remove) {
  2491. arr[i].addClass('rsHidden');
  2492. } else {
  2493. arr[i].removeClass('rsHidden');
  2494. }
  2495. }
  2496. }
  2497. }
  2498. });
  2499. $.rsModules.video = $.rsProto._initVideo;
  2500. /****************************************************************************************************************/
  2501. /**
  2502. *
  2503. * RoyalSlider auto play module
  2504. * @version 1.0.5:
  2505. *
  2506. * 1.0.3:
  2507. * - added support for 'autoplay' property name.
  2508. *
  2509. * 1.0.4
  2510. * - added toggleAutoPlay public method
  2511. *
  2512. * 1.0.5
  2513. * - Fixed issue when autoPlay may not pause when switching browser tabs
  2514. */
  2515. $.extend($.rsProto, {
  2516. _initAutoplay: function() {
  2517. var self = this,
  2518. del;
  2519. self._autoPlayDefaults = {
  2520. enabled: false,
  2521. stopAtAction: true,
  2522. pauseOnHover: true,
  2523. delay: 2000
  2524. };
  2525. // fix deprecated name
  2526. if(!self.st.autoPlay && self.st.autoplay) {
  2527. self.st.autoPlay = self.st.autoplay;
  2528. }
  2529. self.st.autoPlay = $.extend({}, self._autoPlayDefaults, self.st.autoPlay);
  2530. if(self.st.autoPlay.enabled) {
  2531. self.ev.on('rsBeforeParseNode', function(e, content, obj) {
  2532. content = $(content);
  2533. del = content.attr('data-rsDelay');
  2534. if(del) {
  2535. obj.customDelay = parseInt(del, 10);
  2536. }
  2537. });
  2538. self.ev.one('rsAfterInit', function() {
  2539. self._setupAutoPlay();
  2540. });
  2541. self.ev.on('rsBeforeDestroy', function() {
  2542. self.stopAutoPlay();
  2543. $(window).off('blur'+self.ns + ' focus' + self.ns);
  2544. });
  2545. }
  2546. },
  2547. _setupAutoPlay: function() {
  2548. var self = this;
  2549. self.startAutoPlay();
  2550. self.ev.on('rsAfterContentSet', function(e, slideObject) {
  2551. if(!self._isDragging && !self._isAnimating && self._autoPlayEnabled && slideObject === self.currSlide ) {
  2552. self._play();
  2553. }
  2554. });
  2555. self.ev.on('rsDragRelease', function() {
  2556. if(self._autoPlayEnabled && self._autoPlayPaused) {
  2557. self._autoPlayPaused = false;
  2558. self._play();
  2559. }
  2560. });
  2561. self.ev.on('rsAfterSlideChange', function() {
  2562. if(self._autoPlayEnabled) {
  2563. if(self._autoPlayPaused) {
  2564. self._autoPlayPaused = false;
  2565. if(self.currSlide.isLoaded) {
  2566. self._play();
  2567. }
  2568. }
  2569. }
  2570. });
  2571. self.ev.on('rsDragStart', function() {
  2572. if(self._autoPlayEnabled) {
  2573. if(self.st.autoPlay.stopAtAction) {
  2574. self.stopAutoPlay();
  2575. } else {
  2576. self._autoPlayPaused = true;
  2577. self._pause();
  2578. }
  2579. }
  2580. });
  2581. self.ev.on('rsBeforeMove', function(e, type, userAction) {
  2582. if(self._autoPlayEnabled) {
  2583. if(userAction && self.st.autoPlay.stopAtAction) {
  2584. self.stopAutoPlay();
  2585. } else {
  2586. self._autoPlayPaused = true;
  2587. self._pause();
  2588. }
  2589. }
  2590. });
  2591. self._pausedByVideo = false;
  2592. self.ev.on('rsVideoStop', function() {
  2593. if(self._autoPlayEnabled) {
  2594. self._pausedByVideo = false;
  2595. self._play();
  2596. }
  2597. });
  2598. self.ev.on('rsVideoPlay', function() {
  2599. if(self._autoPlayEnabled) {
  2600. self._autoPlayPaused = false;
  2601. self._pause();
  2602. self._pausedByVideo = true;
  2603. }
  2604. });
  2605. $(window).on('blur'+self.ns, function(){
  2606. if(self._autoPlayEnabled) {
  2607. self._autoPlayPaused = true;
  2608. self._pause();
  2609. }
  2610. }).on('focus'+self.ns, function(){
  2611. if(self._autoPlayEnabled && self._autoPlayPaused) {
  2612. self._autoPlayPaused = false;
  2613. self._play();
  2614. }
  2615. });
  2616. if(self.st.autoPlay.pauseOnHover) {
  2617. self._pausedByHover = false;
  2618. self.slider.hover(
  2619. function() {
  2620. if(self._autoPlayEnabled) {
  2621. self._autoPlayPaused = false;
  2622. self._pause();
  2623. self._pausedByHover = true;
  2624. }
  2625. },
  2626. function() {
  2627. if(self._autoPlayEnabled) {
  2628. self._pausedByHover = false;
  2629. self._play();
  2630. }
  2631. }
  2632. );
  2633. }
  2634. },
  2635. toggleAutoPlay: function() {
  2636. var self = this;
  2637. if(self._autoPlayEnabled) {
  2638. self.stopAutoPlay();
  2639. } else {
  2640. self.startAutoPlay();
  2641. }
  2642. },
  2643. startAutoPlay: function() {
  2644. var self = this;
  2645. self._autoPlayEnabled = true;
  2646. if(self.currSlide.isLoaded) {
  2647. self._play();
  2648. }
  2649. },
  2650. stopAutoPlay: function() {
  2651. var self = this;
  2652. self._pausedByVideo = self._pausedByHover = self._autoPlayPaused = self._autoPlayEnabled = false;
  2653. self._pause();
  2654. },
  2655. _play: function() {
  2656. var self = this;
  2657. self.ev.trigger('autoPlayPlay');
  2658. if(!self._pausedByHover && !self._pausedByVideo) {
  2659. self._autoPlayRunning = true;
  2660. if(self._autoPlayTimeout) {
  2661. clearTimeout(self._autoPlayTimeout);
  2662. }
  2663. self._autoPlayTimeout = setTimeout(function() {
  2664. var changed;
  2665. if(!self._loop && !self.st.loopRewind) {
  2666. changed = true;
  2667. self.st.loopRewind = true;
  2668. }
  2669. self.next(true);
  2670. if(changed) {
  2671. changed = false;
  2672. self.st.loopRewind = false;
  2673. }
  2674. }, !self.currSlide.customDelay ? self.st.autoPlay.delay : self.currSlide.customDelay);
  2675. }
  2676. },
  2677. _pause: function() {
  2678. var self = this;
  2679. self.ev.trigger('autoPlayPause');
  2680. if(!self._pausedByHover && !self._pausedByVideo) {
  2681. self._autoPlayRunning = false;
  2682. if(self._autoPlayTimeout) {
  2683. clearTimeout(self._autoPlayTimeout);
  2684. self._autoPlayTimeout = null;
  2685. }
  2686. }
  2687. }
  2688. });
  2689. $.rsModules.autoplay = $.rsProto._initAutoplay;
  2690. /****************************************************************************************************************/
  2691. /**
  2692. *
  2693. * RoyalSlider animated blocks module
  2694. * @version 1.0.6:
  2695. *
  2696. * 1.0.2:
  2697. * - Fixed mistake from prev fix :/
  2698. *
  2699. * 1.0.3:
  2700. * - Fixed animated block appearing in Firefox
  2701. *
  2702. * 1.0.4
  2703. * - Fixed bug that could cause incorrect block when randomizeSlides is enabled
  2704. *
  2705. * 1.0.5
  2706. * - moveEffect:none' bug
  2707. *
  2708. * 1.0.6
  2709. * - Fixed issue that could cause incorrect position of blocks in IE
  2710. */
  2711. $.extend($.rsProto, {
  2712. _initAnimatedBlocks: function() {
  2713. var self = this,
  2714. i;
  2715. self._blockDefaults = {
  2716. fadeEffect: true,
  2717. moveEffect: 'top',
  2718. moveOffset:20,
  2719. speed:400,
  2720. easing:'easeOutSine',
  2721. delay:200
  2722. };
  2723. self.st.block = $.extend({}, self._blockDefaults, self.st.block);
  2724. self._blockAnimProps = [];
  2725. self._animatedBlockTimeouts = [];
  2726. self.ev.on('rsAfterInit', function() {
  2727. runBlocks();
  2728. });
  2729. self.ev.on('rsBeforeParseNode', function(e, content, obj) {
  2730. content = $(content);
  2731. obj.animBlocks = content.find('.rsABlock').css('display', 'none');
  2732. if(!obj.animBlocks.length) {
  2733. if(content.hasClass('rsABlock')) {
  2734. obj.animBlocks = content.css('display', 'none');
  2735. } else {
  2736. obj.animBlocks = false;
  2737. }
  2738. }
  2739. });
  2740. self.ev.on('rsAfterContentSet', function(e, slideObject) {
  2741. var currId = self.slides[self.currSlideId].id;
  2742. if(slideObject.id === currId) {
  2743. setTimeout(function() {
  2744. runBlocks();
  2745. }, self.st.fadeinLoadedSlide ? 300 : 0);
  2746. }
  2747. });
  2748. self.ev.on('rsAfterSlideChange', function() {
  2749. runBlocks();
  2750. });
  2751. function runBlocks() {
  2752. var slide = self.currSlide;
  2753. if(!self.currSlide || !self.currSlide.isLoaded) {
  2754. return;
  2755. }
  2756. // clear previous animations
  2757. if(self._slideWithBlocks !== slide) {
  2758. if(self._animatedBlockTimeouts.length > 0) {
  2759. for(i = 0; i < self._animatedBlockTimeouts.length; i++) {
  2760. clearTimeout(self._animatedBlockTimeouts[i]);
  2761. }
  2762. self._animatedBlockTimeouts = [];
  2763. }
  2764. if(self._blockAnimProps.length > 0) {
  2765. var cItemTemp;
  2766. for(i = 0; i < self._blockAnimProps.length; i++) {
  2767. cItemTemp = self._blockAnimProps[i];
  2768. if(cItemTemp) {
  2769. if(!self._useCSS3Transitions) {
  2770. // if(cItemTemp.running) {
  2771. // cItemTemp.block.stop(true, true);
  2772. // } else {
  2773. cItemTemp.block.stop(true).css(cItemTemp.css);
  2774. //}
  2775. } else {
  2776. cItemTemp.block.css(self._vendorPref + self._TD, '0s');
  2777. cItemTemp.block.css(cItemTemp.css);
  2778. }
  2779. self._slideWithBlocks = null;
  2780. slide.animBlocksDisplayed = false;
  2781. }
  2782. }
  2783. self._blockAnimProps = [];
  2784. }
  2785. if(slide.animBlocks) {
  2786. slide.animBlocksDisplayed = true;
  2787. self._slideWithBlocks = slide;
  2788. self._animateBlocks(slide.animBlocks);
  2789. }
  2790. }
  2791. }
  2792. },
  2793. _updateAnimBlockProps: function(obj, props) {
  2794. setTimeout(function() {
  2795. obj.css(props);
  2796. }, 6);
  2797. },
  2798. _animateBlocks: function(animBlocks) {
  2799. var self = this,
  2800. item,
  2801. animObj,
  2802. newPropObj,
  2803. transitionData;
  2804. var currItem,
  2805. fadeEnabled,
  2806. moveEnabled,
  2807. effectName,
  2808. effectsObject,
  2809. moveEffectProperty,
  2810. currEffects,
  2811. newEffectObj,
  2812. moveOffset,
  2813. delay,
  2814. speed,
  2815. easing,
  2816. moveProp,
  2817. i;
  2818. self._animatedBlockTimeouts = [];
  2819. animBlocks.each(function(index) {
  2820. item = $(this);
  2821. animObj = {};
  2822. newPropObj = {};
  2823. transitionData = null;
  2824. var moveOffset = item.data('move-offset');
  2825. if(isNaN(moveOffset)) {
  2826. moveOffset = self.st.block.moveOffset;
  2827. }
  2828. if(moveOffset > 0) {
  2829. var moveEffect = item.data('move-effect');
  2830. if(moveEffect) {
  2831. moveEffect = moveEffect.toLowerCase();
  2832. if(moveEffect === 'none') {
  2833. moveEffect = false;
  2834. } else if(moveEffect !== 'left' && moveEffect !== 'top' && moveEffect !== 'bottom' && moveEffect !== 'right') {
  2835. moveEffect = self.st.block.moveEffect;
  2836. if(moveEffect === 'none') {
  2837. moveEffect = false;
  2838. }
  2839. }
  2840. } else {
  2841. moveEffect = self.st.block.moveEffect;
  2842. }
  2843. if(moveEffect && moveEffect !== 'none') {
  2844. var moveHorizontal;
  2845. if(moveEffect === 'right' || moveEffect === 'left') {
  2846. moveHorizontal = true;
  2847. } else {
  2848. moveHorizontal = false;
  2849. }
  2850. var currPos,
  2851. moveProp,
  2852. startPos;
  2853. isOppositeProp = false;
  2854. if(self._useCSS3Transitions) {
  2855. currPos = 0;
  2856. moveProp = self._xProp;
  2857. } else {
  2858. if(moveHorizontal) {
  2859. if( !isNaN( parseInt(item.css('right'), 10) ) ) {
  2860. moveProp = 'right';
  2861. isOppositeProp = true;
  2862. } else {
  2863. moveProp = 'left';
  2864. }
  2865. } else {
  2866. if( !isNaN( parseInt(item.css('bottom'), 10) ) ) {
  2867. moveProp = 'bottom';
  2868. isOppositeProp = true;
  2869. } else {
  2870. moveProp = 'top';
  2871. }
  2872. }
  2873. moveProp = 'margin-'+moveProp;
  2874. if(isOppositeProp) {
  2875. moveOffset = -moveOffset;
  2876. }
  2877. if(!self._useCSS3Transitions) {
  2878. currPos = item.data('rs-start-move-prop');
  2879. if( currPos === undefined ) {
  2880. currPos = parseInt(item.css(moveProp), 10);
  2881. item.data('rs-start-move-prop', currPos);
  2882. }
  2883. } else {
  2884. currPos = parseInt(item.css(moveProp), 10);
  2885. }
  2886. }
  2887. if(moveEffect === 'top' || moveEffect === 'left') {
  2888. startPos = currPos - moveOffset;
  2889. } else {
  2890. startPos = currPos + moveOffset;
  2891. }
  2892. newPropObj[moveProp] = self._getCSS3Prop(startPos, moveHorizontal);
  2893. animObj[moveProp] = self._getCSS3Prop(currPos, moveHorizontal);
  2894. }
  2895. }
  2896. var fadeEffect = item.attr('data-fade-effect');
  2897. if(!fadeEffect) {
  2898. fadeEffect = self.st.block.fadeEffect;
  2899. } else if(fadeEffect.toLowerCase() === 'none' || fadeEffect.toLowerCase() === 'false') {
  2900. fadeEffect = false;
  2901. }
  2902. if(fadeEffect) {
  2903. newPropObj.opacity = 0;
  2904. animObj.opacity = 1;
  2905. }
  2906. if(fadeEffect || moveEffect) {
  2907. transitionData = {};
  2908. transitionData.hasFade = Boolean(fadeEffect);
  2909. if(Boolean(moveEffect)) {
  2910. transitionData.moveProp = moveProp;
  2911. transitionData.hasMove = true;
  2912. }
  2913. transitionData.speed = item.data('speed');
  2914. if(isNaN(transitionData.speed)) {
  2915. transitionData.speed = self.st.block.speed;
  2916. }
  2917. transitionData.easing = item.data('easing');
  2918. if(!transitionData.easing) {
  2919. transitionData.easing = self.st.block.easing;
  2920. }
  2921. transitionData.css3Easing = $.rsCSS3Easing[transitionData.easing];
  2922. transitionData.delay = item.data('delay');
  2923. if(isNaN(transitionData.delay)) {
  2924. transitionData.delay = self.st.block.delay * index;
  2925. }
  2926. }
  2927. var blockPropsObj = {};
  2928. if(self._useCSS3Transitions) {
  2929. blockPropsObj[(self._vendorPref + self._TD)] = '0ms';
  2930. }
  2931. blockPropsObj.moveProp = animObj.moveProp;
  2932. blockPropsObj.opacity = animObj.opacity;
  2933. blockPropsObj.display = 'none';
  2934. self._blockAnimProps.push({block:item, css:blockPropsObj});
  2935. self._updateAnimBlockProps(item, newPropObj);
  2936. // animate caption
  2937. self._animatedBlockTimeouts.push(setTimeout((function (cItem, animateData, transitionData, index) {
  2938. return function() {
  2939. cItem.css('display', 'block');
  2940. if(transitionData) {
  2941. var animObj = {};
  2942. if(!self._useCSS3Transitions) {
  2943. setTimeout(function() {
  2944. cItem.animate(animateData, transitionData.speed, transitionData.easing);
  2945. }, 16);
  2946. } else {
  2947. var prop = '';
  2948. if(transitionData.hasMove) {
  2949. prop += transitionData.moveProp;
  2950. }
  2951. if(transitionData.hasFade) {
  2952. if(transitionData.hasMove) {
  2953. prop += ', ';
  2954. }
  2955. prop += 'opacity';
  2956. }
  2957. animObj[(self._vendorPref + self._TP)] = prop;
  2958. animObj[(self._vendorPref + self._TD)] = transitionData.speed + 'ms';
  2959. animObj[(self._vendorPref + self._TTF)] = transitionData.css3Easing;
  2960. cItem.css(animObj);
  2961. setTimeout(function() {
  2962. cItem.css(animateData);
  2963. }, 24);
  2964. }
  2965. }
  2966. delete self._animatedBlockTimeouts[index];
  2967. };
  2968. })(item, animObj, transitionData, index), transitionData.delay <= 6 ? 12 : transitionData.delay));
  2969. //}
  2970. });
  2971. }
  2972. });
  2973. $.rsModules.animatedBlocks = $.rsProto._initAnimatedBlocks;
  2974. /****************************************************************************************************************/
  2975. /**
  2976. *
  2977. * RoyalSlider porthole-thumbnails module by Miroslav Varsky (from Dream-Theme.com)
  2978. * @version 1.0.b:
  2979. *
  2980. */
  2981. $.extend($.rsProto, {
  2982. _initThumbs: function() {
  2983. var self = this;
  2984. if(self.st.controlNavigation === 'porthole') {
  2985. self._thumbsDefaults = {
  2986. drag: false,
  2987. touch: false,
  2988. orientation: 'vertical',
  2989. navigation: true,
  2990. spacing: 10,
  2991. appendSpan: false,
  2992. transitionSpeed:600,
  2993. autoCenter: true,
  2994. fitInViewport: true,
  2995. firstMargin: true,
  2996. paddingTop: 0,
  2997. paddingBottom: 0
  2998. };
  2999. self.st.thumbs = $.extend({}, self._thumbsDefaults, self.st.thumbs);
  3000. self._firstThumbMoved = true;
  3001. if(self.st.thumbs.firstMargin === false) { self.st.thumbs.firstMargin = 0; }
  3002. else if(self.st.thumbs.firstMargin === true) { self.st.thumbs.firstMargin = self.st.thumbs.spacing; }
  3003. self.ev.on('rsBeforeParseNode', function(e, content, obj) {
  3004. content = $(content);
  3005. obj.thumbnail = content.find('.rsTmb').remove();
  3006. if(!obj.thumbnail.length) {
  3007. obj.thumbnail = content.attr('data-rsTmb');
  3008. if(!obj.thumbnail) {
  3009. obj.thumbnail = content.find('.rsImg').attr('data-rsTmb');
  3010. }
  3011. if(!obj.thumbnail) {
  3012. obj.thumbnail = '';
  3013. } else {
  3014. obj.thumbnail = '<img src="'+obj.thumbnail+'" width="150" height="150" />';
  3015. }
  3016. } else {
  3017. obj.thumbnail = $(document.createElement('div')).append(obj.thumbnail).html();
  3018. }
  3019. });
  3020. self.ev.one('rsAfterPropsSetup', function() {
  3021. self._createThumbs();
  3022. });
  3023. self._prevNavItem = null;
  3024. self.ev.on('rsOnUpdateNav', function() {
  3025. //self._controlNavItems.attr('class', 'rsNavItem rsThumb');
  3026. var currItem = $(self._controlNavItems[self.currSlideId]);
  3027. if(currItem === self._prevNavItem) {
  3028. return;
  3029. }
  3030. if(self._prevNavItem) {
  3031. self._prevNavItem = null;
  3032. }
  3033. if(self._thumbsNavigation) {
  3034. self._setCurrentThumb(self.currSlideId);
  3035. }
  3036. self._prevNavItem = currItem;
  3037. self._controlNavItems.each(function() {
  3038. if (self._prevNavItem[0]===this) {
  3039. $(this).attr('class', 'rsNavItem rsThumb rsNavSelected');
  3040. }
  3041. else if (self._prevNavItem.prev().prev()[0]===this || self._prevNavItem.next().next()[0]===this) {
  3042. $(this).attr('class', 'rsNavItem rsThumb rsNavVis');
  3043. }
  3044. else if (self._prevNavItem.prev()[0]===this) {
  3045. $(this).attr('class', 'rsNavItem rsThumb rsNavPrev');
  3046. }
  3047. else if (self._prevNavItem.next()[0]===this) {
  3048. $(this).attr('class', 'rsNavItem rsThumb rsNavNext');
  3049. }
  3050. else {
  3051. $(this).attr('class', 'rsNavItem rsThumb');
  3052. }
  3053. });
  3054. });
  3055. self.ev.on('rsOnAppendSlide', function(e, parsedSlide, index) {
  3056. var html = '<div'+self._thumbsMargin+' class="rsNavItem rsThumb">'+self._addThumbHTML+parsedSlide.thumbnail+'</div>';
  3057. if(index >= self.numSlides) {
  3058. self._thumbsContainer.append(html);
  3059. } else {
  3060. self._controlNavItems.eq(index).before(html);
  3061. }
  3062. self._controlNavItems = self._thumbsContainer.children();
  3063. self.updateThumbsSize();
  3064. });
  3065. self.ev.on('rsOnRemoveSlide', function(e, index) {
  3066. var itemToRemove = self._controlNavItems.eq(index);
  3067. if(itemToRemove) {
  3068. itemToRemove.remove();
  3069. self._controlNavItems = self._thumbsContainer.children();
  3070. self.updateThumbsSize();
  3071. }
  3072. });
  3073. }
  3074. },
  3075. _createThumbs: function() {
  3076. var self = this,
  3077. tText = 'rsThumbs',
  3078. thumbSt = self.st.thumbs,
  3079. out = '',
  3080. style,
  3081. item,
  3082. spacing = thumbSt.spacing;
  3083. self._controlNavEnabled = true;
  3084. self._thumbsHorizontal = (thumbSt.orientation === 'vertical') ? false : true;
  3085. self._thumbsMargin = style = spacing ? ' style="margin-' + (self._thumbsHorizontal ? 'right' : 'bottom') + ':'+ spacing+'px;"' : '';
  3086. self._thumbsPosition = 0;
  3087. self._isThumbsAnimating = false;
  3088. self._thumbsDrag = false;
  3089. self._thumbsNavigation = false;
  3090. var pl = (self._thumbsHorizontal ? 'Hor' : 'Ver');
  3091. self.slider.addClass('rsWithThumbs' + ' rsWithThumbs'+ pl );
  3092. out += '<div class="rsNav rsThumbs rsThumbs'+pl +'"><div class="'+tText+'Container">';
  3093. self._addThumbHTML = thumbSt.appendSpan ? '<span class="thumbIco"></span>' : '';
  3094. for(var i = 0; i < self.numSlides; i++) {
  3095. item = self.slides[i];
  3096. out += '<div'+style+' class="rsNavItem rsThumb">'+item.thumbnail+self._addThumbHTML+'</div>';
  3097. }
  3098. out = $(out +'</div></div>');
  3099. var o = {};
  3100. if(thumbSt.paddingTop) {
  3101. o[self._thumbsHorizontal ? 'paddingTop' : 'paddingLeft'] = thumbSt.paddingTop;
  3102. }
  3103. if(thumbSt.paddingBottom) {
  3104. o[self._thumbsHorizontal ? 'paddingBottom' : 'paddingRight'] = thumbSt.paddingBottom;
  3105. }
  3106. out.css(o);
  3107. self._thumbsContainer = $(out).find('.' + tText + 'Container');
  3108. self._controlNav = out;
  3109. self._controlNavItems = self._thumbsContainer.children();
  3110. if(self.msEnabled && self.st.thumbs.navigation) {
  3111. self._thumbsContainer.css('-ms-touch-action', self._thumbsHorizontal ? 'pan-y' : 'pan-x');
  3112. }
  3113. self.slider.append(out);
  3114. self._thumbsEnabled = true;
  3115. self._thumbsSpacing = spacing;
  3116. if(thumbSt.navigation) {
  3117. if(self._useCSS3Transitions) {
  3118. self._thumbsContainer.css(self._vendorPref + 'transition-property', self._vendorPref + 'transform');
  3119. }
  3120. }
  3121. self._controlNav.on('click.rs','.rsNavItem',function(e) {
  3122. if(!self._thumbsDrag ) {
  3123. self.goTo( $(this).index() );
  3124. }
  3125. });
  3126. self.ev.off('rsBeforeSizeSet.thumbs').on('rsBeforeSizeSet.thumbs', function() {
  3127. self._realWrapSize = self._thumbsHorizontal ? self._wrapHeight : self._wrapWidth;
  3128. self.updateThumbsSize(true);
  3129. });
  3130. // fix deprecated name
  3131. if(!self.st.autoPlay && self.st.autoplay) {
  3132. self.st.autoPlay = self.st.autoplay;
  3133. }
  3134. if (self.st.autoPlay.enabled) {
  3135. self._thumbsContainer.after('<div class="progress-wrapper"><div class="progress-controls"></div></div>');
  3136. self.progressWrap = self._thumbsContainer.next();
  3137. self.progressHtml = '<div class="progress-mask"><div class="progress-spinner-left" style="'+self._vendorPref+'animation-duration: '+self.st.autoPlay.delay+'ms;"></div></div><div class="progress-mask"><div class="progress-spinner-right" style="'+self._vendorPref+'animation-duration: '+self.st.autoPlay.delay+'ms;"></div></div>';
  3138. self.ev.on("autoPlayPlay", function() {
  3139. if (self.progressWrap.find(".progress-mask").length < 1) {
  3140. self.progressWrap.prepend(self.progressHtml);
  3141. }
  3142. self.progressWrap.removeClass("paused");
  3143. });
  3144. self.ev.on("autoPlayPause", function() {
  3145. self.progressWrap.find(".progress-mask").remove();
  3146. if (!self._autoPlayEnabled) {
  3147. self.progressWrap.addClass("paused");
  3148. }
  3149. });
  3150. self.ev.on('rsAfterSlideChange', function() {
  3151. self.progressWrap.removeClass("blurred");
  3152. });
  3153. self.ev.on('rsBeforeAnimStart', function() {
  3154. self.progressWrap.addClass("blurred");
  3155. });
  3156. self.ev.on('rsVideoPlay', function() {
  3157. $("body").addClass("hide-thumbnails");
  3158. if (!self.slider.parent().hasClass("fixed")) $("body").addClass("video-playing");
  3159. });
  3160. self.ev.on('rsVideoStop', function() {
  3161. $("body").removeClass("video-playing").removeClass("hide-thumbnails");
  3162. });
  3163. self.progressWrap.on("click", function() {
  3164. self.toggleAutoPlay();
  3165. });
  3166. }
  3167. },
  3168. updateThumbsSize: function(isResize) {
  3169. var self = this,
  3170. firstThumb = self._controlNavItems.first(),
  3171. cssObj = {};
  3172. var numItems = self._controlNavItems.length;
  3173. self._thumbSize = ( self._thumbsHorizontal ? firstThumb.outerWidth() : firstThumb.outerHeight() ) + self._thumbsSpacing;
  3174. self._thumbsContainerSize = self._thumbsContainer.outerHeight(); // numItems * self._thumbSize - self._thumbsSpacing;
  3175. //cssObj[self._thumbsHorizontal ? 'width' : 'height'] = self._thumbsContainerSize + self._thumbsSpacing;
  3176. self._thumbsViewportSize = self._thumbsHorizontal ? self._controlNav.width() : self._controlNav.height();
  3177. self._thumbsMaxPosition = -(self._thumbsContainerSize - self._thumbsViewportSize) - (self.st.thumbs.firstMargin);
  3178. self._thumbsMinPosition = self.st.thumbs.firstMargin;
  3179. self._visibleThumbsPerView = Math.floor(self._thumbsViewportSize / self._thumbSize); // 1;
  3180. if(self.st.thumbs.navigation && !self._thumbsNavigation) {
  3181. self._thumbsNavigation = true;
  3182. if( (!self.hasTouch && self.st.thumbs.drag) || (self.hasTouch && self.st.thumbs.touch)) {
  3183. self._thumbsDrag = true;
  3184. self._controlNav.on(self._downEvent, function(e) { self._onDragStart(e, true); });
  3185. }
  3186. }
  3187. if(self._useCSS3Transitions) {
  3188. cssObj[(self._vendorPref + 'transition-duration')] = '0ms';
  3189. }
  3190. self._thumbsContainer.css(cssObj);
  3191. },
  3192. setThumbsOrientation: function(newPlacement, dontUpdateSize) {
  3193. var self = this;
  3194. if(self._thumbsEnabled) {
  3195. self.st.thumbs.orientation = newPlacement;
  3196. self._controlNav.remove();
  3197. self.slider.removeClass('rsWithThumbsHor rsWithThumbsVer');
  3198. self._createThumbs();
  3199. self._controlNav.off(self._downEvent);
  3200. if(!dontUpdateSize) {
  3201. self.updateSliderSize(true);
  3202. }
  3203. }
  3204. },
  3205. _setThumbsPosition: function(pos) {
  3206. var self = this;
  3207. self._thumbsPosition = pos;
  3208. if(self._useCSS3Transitions) {
  3209. self._thumbsContainer.css(self._xProp, self._tPref1 + ( self._thumbsHorizontal ? (pos + self._tPref2 + 0) : (0 + self._tPref2 + pos) ) + self._tPref3 );
  3210. } else {
  3211. self._thumbsContainer.css(self._thumbsHorizontal ? self._xProp : self._yProp, pos);
  3212. }
  3213. },
  3214. _animateThumbsTo: function(pos, speed, outEasing, bounceAnimPosition, bounceAnimSpeed) {
  3215. var self = this;
  3216. if(!self._thumbsNavigation) {
  3217. return;
  3218. }
  3219. if(!speed) {
  3220. speed = self.st.thumbs.transitionSpeed;
  3221. }
  3222. self._thumbsPosition = pos;
  3223. if(self._thumbsAnimTimeout) {
  3224. clearTimeout(self._thumbsAnimTimeout);
  3225. }
  3226. if(self._isThumbsAnimating) {
  3227. if(!self._useCSS3Transitions) {
  3228. self._thumbsContainer.stop();
  3229. }
  3230. outEasing = true;
  3231. }
  3232. var animObj = {};
  3233. self._isThumbsAnimating = true;
  3234. if(!self._useCSS3Transitions) {
  3235. animObj[self._thumbsHorizontal ? self._xProp : self._yProp] = pos + 'px';
  3236. self._thumbsContainer.animate(animObj, speed, outEasing ? 'easeOutCubic' : self.st.easeInOut);
  3237. } else {
  3238. animObj[(self._vendorPref + 'transition-duration')] = speed+'ms';
  3239. animObj[(self._vendorPref + 'transition-timing-function')] = outEasing ? $.rsCSS3Easing[self.st.easeOut] : $.rsCSS3Easing[self.st.easeInOut];
  3240. self._thumbsContainer.css(animObj);
  3241. self._setThumbsPosition(pos);
  3242. }
  3243. if(bounceAnimPosition) {
  3244. self._thumbsPosition = bounceAnimPosition;
  3245. }
  3246. self._thumbsAnimTimeout = setTimeout(function() {
  3247. self._isThumbsAnimating = false;
  3248. if(bounceAnimSpeed) {
  3249. self._animateThumbsTo(bounceAnimPosition, bounceAnimSpeed, true);
  3250. bounceAnimSpeed = null;
  3251. }
  3252. }, speed);
  3253. },
  3254. _setCurrentThumb: function(id, justSet) {
  3255. var self = this,
  3256. newPos = -id * 40;
  3257. if (newPos == 0) {
  3258. newPos = 20;
  3259. }
  3260. if(!self._thumbsNavigation) {
  3261. return;
  3262. }
  3263. if(self._firstThumbMoved) {
  3264. justSet = true;
  3265. self._firstThumbMoved = false;
  3266. }
  3267. if(newPos !== self._thumbsPosition) {
  3268. if(!justSet) {
  3269. self._animateThumbsTo(newPos);
  3270. } else {
  3271. self._setThumbsPosition(newPos);
  3272. }
  3273. }
  3274. /*
  3275. if ($("#header").hasClass("overlap") && !$("#main-slideshow").hasClass("fixed")) {
  3276. self._controlNav.css({
  3277. "margin-top": -185 + $("#header").outerHeight() / 2
  3278. })
  3279. } else if ($("#header").hasClass("overlap") && $("#main-slideshow").hasClass("fixed")) {
  3280. self.slider.css({
  3281. "margin-top": $("#header").outerHeight()
  3282. });
  3283. }
  3284. */
  3285. }
  3286. });
  3287. $.rsModules.thumbnails = $.rsProto._initThumbs;
  3288. })(jQuery, window);