{"version":3,"file":"largeSlides.js","names":["cycleMod","max","index","increment","app","component","bindings","current","images","onNavigate","controller","$document","$timeout","$element","$scope","ctrl","this","util","tios","_init","_currentImageIndex","_currentSlot","getSlideInDirection","forwards","imageIndex","length","slotIndex","slots","setImage","image","$","attr","Full","displayedSlot","goToSlideIndex","nextSlide","prevSlide","$event","navigate","direction","newSlide","anticipatedSlide","showSlideInDirection","$onInit","$onChanges","changes","controllerAs","templateUrl","cdnUrl"],"sources":["angular/component/largeSlides.js"],"mappings":"CAAA,WACI,aAEA,SAASA,EAAUC,EAAKC,EAAOC,GAC3B,QAASD,EAAQC,GAAaF,EAAMA,GAAOA,CAC/C,CAqLAG,IAAIC,UAAU,cAAe,CAEzBC,SAAU,CACNC,QAAS,IACTC,OAAQ,IACRC,WAAY,KAGhBC,WAAY,CAAC,YAAa,WAAY,WA3Ld,SAAUC,EAAWC,EAAUC,EAAUC,GACjE,IAAIC,EAAOC,KAEXD,EAAKE,KAAOC,KAAKD,KAGjB,IAAIE,GAAQ,EAKRC,EAAqB,EACrBC,EAAe,EAYnB,SAASC,EAAqBC,GAC1B,IAAIpB,EAAaoB,EAAW,GAAK,EAGjC,MAAO,CAAEC,WAFuBxB,EAASe,EAAKP,OAAOiB,OAAQL,EAAoBjB,GAEjCuB,UADb1B,EAASe,EAAKY,MAAMF,OAAQJ,EAAclB,GAEjF,CASA,SAASyB,EAASF,EAAWG,GAOZC,EAAE,SAAWJ,EAAW,QAU9BK,KAAK,MAAOF,EAAMG,MAMzBpB,GAAS,WACLG,EAAKkB,cAAgBZ,CACzB,GACJ,CAyBA,SAASa,EAAeV,EAAYE,GAG5B,GAAIX,EAAKP,OAAOiB,QAAUD,EAAaT,EAAKP,OAAOiB,OAAQ,CAGnDJ,OADuB,IAAhB,EACQ,EAEAK,EAEnBN,EAAqBI,EAErB,IAAIW,EAAYb,GAAoB,GAChCc,EAAYd,GAAoB,GAEpCM,EACIP,EACAN,EAAKP,OAAOY,IAIhBQ,EACIO,EAAUT,UACVX,EAAKP,OAAO2B,EAAUX,aAG1BI,EACIQ,EAAUV,UACVX,EAAKP,OAAO4B,EAAUZ,aAI1BT,EAAKN,WAAW,CAAE4B,OAAQ,CAAEnC,MAAOkB,IACvC,CAIR,CA/GAL,EAAKY,MAAQ,CAAC,EAAE,EAAE,GAClBZ,EAAKkB,cAAgB,EAkHrBlB,EAAKuB,SAAW,SAAUC,IAhE1B,SAA+BhB,GAIvB,IAAIiB,EAAWlB,EAAoBC,GAEnCF,EAAemB,EAASd,UACxBN,EAAqBoB,EAAShB,WAC9B,IAAIiB,EAAmBnB,EAAoBC,GAE3CK,EACIa,EAAiBf,UACjBX,EAAKP,OAAOiC,EAAiBjB,aAIjCT,EAAKN,WAAW,CAAE4B,OAAQ,CAAEnC,MAAOkB,IAK3C,CA+CQsB,CAAqBH,EAI7B,EAKAxB,EAAK4B,QAaL,WAEI/B,GAAS,WAcLsB,EAAe,EAAG,EACtB,IAEAf,GAAQ,CACZ,EA/BAJ,EAAK6B,WAAa,SAAUC,GACpB1B,GAEuB,MAAnB0B,EAAQtC,SACR2B,EAAenB,EAAKR,QAAS,EAGzC,CAyBJ,GAWIuC,aAAc,OAEdC,YAAgC,oBAAX,KAAyB7B,KAAKD,KAAK+B,OAAO,2CAA6C,8BAEnH,CAvMD","sourcesContent":["(function () {\r\n 'use strict'\r\n\r\n function cycleMod (max, index, increment) {\r\n return ((index + increment) % max + max) % max;\r\n }\r\n\r\n var largeSlidesController = function ($document, $timeout, $element, $scope) {\r\n var ctrl = this;\r\n\r\n ctrl.util = tios.util;\r\n\r\n //Internal variables\r\n var _init = false;\r\n var _f = 'function';\r\n\r\n //var _loadingQueue = []; // Array of images pending load\r\n\r\n var _currentImageIndex = 0;\r\n var _currentSlot = 0; // This is the current slot we should show (does not imply currently displayed)\r\n\r\n // Three slots for triple buffering\r\n ctrl.slots = [0,1,2];\r\n ctrl.displayedSlot = 0; // This is the slot currently displayed (for class setting)\r\n\r\n\r\n //If returns true, should block navigation events\r\n /*function isLoading() {\r\n return _loadingQueue.length > 0;\r\n }*/\r\n\r\n function getSlideInDirection (forwards) {\r\n var increment = (forwards ? 1 : -1);\r\n var incrementedSlideItemIndex = cycleMod(ctrl.images.length, _currentImageIndex, increment);\r\n var incrementedFrameElementIndex = cycleMod(ctrl.slots.length, _currentSlot, increment);\r\n return { imageIndex: incrementedSlideItemIndex, slotIndex: incrementedFrameElementIndex } // TODO rename frameElementIndex to slotIndex\r\n };\r\n\r\n /*function hammerSwipe(e) {\r\n console.log('hammer', e);\r\n }\r\n\r\n var hammerEvents = 'panleft panright tap press swipe';\r\n */\r\n\r\n function setImage(slotIndex, image) {\r\n //This is an image, which requires load-blocking\r\n\r\n //push the current element into the loading queue\r\n //_loadingQueue.push(slotIndex);\r\n\r\n // Get the image from inside the slide and unbind any events\r\n var $image = $('#slide' + slotIndex +' img');\r\n\r\n // Temporary instance of the load method so it can correctly unbind on load\r\n /*var loadEvent = function () {\r\n _loadingQueue.splice(_loadingQueue.indexOf(slotIndex), 1);//Remove the current element from the loading list once the onload has been fired\r\n $image.unbind('load'); // Unbind itself after loading\r\n };*/\r\n \r\n // Now using load event, since jquery 3.0 deprecated the .load() method\r\n //$image.on('load', loadEvent).attr(\"src\", image.Full);\r\n $image.attr(\"src\", image.Full);\r\n\r\n //In case it's cached, trigger the load event\r\n /*if ($image[0].complete) {\r\n $image.trigger('load');\r\n }*/\r\n $timeout(function () {\r\n ctrl.displayedSlot = _currentSlot;\r\n });\r\n };\r\n\r\n function showSlideInDirection (forwards) {\r\n \r\n //if (!isLoading()) { //Do not perform the function if the current slide is still loading\r\n\r\n var newSlide = getSlideInDirection(forwards);//next slide relative to current\r\n\r\n _currentSlot = newSlide.slotIndex;//set position to next slide from current\r\n _currentImageIndex = newSlide.imageIndex;\r\n var anticipatedSlide = getSlideInDirection(forwards);//get the next anticipated slide to preload\r\n\r\n setImage(\r\n anticipatedSlide.slotIndex,\r\n ctrl.images[anticipatedSlide.imageIndex]\r\n );\r\n\r\n //pass back to the page which image index is showing\r\n ctrl.onNavigate({ $event: { index: _currentImageIndex } });\r\n\r\n /*} else {\r\n //console.log('slideindirection blocked');\r\n }*/\r\n };\r\n\r\n function goToSlideIndex(imageIndex, slotIndex) {\r\n \r\n //if (!isLoading()) { //Do not perform the function if the current slide is still loading\r\n if (ctrl.images.length && imageIndex < ctrl.images.length) {//don't go to index if there are no slides or it's out of bounds\r\n\r\n if (typeof (slotIndex) === 'undefined') {\r\n _currentSlot = 0;\r\n } else {\r\n _currentSlot = slotIndex;\r\n }\r\n _currentImageIndex = imageIndex;\r\n\r\n var nextSlide = getSlideInDirection(true);\r\n var prevSlide = getSlideInDirection(false);\r\n\r\n setImage(\r\n _currentSlot,\r\n ctrl.images[_currentImageIndex]\r\n );\r\n\r\n //set previous and next slides \r\n setImage(\r\n nextSlide.slotIndex,\r\n ctrl.images[nextSlide.imageIndex]\r\n );\r\n \r\n setImage(\r\n prevSlide.slotIndex,\r\n ctrl.images[prevSlide.imageIndex]\r\n );\r\n \r\n //pass back to the page which image index is showing\r\n ctrl.onNavigate({ $event: { index: _currentImageIndex } });\r\n }\r\n /*} else {\r\n //console.log('gotoindex blocked');\r\n }*/\r\n }\r\n\r\n\r\n\r\n ctrl.navigate = function (direction) {\r\n\r\n //if (!isLoading()) { //Do not perform the function if the current slide is still loading\r\n\r\n showSlideInDirection(direction);\r\n\r\n //} \r\n \r\n };\r\n\r\n\r\n\r\n //Init function\r\n ctrl.$onInit = init;\r\n\r\n ctrl.$onChanges = function (changes) {\r\n if (_init) {\r\n // If the current image is changed after init, jump to it.\r\n if (changes.current != null) {\r\n goToSlideIndex(ctrl.current, 1);\r\n }\r\n }\r\n };\r\n\r\n //-\r\n\r\n function init() {\r\n //set up defaults - set a timeout on this so we render after the page has loaded\r\n $timeout(function () {\r\n /*\r\n // Get the images\r\n var $image = $('.slides .slide');\r\n\r\n // Subscribe to a quick start event: press, tap, or doubletap.\r\n // For a full list of quick start events, read the documentation.\r\n $image.each(function () {\r\n console.log('binding image', this);\r\n Hammer.on(this, hammerEvents, hammerSwipe);\r\n \r\n });\r\n */\r\n\r\n goToSlideIndex(0, 0);\r\n });\r\n\r\n _init = true;\r\n }\r\n };\r\n\r\n app.component('largeslides', {\r\n\r\n bindings: {\r\n current: '<', // Current index to show (can be changed to trigger)\r\n images: '<', // Array of images {Full:'url',Thumb:'Url'}\r\n onNavigate: '&' // what to do when image navigation is changed (will return new index)\r\n },\r\n\r\n controller: ['$document', '$timeout', '$element', largeSlidesController],\r\n controllerAs: 'ctrl',\r\n\r\n templateUrl: (typeof (tios) !== 'undefined' ? tios.util.cdnUrl('dist/angular/component/largeSlides.html') : 'component/largeSlides.html')\r\n });\r\n})();"]}