{"version":3,"sources":["www/js/main.js"],"names":["onSlide_1Enter","source","direction","slide1Animations","kitesAnimations","textAnimations","charactersAnimations","onSlide_1Leave","onSlide_10Enter","slide10Animations","backgroundAnimations","onSlide_10Leave","onSlide_11Enter","slide11Animations","onSlide_11Leave","onSlide_12Enter","slide12Animations","onSlide_12Leave","onSlide_13Enter","slide13Animations","onSlide_13Leave","onSlide_14Enter","slide14Animations","prepareBackgroundAnimations","onSlide_14Leave","onSlide_15Enter","slide15Animations","onSlide_15Leave","onSlide_16Enter","slide16Animations","onSlide_16Leave","isReferencesVisible","referencesInfo","velocity","onSlide_2Enter","slide2Animations","slide3Animations","onSlide_2Leave","onSlide_3Enter","onSlide_3Leave","onSlide_4Enter","slidesView","setIndicatorPosition","slide4Animations","indicatorAnimations","onSlide_4Leave","onSlide_5Enter","slide5Animations","onSlide_5Leave","onSlide_6Enter","slide6Animations","onSlide_6Leave","onSlide_7Enter","slide7Animations","onSlide_7Leave","onSlide_8Enter","slide8Animations","onSlide_8Leave","onSlide_9Enter","slide9Animations","onSlide_9Leave","global","factory","define","amd","$","document","Math","exports","module","require","jQuery","window","this","undefined","WRAPPER","WRAPPER_SEL","SCROLLABLE","SCROLLABLE_SEL","SLIMSCROLL_BAR_SEL","SLIMSCROLL_RAIL_SEL","RESPONSIVE","NO_TRANSITION","DESTROYED","ENABLED","VIEWING_PREFIX","ACTIVE","ACTIVE_SEL","SECTION_DEFAULT_SEL","SECTION","SECTION_SEL","SECTION_ACTIVE_SEL","SECTION_FIRST_SEL","SECTION_LAST_SEL","TABLE_CELL","TABLE_CELL_SEL","SECTION_NAV","SECTION_NAV_SEL","SECTION_NAV_TOOLTIP","SHOW_ACTIVE_TOOLTIP","SLIDE_DEFAULT_SEL","SLIDE","SLIDE_SEL","SLIDE_ACTIVE_SEL","SLIDES_WRAPPER","SLIDES_WRAPPER_SEL","SLIDES_CONTAINER","SLIDES_CONTAINER_SEL","TABLE","SLIDES_NAV","SLIDES_NAV_SEL","SLIDES_NAV_LINK_SEL","SLIDES_ARROW","SLIDES_ARROW_SEL","SLIDES_PREV","SLIDES_PREV_SEL","SLIDES_ARROW_PREV","SLIDES_ARROW_PREV_SEL","SLIDES_NEXT","SLIDES_NEXT_SEL","SLIDES_ARROW_NEXT","SLIDES_ARROW_NEXT_SEL","$window","$document","fn","fullpage","options","createSlideArrows","section","find","after","controlArrowColor","css","loopHorizontal","hide","addVerticalNavigation","$body","append","nav","addClass","showActiveTooltip","navigationPosition","i","length","link","anchors","li","tooltip","navigationTooltips","createSlimScrollingHandler","each","slides","createSlimScrolling","afterRenderActions","mouseover","isFunction","afterLoad","call","data","index","afterRender","scrollHandler","currentSection","autoScrolling","scrollBar","currentScroll","scrollTop","visibleSectionIndex","initial","abs","querySelectorAll","offsetTop","sections","current","eq","hasClass","isScrolling","leavingSection","leavingSectionIndex","yMovement","getYmovement","anchorLink","sectionIndex","activeSlide","slideAnchorLink","slideIndex","canScroll","siblings","removeClass","onLeave","activateMenuAndNav","lastScrolledDestiny","setState","clearTimeout","scrollId","setTimeout","fitToSection","scrollId2","is","isResizing","scrollPage","isScrollable","activeSection","scrolling","type","scrollable","isScrollAllowed","check","scrollSection","FP","moveSectionDown","moveSectionUp","isScrolled","touchMoveHandler","event","e","originalEvent","checkParentForNormalScrollElement","target","isReallyTouch","preventDefault","slideMoving","touchEvents","getEventsPage","touchEndY","y","touchEndX","x","touchStartX","touchStartY","width","touchSensitivity","right","moveSlideRight","left","moveSlideLeft","height","el","hop","parent","normalScrollElementTouchThreshold","normalScrollElements","pointerType","touchStartHandler","$htmlBody","stop","getAverage","elements","number","sum","lastElements","slice","max","ceil","MouseWheelHandler","curTime","Date","getTime","controlPressed","value","wheelDelta","deltaY","detail","delta","min","scrollings","shift","push","returnValue","timeDiff","prevTime","averageEnd","averageMiddle","isAccelerating","moveSlide","currentSlide","destiny","prev","next","landscapeScroll","keepSlidesPosition","silentLandscapeScroll","element","callback","isMovementUp","dest","position","v","dtop","top","localIsResizing","continuousVertical","createInfiniteSections","performMovement","css3","translate3d","transformContainer","scrollingSpeed","afterSectionLoads","scrollSettings","getScrollSettings","animate","easing","promise","done","scroll","before","nextAll","prevAll","get","reverse","silentScroll","wrapAroundElements","continuousVerticalFixSectionOrder","scrollToAnchor","location","hash","replace","split","slide","scrollPageAndSlide","hashChangeHandler","isFirstSlideMove","isFirstScrollMove","lastScrolledSlide","keydownHandler","keydownId","ctrlKey","activeElement","keyboardScrolling","keyCode","which","keyControls","inArray","onkeydown","shiftPressed","shiftKey","moveTo","mouseMoveHandler","pageY","oldPageY","destinyPos","closest","slidesNav","slideAnchor","getSlideAnchor","onSlideLeave","prevSlide","prevSlideIndex","xMovement","getXmovement","controlArrows","toggle","afterSlideLoads","afterSlideLoad","beforeScroll","round","addAnimation","getTransforms","scrollLeft","resizeHandler","responsive","isTouchDevice","currentHeight","previousHeight","reBuild","resizeId","isResponsive","container","setAutoScrolling","setFitToSection","originals","show","transition","easingcss3","-webkit-transition","removeAnimation","resizeMe","displayHeight","displayWidth","preferredHeight","preferredWidth","heightPercentage","widthPercentage","percentage","newFontSize","toFixed","activateNavDots","name","navigation","activateMenuElement","menu","anchor","innerHeight","scrollHeight","fromIndex","toIndex","contentHeight","verticalCentered","windowsHeight","parseInt","wrapInner","slimScroll","allowPageScroll","size","alwaysVisible","removeSlimScroll","children","first","unwrap","remove","addTableClass","getTableHeight","sectionHeight","paddingTop","paddingBottom","paddings","animated","getSectionByAnchor","sectionAnchor","getSlideByAnchor","scrollSlider","addSlidesNavigation","numSlides","slidesNavPosition","sectionHash","setUrlHash","setBodyClass","url","recordHistory","isTouch","history","replaceState","baseUrl","href","text","String","classRe","RegExp","className","support3d","has3d","createElement","transforms","webkitTransform","OTransform","msTransform","MozTransform","transform","body","insertBefore","t","style","getComputedStyle","getPropertyValue","removeChild","removeMouseWheelHandler","addEventListener","removeEventListener","detachEvent","addMouseWheelHandler","attachEvent","addTouchHandler","MSPointer","getMSPointer","off","down","on","move","removeTouchHandler","pointer","PointerEvent","events","pageX","touches","noCallbacks","setScrollingSpeed","-webkit-transform","-moz-transform","-ms-transform","setIsScrollable","up","setAllowScrolling","destroyStructure","background-color","padding","-ms-touch-action","touch-action","replaceWith","childNodes","setVariableState","variable","displayWarnings","loopTop","loopBottom","showError","console","extend","slidesNavigation","scrollOverflow","animateAnchor","resize","sectionsColor","fixedElements","sectionSelector","slideSelector","afterResize","afterReBuild","easeInOutCubic","b","c","d","easeInQuart","overflow","setRecordHistory","setMouseWheelScrolling","directions","setKeyboardScrolling","last","silentMoveTo","resizing","windowsWidth","slidesWrap","navigator","userAgent","match","msMaxTouchPoints","that","attr","sliderWidth","slideWidth","wrapAll","wrap","startingSlide","appendTo","readyState","keydown","keyup","mousedown","mouseup","flag","destroy","all","lazyload","update","counter","$this","settings","skip_invisible","abovethetop","leftofbegin","belowthefold","rightoffold","failure_limit","trigger","$container","threshold","effect","data_attribute","appear","load","placeholder","failurelimit","effectspeed","effect_speed","indexOf","bind","self","$self","loaded","one","elements_left","original","temp","grep","test","appVersion","persisted","ready","fold","offset","inviewport","expr","below-the-fold","a","above-the-top","right-of-screen","left-of-screen","in-viewport","above-the-fold","right-of-fold","left-of-fold","handler","orgEvent","args","arguments","deltaX","absDelta","offsetX","offsetY","fix","wheelDeltaY","wheelDeltaX","axis","HORIZONTAL_AXIS","deltaMode","lineHeight","pageHeight","lowestDelta","shouldAdjustOldDeltas","special","normalizeOffset","getBoundingClientRect","boundingRect","clientX","clientY","deltaFactor","unshift","nullLowestDeltaTimeout","nullLowestDelta","dispatch","handle","apply","adjustOldDeltas","toFix","toBind","documentMode","Array","prototype","fixHooks","mouseHooks","mousewheel","version","setup","onmousewheel","getLineHeight","getPageHeight","teardown","removeData","elem","$elem","$parent","unmousewheel","unbind","defaults","color","distance","start","opacity","disableFadeOut","railVisible","railColor","railOpacity","railDraggable","railClass","barClass","wrapperClass","wheelStep","touchScrollStep","borderRadius","railBorderRadius","o","_onWheel","isOverPanel","srcTarget","srcElement","me","scrollContent","releaseScroll","isWheel","isJump","maxTop","outerHeight","bar","floor","percentScroll","showBar","hideBar","attachWheel","detachWheel","getBarHeight","barHeight","minBarHeight","display","queueHide","lastScroll","msg","fadeIn","rail","isOverBar","isDragg","fadeOut","touchDif","divS","isPlainObject","scrollTo","scrollBy","wrapper","border-radius","background","zIndex","BorderRadius","MozBorderRadius","WebkitBorderRadius","posCss","$doc","parseFloat","currTop","stopPropagation","hover","diff","slimscroll","init","swipe","swipeStatus","NONE","click","tap","plugin","PLUGIN_NS","TouchSwipe","touchStart","jqEvent","getTouchInProgress","excludedElements","$element","ret","evt","SUPPORTS_TOUCH","phase","PHASE_START","fingerCount","pinchDirection","duration","startTouchesDistance","endTouchesDistance","pinchZoom","pinchDistance","fingerData","createAllFingerData","maximumsMap","createMaximumsData","cancelMultiFingerRelease","fingers","ALL_FINGERS","hasPinches","createFingerData","startTime","getTimeStamp","calculateTouchesDistance","pinchStatus","triggerHandler","PHASE_CANCEL","hold","holdTimeout","proxy","longTapThreshold","setTouchInProgress","touchMove","PHASE_END","inMultiFingerRelease","currentFinger","updateFingerData","endTime","PHASE_MOVE","end","calculatePinchDirection","calculatePinchZoom","calculateDirection","validateDefaultEvent","calculateDistance","calculateDuration","setMaxDistance","triggerOnTouchEnd","triggerOnTouchLeave","inBounds","bounds","getbounds","isInBounds","getNextPhase","touchEnd","startMultiFingerRelease","previousTouchFingerCount","didSwipeBackToCancel","validateSwipeDistance","hasTap","triggerHandlerForGesture","TAP","touchCancel","touchLeave","removeListeners","START_EV","CANCEL_EV","MOVE_EV","END_EV","LEAVE_EV","currentPhase","nextPhase","validTime","validateSwipeTime","validDistance","didCancel","didSwipe","hasSwipes","didPinch","SWIPE","PINCH","didDoubleTap","DOUBLE_TAP","didLongTap","LONG_TAP","didTap","gesture","validateSwipe","LEFT","swipeLeft","RIGHT","swipeRight","UP","swipeUp","DOWN","swipeDown","validatePinch","IN","pinchIn","OUT","pinchOut","singleTapTimeout","hasDoubleTap","inDoubleTap","doubleTapStartTime","doubleTapThreshold","doubleTap","longTap","valid","cancelled","cancelThreshold","getMaxDistance","validatePinchDistance","pinchThreshold","result","maxTimeThreshold","preventDefaultEvents","auto","AUTO","HORIZONTAL","VERTICAL","hasCorrectFingerCount","validateFingers","hasEndPoint","validateEndPoint","hasCorrectDistance","hasValidTime","hasValidDistance","hasLongTap","validateDoubleTap","now","validateTap","isNaN","validateLongTap","DOUBLE_TAP_THRESHOLD","previousTouchEndTime","withinThreshold","fingerReleaseThreshold","val","id","identifier","f","getFingerData","maxData","createMaximumVO","dir","startPoint","endPoint","diffX","diffY","sqrt","startDistance","endDistance","percent","pow","calculateAngle","r","atan2","angle","PI","outerWidth","bottom","point","useTouchEvents","SUPPORTS_POINTER","fallbackToMouseEvents","SUPPORTS_POINTER_IE10","error","enable","disable","option","property","msPointerEnabled","pointerEnabled","method","phases","pageScroll","ONE","TWO","THREE","ALL","isPortrait","innerWidth","setNavActiveLink","slideId","slideNav","showOrientationMessage","hideOrientationMessage","currentScrollingSpeed","surpressCallbacks","indicatorPosition","getBeforeEnterCallbackName","capitalize","getBeforeLeaveCallbackName","backgroundTransition","newSlideEl","targetSlide","onBeforeSlideEnter","oldSlideEl","newSlideIndex","onBeforeEnterFnName","speed","onBeforeSlideLeave","slideEl","onBeforeLeaveFnName","onBeforeScroll","newLeftPos","elementLeft","$layer","onResize","ratio","updateIndicator","sel1","sel2","$character","$zoom","pivotX","pivotY","autoscroll","targetSlideId","activeSlideId","pop","charAt","toUpperCase","enter","$kite1","$kite2","delay","complete","loop","$characters","stagger","$infoBox","$title","$start","$delay","$pinkBubble","$orangeBubble","$greenBubble","$desk","$bgOffice","$bgBox","$officeDelay","$doctor","furnitureAnimations","$table","$picture","$effect","$checklist","$familyTree","$legend","$clock","$transitionBox","$bgHome","$homeDelay","$homeDuration","$cyclist","$girlWithDog","$logo","$references","$footerInfo","references","isHoverVisible","$infoHover","character","$indicator","$violetBubble","triggersAnimations","$attacksInfo","$triggers","drag"],"mappings":"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","file":"main.min.js","sourcesContent":["/**\r\n * fullPage 2.6.5\r\n * https://github.com/alvarotrigo/fullPage.js\r\n * MIT licensed\r\n *\r\n * Copyright (C) 2015 alvarotrigo.com - A project by Alvaro Trigo\r\n */\r\n(function(global, factory) {\r\n 'use strict';\r\n if (typeof define === 'function' && define.amd) {\r\n define(['jquery'], function($) {\r\n return factory($, global, global.document, global.Math);\r\n });\r\n } else if (typeof exports !== 'undefined') {\r\n module.exports = factory(require('jquery'), global, global.document, global.Math);\r\n } else {\r\n factory(jQuery, global, global.document, global.Math);\r\n }\r\n})(typeof window !== 'undefined' ? window : this, function($, window, document, Math, undefined) {\r\n 'use strict';\r\n\r\n // keeping central set of classnames and selectors\r\n var WRAPPER = 'fullpage-wrapper';\r\n var WRAPPER_SEL = '.' + WRAPPER;\r\n\r\n // slimscroll\r\n var SCROLLABLE = 'fp-scrollable';\r\n var SCROLLABLE_SEL = '.' + SCROLLABLE;\r\n var SLIMSCROLL_BAR_SEL = '.slimScrollBar';\r\n var SLIMSCROLL_RAIL_SEL = '.slimScrollRail';\r\n\r\n // util\r\n var RESPONSIVE = 'fp-responsive';\r\n var NO_TRANSITION = 'fp-notransition';\r\n var DESTROYED = 'fp-destroyed';\r\n var ENABLED = 'fp-enabled';\r\n var VIEWING_PREFIX = 'fp-viewing';\r\n var ACTIVE = 'active';\r\n var ACTIVE_SEL = '.' + ACTIVE;\r\n\r\n // section\r\n var SECTION_DEFAULT_SEL = '.section';\r\n var SECTION = 'fp-section';\r\n var SECTION_SEL = '.' + SECTION;\r\n var SECTION_ACTIVE_SEL = SECTION_SEL + ACTIVE_SEL;\r\n var SECTION_FIRST_SEL = SECTION_SEL + ':first';\r\n var SECTION_LAST_SEL = SECTION_SEL + ':last';\r\n var TABLE_CELL = 'fp-tableCell';\r\n var TABLE_CELL_SEL = '.' + TABLE_CELL;\r\n\r\n // section nav\r\n var SECTION_NAV = 'fp-nav';\r\n var SECTION_NAV_SEL = '#' + SECTION_NAV;\r\n var SECTION_NAV_TOOLTIP = 'fp-tooltip';\r\n var SHOW_ACTIVE_TOOLTIP = 'fp-show-active';\r\n\r\n // slide\r\n var SLIDE_DEFAULT_SEL = '.slide';\r\n var SLIDE = 'fp-slide';\r\n var SLIDE_SEL = '.' + SLIDE;\r\n var SLIDE_ACTIVE_SEL = SLIDE_SEL + ACTIVE_SEL;\r\n var SLIDES_WRAPPER = 'fp-slides';\r\n var SLIDES_WRAPPER_SEL = '.' + SLIDES_WRAPPER;\r\n var SLIDES_CONTAINER = 'fp-slidesContainer';\r\n var SLIDES_CONTAINER_SEL = '.' + SLIDES_CONTAINER;\r\n var TABLE = 'fp-table';\r\n\r\n // slide nav\r\n var SLIDES_NAV = 'fp-slidesNav';\r\n var SLIDES_NAV_SEL = '.' + SLIDES_NAV;\r\n var SLIDES_NAV_LINK_SEL = SLIDES_NAV_SEL + ' a';\r\n var SLIDES_ARROW = 'fp-controlArrow';\r\n var SLIDES_ARROW_SEL = '.' + SLIDES_ARROW;\r\n var SLIDES_PREV = 'fp-prev';\r\n var SLIDES_PREV_SEL = '.' + SLIDES_PREV;\r\n var SLIDES_ARROW_PREV = SLIDES_ARROW + ' ' + SLIDES_PREV;\r\n var SLIDES_ARROW_PREV_SEL = SLIDES_ARROW_SEL + SLIDES_PREV_SEL;\r\n var SLIDES_NEXT = 'fp-next';\r\n var SLIDES_NEXT_SEL = '.' + SLIDES_NEXT;\r\n var SLIDES_ARROW_NEXT = SLIDES_ARROW + ' ' + SLIDES_NEXT;\r\n var SLIDES_ARROW_NEXT_SEL = SLIDES_ARROW_SEL + SLIDES_NEXT_SEL;\r\n\r\n var $window = $(window);\r\n var $document = $(document);\r\n\r\n $.fn.fullpage = function(options) {\r\n\r\n // common jQuery objects\r\n var $htmlBody = $('html, body');\r\n var $body = $('body');\r\n\r\n var FP = $.fn.fullpage;\r\n // Create some defaults, extending them with any options that were provided\r\n options = $.extend({\r\n //navigation\r\n menu: false,\r\n anchors:[],\r\n navigation: false,\r\n navigationPosition: 'right',\r\n navigationTooltips: [],\r\n showActiveTooltip: false,\r\n slidesNavigation: false,\r\n slidesNavPosition: 'bottom',\r\n scrollBar: false,\r\n\r\n //scrolling\r\n css3: true,\r\n scrollingSpeed: 700,\r\n autoScrolling: true,\r\n fitToSection: true,\r\n easing: 'easeInOutCubic',\r\n easingcss3: 'ease',\r\n loopBottom: false,\r\n loopTop: false,\r\n loopHorizontal: true,\r\n continuousVertical: false,\r\n normalScrollElements: null,\r\n scrollOverflow: false,\r\n touchSensitivity: 5,\r\n normalScrollElementTouchThreshold: 5,\r\n\r\n //Accessibility\r\n keyboardScrolling: true,\r\n animateAnchor: true,\r\n recordHistory: true,\r\n\r\n //design\r\n controlArrows: true,\r\n controlArrowColor: '#fff',\r\n verticalCentered: true,\r\n resize: false,\r\n sectionsColor : [],\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n fixedElements: null,\r\n responsive: 0,\r\n\r\n //Custom selectors\r\n sectionSelector: SECTION_DEFAULT_SEL,\r\n slideSelector: SLIDE_DEFAULT_SEL,\r\n\r\n\r\n //events\r\n afterLoad: null,\r\n onLeave: null,\r\n afterRender: null,\r\n afterResize: null,\r\n afterReBuild: null,\r\n afterSlideLoad: null,\r\n onSlideLeave: null,\r\n beforeScroll: null\r\n }, options);\r\n\r\n displayWarnings();\r\n\r\n\r\n //easeInOutCubic animation included in the plugin\r\n $.extend($.easing,{ easeInOutCubic: function (x, t, b, c, d) {if ((t/=d/2) < 1) return c/2*t*t*t + b;return c/2*((t-=2)*t*t + 2) + b;}});\r\n\r\n //TO BE REMOVED in future versions. Maintained temporaly for backwards compatibility.\r\n $.extend($.easing,{ easeInQuart: function (x, t, b, c, d) { return c*(t/=d)*t*t*t + b; }});\r\n\r\n /**\r\n * Sets the autoScroll option.\r\n * It changes the scroll bar visibility and the history of the site as a result.\r\n */\r\n FP.setAutoScrolling = function(value, type){\r\n setVariableState('autoScrolling', value, type);\r\n\r\n var element = $(SECTION_ACTIVE_SEL);\r\n\r\n if(options.autoScrolling && !options.scrollBar){\r\n $htmlBody.css({\r\n 'overflow' : 'hidden',\r\n 'height' : '100%'\r\n });\r\n\r\n FP.setRecordHistory(options.recordHistory, 'internal');\r\n\r\n //for IE touch devices\r\n container.css({\r\n '-ms-touch-action': 'none',\r\n 'touch-action': 'none'\r\n });\r\n\r\n if(element.length){\r\n //moving the container up\r\n silentScroll(element.position().top);\r\n }\r\n\r\n }else{\r\n $htmlBody.css({\r\n 'overflow' : 'visible',\r\n 'height' : 'initial'\r\n });\r\n\r\n FP.setRecordHistory(false, 'internal');\r\n\r\n //for IE touch devices\r\n container.css({\r\n '-ms-touch-action': '',\r\n 'touch-action': ''\r\n });\r\n\r\n silentScroll(0);\r\n\r\n //scrolling the page to the section with no animation\r\n if (element.length) {\r\n $htmlBody.scrollTop(element.position().top);\r\n }\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Defines wheter to record the history for each hash change in the URL.\r\n */\r\n FP.setRecordHistory = function(value, type){\r\n setVariableState('recordHistory', value, type);\r\n };\r\n\r\n /**\r\n * Defines the scrolling speed\r\n */\r\n FP.setScrollingSpeed = function(value, type){\r\n setVariableState('scrollingSpeed', value, type);\r\n };\r\n\r\n /**\r\n * Sets fitToSection\r\n */\r\n FP.setFitToSection = function(value, type){\r\n setVariableState('fitToSection', value, type);\r\n };\r\n\r\n /**\r\n * Adds or remove the possiblity of scrolling through sections by using the mouse wheel or the trackpad.\r\n */\r\n FP.setMouseWheelScrolling = function (value){\r\n if(value){\r\n addMouseWheelHandler();\r\n }else{\r\n removeMouseWheelHandler();\r\n }\r\n };\r\n\r\n /**\r\n * Adds or remove the possiblity of scrolling through sections by using the mouse wheel/trackpad or touch gestures.\r\n * Optionally a second parameter can be used to specify the direction for which the action will be applied.\r\n *\r\n * @param directions string containing the direction or directions separated by comma.\r\n */\r\n FP.setAllowScrolling = function (value, directions){\r\n if(typeof directions != 'undefined'){\r\n directions = directions.replace(/ /g,'').split(',');\r\n\r\n $.each(directions, function (index, direction){\r\n setIsScrollable(value, direction);\r\n });\r\n }\r\n else if(value){\r\n FP.setMouseWheelScrolling(true);\r\n addTouchHandler();\r\n }else{\r\n FP.setMouseWheelScrolling(false);\r\n removeTouchHandler();\r\n }\r\n };\r\n\r\n /**\r\n * Adds or remove the possiblity of scrolling through sections by using the keyboard arrow keys\r\n */\r\n FP.setKeyboardScrolling = function (value){\r\n options.keyboardScrolling = value;\r\n };\r\n\r\n /**\r\n * Moves the page up one section.\r\n */\r\n FP.moveSectionUp = function(){\r\n var prev = $(SECTION_ACTIVE_SEL).prev(SECTION_SEL);\r\n\r\n //looping to the bottom if there's no more sections above\r\n if (!prev.length && (options.loopTop || options.continuousVertical)) {\r\n prev = $(SECTION_SEL).last();\r\n }\r\n\r\n if (prev.length) {\r\n scrollPage(prev, null, true);\r\n }\r\n };\r\n\r\n /**\r\n * Moves the page down one section.\r\n */\r\n FP.moveSectionDown = function (){\r\n var next = $(SECTION_ACTIVE_SEL).next(SECTION_SEL);\r\n\r\n //looping to the top if there's no more sections below\r\n if(!next.length &&\r\n (options.loopBottom || options.continuousVertical)){\r\n next = $(SECTION_SEL).first();\r\n }\r\n\r\n if(next.length){\r\n scrollPage(next, null, false);\r\n }\r\n };\r\n\r\n /**\r\n * Moves the page to the given section and slide with no animation.\r\n * Anchors or index positions can be used as params.\r\n */\r\n FP.silentMoveTo = function(sectionAnchor, slideAnchor){\r\n FP.setScrollingSpeed (0, 'internal');\r\n FP.moveTo(sectionAnchor, slideAnchor)\r\n FP.setScrollingSpeed (originals.scrollingSpeed, 'internal');\r\n };\r\n\r\n /**\r\n * Moves the page to the given section and slide.\r\n * Anchors or index positions can be used as params.\r\n */\r\n FP.moveTo = function (sectionAnchor, slideAnchor){\r\n var destiny = getSectionByAnchor(sectionAnchor);\r\n\r\n if (typeof slideAnchor !== 'undefined'){\r\n scrollPageAndSlide(sectionAnchor, slideAnchor);\r\n }else if(destiny.length > 0){\r\n scrollPage(destiny);\r\n }\r\n };\r\n\r\n /**\r\n * Slides right the slider of the active section.\r\n */\r\n FP.moveSlideRight = function(){\r\n moveSlide('next');\r\n };\r\n\r\n /**\r\n * Slides left the slider of the active section.\r\n */\r\n FP.moveSlideLeft = function(){\r\n moveSlide('prev');\r\n };\r\n\r\n /**\r\n * When resizing is finished, we adjust the slides sizes and positions\r\n */\r\n FP.reBuild = function(resizing){\r\n if(container.hasClass(DESTROYED)){ return; } //nothing to do if the plugin was destroyed\r\n\r\n isResizing = true;\r\n\r\n var windowsWidth = $window.width();\r\n windowsHeight = $window.height(); //updating global var\r\n\r\n //text resizing\r\n if (options.resize) {\r\n resizeMe(windowsHeight, windowsWidth);\r\n }\r\n\r\n $(SECTION_SEL).each(function(){\r\n var slidesWrap = $(this).find(SLIDES_WRAPPER_SEL);\r\n var slides = $(this).find(SLIDE_SEL);\r\n\r\n //adjusting the height of the table-cell for IE and Firefox\r\n if(options.verticalCentered){\r\n $(this).find(TABLE_CELL_SEL).css('height', getTableHeight($(this)) + 'px');\r\n }\r\n\r\n $(this).css('height', windowsHeight + 'px');\r\n\r\n //resizing the scrolling divs\r\n if(options.scrollOverflow){\r\n if(slides.length){\r\n slides.each(function(){\r\n createSlimScrolling($(this));\r\n });\r\n }else{\r\n createSlimScrolling($(this));\r\n }\r\n }\r\n\r\n //adjusting the position fo the FULL WIDTH slides...\r\n if (slides.length > 1) {\r\n landscapeScroll(slidesWrap, slidesWrap.find(SLIDE_ACTIVE_SEL));\r\n }\r\n });\r\n\r\n var activeSection = $(SECTION_ACTIVE_SEL);\r\n var sectionIndex = activeSection.index(SECTION_SEL);\r\n\r\n //isn't it the first section?\r\n if(sectionIndex){\r\n //adjusting the position for the current section\r\n FP.silentMoveTo(sectionIndex + 1);\r\n }\r\n\r\n isResizing = false;\r\n $.isFunction( options.afterResize ) && resizing && options.afterResize.call(container);\r\n $.isFunction( options.afterReBuild ) && !resizing && options.afterReBuild.call(container);\r\n };\r\n\r\n //flag to avoid very fast sliding for landscape sliders\r\n var slideMoving = false;\r\n\r\n var isTouchDevice = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/);\r\n var isTouch = (('ontouchstart' in window) || (navigator.msMaxTouchPoints > 0) || (navigator.maxTouchPoints));\r\n var container = $(this);\r\n var windowsHeight = $window.height();\r\n var isResizing = false;\r\n var lastScrolledDestiny;\r\n var lastScrolledSlide;\r\n var canScroll = true;\r\n var scrollings = [];\r\n var nav;\r\n var controlPressed;\r\n var isScrollAllowed = { 'up':true, 'down':true, 'left':true, 'right':true };\r\n var originals = $.extend(true, {}, options); //deep copy\r\n\r\n if($(this).length){\r\n container.css({\r\n 'height': '100%',\r\n 'position': 'relative'\r\n });\r\n\r\n //adding a class to recognize the container internally in the code\r\n container.addClass(WRAPPER);\r\n $('html').addClass(ENABLED);\r\n }\r\n //trying to use fullpage without a selector?\r\n else{\r\n showError('error', 'Error! Fullpage.js needs to be initialized with a selector. For example: $(\\'#myContainer\\').fullpage();');\r\n }\r\n\r\n //if css3 is not supported, it will use jQuery animations\r\n if(options.css3){\r\n options.css3 = support3d();\r\n }\r\n\r\n FP.setAllowScrolling(true);\r\n container.removeClass(DESTROYED); //in case it was destroyed before initilizing it again\r\n\r\n\r\n //adding internal class names to void problem with common ones\r\n $(options.sectionSelector).each(function(){\r\n $(this).addClass(SECTION);\r\n });\r\n $(options.slideSelector).each(function(){\r\n $(this).addClass(SLIDE);\r\n });\r\n\r\n //creating the navigation dots\r\n if (options.navigation) {\r\n addVerticalNavigation();\r\n }\r\n\r\n //styling the sections\r\n $(SECTION_SEL).each(function(index){\r\n var that = $(this);\r\n var slides = $(this).find(SLIDE_SEL);\r\n var numSlides = slides.length;\r\n\r\n //if no active section is defined, the 1st one will be the default one\r\n if(!index && $(SECTION_ACTIVE_SEL).length === 0) {\r\n $(this).addClass(ACTIVE);\r\n }\r\n\r\n $(this).css('height', windowsHeight + 'px');\r\n\r\n if(options.paddingTop){\r\n $(this).css('padding-top', options.paddingTop);\r\n }\r\n\r\n if(options.paddingBottom){\r\n $(this).css('padding-bottom', options.paddingBottom);\r\n }\r\n\r\n if (typeof options.sectionsColor[index] !== 'undefined') {\r\n $(this).css('background-color', options.sectionsColor[index]);\r\n }\r\n\r\n if (typeof options.anchors[index] !== 'undefined') {\r\n $(this).attr('data-anchor', options.anchors[index]);\r\n\r\n //activating the menu / nav element on load\r\n if($(this).hasClass(ACTIVE)){\r\n activateMenuAndNav(options.anchors[index], index);\r\n }\r\n }\r\n\r\n // if there's any slide\r\n if (numSlides > 0) {\r\n var sliderWidth = numSlides * 100;\r\n var slideWidth = 100 / numSlides;\r\n\r\n slides.wrapAll('
');\r\n slides.parent().wrap('
');\r\n\r\n $(this).find(SLIDES_CONTAINER_SEL).css('width', sliderWidth + '%');\r\n\r\n if(options.controlArrows && numSlides > 1){\r\n createSlideArrows($(this));\r\n }\r\n\r\n if(options.slidesNavigation){\r\n addSlidesNavigation($(this), numSlides);\r\n }\r\n\r\n slides.each(function(index) {\r\n $(this).css('width', slideWidth + '%');\r\n\r\n if(options.verticalCentered){\r\n addTableClass($(this));\r\n }\r\n });\r\n\r\n var startingSlide = that.find(SLIDE_ACTIVE_SEL);\r\n\r\n //if the slide won#t be an starting point, the default will be the first one\r\n if(!startingSlide.length){\r\n slides.eq(0).addClass(ACTIVE);\r\n }\r\n\r\n //is there a starting point for a non-starting section?\r\n else{\r\n silentLandscapeScroll(startingSlide);\r\n }\r\n\r\n }else{\r\n if(options.verticalCentered){\r\n addTableClass($(this));\r\n }\r\n }\r\n\r\n }).promise().done(function(){\r\n FP.setAutoScrolling(options.autoScrolling, 'internal');\r\n\r\n //the starting point is a slide?\r\n var activeSlide = $(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL);\r\n\r\n //the active section isn't the first one? Is not the first slide of the first section? Then we load that section/slide by default.\r\n if( activeSlide.length && ($(SECTION_ACTIVE_SEL).index(SECTION_SEL) !== 0 || ($(SECTION_ACTIVE_SEL).index(SECTION_SEL) === 0 && activeSlide.index() !== 0))){\r\n silentLandscapeScroll(activeSlide);\r\n }\r\n\r\n //fixed elements need to be moved out of the plugin container due to problems with CSS3.\r\n if(options.fixedElements && options.css3){\r\n $(options.fixedElements).appendTo($body);\r\n }\r\n\r\n //vertical centered of the navigation + first bullet active\r\n if(options.navigation){\r\n nav.css('margin-top', '-' + (nav.height()/2) + 'px');\r\n nav.find('li').eq($(SECTION_ACTIVE_SEL).index(SECTION_SEL)).find('a').addClass(ACTIVE);\r\n }\r\n\r\n //moving the menu outside the main container if it is inside (avoid problems with fixed positions when using CSS3 tranforms)\r\n if(options.menu && options.css3 && $(options.menu).closest(WRAPPER_SEL).length){\r\n $(options.menu).appendTo($body);\r\n }\r\n\r\n if(options.scrollOverflow){\r\n if(document.readyState === 'complete'){\r\n createSlimScrollingHandler();\r\n }\r\n //after DOM and images are loaded\r\n $window.on('load', createSlimScrollingHandler);\r\n }else{\r\n afterRenderActions();\r\n }\r\n\r\n responsive();\r\n\r\n //for animateAnchor:false\r\n if(!options.animateAnchor){\r\n //getting the anchor link in the URL and deleting the `#`\r\n var value = window.location.hash.replace('#', '').split('/');\r\n var destiny = value[0];\r\n\r\n if(destiny.length){\r\n var section = $('[data-anchor=\"'+destiny+'\"]');\r\n\r\n if(section.length){\r\n if(options.autoScrolling){\r\n silentScroll(section.position().top);\r\n }\r\n else{\r\n silentScroll(0);\r\n\r\n //scrolling the page to the section with no animation\r\n $htmlBody.scrollTop(section.position().top);\r\n }\r\n activateMenuAndNav(destiny, null);\r\n\r\n $.isFunction( options.afterLoad ) && options.afterLoad.call( section, destiny, (section.index(SECTION_SEL) + 1));\r\n\r\n //updating the active class\r\n section.addClass(ACTIVE).siblings().removeClass(ACTIVE);\r\n }\r\n }\r\n }\r\n\r\n //setting the class for the body element\r\n setBodyClass();\r\n\r\n $window.on('load', function() {\r\n scrollToAnchor();\r\n });\r\n\r\n });\r\n\r\n\r\n /**\r\n * Creates the control arrows for the given section\r\n */\r\n function createSlideArrows(section){\r\n section.find(SLIDES_WRAPPER_SEL).after('
');\r\n\r\n if(options.controlArrowColor!='#fff'){\r\n section.find(SLIDES_ARROW_NEXT_SEL).css('border-color', 'transparent transparent transparent '+options.controlArrowColor);\r\n section.find(SLIDES_ARROW_PREV_SEL).css('border-color', 'transparent '+ options.controlArrowColor + ' transparent transparent');\r\n }\r\n\r\n if(!options.loopHorizontal){\r\n section.find(SLIDES_ARROW_PREV_SEL).hide();\r\n }\r\n }\r\n\r\n /**\r\n * Creates a vertical navigation bar.\r\n */\r\n function addVerticalNavigation(){\r\n $body.append('
    ');\r\n nav = $(SECTION_NAV_SEL);\r\n\r\n nav.addClass(function() {\r\n return options.showActiveTooltip ? SHOW_ACTIVE_TOOLTIP + ' ' + options.navigationPosition : options.navigationPosition;\r\n });\r\n\r\n for (var i = 0; i < $(SECTION_SEL).length; i++) {\r\n var link = '';\r\n if (options.anchors.length) {\r\n link = options.anchors[i];\r\n }\r\n\r\n var li = '
  • ';\r\n\r\n // Only add tooltip if needed (defined by user)\r\n var tooltip = options.navigationTooltips[i];\r\n\r\n if (typeof tooltip !== 'undefined' && tooltip !== '') {\r\n li += '
    ' + tooltip + '
    ';\r\n }\r\n\r\n li += '
  • ';\r\n\r\n nav.find('ul').append(li);\r\n }\r\n }\r\n\r\n /**\r\n * Creates the slim scroll scrollbar for the sections and slides inside them.\r\n */\r\n function createSlimScrollingHandler(){\r\n $(SECTION_SEL).each(function(){\r\n var slides = $(this).find(SLIDE_SEL);\r\n\r\n if(slides.length){\r\n slides.each(function(){\r\n createSlimScrolling($(this));\r\n });\r\n }else{\r\n createSlimScrolling($(this));\r\n }\r\n\r\n });\r\n afterRenderActions();\r\n }\r\n\r\n /**\r\n * Actions and callbacks to fire afterRender\r\n */\r\n function afterRenderActions(){\r\n var section = $(SECTION_ACTIVE_SEL);\r\n\r\n //to solve a bug with slimScroll vendor #1037, #553\r\n section.find('.fp-scrollable').mouseover();\r\n\r\n $.isFunction( options.afterLoad ) && options.afterLoad.call(section, section.data('anchor'), (section.index(SECTION_SEL) + 1));\r\n $.isFunction( options.afterRender ) && options.afterRender.call( this);\r\n }\r\n\r\n var scrollId;\r\n var scrollId2;\r\n var isScrolling = false;\r\n\r\n //when scrolling...\r\n $window.on('scroll', scrollHandler);\r\n\r\n function scrollHandler(){\r\n var currentSection;\r\n\r\n if(!options.autoScrolling || options.scrollBar){\r\n var currentScroll = $window.scrollTop();\r\n var visibleSectionIndex = 0;\r\n var initial = Math.abs(currentScroll - document.querySelectorAll(SECTION_SEL)[0].offsetTop);\r\n\r\n //taking the section which is showing more content in the viewport\r\n var sections = document.querySelectorAll(SECTION_SEL);\r\n for (var i = 0; i < sections.length; ++i) {\r\n var section = sections[i];\r\n\r\n var current = Math.abs(currentScroll - section.offsetTop);\r\n\r\n if(current < initial){\r\n visibleSectionIndex = i;\r\n initial = current;\r\n }\r\n }\r\n\r\n //geting the last one, the current one on the screen\r\n currentSection = $(sections).eq(visibleSectionIndex);\r\n }\r\n\r\n if(!options.autoScrolling || options.scrollBar){\r\n //executing only once the first time we reach the section\r\n if(!currentSection.hasClass(ACTIVE)){\r\n isScrolling = true;\r\n var leavingSection = $(SECTION_ACTIVE_SEL);\r\n var leavingSectionIndex = leavingSection.index(SECTION_SEL) + 1;\r\n var yMovement = getYmovement(currentSection);\r\n var anchorLink = currentSection.data('anchor');\r\n var sectionIndex = currentSection.index(SECTION_SEL) + 1;\r\n var activeSlide = currentSection.find(SLIDE_ACTIVE_SEL);\r\n\r\n if(activeSlide.length){\r\n var slideAnchorLink = activeSlide.data('anchor');\r\n var slideIndex = activeSlide.index();\r\n }\r\n\r\n if(canScroll){\r\n currentSection.addClass(ACTIVE).siblings().removeClass(ACTIVE);\r\n\r\n $.isFunction( options.onLeave ) && options.onLeave.call( leavingSection, leavingSectionIndex, sectionIndex, yMovement);\r\n\r\n $.isFunction( options.afterLoad ) && options.afterLoad.call( currentSection, anchorLink, sectionIndex);\r\n\r\n activateMenuAndNav(anchorLink, sectionIndex - 1);\r\n\r\n if(options.anchors.length){\r\n //needed to enter in hashChange event when using the menu with anchor links\r\n lastScrolledDestiny = anchorLink;\r\n\r\n setState(slideIndex, slideAnchorLink, anchorLink, sectionIndex);\r\n }\r\n }\r\n\r\n //small timeout in order to avoid entering in hashChange event when scrolling is not finished yet\r\n clearTimeout(scrollId);\r\n scrollId = setTimeout(function(){\r\n isScrolling = false;\r\n }, 100);\r\n }\r\n\r\n if(options.fitToSection){\r\n //for the auto adjust of the viewport to fit a whole section\r\n clearTimeout(scrollId2);\r\n\r\n scrollId2 = setTimeout(function(){\r\n if(canScroll){\r\n //allows to scroll to an active section and\r\n //if the section is already active, we prevent firing callbacks\r\n if($(SECTION_ACTIVE_SEL).is(currentSection)){\r\n isResizing = true;\r\n }\r\n scrollPage(currentSection);\r\n isResizing = false;\r\n }\r\n }, 1000);\r\n }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Determines whether the active section or slide is scrollable through and scrolling bar\r\n */\r\n function isScrollable(activeSection){\r\n //if there are landscape slides, we check if the scrolling bar is in the current one or not\r\n if(activeSection.find(SLIDES_WRAPPER_SEL).length){\r\n return activeSection.find(SLIDE_ACTIVE_SEL).find(SCROLLABLE_SEL);\r\n }\r\n\r\n return activeSection.find(SCROLLABLE_SEL);\r\n }\r\n\r\n /**\r\n * Determines the way of scrolling up or down:\r\n * by 'automatically' scrolling a section or by using the default and normal scrolling.\r\n */\r\n function scrolling(type, scrollable){\r\n if (!isScrollAllowed[type]){\r\n return;\r\n }\r\n var check, scrollSection;\r\n\r\n if(type == 'down'){\r\n check = 'bottom';\r\n scrollSection = FP.moveSectionDown;\r\n }else{\r\n check = 'top';\r\n scrollSection = FP.moveSectionUp;\r\n }\r\n\r\n if(scrollable.length > 0 ){\r\n //is the scrollbar at the start/end of the scroll?\r\n if(isScrolled(check, scrollable)){\r\n scrollSection();\r\n }else{\r\n return true;\r\n }\r\n }else{\r\n // moved up/down\r\n scrollSection();\r\n }\r\n }\r\n\r\n\r\n var touchStartY = 0;\r\n var touchStartX = 0;\r\n var touchEndY = 0;\r\n var touchEndX = 0;\r\n\r\n /* Detecting touch events\r\n\r\n * As we are changing the top property of the page on scrolling, we can not use the traditional way to detect it.\r\n * This way, the touchstart and the touch moves shows an small difference between them which is the\r\n * used one to determine the direction.\r\n */\r\n function touchMoveHandler(event){\r\n var e = event.originalEvent;\r\n\r\n // additional: if one of the normalScrollElements isn't within options.normalScrollElementTouchThreshold hops up the DOM chain\r\n if (!checkParentForNormalScrollElement(event.target) && isReallyTouch(e) ) {\r\n\r\n if(options.autoScrolling){\r\n //preventing the easing on iOS devices\r\n event.preventDefault();\r\n }\r\n\r\n var activeSection = $(SECTION_ACTIVE_SEL);\r\n var scrollable = isScrollable(activeSection);\r\n\r\n if (canScroll && !slideMoving) { //if theres any #\r\n var touchEvents = getEventsPage(e);\r\n\r\n touchEndY = touchEvents.y;\r\n touchEndX = touchEvents.x;\r\n\r\n //if movement in the X axys is greater than in the Y and the currect section has slides...\r\n if (activeSection.find(SLIDES_WRAPPER_SEL).length && Math.abs(touchStartX - touchEndX) > (Math.abs(touchStartY - touchEndY))) {\r\n\r\n //is the movement greater than the minimum resistance to scroll?\r\n if (Math.abs(touchStartX - touchEndX) > ($window.width() / 100 * options.touchSensitivity)) {\r\n if (touchStartX > touchEndX) {\r\n if(isScrollAllowed.right){\r\n FP.moveSlideRight(); //next\r\n }\r\n } else {\r\n if(isScrollAllowed.left){\r\n FP.moveSlideLeft(); //prev\r\n }\r\n }\r\n }\r\n }\r\n\r\n //vertical scrolling (only when autoScrolling is enabled)\r\n else if(options.autoScrolling){\r\n\r\n //is the movement greater than the minimum resistance to scroll?\r\n if (Math.abs(touchStartY - touchEndY) > ($window.height() / 100 * options.touchSensitivity)) {\r\n if (touchStartY > touchEndY) {\r\n scrolling('down', scrollable);\r\n } else if (touchEndY > touchStartY) {\r\n scrolling('up', scrollable);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n /**\r\n * recursive function to loop up the parent nodes to check if one of them exists in options.normalScrollElements\r\n * Currently works well for iOS - Android might need some testing\r\n * @param {Element} el target element / jquery selector (in subsequent nodes)\r\n * @param {int} hop current hop compared to options.normalScrollElementTouchThreshold\r\n * @return {boolean} true if there is a match to options.normalScrollElements\r\n */\r\n function checkParentForNormalScrollElement (el, hop) {\r\n hop = hop || 0;\r\n var parent = $(el).parent();\r\n\r\n if (hop < options.normalScrollElementTouchThreshold &&\r\n parent.is(options.normalScrollElements) ) {\r\n return true;\r\n } else if (hop == options.normalScrollElementTouchThreshold) {\r\n return false;\r\n } else {\r\n return checkParentForNormalScrollElement(parent, ++hop);\r\n }\r\n }\r\n\r\n /**\r\n * As IE >= 10 fires both touch and mouse events when using a mouse in a touchscreen\r\n * this way we make sure that is really a touch event what IE is detecting.\r\n */\r\n function isReallyTouch(e){\r\n //if is not IE || IE is detecting `touch` or `pen`\r\n return typeof e.pointerType === 'undefined' || e.pointerType != 'mouse';\r\n }\r\n\r\n /**\r\n * Handler for the touch start event.\r\n */\r\n function touchStartHandler(event){\r\n var e = event.originalEvent;\r\n\r\n //stopping the auto scroll to adjust to a section\r\n if(options.fitToSection){\r\n $htmlBody.stop();\r\n }\r\n\r\n if(isReallyTouch(e)){\r\n var touchEvents = getEventsPage(e);\r\n touchStartY = touchEvents.y;\r\n touchStartX = touchEvents.x;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the average of the last `number` elements of the given array.\r\n */\r\n function getAverage(elements, number){\r\n var sum = 0;\r\n\r\n //taking `number` elements from the end to make the average, if there are not enought, 1\r\n var lastElements = elements.slice(Math.max(elements.length - number, 1));\r\n\r\n for(var i = 0; i < lastElements.length; i++){\r\n sum = sum + lastElements[i];\r\n }\r\n\r\n return Math.ceil(sum/number);\r\n }\r\n\r\n /**\r\n * Detecting mousewheel scrolling\r\n *\r\n * http://blogs.sitepointstatic.com/examples/tech/mouse-wheel/index.html\r\n * http://www.sitepoint.com/html5-javascript-mouse-wheel/\r\n */\r\n var prevTime = new Date().getTime();\r\n\r\n function MouseWheelHandler(e) {\r\n var curTime = new Date().getTime();\r\n\r\n //autoscrolling and not zooming?\r\n if(options.autoScrolling && !controlPressed){\r\n // cross-browser wheel delta\r\n e = window.event || e;\r\n var value = e.wheelDelta || -e.deltaY || -e.detail;\r\n var delta = Math.max(-1, Math.min(1, value));\r\n\r\n //Limiting the array to 150 (lets not waist memory!)\r\n if(scrollings.length > 149){\r\n scrollings.shift();\r\n }\r\n\r\n //keeping record of the previous scrollings\r\n scrollings.push(Math.abs(value));\r\n\r\n //preventing to scroll the site on mouse wheel when scrollbar is present\r\n if(options.scrollBar){\r\n e.preventDefault ? e.preventDefault() : e.returnValue = false;\r\n }\r\n\r\n var activeSection = $(SECTION_ACTIVE_SEL);\r\n var scrollable = isScrollable(activeSection);\r\n\r\n //time difference between the last scroll and the current one\r\n var timeDiff = curTime-prevTime;\r\n prevTime = curTime;\r\n\r\n //haven't they scrolled in a while?\r\n //(enough to be consider a different scrolling action to scroll another section)\r\n if(timeDiff > 200){\r\n //emptying the array, we dont care about old scrollings for our averages\r\n scrollings = [];\r\n }\r\n\r\n if(canScroll){\r\n var averageEnd = getAverage(scrollings, 10);\r\n var averageMiddle = getAverage(scrollings, 70);\r\n var isAccelerating = averageEnd >= averageMiddle;\r\n\r\n //to avoid double swipes...\r\n if(isAccelerating){\r\n //scrolling down?\r\n if (delta < 0) {\r\n scrolling('down', scrollable);\r\n\r\n //scrolling up?\r\n }else {\r\n scrolling('up', scrollable);\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n if(options.fitToSection){\r\n //stopping the auto scroll to adjust to a section\r\n $htmlBody.stop();\r\n }\r\n }\r\n\r\n /**\r\n * Slides a slider to the given direction.\r\n */\r\n function moveSlide(direction){\r\n var activeSection = $(SECTION_ACTIVE_SEL);\r\n var slides = activeSection.find(SLIDES_WRAPPER_SEL);\r\n\r\n // more than one slide needed and nothing should be sliding\r\n if (!slides.length || slideMoving) {\r\n return;\r\n }\r\n\r\n var currentSlide = slides.find(SLIDE_ACTIVE_SEL);\r\n var destiny = null;\r\n\r\n if(direction === 'prev'){\r\n destiny = currentSlide.prev(SLIDE_SEL);\r\n }else{\r\n destiny = currentSlide.next(SLIDE_SEL);\r\n }\r\n\r\n //isn't there a next slide in the secuence?\r\n if(!destiny.length){\r\n //respect loopHorizontal settin\r\n if (!options.loopHorizontal) return;\r\n\r\n if(direction === 'prev'){\r\n destiny = currentSlide.siblings(':last');\r\n }else{\r\n destiny = currentSlide.siblings(':first');\r\n }\r\n }\r\n\r\n slideMoving = true;\r\n\r\n landscapeScroll(slides, destiny);\r\n }\r\n\r\n /**\r\n * Maintains the active slides in the viewport\r\n * (Because he `scroll` animation might get lost with some actions, such as when using continuousVertical)\r\n */\r\n function keepSlidesPosition(){\r\n $(SLIDE_ACTIVE_SEL).each(function(){\r\n silentLandscapeScroll($(this), 'internal');\r\n });\r\n }\r\n\r\n /**\r\n * Scrolls the site to the given element and scrolls to the slide if a callback is given.\r\n */\r\n function scrollPage(element, callback, isMovementUp){\r\n var dest = element.position();\r\n if(typeof dest === 'undefined'){ return; } //there's no element to scroll, leaving the function\r\n\r\n //local variables\r\n var v = {\r\n element: element,\r\n callback: callback,\r\n isMovementUp: isMovementUp,\r\n dest: dest,\r\n dtop: dest.top,\r\n yMovement: getYmovement(element),\r\n anchorLink: element.data('anchor'),\r\n sectionIndex: element.index(SECTION_SEL),\r\n activeSlide: element.find(SLIDE_ACTIVE_SEL),\r\n activeSection: $(SECTION_ACTIVE_SEL),\r\n leavingSection: $(SECTION_ACTIVE_SEL).index(SECTION_SEL) + 1,\r\n\r\n //caching the value of isResizing at the momment the function is called\r\n //because it will be checked later inside a setTimeout and the value might change\r\n localIsResizing: isResizing\r\n };\r\n\r\n //quiting when destination scroll is the same as the current one\r\n if((v.activeSection.is(element) && !isResizing) || (options.scrollBar && $window.scrollTop() === v.dtop)){ return; }\r\n\r\n if(v.activeSlide.length){\r\n var slideAnchorLink = v.activeSlide.data('anchor');\r\n var slideIndex = v.activeSlide.index();\r\n }\r\n\r\n // If continuousVertical && we need to wrap around\r\n if (options.autoScrolling && options.continuousVertical && typeof (v.isMovementUp) !== \"undefined\" &&\r\n ((!v.isMovementUp && v.yMovement == 'up') || // Intending to scroll down but about to go up or\r\n (v.isMovementUp && v.yMovement == 'down'))) { // intending to scroll up but about to go down\r\n\r\n v = createInfiniteSections(v);\r\n }\r\n\r\n element.addClass(ACTIVE).siblings().removeClass(ACTIVE);\r\n\r\n //preventing from activating the MouseWheelHandler event\r\n //more than once if the page is scrolling\r\n canScroll = false;\r\n\r\n setState(slideIndex, slideAnchorLink, v.anchorLink, v.sectionIndex);\r\n\r\n //callback (onLeave) if the site is not just resizing and readjusting the slides\r\n $.isFunction(options.onLeave) && !v.localIsResizing && options.onLeave.call(v.activeSection, v.leavingSection, (v.sectionIndex + 1), v.yMovement);\r\n\r\n performMovement(v);\r\n\r\n //flag to avoid callingn `scrollPage()` twice in case of using anchor links\r\n lastScrolledDestiny = v.anchorLink;\r\n\r\n //avoid firing it twice (as it does also on scroll)\r\n activateMenuAndNav(v.anchorLink, v.sectionIndex);\r\n }\r\n\r\n /**\r\n * Performs the movement (by CSS3 or by jQuery)\r\n */\r\n function performMovement(v){\r\n // using CSS3 translate functionality\r\n if (options.css3 && options.autoScrolling && !options.scrollBar) {\r\n\r\n var translate3d = 'translate3d(0px, -' + v.dtop + 'px, 0px)';\r\n transformContainer(translate3d, true);\r\n\r\n //even when the scrollingSpeed is 0 there's a little delay, which might cause the\r\n //scrollingSpeed to change in case of using silentMoveTo();\r\n if(options.scrollingSpeed){\r\n setTimeout(function () {\r\n afterSectionLoads(v);\r\n }, options.scrollingSpeed);\r\n }else{\r\n afterSectionLoads(v);\r\n }\r\n }\r\n\r\n // using jQuery animate\r\n else{\r\n var scrollSettings = getScrollSettings(v);\r\n\r\n $(scrollSettings.element).animate(\r\n scrollSettings.options,\r\n options.scrollingSpeed, options.easing).promise().done(function () { //only one single callback in case of animating `html, body`\r\n afterSectionLoads(v);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets the scrolling settings depending on the plugin autoScrolling option\r\n */\r\n function getScrollSettings(v){\r\n var scroll = {};\r\n\r\n if(options.autoScrolling && !options.scrollBar){\r\n scroll.options = { 'top': -v.dtop};\r\n scroll.element = WRAPPER_SEL;\r\n }else{\r\n scroll.options = { 'scrollTop': v.dtop};\r\n scroll.element = 'html, body';\r\n }\r\n\r\n return scroll;\r\n }\r\n\r\n /**\r\n * Adds sections before or after the current one to create the infinite effect.\r\n */\r\n function createInfiniteSections(v){\r\n // Scrolling down\r\n if (!v.isMovementUp) {\r\n // Move all previous sections to after the active section\r\n $(SECTION_ACTIVE_SEL).after(v.activeSection.prevAll(SECTION_SEL).get().reverse());\r\n }\r\n else { // Scrolling up\r\n // Move all next sections to before the active section\r\n $(SECTION_ACTIVE_SEL).before(v.activeSection.nextAll(SECTION_SEL));\r\n }\r\n\r\n // Maintain the displayed position (now that we changed the element order)\r\n silentScroll($(SECTION_ACTIVE_SEL).position().top);\r\n\r\n // Maintain the active slides visible in the viewport\r\n keepSlidesPosition();\r\n\r\n // save for later the elements that still need to be reordered\r\n v.wrapAroundElements = v.activeSection;\r\n\r\n // Recalculate animation variables\r\n v.dest = v.element.position();\r\n v.dtop = v.dest.top;\r\n v.yMovement = getYmovement(v.element);\r\n\r\n return v;\r\n }\r\n\r\n /**\r\n * Fix section order after continuousVertical changes have been animated\r\n */\r\n function continuousVerticalFixSectionOrder (v) {\r\n // If continuousVertical is in effect (and autoScrolling would also be in effect then),\r\n // finish moving the elements around so the direct navigation will function more simply\r\n if (!v.wrapAroundElements || !v.wrapAroundElements.length) {\r\n return;\r\n }\r\n\r\n if (v.isMovementUp) {\r\n $(SECTION_FIRST_SEL).before(v.wrapAroundElements);\r\n }\r\n else {\r\n $(SECTION_LAST_SEL).after(v.wrapAroundElements);\r\n }\r\n\r\n silentScroll($(SECTION_ACTIVE_SEL).position().top);\r\n\r\n // Maintain the active slides visible in the viewport\r\n keepSlidesPosition();\r\n }\r\n\r\n\r\n /**\r\n * Actions to do once the section is loaded\r\n */\r\n function afterSectionLoads (v){\r\n continuousVerticalFixSectionOrder(v);\r\n\r\n v.element.find('.fp-scrollable').mouseover();\r\n\r\n //callback (afterLoad) if the site is not just resizing and readjusting the slides\r\n $.isFunction(options.afterLoad) && !v.localIsResizing && options.afterLoad.call(v.element, v.anchorLink, (v.sectionIndex + 1));\r\n\r\n canScroll = true;\r\n\r\n $.isFunction(v.callback) && v.callback.call(this);\r\n }\r\n\r\n /**\r\n * Scrolls to the anchor in the URL when loading the site\r\n */\r\n function scrollToAnchor(){\r\n //getting the anchor link in the URL and deleting the `#`\r\n var value = window.location.hash.replace('#', '').split('/');\r\n var section = value[0];\r\n var slide = value[1];\r\n\r\n if(section){ //if theres any #\r\n scrollPageAndSlide(section, slide);\r\n }\r\n }\r\n\r\n //detecting any change on the URL to scroll to the given anchor link\r\n //(a way to detect back history button as we play with the hashes on the URL)\r\n $window.on('hashchange', hashChangeHandler);\r\n\r\n function hashChangeHandler(){\r\n if(!isScrolling){\r\n var value = window.location.hash.replace('#', '').split('/');\r\n var section = value[0];\r\n var slide = value[1];\r\n\r\n if(section.length){\r\n //when moving to a slide in the first section for the first time (first time to add an anchor to the URL)\r\n var isFirstSlideMove = (typeof lastScrolledDestiny === 'undefined');\r\n var isFirstScrollMove = (typeof lastScrolledDestiny === 'undefined' && typeof slide === 'undefined' && !slideMoving);\r\n\r\n /*in order to call scrollpage() only once for each destination at a time\r\n It is called twice for each scroll otherwise, as in case of using anchorlinks `hashChange`\r\n event is fired on every scroll too.*/\r\n if ((section && section !== lastScrolledDestiny) && !isFirstSlideMove || isFirstScrollMove || (!slideMoving && lastScrolledSlide != slide )) {\r\n scrollPageAndSlide(section, slide);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sliding with arrow keys, both, vertical and horizontal\r\n */\r\n $document.keydown(keydownHandler);\r\n\r\n //to prevent scrolling while zooming\r\n $document.keyup(function(e){\r\n controlPressed = e.ctrlKey;\r\n });\r\n\r\n var keydownId;\r\n function keydownHandler(e) {\r\n clearTimeout(keydownId);\r\n controlPressed = e.ctrlKey;\r\n\r\n var activeElement = $(document.activeElement);\r\n\r\n if(!activeElement.is('textarea') && !activeElement.is('input') && !activeElement.is('select') &&\r\n options.keyboardScrolling && options.autoScrolling){\r\n var keyCode = e.which;\r\n\r\n //preventing the scroll with arrow keys & spacebar & Page Up & Down keys\r\n var keyControls = [40, 38, 32, 33, 34];\r\n if($.inArray(keyCode, keyControls) > -1){\r\n e.preventDefault();\r\n }\r\n\r\n keydownId = setTimeout(function(){\r\n onkeydown(e);\r\n },150);\r\n }\r\n }\r\n\r\n /**\r\n * Keydown event\r\n */\r\n function onkeydown(e){\r\n var shiftPressed = e.shiftKey;\r\n switch (e.which) {\r\n //up\r\n case 38:\r\n case 33:\r\n FP.moveSectionUp();\r\n break;\r\n\r\n //down\r\n case 32: //spacebar\r\n if(shiftPressed){\r\n FP.moveSectionUp();\r\n break;\r\n }\r\n case 40:\r\n case 34:\r\n FP.moveSectionDown();\r\n break;\r\n\r\n //Home\r\n case 36:\r\n FP.moveTo(1);\r\n break;\r\n\r\n //End\r\n case 35:\r\n FP.moveTo( $(SECTION_SEL).length );\r\n break;\r\n\r\n //left\r\n case 37:\r\n FP.moveSlideLeft();\r\n break;\r\n\r\n //right\r\n case 39:\r\n FP.moveSlideRight();\r\n break;\r\n\r\n default:\r\n return; // exit this handler for other keys\r\n }\r\n }\r\n\r\n //binding the mousemove when the mouse's middle button is released\r\n container.mousedown(function(e){\r\n //middle button\r\n if (e.which == 2){\r\n oldPageY = e.pageY;\r\n container.on('mousemove', mouseMoveHandler);\r\n }\r\n });\r\n\r\n //unbinding the mousemove when the mouse's middle button is released\r\n container.mouseup(function(e){\r\n //middle button\r\n if (e.which == 2){\r\n container.off('mousemove');\r\n }\r\n });\r\n\r\n /**\r\n * Detecting the direction of the mouse movement.\r\n * Used only for the middle button of the mouse.\r\n */\r\n var oldPageY = 0;\r\n function mouseMoveHandler(e){\r\n // moving up\r\n if(canScroll){\r\n if (e.pageY < oldPageY){\r\n FP.moveSectionUp();\r\n\r\n // moving downw\r\n }else if(e.pageY > oldPageY){\r\n FP.moveSectionDown();\r\n }\r\n }\r\n oldPageY = e.pageY;\r\n }\r\n\r\n /**\r\n * Scrolls to the section when clicking the navigation bullet\r\n */\r\n $document.on('click touchstart', SECTION_NAV_SEL + ' a', function(e){\r\n e.preventDefault();\r\n var index = $(this).parent().index();\r\n scrollPage($(SECTION_SEL).eq(index));\r\n });\r\n\r\n /**\r\n * Scrolls the slider to the given slide destination for the given section\r\n */\r\n $document.on('click touchstart', SLIDES_NAV_LINK_SEL, function(e){\r\n e.preventDefault();\r\n var slides = $(this).closest(SECTION_SEL).find(SLIDES_WRAPPER_SEL);\r\n var destiny = slides.find(SLIDE_SEL).eq($(this).closest('li').index());\r\n\r\n landscapeScroll(slides, destiny);\r\n });\r\n\r\n /**\r\n * Applying normalScroll elements.\r\n * Ignoring the scrolls over the specified selectors.\r\n */\r\n if(options.normalScrollElements){\r\n $document.on('mouseenter', options.normalScrollElements, function () {\r\n FP.setMouseWheelScrolling(false);\r\n });\r\n\r\n $document.on('mouseleave', options.normalScrollElements, function(){\r\n FP.setMouseWheelScrolling(true);\r\n });\r\n }\r\n\r\n /**\r\n * Scrolling horizontally when clicking on the slider controls.\r\n */\r\n\t\t var flag = false;\r\n $(SECTION_SEL).on('click touchstart', SLIDES_ARROW_SEL, function() {\r\n\t\t\tif (!flag) {\r\n\t\t\t\tflag = true;\r\n\t\t\t\tsetTimeout(function(){ flag = false; }, 500);\r\n\t\t\t\tif ($(this).hasClass(SLIDES_PREV)) {\r\n\t\t\t\t\tif(isScrollAllowed.left){\r\n\t\t\t\t\t\tFP.moveSlideLeft();\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif(isScrollAllowed.right){\r\n\t\t\t\t\t\tFP.moveSlideRight();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n });\r\n\r\n /**\r\n * Scrolls horizontal sliders.\r\n */\r\n function landscapeScroll(slides, destiny){\r\n var destinyPos = destiny.position();\r\n var slideIndex = destiny.index();\r\n var section = slides.closest(SECTION_SEL);\r\n var sectionIndex = section.index(SECTION_SEL);\r\n var anchorLink = section.data('anchor');\r\n var slidesNav = section.find(SLIDES_NAV_SEL);\r\n var slideAnchor = getSlideAnchor(destiny);\r\n\r\n //caching the value of isResizing at the momment the function is called\r\n //because it will be checked later inside a setTimeout and the value might change\r\n var localIsResizing = isResizing;\r\n\r\n if(options.onSlideLeave){\r\n var prevSlide = section.find(SLIDE_ACTIVE_SEL);\r\n var prevSlideIndex = prevSlide.index();\r\n var xMovement = getXmovement(prevSlideIndex, slideIndex);\r\n\r\n //if the site is not just resizing and readjusting the slides\r\n if(!localIsResizing && xMovement!=='none'){\r\n $.isFunction( options.onSlideLeave ) && options.onSlideLeave.call( prevSlide, anchorLink, (sectionIndex + 1), prevSlideIndex, xMovement);\r\n }\r\n }\r\n\r\n destiny.addClass(ACTIVE).siblings().removeClass(ACTIVE);\r\n\r\n if(!options.loopHorizontal && options.controlArrows){\r\n //hidding it for the fist slide, showing for the rest\r\n section.find(SLIDES_ARROW_PREV_SEL).toggle(slideIndex!==0);\r\n\r\n //hidding it for the last slide, showing for the rest\r\n section.find(SLIDES_ARROW_NEXT_SEL).toggle(!destiny.is(':last-child'));\r\n }\r\n\r\n //only changing the URL if the slides are in the current section (not for resize re-adjusting)\r\n if(section.hasClass(ACTIVE)){\r\n setState(slideIndex, slideAnchor, anchorLink, sectionIndex);\r\n }\r\n\r\n var afterSlideLoads = function(){\r\n //if the site is not just resizing and readjusting the slides\r\n if(!localIsResizing){\r\n $.isFunction( options.afterSlideLoad ) && options.afterSlideLoad.call( destiny, anchorLink, (sectionIndex + 1), slideAnchor, slideIndex);\r\n }\r\n //letting them slide again\r\n slideMoving = false;\r\n };\r\n\r\n\r\n var beforeScroll = function(left){\r\n //if the site is not just resizing and readjusting the slides\r\n if(!localIsResizing){\r\n $.isFunction( options.beforeScroll ) && options.beforeScroll.call(destiny, left);\r\n }\r\n //letting them slide again\r\n slideMoving = false;\r\n };\r\n\r\n if(options.css3){\r\n var translate3d = 'translate3d(-' + Math.round(destinyPos.left) + 'px, 0px, 0px)';\r\n\r\n addAnimation(slides.find(SLIDES_CONTAINER_SEL), options.scrollingSpeed>0).css(getTransforms(translate3d));\r\n beforeScroll(destinyPos.left);\r\n setTimeout(function(){\r\n afterSlideLoads();\r\n }, options.scrollingSpeed, options.easing);\r\n }else{\r\n slides.animate({\r\n scrollLeft : Math.round(destinyPos.left)\r\n }, options.scrollingSpeed, options.easing, function() {\r\n beforeScroll(destinyPos.left);\r\n afterSlideLoads();\r\n });\r\n }\r\n\r\n slidesNav.find(ACTIVE_SEL).removeClass(ACTIVE);\r\n slidesNav.find('li').eq(slideIndex).find('a').addClass(ACTIVE);\r\n }\r\n\r\n //when resizing the site, we adjust the heights of the sections, slimScroll...\r\n $window.resize(resizeHandler);\r\n\r\n var previousHeight = windowsHeight;\r\n var resizeId;\r\n function resizeHandler(){\r\n //checking if it needs to get responsive\r\n responsive();\r\n\r\n // rebuild immediately on touch devices\r\n if (isTouchDevice) {\r\n var activeElement = $(document.activeElement);\r\n\r\n //if the keyboard is NOT visible\r\n if (!activeElement.is('textarea') && !activeElement.is('input') && !activeElement.is('select')) {\r\n var currentHeight = $window.height();\r\n\r\n //making sure the change in the viewport size is enough to force a rebuild. (20 % of the window to avoid problems when hidding scroll bars)\r\n if( Math.abs(currentHeight - previousHeight) > (20 * Math.max(previousHeight, currentHeight) / 100) ){\r\n FP.reBuild(true);\r\n previousHeight = currentHeight;\r\n }\r\n }\r\n }else{\r\n //in order to call the functions only when the resize is finished\r\n //http://stackoverflow.com/questions/4298612/jquery-how-to-call-resize-event-only-once-its-finished-resizing\r\n clearTimeout(resizeId);\r\n\r\n resizeId = setTimeout(function(){\r\n FP.reBuild(true);\r\n }, 350);\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the site needs to get responsive and disables autoScrolling if so.\r\n * A class `fp-responsive` is added to the plugin's container in case the user wants to use it for his own responsive CSS.\r\n */\r\n function responsive(){\r\n if(options.responsive){\r\n var isResponsive = container.hasClass(RESPONSIVE);\r\n if ($window.width() < options.responsive ){\r\n if(!isResponsive){\r\n FP.setAutoScrolling(false, 'internal');\r\n FP.setFitToSection(false, 'internal');\r\n $(SECTION_NAV_SEL).hide();\r\n container.addClass(RESPONSIVE);\r\n }\r\n }else if(isResponsive){\r\n FP.setAutoScrolling(originals.autoScrolling, 'internal');\r\n FP.setFitToSection(originals.autoScrolling, 'internal');\r\n $(SECTION_NAV_SEL).show();\r\n container.removeClass(RESPONSIVE);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Adds transition animations for the given element\r\n */\r\n function addAnimation(element){\r\n var transition = 'all ' + options.scrollingSpeed + 'ms ' + options.easingcss3;\r\n\r\n element.removeClass(NO_TRANSITION);\r\n return element.css({\r\n '-webkit-transition': transition,\r\n 'transition': transition\r\n });\r\n }\r\n\r\n /**\r\n * Remove transition animations for the given element\r\n */\r\n function removeAnimation(element){\r\n return element.addClass(NO_TRANSITION);\r\n }\r\n\r\n /**\r\n * Resizing of the font size depending on the window size as well as some of the images on the site.\r\n */\r\n function resizeMe(displayHeight, displayWidth) {\r\n //Standard dimensions, for which the body font size is correct\r\n var preferredHeight = 825;\r\n var preferredWidth = 900;\r\n\r\n if (displayHeight < preferredHeight || displayWidth < preferredWidth) {\r\n var heightPercentage = (displayHeight * 100) / preferredHeight;\r\n var widthPercentage = (displayWidth * 100) / preferredWidth;\r\n var percentage = Math.min(heightPercentage, widthPercentage);\r\n var newFontSize = percentage.toFixed(2);\r\n\r\n $body.css('font-size', newFontSize + '%');\r\n } else {\r\n $body.css('font-size', '100%');\r\n }\r\n }\r\n\r\n /**\r\n * Activating the website navigation dots according to the given slide name.\r\n */\r\n function activateNavDots(name, sectionIndex){\r\n if(options.navigation){\r\n $(SECTION_NAV_SEL).find(ACTIVE_SEL).removeClass(ACTIVE);\r\n if(name){\r\n $(SECTION_NAV_SEL).find('a[href=\"#' + name + '\"]').addClass(ACTIVE);\r\n }else{\r\n $(SECTION_NAV_SEL).find('li').eq(sectionIndex).find('a').addClass(ACTIVE);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Activating the website main menu elements according to the given slide name.\r\n */\r\n function activateMenuElement(name){\r\n if(options.menu){\r\n $(options.menu).find(ACTIVE_SEL).removeClass(ACTIVE);\r\n $(options.menu).find('[data-menuanchor=\"'+name+'\"]').addClass(ACTIVE);\r\n }\r\n }\r\n\r\n function activateMenuAndNav(anchor, index){\r\n activateMenuElement(anchor);\r\n activateNavDots(anchor, index);\r\n }\r\n\r\n /**\r\n * Return a boolean depending on whether the scrollable element is at the end or at the start of the scrolling\r\n * depending on the given type.\r\n */\r\n function isScrolled(type, scrollable){\r\n if(type === 'top'){\r\n return !scrollable.scrollTop();\r\n }else if(type === 'bottom'){\r\n return scrollable.scrollTop() + 1 + scrollable.innerHeight() >= scrollable[0].scrollHeight;\r\n }\r\n }\r\n\r\n /**\r\n * Retuns `up` or `down` depending on the scrolling movement to reach its destination\r\n * from the current section.\r\n */\r\n function getYmovement(destiny){\r\n var fromIndex = $(SECTION_ACTIVE_SEL).index(SECTION_SEL);\r\n var toIndex = destiny.index(SECTION_SEL);\r\n if( fromIndex == toIndex){\r\n return 'none';\r\n }\r\n if(fromIndex > toIndex){\r\n return 'up';\r\n }\r\n return 'down';\r\n }\r\n\r\n /**\r\n * Retuns `right` or `left` depending on the scrolling movement to reach its destination\r\n * from the current slide.\r\n */\r\n function getXmovement(fromIndex, toIndex){\r\n if( fromIndex == toIndex){\r\n return 'none';\r\n }\r\n if(fromIndex > toIndex){\r\n return 'left';\r\n }\r\n return 'right';\r\n }\r\n\r\n\r\n function createSlimScrolling(element){\r\n //needed to make `scrollHeight` work under Opera 12\r\n element.css('overflow', 'hidden');\r\n\r\n //in case element is a slide\r\n var section = element.closest(SECTION_SEL);\r\n var scrollable = element.find(SCROLLABLE_SEL);\r\n var contentHeight;\r\n\r\n //if there was scroll, the contentHeight will be the one in the scrollable section\r\n if(scrollable.length){\r\n contentHeight = scrollable.get(0).scrollHeight;\r\n }else{\r\n contentHeight = element.get(0).scrollHeight;\r\n if(options.verticalCentered){\r\n contentHeight = element.find(TABLE_CELL_SEL).get(0).scrollHeight;\r\n }\r\n }\r\n\r\n var scrollHeight = windowsHeight - parseInt(section.css('padding-bottom')) - parseInt(section.css('padding-top'));\r\n\r\n //needs scroll?\r\n if ( contentHeight > scrollHeight) {\r\n //was there already an scroll ? Updating it\r\n if(scrollable.length){\r\n scrollable.css('height', scrollHeight + 'px').parent().css('height', scrollHeight + 'px');\r\n }\r\n //creating the scrolling\r\n else{\r\n if(options.verticalCentered){\r\n element.find(TABLE_CELL_SEL).wrapInner('
    ');\r\n }else{\r\n element.wrapInner('
    ');\r\n }\r\n\r\n element.find(SCROLLABLE_SEL).slimScroll({\r\n allowPageScroll: true,\r\n height: scrollHeight + 'px',\r\n size: '10px',\r\n alwaysVisible: true\r\n });\r\n }\r\n }\r\n\r\n //removing the scrolling when it is not necessary anymore\r\n else{\r\n removeSlimScroll(element);\r\n }\r\n\r\n //undo\r\n element.css('overflow', '');\r\n }\r\n\r\n function removeSlimScroll(element){\r\n element.find(SCROLLABLE_SEL).children().first().unwrap().unwrap();\r\n element.find(SLIMSCROLL_BAR_SEL).remove();\r\n element.find(SLIMSCROLL_RAIL_SEL).remove();\r\n }\r\n\r\n function addTableClass(element){\r\n element.addClass(TABLE).wrapInner('
    ');\r\n }\r\n\r\n function getTableHeight(element){\r\n var sectionHeight = windowsHeight;\r\n\r\n if(options.paddingTop || options.paddingBottom){\r\n var section = element;\r\n if(!section.hasClass(SECTION)){\r\n section = element.closest(SECTION_SEL);\r\n }\r\n\r\n var paddings = parseInt(section.css('padding-top')) + parseInt(section.css('padding-bottom'));\r\n sectionHeight = (windowsHeight - paddings);\r\n }\r\n\r\n return sectionHeight;\r\n }\r\n\r\n /**\r\n * Adds a css3 transform property to the container class with or without animation depending on the animated param.\r\n */\r\n function transformContainer(translate3d, animated){\r\n if(animated){\r\n addAnimation(container);\r\n }else{\r\n removeAnimation(container);\r\n }\r\n\r\n container.css(getTransforms(translate3d));\r\n\r\n //syncronously removing the class after the animation has been applied.\r\n setTimeout(function(){\r\n container.removeClass(NO_TRANSITION);\r\n },10);\r\n }\r\n\r\n /**\r\n * Gets a section by its anchor / index\r\n */\r\n function getSectionByAnchor(sectionAnchor){\r\n //section\r\n var section = $(SECTION_SEL + '[data-anchor=\"'+sectionAnchor+'\"]');\r\n if(!section.length){\r\n section = $(SECTION_SEL).eq( (sectionAnchor -1) );\r\n }\r\n\r\n return section;\r\n }\r\n\r\n /**\r\n * Gets a slide inside a given section by its anchor / index\r\n */\r\n function getSlideByAnchor(slideAnchor, section){\r\n var slides = section.find(SLIDES_WRAPPER_SEL);\r\n var slide = slides.find(SLIDE_SEL + '[data-anchor=\"'+slideAnchor+'\"]');\r\n\r\n if(!slide.length){\r\n slide = slides.find(SLIDE_SEL).eq(slideAnchor);\r\n }\r\n\r\n return slide;\r\n }\r\n\r\n /**\r\n * Scrolls to the given section and slide anchors\r\n */\r\n function scrollPageAndSlide(destiny, slide){\r\n var section = getSectionByAnchor(destiny);\r\n\r\n //default slide\r\n if (typeof slide === 'undefined') {\r\n slide = 0;\r\n }\r\n\r\n //we need to scroll to the section and then to the slide\r\n if (destiny !== lastScrolledDestiny && !section.hasClass(ACTIVE)){\r\n scrollPage(section, function(){\r\n scrollSlider(section, slide);\r\n });\r\n }\r\n //if we were already in the section\r\n else{\r\n scrollSlider(section, slide);\r\n }\r\n }\r\n\r\n /**\r\n * Scrolls the slider to the given slide destination for the given section\r\n */\r\n function scrollSlider(section, slideAnchor){\r\n if(typeof slideAnchor !== 'undefined'){\r\n var slides = section.find(SLIDES_WRAPPER_SEL);\r\n var destiny = getSlideByAnchor(slideAnchor, section);\r\n\r\n if(destiny.length){\r\n landscapeScroll(slides, destiny);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a landscape navigation bar with dots for horizontal sliders.\r\n */\r\n function addSlidesNavigation(section, numSlides){\r\n section.append('
      ');\r\n var nav = section.find(SLIDES_NAV_SEL);\r\n\r\n //top or bottom\r\n nav.addClass(options.slidesNavPosition);\r\n\r\n for(var i=0; i< numSlides; i++){\r\n nav.find('ul').append('
    • ');\r\n }\r\n\r\n //centering it\r\n nav.css('margin-left', '-' + (nav.width()/2) + 'px');\r\n\r\n nav.find('li').first().find('a').addClass(ACTIVE);\r\n }\r\n\r\n\r\n /**\r\n * Sets the state of the website depending on the active section/slide.\r\n * It changes the URL hash when needed and updates the body class.\r\n */\r\n function setState(slideIndex, slideAnchor, anchorLink, sectionIndex){\r\n var sectionHash = '';\r\n\r\n if(options.anchors.length){\r\n\r\n //isn't it the first slide?\r\n if(slideIndex){\r\n if(typeof anchorLink !== 'undefined'){\r\n sectionHash = anchorLink;\r\n }\r\n\r\n //slide without anchor link? We take the index instead.\r\n if(typeof slideAnchor === 'undefined'){\r\n slideAnchor = slideIndex;\r\n }\r\n\r\n lastScrolledSlide = slideAnchor;\r\n setUrlHash(sectionHash + '/' + slideAnchor);\r\n\r\n //first slide won't have slide anchor, just the section one\r\n }else if(typeof slideIndex !== 'undefined'){\r\n lastScrolledSlide = slideAnchor;\r\n setUrlHash(anchorLink);\r\n }\r\n\r\n //section without slides\r\n else{\r\n setUrlHash(anchorLink);\r\n }\r\n }\r\n\r\n setBodyClass();\r\n }\r\n\r\n /**\r\n * Sets the URL hash.\r\n */\r\n function setUrlHash(url){\r\n if(options.recordHistory){\r\n location.hash = url;\r\n }else{\r\n //Mobile Chrome doesn't work the normal way, so... lets use HTML5 for phones :)\r\n if(isTouchDevice || isTouch){\r\n history.replaceState(undefined, undefined, '#' + url);\r\n }else{\r\n var baseUrl = window.location.href.split('#')[0];\r\n window.location.replace( baseUrl + '#' + url );\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the anchor for the given slide. Its index will be used if there's none.\r\n */\r\n function getSlideAnchor(slide){\r\n var slideAnchor = slide.data('anchor');\r\n var slideIndex = slide.index();\r\n\r\n //Slide without anchor link? We take the index instead.\r\n if(typeof slideAnchor === 'undefined'){\r\n slideAnchor = slideIndex;\r\n }\r\n\r\n return slideAnchor;\r\n }\r\n\r\n /**\r\n * Sets a class for the body of the page depending on the active section / slide\r\n */\r\n function setBodyClass(){\r\n var section = $(SECTION_ACTIVE_SEL);\r\n var slide = section.find(SLIDE_ACTIVE_SEL);\r\n\r\n var sectionAnchor = section.data('anchor');\r\n var slideAnchor = getSlideAnchor(slide);\r\n\r\n var sectionIndex = section.index(SECTION_SEL);\r\n\r\n var text = String(sectionIndex);\r\n\r\n if(options.anchors.length){\r\n text = sectionAnchor;\r\n }\r\n\r\n if(slide.length){\r\n text = text + '-' + slideAnchor;\r\n }\r\n\r\n //changing slash for dash to make it a valid CSS style\r\n text = text.replace('/', '-').replace('#','');\r\n\r\n //removing previous anchor classes\r\n var classRe = new RegExp('\\\\b\\\\s?' + VIEWING_PREFIX + '-[^\\\\s]+\\\\b', \"g\");\r\n $body[0].className = $body[0].className.replace(classRe, '');\r\n\r\n //adding the current anchor\r\n $body.addClass(VIEWING_PREFIX + '-' + text);\r\n }\r\n\r\n /**\r\n * Checks for translate3d support\r\n * @return boolean\r\n * http://stackoverflow.com/questions/5661671/detecting-transform-translate3d-support\r\n */\r\n function support3d() {\r\n var el = document.createElement('p'),\r\n has3d,\r\n transforms = {\r\n 'webkitTransform':'-webkit-transform',\r\n 'OTransform':'-o-transform',\r\n 'msTransform':'-ms-transform',\r\n 'MozTransform':'-moz-transform',\r\n 'transform':'transform'\r\n };\r\n\r\n // Add it to the body to get the computed style.\r\n document.body.insertBefore(el, null);\r\n\r\n for (var t in transforms) {\r\n if (el.style[t] !== undefined) {\r\n el.style[t] = 'translate3d(1px,1px,1px)';\r\n has3d = window.getComputedStyle(el).getPropertyValue(transforms[t]);\r\n }\r\n }\r\n\r\n document.body.removeChild(el);\r\n\r\n return (has3d !== undefined && has3d.length > 0 && has3d !== 'none');\r\n }\r\n\r\n /**\r\n * Removes the auto scrolling action fired by the mouse wheel and trackpad.\r\n * After this function is called, the mousewheel and trackpad movements won't scroll through sections.\r\n */\r\n function removeMouseWheelHandler(){\r\n if (document.addEventListener) {\r\n document.removeEventListener('mousewheel', MouseWheelHandler, false); //IE9, Chrome, Safari, Oper\r\n document.removeEventListener('wheel', MouseWheelHandler, false); //Firefox\r\n } else {\r\n document.detachEvent('onmousewheel', MouseWheelHandler); //IE 6/7/8\r\n }\r\n }\r\n\r\n /**\r\n * Adds the auto scrolling action for the mouse wheel and trackpad.\r\n * After this function is called, the mousewheel and trackpad movements will scroll through sections\r\n */\r\n function addMouseWheelHandler(){\r\n if (document.addEventListener) {\r\n document.addEventListener('mousewheel', MouseWheelHandler, false); //IE9, Chrome, Safari, Oper\r\n document.addEventListener('wheel', MouseWheelHandler, false); //Firefox\r\n } else {\r\n document.attachEvent('onmousewheel', MouseWheelHandler); //IE 6/7/8\r\n }\r\n }\r\n\r\n /**\r\n * Adds the possibility to auto scroll through sections on touch devices.\r\n */\r\n function addTouchHandler(){\r\n if(isTouchDevice || isTouch){\r\n //Microsoft pointers\r\n var MSPointer = getMSPointer();\r\n\r\n $(WRAPPER_SEL).off('touchstart ' + MSPointer.down).on('touchstart ' + MSPointer.down, touchStartHandler);\r\n $(WRAPPER_SEL).off('touchmove ' + MSPointer.move).on('touchmove ' + MSPointer.move, touchMoveHandler);\r\n }\r\n }\r\n\r\n /**\r\n * Removes the auto scrolling for touch devices.\r\n */\r\n function removeTouchHandler(){\r\n if(isTouchDevice || isTouch){\r\n //Microsoft pointers\r\n var MSPointer = getMSPointer();\r\n\r\n $(WRAPPER_SEL).off('touchstart ' + MSPointer.down);\r\n $(WRAPPER_SEL).off('touchmove ' + MSPointer.move);\r\n }\r\n }\r\n\r\n /*\r\n * Returns and object with Microsoft pointers (for IE<11 and for IE >= 11)\r\n * http://msdn.microsoft.com/en-us/library/ie/dn304886(v=vs.85).aspx\r\n */\r\n function getMSPointer(){\r\n var pointer;\r\n\r\n //IE >= 11 & rest of browsers\r\n if(window.PointerEvent){\r\n pointer = { down: 'pointerdown', move: 'pointermove'};\r\n }\r\n\r\n //IE < 11\r\n else{\r\n pointer = { down: 'MSPointerDown', move: 'MSPointerMove'};\r\n }\r\n\r\n return pointer;\r\n }\r\n\r\n /**\r\n * Gets the pageX and pageY properties depending on the browser.\r\n * https://github.com/alvarotrigo/fullPage.js/issues/194#issuecomment-34069854\r\n */\r\n function getEventsPage(e){\r\n var events = [];\r\n\r\n events.y = (typeof e.pageY !== 'undefined' && (e.pageY || e.pageX) ? e.pageY : e.touches[0].pageY);\r\n events.x = (typeof e.pageX !== 'undefined' && (e.pageY || e.pageX) ? e.pageX : e.touches[0].pageX);\r\n\r\n //in touch devices with scrollBar:true, e.pageY is detected, but we have to deal with touch events. #1008\r\n if(isTouch && isReallyTouch(e)){\r\n events.y = e.touches[0].pageY;\r\n events.x = e.touches[0].pageX;\r\n }\r\n\r\n return events;\r\n }\r\n\r\n /**\r\n * Slides silently (with no animation) the active slider to the given slide.\r\n */\r\n function silentLandscapeScroll(activeSlide, noCallbacks){\r\n FP.setScrollingSpeed (0, 'internal');\r\n\r\n if(typeof noCallbacks !== 'undefined'){\r\n //preventing firing callbacks afterSlideLoad etc.\r\n isResizing = true;\r\n }\r\n\r\n landscapeScroll(activeSlide.closest(SLIDES_WRAPPER_SEL), activeSlide);\r\n\r\n if(typeof noCallbacks !== 'undefined'){\r\n isResizing = false;\r\n }\r\n\r\n FP.setScrollingSpeed(originals.scrollingSpeed, 'internal');\r\n }\r\n\r\n /**\r\n * Scrolls silently (with no animation) the page to the given Y position.\r\n */\r\n function silentScroll(top){\r\n if(options.scrollBar){\r\n container.scrollTop(top);\r\n }\r\n else if (options.css3) {\r\n var translate3d = 'translate3d(0px, -' + top + 'px, 0px)';\r\n transformContainer(translate3d, false);\r\n }\r\n else {\r\n container.css('top', -top);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the cross-browser transform string.\r\n */\r\n function getTransforms(translate3d){\r\n return {\r\n '-webkit-transform': translate3d,\r\n '-moz-transform': translate3d,\r\n '-ms-transform':translate3d,\r\n 'transform': translate3d\r\n };\r\n }\r\n\r\n /**\r\n * Allowing or disallowing the mouse/swipe scroll in a given direction. (not for keyboard)\r\n */\r\n function setIsScrollable(value, direction){\r\n switch (direction){\r\n case 'up': isScrollAllowed.up = value; break;\r\n case 'down': isScrollAllowed.down = value; break;\r\n case 'left': isScrollAllowed.left = value; break;\r\n case 'right': isScrollAllowed.right = value; break;\r\n case 'all': FP.setAllowScrolling(value);\r\n }\r\n }\r\n\r\n /*\r\n * Destroys fullpage.js plugin events and optinally its html markup and styles\r\n */\r\n FP.destroy = function(all){\r\n FP.setAutoScrolling(false, 'internal');\r\n FP.setAllowScrolling(false);\r\n FP.setKeyboardScrolling(false);\r\n container.addClass(DESTROYED);\r\n\r\n $window\r\n .off('scroll', scrollHandler)\r\n .off('hashchange', hashChangeHandler)\r\n .off('resize', resizeHandler);\r\n\r\n $document\r\n .off('click', SECTION_NAV_SEL + ' a')\r\n .off('mouseenter', SECTION_NAV_SEL + ' li')\r\n .off('mouseleave', SECTION_NAV_SEL + ' li')\r\n .off('click', SLIDES_NAV_LINK_SEL)\r\n .off('mouseover', options.normalScrollElements)\r\n .off('mouseout', options.normalScrollElements);\r\n\r\n $(SECTION_SEL)\r\n .off('click', SLIDES_ARROW_SEL);\r\n\r\n //lets make a mess!\r\n if(all){\r\n destroyStructure();\r\n }\r\n };\r\n\r\n /*\r\n * Removes inline styles added by fullpage.js\r\n */\r\n function destroyStructure(){\r\n //reseting the `top` or `translate` properties to 0\r\n silentScroll(0);\r\n\r\n $(SECTION_NAV_SEL + ', ' + SLIDES_NAV_SEL + ', ' + SLIDES_ARROW_SEL).remove();\r\n\r\n //removing inline styles\r\n $(SECTION_SEL).css( {\r\n 'height': '',\r\n 'background-color' : '',\r\n 'padding': ''\r\n });\r\n\r\n $(SLIDE_SEL).css( {\r\n 'width': ''\r\n });\r\n\r\n container.css({\r\n 'height': '',\r\n 'position': '',\r\n '-ms-touch-action': '',\r\n 'touch-action': ''\r\n });\r\n\r\n //removing added classes\r\n $(SECTION_SEL + ', ' + SLIDE_SEL).each(function(){\r\n removeSlimScroll($(this));\r\n $(this).removeClass(TABLE + ' ' + ACTIVE);\r\n });\r\n\r\n removeAnimation(container);\r\n\r\n //Unwrapping content\r\n container.find(TABLE_CELL_SEL + ', ' + SLIDES_CONTAINER_SEL + ', ' + SLIDES_WRAPPER_SEL).each(function(){\r\n //unwrap not being use in case there's no child element inside and its just text\r\n $(this).replaceWith(this.childNodes);\r\n });\r\n\r\n //scrolling the page to the top with no animation\r\n $htmlBody.scrollTop(0);\r\n }\r\n\r\n /*\r\n * Sets the state for a variable with multiple states (original, and temporal)\r\n * Some variables such as `autoScrolling` or `recordHistory` might change automatically its state when using `responsive` or `autoScrolling:false`.\r\n * This function is used to keep track of both states, the original and the temporal one.\r\n * If type is not 'internal', then we assume the user is globally changing the variable.\r\n */\r\n function setVariableState(variable, value, type){\r\n options[variable] = value;\r\n if(type !== 'internal'){\r\n originals[variable] = value;\r\n }\r\n }\r\n\r\n /**\r\n * Displays warnings\r\n */\r\n function displayWarnings(){\r\n // Disable mutually exclusive settings\r\n if (options.continuousVertical &&\r\n (options.loopTop || options.loopBottom)) {\r\n options.continuousVertical = false;\r\n showError('warn', 'Option `loopTop/loopBottom` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled');\r\n }\r\n if(options.continuousVertical && options.scrollBar){\r\n options.continuousVertical = false;\r\n showError('warn', 'Option `scrollBar` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled');\r\n }\r\n\r\n //anchors can not have the same value as any element ID or NAME\r\n $.each(options.anchors, function(index, name){\r\n if($('#' + name).length || $('[name=\"'+name+'\"]').length ){\r\n showError('error', 'data-anchor tags can not have the same value as any `id` element on the site (or `name` element for IE).');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Shows a message in the console of the given type.\r\n */\r\n function showError(type, text){\r\n console && console[type] && console[type]('fullPage: ' + text);\r\n }\r\n };\r\n});\r\n\n/*\n * Lazy Load - jQuery plugin for lazy loading images\n *\n * Copyright (c) 2007-2013 Mika Tuupola\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n * Project home:\n * http://www.appelsiini.net/projects/lazyload\n *\n * Version: 1.9.3\n *\n */\n\n(function($, window, document, undefined) {\n var $window = $(window);\n\n $.fn.lazyload = function(options) {\n var elements = this;\n var $container;\n var settings = {\n threshold : 0,\n failure_limit : 0,\n event : \"scroll\",\n effect : \"show\",\n container : window,\n data_attribute : \"original\",\n skip_invisible : true,\n appear : null,\n load : null,\n placeholder : \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC\"\n };\n\n function update() {\n var counter = 0;\n\n elements.each(function() {\n var $this = $(this);\n if (settings.skip_invisible && !$this.is(\":visible\")) {\n return;\n }\n if ($.abovethetop(this, settings) ||\n $.leftofbegin(this, settings)) {\n /* Nothing. */\n } else if (!$.belowthefold(this, settings) &&\n !$.rightoffold(this, settings)) {\n $this.trigger(\"appear\");\n /* if we found an image we'll load, reset the counter */\n counter = 0;\n } else {\n if (++counter > settings.failure_limit) {\n return false;\n }\n }\n });\n\n }\n\n if(options) {\n /* Maintain BC for a couple of versions. */\n if (undefined !== options.failurelimit) {\n options.failure_limit = options.failurelimit;\n delete options.failurelimit;\n }\n if (undefined !== options.effectspeed) {\n options.effect_speed = options.effectspeed;\n delete options.effectspeed;\n }\n\n $.extend(settings, options);\n }\n\n /* Cache container as jQuery as object. */\n $container = (settings.container === undefined ||\n settings.container === window) ? $window : $(settings.container);\n\n /* Fire one scroll event per scroll. Not one scroll event per image. */\n if (0 === settings.event.indexOf(\"scroll\")) {\n $container.bind(settings.event, function() {\n return update();\n });\n }\n\n this.each(function() {\n var self = this;\n var $self = $(self);\n\n self.loaded = false;\n\n /* If no src attribute given use data:uri. */\n if ($self.attr(\"src\") === undefined || $self.attr(\"src\") === false) {\n if ($self.is(\"img\")) {\n $self.attr(\"src\", settings.placeholder);\n }\n }\n\n /* When appear is triggered load original image. */\n $self.one(\"appear\", function() {\n if (!this.loaded) {\n if (settings.appear) {\n var elements_left = elements.length;\n settings.appear.call(self, elements_left, settings);\n }\n $(\"\")\n .bind(\"load\", function() {\n\n var original = $self.attr(\"data-\" + settings.data_attribute);\n $self.hide();\n if ($self.is(\"img\")) {\n $self.attr(\"src\", original);\n } else {\n $self.css(\"background-image\", \"url('\" + original + \"')\");\n }\n $self[settings.effect](settings.effect_speed);\n\n self.loaded = true;\n\n /* Remove image from array so it is not looped next time. */\n var temp = $.grep(elements, function(element) {\n return !element.loaded;\n });\n elements = $(temp);\n\n if (settings.load) {\n var elements_left = elements.length;\n settings.load.call(self, elements_left, settings);\n }\n })\n .attr(\"src\", $self.attr(\"data-\" + settings.data_attribute));\n }\n });\n\n /* When wanted event is triggered load original image */\n /* by triggering appear. */\n if (0 !== settings.event.indexOf(\"scroll\")) {\n $self.bind(settings.event, function() {\n if (!self.loaded) {\n $self.trigger(\"appear\");\n }\n });\n }\n });\n\n /* Check if something appears when window is resized. */\n $window.bind(\"resize\", function() {\n update();\n });\n\n /* With IOS5 force loading images when navigating with back button. */\n /* Non optimal workaround. */\n if ((/(?:iphone|ipod|ipad).*os 5/gi).test(navigator.appVersion)) {\n $window.bind(\"pageshow\", function(event) {\n if (event.originalEvent && event.originalEvent.persisted) {\n elements.each(function() {\n $(this).trigger(\"appear\");\n });\n }\n });\n }\n\n /* Force initial check if images should appear. */\n $(document).ready(function() {\n update();\n });\n\n return this;\n };\n\n /* Convenience methods in jQuery namespace. */\n /* Use as $.belowthefold(element, {threshold : 100, container : window}) */\n\n $.belowthefold = function(element, settings) {\n var fold;\n\n if (settings.container === undefined || settings.container === window) {\n fold = (window.innerHeight ? window.innerHeight : $window.height()) + $window.scrollTop();\n } else {\n fold = $(settings.container).offset().top + $(settings.container).height();\n }\n\n return fold <= $(element).offset().top - settings.threshold;\n };\n\n $.rightoffold = function(element, settings) {\n var fold;\n\n if (settings.container === undefined || settings.container === window) {\n fold = $window.width() + $window.scrollLeft();\n } else {\n fold = $(settings.container).offset().left + $(settings.container).width();\n }\n\n return fold <= $(element).offset().left - settings.threshold;\n };\n\n $.abovethetop = function(element, settings) {\n var fold;\n\n if (settings.container === undefined || settings.container === window) {\n fold = $window.scrollTop();\n } else {\n fold = $(settings.container).offset().top;\n }\n\n return fold >= $(element).offset().top + settings.threshold + $(element).height();\n };\n\n $.leftofbegin = function(element, settings) {\n var fold;\n\n if (settings.container === undefined || settings.container === window) {\n fold = $window.scrollLeft();\n } else {\n fold = $(settings.container).offset().left;\n }\n\n return fold >= $(element).offset().left + settings.threshold + $(element).width();\n };\n\n $.inviewport = function(element, settings) {\n return !$.rightoffold(element, settings) && !$.leftofbegin(element, settings) &&\n !$.belowthefold(element, settings) && !$.abovethetop(element, settings);\n };\n\n /* Custom selectors for your convenience. */\n /* Use as $(\"img:below-the-fold\").something() or */\n /* $(\"img\").filter(\":below-the-fold\").something() which is faster */\n\n $.extend($.expr[\":\"], {\n \"below-the-fold\" : function(a) { return $.belowthefold(a, {threshold : 0}); },\n \"above-the-top\" : function(a) { return !$.belowthefold(a, {threshold : 0}); },\n \"right-of-screen\": function(a) { return $.rightoffold(a, {threshold : 0}); },\n \"left-of-screen\" : function(a) { return !$.rightoffold(a, {threshold : 0}); },\n \"in-viewport\" : function(a) { return $.inviewport(a, {threshold : 0}); },\n /* Maintain BC for couple of versions. */\n \"above-the-fold\" : function(a) { return !$.belowthefold(a, {threshold : 0}); },\n \"right-of-fold\" : function(a) { return $.rightoffold(a, {threshold : 0}); },\n \"left-of-fold\" : function(a) { return !$.rightoffold(a, {threshold : 0}); }\n });\n\n})(jQuery, window, document);\n\n/*!\n * jQuery Mousewheel 3.1.12\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n(function (factory) {\n if ( typeof define === 'function' && define.amd ) {\n // AMD. Register as an anonymous module.\n define(['jquery'], factory);\n } else if (typeof exports === 'object') {\n // Node/CommonJS style for Browserify\n module.exports = factory;\n } else {\n // Browser globals\n factory(jQuery);\n }\n}(function ($) {\n\n var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],\n toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?\n ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],\n slice = Array.prototype.slice,\n nullLowestDeltaTimeout, lowestDelta;\n\n if ( $.event.fixHooks ) {\n for ( var i = toFix.length; i; ) {\n $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;\n }\n }\n\n var special = $.event.special.mousewheel = {\n version: '3.1.12',\n\n setup: function() {\n if ( this.addEventListener ) {\n for ( var i = toBind.length; i; ) {\n this.addEventListener( toBind[--i], handler, false );\n }\n } else {\n this.onmousewheel = handler;\n }\n // Store the line height and page height for this particular element\n $.data(this, 'mousewheel-line-height', special.getLineHeight(this));\n $.data(this, 'mousewheel-page-height', special.getPageHeight(this));\n },\n\n teardown: function() {\n if ( this.removeEventListener ) {\n for ( var i = toBind.length; i; ) {\n this.removeEventListener( toBind[--i], handler, false );\n }\n } else {\n this.onmousewheel = null;\n }\n // Clean up the data we added to the element\n $.removeData(this, 'mousewheel-line-height');\n $.removeData(this, 'mousewheel-page-height');\n },\n\n getLineHeight: function(elem) {\n var $elem = $(elem),\n $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();\n if (!$parent.length) {\n $parent = $('body');\n }\n return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;\n },\n\n getPageHeight: function(elem) {\n return $(elem).height();\n },\n\n settings: {\n adjustOldDeltas: true, // see shouldAdjustOldDeltas() below\n normalizeOffset: true // calls getBoundingClientRect for each event\n }\n };\n\n $.fn.extend({\n mousewheel: function(fn) {\n return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');\n },\n\n unmousewheel: function(fn) {\n return this.unbind('mousewheel', fn);\n }\n });\n\n\n function handler(event) {\n var orgEvent = event || window.event,\n args = slice.call(arguments, 1),\n delta = 0,\n deltaX = 0,\n deltaY = 0,\n absDelta = 0,\n offsetX = 0,\n offsetY = 0;\n event = $.event.fix(orgEvent);\n event.type = 'mousewheel';\n\n // Old school scrollwheel delta\n if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; }\n if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; }\n if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; }\n if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }\n\n // Firefox < 17 horizontal scrolling related to DOMMouseScroll event\n if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {\n deltaX = deltaY * -1;\n deltaY = 0;\n }\n\n // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy\n delta = deltaY === 0 ? deltaX : deltaY;\n\n // New school wheel delta (wheel event)\n if ( 'deltaY' in orgEvent ) {\n deltaY = orgEvent.deltaY * -1;\n delta = deltaY;\n }\n if ( 'deltaX' in orgEvent ) {\n deltaX = orgEvent.deltaX;\n if ( deltaY === 0 ) { delta = deltaX * -1; }\n }\n\n // No change actually happened, no reason to go any further\n if ( deltaY === 0 && deltaX === 0 ) { return; }\n\n // Need to convert lines and pages to pixels if we aren't already in pixels\n // There are three delta modes:\n // * deltaMode 0 is by pixels, nothing to do\n // * deltaMode 1 is by lines\n // * deltaMode 2 is by pages\n if ( orgEvent.deltaMode === 1 ) {\n var lineHeight = $.data(this, 'mousewheel-line-height');\n delta *= lineHeight;\n deltaY *= lineHeight;\n deltaX *= lineHeight;\n } else if ( orgEvent.deltaMode === 2 ) {\n var pageHeight = $.data(this, 'mousewheel-page-height');\n delta *= pageHeight;\n deltaY *= pageHeight;\n deltaX *= pageHeight;\n }\n\n // Store lowest absolute delta to normalize the delta values\n absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );\n\n if ( !lowestDelta || absDelta < lowestDelta ) {\n lowestDelta = absDelta;\n\n // Adjust older deltas if necessary\n if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\n lowestDelta /= 40;\n }\n }\n\n // Adjust older deltas if necessary\n if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\n // Divide all the things by 40!\n delta /= 40;\n deltaX /= 40;\n deltaY /= 40;\n }\n\n // Get a whole, normalized value for the deltas\n delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta);\n deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);\n deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);\n\n // Normalise offsetX and offsetY properties\n if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {\n var boundingRect = this.getBoundingClientRect();\n offsetX = event.clientX - boundingRect.left;\n offsetY = event.clientY - boundingRect.top;\n }\n\n // Add information to the event object\n event.deltaX = deltaX;\n event.deltaY = deltaY;\n event.deltaFactor = lowestDelta;\n event.offsetX = offsetX;\n event.offsetY = offsetY;\n // Go ahead and set deltaMode to 0 since we converted to pixels\n // Although this is a little odd since we overwrite the deltaX/Y\n // properties with normalized deltas.\n event.deltaMode = 0;\n\n // Add event and delta to the front of the arguments\n args.unshift(event, delta, deltaX, deltaY);\n\n // Clearout lowestDelta after sometime to better\n // handle multiple device types that give different\n // a different lowestDelta\n // Ex: trackpad = 3 and mouse wheel = 120\n if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }\n nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);\n\n return ($.event.dispatch || $.event.handle).apply(this, args);\n }\n\n function nullLowestDelta() {\n lowestDelta = null;\n }\n\n function shouldAdjustOldDeltas(orgEvent, absDelta) {\n // If this is an older event and the delta is divisable by 120,\n // then we are assuming that the browser is treating this as an\n // older mouse wheel event and that we should divide the deltas\n // by 40 to try and get a more usable deltaFactor.\n // Side note, this actually impacts the reported scroll distance\n // in older browsers and can cause scrolling to be slower than native.\n // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.\n return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;\n }\n\n}));\n\n/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)\n * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)\n * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.\n *\n * Version: 1.3.2 (modified for fullpage.js)\n *\n */\n(function($) {\n\n jQuery.fn.extend({\n slimScroll: function(options) {\n\n var defaults = {\n\n // width in pixels of the visible scroll area\n width : 'auto',\n\n // height in pixels of the visible scroll area\n height : '250px',\n\n // width in pixels of the scrollbar and rail\n size : '7px',\n\n // scrollbar color, accepts any hex/color value\n color: '#000',\n\n // scrollbar position - left/right\n position : 'right',\n\n // distance in pixels between the side edge and the scrollbar\n distance : '1px',\n\n // default scroll position on load - top / bottom / $('selector')\n start : 'top',\n\n // sets scrollbar opacity\n opacity : .4,\n\n // enables always-on mode for the scrollbar\n alwaysVisible : false,\n\n // check if we should hide the scrollbar when user is hovering over\n disableFadeOut : false,\n\n // sets visibility of the rail\n railVisible : false,\n\n // sets rail color\n railColor : '#333',\n\n // sets rail opacity\n railOpacity : .2,\n\n // whether we should use jQuery UI Draggable to enable bar dragging\n railDraggable : true,\n\n // defautlt CSS class of the slimscroll rail\n railClass : 'slimScrollRail',\n\n // defautlt CSS class of the slimscroll bar\n barClass : 'slimScrollBar',\n\n // defautlt CSS class of the slimscroll wrapper\n wrapperClass : 'slimScrollDiv',\n\n // check if mousewheel should scroll the window if we reach top/bottom\n allowPageScroll : false,\n\n // scroll amount applied to each mouse wheel step\n wheelStep : 20,\n\n // scroll amount applied when user is using gestures\n touchScrollStep : 200,\n\n // sets border radius\n borderRadius: '7px',\n\n // sets border radius of the rail\n railBorderRadius : '7px'\n };\n\n var o = $.extend(defaults, options);\n\n // do it for every element that matches selector\n this.each(function(){\n\n var isOverPanel, isOverBar, isDragg, queueHide, touchDif,\n barHeight, percentScroll, lastScroll,\n divS = '
      ',\n minBarHeight = 30,\n releaseScroll = false;\n\n // used in event handlers and for better minification\n var me = $(this);\n\n // ensure we are not binding it again\n if (me.parent().hasClass(o.wrapperClass))\n {\n // start from last bar position\n var offset = me.scrollTop();\n\n // find bar and rail\n bar = me.parent().find('.' + o.barClass);\n rail = me.parent().find('.' + o.railClass);\n\n getBarHeight();\n\n // check if we should scroll existing instance\n if ($.isPlainObject(options))\n {\n // Pass height: auto to an existing slimscroll object to force a resize after contents have changed\n if ( 'height' in options && options.height == 'auto' ) {\n me.parent().css('height', 'auto');\n me.css('height', 'auto');\n var height = me.parent().parent().height();\n me.parent().css('height', height);\n me.css('height', height);\n }\n\n if ('scrollTo' in options)\n {\n // jump to a static point\n offset = parseInt(o.scrollTo);\n }\n else if ('scrollBy' in options)\n {\n // jump by value pixels\n offset += parseInt(o.scrollBy);\n }\n else if ('destroy' in options)\n {\n // clear slimscroll mouse event listeners\n detachWheel();\n\n // remove slimscroll elements\n bar.remove();\n rail.remove();\n me.unwrap();\n return;\n }\n\n // scroll content by the given offset\n scrollContent(offset, false, true);\n }\n\n return;\n }\n\n // optionally set height to the parent's height\n o.height = (options.height == 'auto') ? me.parent().height() : options.height;\n\n // wrap content\n var wrapper = $(divS)\n .addClass(o.wrapperClass)\n .css({\n position: 'relative',\n overflow: 'hidden',\n width: o.width,\n height: o.height\n });\n\n // update style for the div\n me.css({\n overflow: 'hidden',\n width: o.width,\n height: o.height\n });\n\n // create scrollbar rail\n var rail = $(divS)\n .addClass(o.railClass)\n .css({\n width: o.size,\n height: '100%',\n position: 'absolute',\n top: 0,\n display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',\n 'border-radius': o.railBorderRadius,\n background: o.railColor,\n opacity: o.railOpacity,\n zIndex: 90\n });\n\n // create scrollbar\n var bar = $(divS)\n .addClass(o.barClass)\n .css({\n background: o.color,\n width: o.size,\n position: 'absolute',\n top: 0,\n opacity: o.opacity,\n display: o.alwaysVisible ? 'block' : 'none',\n 'border-radius' : o.borderRadius,\n BorderRadius: o.borderRadius,\n MozBorderRadius: o.borderRadius,\n WebkitBorderRadius: o.borderRadius,\n zIndex: 99\n });\n\n // set position\n var posCss = (o.position == 'right') ? { right: o.distance } : { left: o.distance };\n rail.css(posCss);\n bar.css(posCss);\n\n // wrap it\n me.wrap(wrapper);\n\n // append to parent div\n me.parent().append(bar);\n me.parent().append(rail);\n\n // make it draggable and no longer dependent on the jqueryUI\n if (o.railDraggable){\n bar.bind(\"mousedown\", function(e) {\n var $doc = $(document);\n isDragg = true;\n t = parseFloat(bar.css('top'));\n pageY = e.pageY;\n\n $doc.bind(\"mousemove.slimscroll\", function(e){\n currTop = t + e.pageY - pageY;\n bar.css('top', currTop);\n scrollContent(0, bar.position().top, false);// scroll content\n });\n\n $doc.bind(\"mouseup.slimscroll\", function(e) {\n isDragg = false;hideBar();\n $doc.unbind('.slimscroll');\n });\n return false;\n }).bind(\"selectstart.slimscroll\", function(e){\n e.stopPropagation();\n e.preventDefault();\n return false;\n });\n }\n\n // on rail over\n rail.hover(function(){\n showBar();\n }, function(){\n hideBar();\n });\n\n // on bar over\n bar.hover(function(){\n isOverBar = true;\n }, function(){\n isOverBar = false;\n });\n\n // show on parent mouseover\n me.hover(function(){\n isOverPanel = true;\n showBar();\n hideBar();\n }, function(){\n isOverPanel = false;\n hideBar();\n });\n\n // support for mobile\n me.bind('touchstart', function(e,b){\n if (e.originalEvent.touches.length)\n {\n // record where touch started\n touchDif = e.originalEvent.touches[0].pageY;\n }\n });\n\n me.bind('touchmove', function(e){\n // prevent scrolling the page if necessary\n if(!releaseScroll)\n {\n \t\t e.originalEvent.preventDefault();\n\t\t }\n if (e.originalEvent.touches.length)\n {\n // see how far user swiped\n var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;\n // scroll content\n scrollContent(diff, true);\n touchDif = e.originalEvent.touches[0].pageY;\n }\n });\n\n // set up initial height\n getBarHeight();\n\n // check start position\n if (o.start === 'bottom')\n {\n // scroll content to bottom\n bar.css({ top: me.outerHeight() - bar.outerHeight() });\n scrollContent(0, true);\n }\n else if (o.start !== 'top')\n {\n // assume jQuery selector\n scrollContent($(o.start).position().top, null, true);\n\n // make sure bar stays hidden\n if (!o.alwaysVisible) { bar.hide(); }\n }\n\n // attach scroll events\n attachWheel();\n\n function _onWheel(e)\n {\n // use mouse wheel only when mouse is over\n if (!isOverPanel) { return; }\n\n var e = e || window.event;\n\n var delta = 0;\n if (e.wheelDelta) { delta = -e.wheelDelta/120; }\n if (e.detail) { delta = e.detail / 3; }\n\n var target = e.target || e.srcTarget || e.srcElement;\n if ($(target).closest('.' + o.wrapperClass).is(me.parent())) {\n // scroll content\n scrollContent(delta, true);\n }\n\n // stop window scroll\n if (e.preventDefault && !releaseScroll) { e.preventDefault(); }\n if (!releaseScroll) { e.returnValue = false; }\n }\n\n function scrollContent(y, isWheel, isJump)\n {\n releaseScroll = false;\n var delta = y;\n var maxTop = me.outerHeight() - bar.outerHeight();\n\n if (isWheel)\n {\n // move bar with mouse wheel\n delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();\n\n // move bar, make sure it doesn't go out\n delta = Math.min(Math.max(delta, 0), maxTop);\n\n // if scrolling down, make sure a fractional change to the\n // scroll position isn't rounded away when the scrollbar's CSS is set\n // this flooring of delta would happened automatically when\n // bar.css is set below, but we floor here for clarity\n delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta);\n\n // scroll the scrollbar\n bar.css({ top: delta + 'px' });\n }\n\n // calculate actual scroll amount\n percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());\n delta = percentScroll * (me[0].scrollHeight - me.outerHeight());\n\n if (isJump)\n {\n delta = y;\n var offsetTop = delta / me[0].scrollHeight * me.outerHeight();\n offsetTop = Math.min(Math.max(offsetTop, 0), maxTop);\n bar.css({ top: offsetTop + 'px' });\n }\n\n // scroll content\n me.scrollTop(delta);\n\n // fire scrolling event\n me.trigger('slimscrolling', ~~delta);\n\n // ensure bar is visible\n showBar();\n\n // trigger hide when scroll is stopped\n hideBar();\n }\n\n function attachWheel()\n {\n if (window.addEventListener)\n {\n this.addEventListener('DOMMouseScroll', _onWheel, false );\n this.addEventListener('mousewheel', _onWheel, false );\n }\n else\n {\n document.attachEvent(\"onmousewheel\", _onWheel)\n }\n }\n\n function detachWheel()\n {\n if (window.removeEventListener)\n {\n this.removeEventListener('DOMMouseScroll', _onWheel);\n this.removeEventListener('mousewheel', _onWheel);\n }\n else\n {\n document.detachEvent('onmousewheel', _onWheel);\n }\n }\n\n function getBarHeight()\n {\n // calculate scrollbar height and make sure it is not too small\n barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);\n bar.css({ height: barHeight + 'px' });\n\n // hide scrollbar if content is not long enough\n var display = barHeight == me.outerHeight() ? 'none' : 'block';\n bar.css({ display: display });\n }\n\n function showBar()\n {\n // recalculate bar height\n getBarHeight();\n clearTimeout(queueHide);\n\n // when bar reached top or bottom\n if (percentScroll == ~~percentScroll)\n {\n //release wheel\n releaseScroll = o.allowPageScroll;\n\n // publish approporiate event\n if (lastScroll != percentScroll)\n {\n var msg = (~~percentScroll == 0) ? 'top' : 'bottom';\n me.trigger('slimscroll', msg);\n }\n }\n else\n {\n releaseScroll = false;\n }\n lastScroll = percentScroll;\n\n // show only when required\n if(barHeight >= me.outerHeight()) {\n //allow window scroll\n releaseScroll = true;\n return;\n }\n bar.stop(true,true).fadeIn('fast');\n if (o.railVisible) { rail.stop(true,true).fadeIn('fast'); }\n }\n\n function hideBar()\n {\n // only hide when options allow it\n if (!o.alwaysVisible)\n {\n queueHide = setTimeout(function(){\n if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)\n {\n bar.fadeOut('slow');\n rail.fadeOut('slow');\n }\n }, 1000);\n }\n }\n\n });\n\n // maintain chainability\n return this;\n }\n });\n\n jQuery.fn.extend({\n slimscroll: jQuery.fn.slimScroll\n });\n\n})(jQuery);\n/*\n* @fileOverview TouchSwipe - jQuery Plugin\n* @version 1.6.6\n*\n* @author Matt Bryson http://www.github.com/mattbryson\n* @see https://github.com/mattbryson/TouchSwipe-Jquery-Plugin\n* @see http://labs.rampinteractive.co.uk/touchSwipe/\n* @see http://plugins.jquery.com/project/touchSwipe\n*\n* Copyright (c) 2010-2015 Matt Bryson\n* Dual licensed under the MIT or GPL Version 2 licenses.\n*\n*/\n\n/*\n*\n* Changelog\n* $Date: 2010-12-12 (Wed, 12 Dec 2010) $\n* $version: 1.0.0\n* $version: 1.0.1 - removed multibyte comments\n*\n* $Date: 2011-21-02 (Mon, 21 Feb 2011) $\n* $version: 1.1.0 \t- added allowPageScroll property to allow swiping and scrolling of page\n*\t\t\t\t\t- changed handler signatures so one handler can be used for multiple events\n* $Date: 2011-23-02 (Wed, 23 Feb 2011) $\n* $version: 1.2.0 \t- added click handler. This is fired if the user simply clicks and does not swipe. The event object and click target are passed to handler.\n*\t\t\t\t\t- If you use the http://code.google.com/p/jquery-ui-for-ipad-and-iphone/ plugin, you can also assign jQuery mouse events to children of a touchSwipe object.\n* $version: 1.2.1 \t- removed console log!\n*\n* $version: 1.2.2 \t- Fixed bug where scope was not preserved in callback methods.\n*\n* $Date: 2011-28-04 (Thurs, 28 April 2011) $\n* $version: 1.2.4 \t- Changed licence terms to be MIT or GPL inline with jQuery. Added check for support of touch events to stop non compatible browsers erroring.\n*\n* $Date: 2011-27-09 (Tues, 27 September 2011) $\n* $version: 1.2.5 \t- Added support for testing swipes with mouse on desktop browser (thanks to https://github.com/joelhy)\n*\n* $Date: 2012-14-05 (Mon, 14 May 2012) $\n* $version: 1.2.6 \t- Added timeThreshold between start and end touch, so user can ignore slow swipes (thanks to Mark Chase). Default is null, all swipes are detected\n*\n* $Date: 2012-05-06 (Tues, 05 June 2012) $\n* $version: 1.2.7 \t- Changed time threshold to have null default for backwards compatibility. Added duration param passed back in events, and refactored how time is handled.\n*\n* $Date: 2012-05-06 (Tues, 05 June 2012) $\n* $version: 1.2.8 \t- Added the possibility to return a value like null or false in the trigger callback. In that way we can control when the touch start/move should take effect or not (simply by returning in some cases return null; or return false;) This effects the ontouchstart/ontouchmove event.\n*\n* $Date: 2012-06-06 (Wed, 06 June 2012) $\n* $version: 1.3.0 \t- Refactored whole plugin to allow for methods to be executed, as well as exposed defaults for user override. Added 'enable', 'disable', and 'destroy' methods\n*\n* $Date: 2012-05-06 (Fri, 05 June 2012) $\n* $version: 1.3.1 \t- Bug fixes - bind() with false as last argument is no longer supported in jQuery 1.6, also, if you just click, the duration is now returned correctly.\n*\n* $Date: 2012-29-07 (Sun, 29 July 2012) $\n* $version: 1.3.2\t- Added fallbackToMouseEvents option to NOT capture mouse events on non touch devices.\n* \t\t\t- Added \"all\" fingers value to the fingers property, so any combination of fingers triggers the swipe, allowing event handlers to check the finger count\n*\n* $Date: 2012-09-08 (Thurs, 9 Aug 2012) $\n* $version: 1.3.3\t- Code tidy prep for minefied version\n*\n* $Date: 2012-04-10 (wed, 4 Oct 2012) $\n* $version: 1.4.0\t- Added pinch support, pinchIn and pinchOut\n*\n* $Date: 2012-11-10 (Thurs, 11 Oct 2012) $\n* $version: 1.5.0\t- Added excludedElements, a jquery selector that specifies child elements that do NOT trigger swipes. By default, this is one select that removes all form, input select, button and anchor elements.\n*\n* $Date: 2012-22-10 (Mon, 22 Oct 2012) $\n* $version: 1.5.1\t- Fixed bug with jQuery 1.8 and trailing comma in excludedElements\n*\t\t\t\t\t- Fixed bug with IE and eventPreventDefault()\n* $Date: 2013-01-12 (Fri, 12 Jan 2013) $\n* $version: 1.6.0\t- Fixed bugs with pinching, mainly when both pinch and swipe enabled, as well as adding time threshold for multifinger gestures, so releasing one finger beofre the other doesnt trigger as single finger gesture.\n*\t\t\t\t\t- made the demo site all static local HTML pages so they can be run locally by a developer\n*\t\t\t\t\t- added jsDoc comments and added documentation for the plugin\t\n*\t\t\t\t\t- code tidy\n*\t\t\t\t\t- added triggerOnTouchLeave property that will end the event when the user swipes off the element.\n* $Date: 2013-03-23 (Sat, 23 Mar 2013) $\n* $version: 1.6.1\t- Added support for ie8 touch events\n* $version: 1.6.2\t- Added support for events binding with on / off / bind in jQ for all callback names.\n* - Deprecated the 'click' handler in favour of tap.\n* - added cancelThreshold property\n* - added option method to update init options at runtime\n* $version 1.6.3 - added doubletap, longtap events and longTapThreshold, doubleTapThreshold property\n*\n* $Date: 2013-04-04 (Thurs, 04 April 2013) $\n* $version 1.6.4 - Fixed bug with cancelThreshold introduced in 1.6.3, where swipe status no longer fired start event, and stopped once swiping back.\n*\n* $Date: 2013-08-24 (Sat, 24 Aug 2013) $\n* $version 1.6.5 - Merged a few pull requests fixing various bugs, added AMD support.\n*\n* $Date: 2014-06-04 (Wed, 04 June 2014) $\n* $version 1.6.6 \t- Merge of pull requests.\n* \t\t\t\t- IE10 touch support \n* \t\t\t\t- Only prevent default event handling on valid swipe\n* \t\t\t\t- Separate license/changelog comment\n* \t\t\t\t- Detect if the swipe is valid at the end of the touch event.\n* \t\t\t\t- Pass fingerdata to event handlers. \n* \t\t\t\t- Add 'hold' gesture \n* \t\t\t\t- Be more tolerant about the tap distance\n* \t\t\t\t- Typos and minor fixes\n*\n* $Date: 2015-22-01 (Thurs, 22 Jan 2015) $\n* $version 1.6.7 - Added patch from https://github.com/mattbryson/TouchSwipe-Jquery-Plugin/issues/206 to fix memory leak\n*\n* $Date: 2015-2-2 (Mon, 2 Feb 2015) $\n* $version 1.6.7 - Added preventDefaultEvents option to proxy events regardless.\n*\t\t\t\t\t- Fixed issue with swipe and pinch not triggering at the same time\n*/\n\n/**\n * See (http://jquery.com/).\n * @name $\n * @class \n * See the jQuery Library (http://jquery.com/) for full details. This just\n * documents the function and classes that are added to jQuery by this plug-in.\n */\n \n/**\n * See (http://jquery.com/)\n * @name fn\n * @class \n * See the jQuery Library (http://jquery.com/) for full details. This just\n * documents the function and classes that are added to jQuery by this plug-in.\n * @memberOf $\n */\n\n\n\n(function (factory) {\n if (typeof define === 'function' && define.amd && define.amd.jQuery) {\n // AMD. Register as anonymous module.\n define(['jquery'], factory);\n } else {\n // Browser globals.\n factory(jQuery);\n }\n}(function ($) {\n\t\"use strict\";\n\n\t//Constants\n\tvar LEFT = \"left\",\n\t\tRIGHT = \"right\",\n\t\tUP = \"up\",\n\t\tDOWN = \"down\",\n\t\tIN = \"in\",\n\t\tOUT = \"out\",\n\n\t\tNONE = \"none\",\n\t\tAUTO = \"auto\",\n\t\t\n\t\tSWIPE = \"swipe\",\n\t\tPINCH = \"pinch\",\n\t\tTAP = \"tap\",\n\t\tDOUBLE_TAP = \"doubletap\",\n\t\tLONG_TAP = \"longtap\",\n\t\tHOLD = \"hold\",\n\t\t\n\t\tHORIZONTAL = \"horizontal\",\n\t\tVERTICAL = \"vertical\",\n\n\t\tALL_FINGERS = \"all\",\n\t\t\n\t\tDOUBLE_TAP_THRESHOLD = 10,\n\n\t\tPHASE_START = \"start\",\n\t\tPHASE_MOVE = \"move\",\n\t\tPHASE_END = \"end\",\n\t\tPHASE_CANCEL = \"cancel\",\n\n\t\tSUPPORTS_TOUCH = 'ontouchstart' in window,\n\t\t\n\t\tSUPPORTS_POINTER_IE10 = window.navigator.msPointerEnabled && !window.navigator.pointerEnabled,\n\t\t\n\t\tSUPPORTS_POINTER = window.navigator.pointerEnabled || window.navigator.msPointerEnabled,\n\n\t\tPLUGIN_NS = 'TouchSwipe';\n\n\n\n\t/**\n\t* The default configuration, and available options to configure touch swipe with.\n\t* You can set the default values by updating any of the properties prior to instantiation.\n\t* @name $.fn.swipe.defaults\n\t* @namespace\n\t* @property {int} [fingers=1] The number of fingers to detect in a swipe. Any swipes that do not meet this requirement will NOT trigger swipe handlers.\n\t* @property {int} [threshold=75] The number of pixels that the user must move their finger by before it is considered a swipe. \n\t* @property {int} [cancelThreshold=null] The number of pixels that the user must move their finger back from the original swipe direction to cancel the gesture.\n\t* @property {int} [pinchThreshold=20] The number of pixels that the user must pinch their finger by before it is considered a pinch. \n\t* @property {int} [maxTimeThreshold=null] Time, in milliseconds, between touchStart and touchEnd must NOT exceed in order to be considered a swipe. \n\t* @property {int} [fingerReleaseThreshold=250] Time in milliseconds between releasing multiple fingers. If 2 fingers are down, and are released one after the other, if they are within this threshold, it counts as a simultaneous release. \n\t* @property {int} [longTapThreshold=500] Time in milliseconds between tap and release for a long tap\n\t* @property {int} [doubleTapThreshold=200] Time in milliseconds between 2 taps to count as a double tap\n\t* @property {function} [swipe=null] A handler to catch all swipes. See {@link $.fn.swipe#event:swipe}\n\t* @property {function} [swipeLeft=null] A handler that is triggered for \"left\" swipes. See {@link $.fn.swipe#event:swipeLeft}\n\t* @property {function} [swipeRight=null] A handler that is triggered for \"right\" swipes. See {@link $.fn.swipe#event:swipeRight}\n\t* @property {function} [swipeUp=null] A handler that is triggered for \"up\" swipes. See {@link $.fn.swipe#event:swipeUp}\n\t* @property {function} [swipeDown=null] A handler that is triggered for \"down\" swipes. See {@link $.fn.swipe#event:swipeDown}\n\t* @property {function} [swipeStatus=null] A handler triggered for every phase of the swipe. See {@link $.fn.swipe#event:swipeStatus}\n\t* @property {function} [pinchIn=null] A handler triggered for pinch in events. See {@link $.fn.swipe#event:pinchIn}\n\t* @property {function} [pinchOut=null] A handler triggered for pinch out events. See {@link $.fn.swipe#event:pinchOut}\n\t* @property {function} [pinchStatus=null] A handler triggered for every phase of a pinch. See {@link $.fn.swipe#event:pinchStatus}\n\t* @property {function} [tap=null] A handler triggered when a user just taps on the item, rather than swipes it. If they do not move, tap is triggered, if they do move, it is not. \n\t* @property {function} [doubleTap=null] A handler triggered when a user double taps on the item. The delay between taps can be set with the doubleTapThreshold property. See {@link $.fn.swipe.defaults#doubleTapThreshold}\n\t* @property {function} [longTap=null] A handler triggered when a user long taps on the item. The delay between start and end can be set with the longTapThreshold property. See {@link $.fn.swipe.defaults#longTapThreshold}\n\t* @property (function) [hold=null] A handler triggered when a user reaches longTapThreshold on the item. See {@link $.fn.swipe.defaults#longTapThreshold}\n\t* @property {boolean} [triggerOnTouchEnd=true] If true, the swipe events are triggered when the touch end event is received (user releases finger). If false, it will be triggered on reaching the threshold, and then cancel the touch event automatically. \n\t* @property {boolean} [triggerOnTouchLeave=false] If true, then when the user leaves the swipe object, the swipe will end and trigger appropriate handlers. \n\t* @property {string|undefined} [allowPageScroll='auto'] How the browser handles page scrolls when the user is swiping on a touchSwipe object. See {@link $.fn.swipe.pageScroll}.

      \n\t\t\t\t\t\t\t\t\t\t\"auto\" : all undefined swipes will cause the page to scroll in that direction.
      \n\t\t\t\t\t\t\t\t\t\t\"none\" : the page will not scroll when user swipes.
      \n\t\t\t\t\t\t\t\t\t\t\"horizontal\" : will force page to scroll on horizontal swipes.
      \n\t\t\t\t\t\t\t\t\t\t\"vertical\" : will force page to scroll on vertical swipes.
      \n\t* @property {boolean} [fallbackToMouseEvents=true] If true mouse events are used when run on a non touch device, false will stop swipes being triggered by mouse events on non tocuh devices. \n\t* @property {string} [excludedElements=\"button, input, select, textarea, a, .noSwipe\"] A jquery selector that specifies child elements that do NOT trigger swipes. By default this excludes all form, input, select, button, anchor and .noSwipe elements. \n\t* @property {boolean} [preventDefaultEvents=true] by default default events are cancelled, so the page doesn't move. You can dissable this so both native events fire as well as your handlers. \n\t\n\t*/\n\tvar defaults = {\n\t\tfingers: 1, \t\t\n\t\tthreshold: 75, \t\n\t\tcancelThreshold:null,\t\n\t\tpinchThreshold:20,\n\t\tmaxTimeThreshold: null, \n\t\tfingerReleaseThreshold:250, \n\t\tlongTapThreshold:500,\n\t\tdoubleTapThreshold:200,\n\t\tswipe: null, \t\t\n\t\tswipeLeft: null, \t\n\t\tswipeRight: null, \t\n\t\tswipeUp: null, \t\t\n\t\tswipeDown: null, \t\n\t\tswipeStatus: null, \t\n\t\tpinchIn:null,\t\t\n\t\tpinchOut:null,\t\t\n\t\tpinchStatus:null,\t\n\t\tclick:null, //Deprecated since 1.6.2\n\t\ttap:null,\n\t\tdoubleTap:null,\n\t\tlongTap:null, \t\t\n\t\thold:null, \n\t\ttriggerOnTouchEnd: true, \n\t\ttriggerOnTouchLeave:false, \n\t\tallowPageScroll: \"auto\", \n\t\tfallbackToMouseEvents: true,\t\n\t\texcludedElements:\"label, button, input, select, textarea, a, .noSwipe\",\n\t\tpreventDefaultEvents:true\n\t};\n\n\n\n\t/**\n\t* Applies TouchSwipe behaviour to one or more jQuery objects.\n\t* The TouchSwipe plugin can be instantiated via this method, or methods within \n\t* TouchSwipe can be executed via this method as per jQuery plugin architecture.\n\t* @see TouchSwipe\n\t* @class\n\t* @param {Mixed} method If the current DOMNode is a TouchSwipe object, and method is a TouchSwipe method, then\n\t* the method is executed, and any following arguments are passed to the TouchSwipe method.\n\t* If method is an object, then the TouchSwipe class is instantiated on the current DOMNode, passing the \n\t* configuration properties defined in the object. See TouchSwipe\n\t*\n\t*/\n\t$.fn.swipe = function (method) {\n\t\tvar $this = $(this),\n\t\t\tplugin = $this.data(PLUGIN_NS);\n\n\t\t//Check if we are already instantiated and trying to execute a method\t\n\t\tif (plugin && typeof method === 'string') {\n\t\t\tif (plugin[method]) {\n\t\t\t\treturn plugin[method].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t\t} else {\n\t\t\t\t$.error('Method ' + method + ' does not exist on jQuery.swipe');\n\t\t\t}\n\t\t}\n\t\t//Else not instantiated and trying to pass init object (or nothing)\n\t\telse if (!plugin && (typeof method === 'object' || !method)) {\n\t\t\treturn init.apply(this, arguments);\n\t\t}\n\n\t\treturn $this;\n\t};\n\n\t//Expose our defaults so a user could override the plugin defaults\n\t$.fn.swipe.defaults = defaults;\n\n\t/**\n\t* The phases that a touch event goes through. The phase is passed to the event handlers. \n\t* These properties are read only, attempting to change them will not alter the values passed to the event handlers.\n\t* @namespace\n\t* @readonly\n\t* @property {string} PHASE_START Constant indicating the start phase of the touch event. Value is \"start\".\n\t* @property {string} PHASE_MOVE Constant indicating the move phase of the touch event. Value is \"move\".\n\t* @property {string} PHASE_END Constant indicating the end phase of the touch event. Value is \"end\".\n\t* @property {string} PHASE_CANCEL Constant indicating the cancel phase of the touch event. Value is \"cancel\".\n\t*/\n\t$.fn.swipe.phases = {\n\t\tPHASE_START: PHASE_START,\n\t\tPHASE_MOVE: PHASE_MOVE,\n\t\tPHASE_END: PHASE_END,\n\t\tPHASE_CANCEL: PHASE_CANCEL\n\t};\n\n\t/**\n\t* The direction constants that are passed to the event handlers. \n\t* These properties are read only, attempting to change them will not alter the values passed to the event handlers.\n\t* @namespace\n\t* @readonly\n\t* @property {string} LEFT Constant indicating the left direction. Value is \"left\".\n\t* @property {string} RIGHT Constant indicating the right direction. Value is \"right\".\n\t* @property {string} UP Constant indicating the up direction. Value is \"up\".\n\t* @property {string} DOWN Constant indicating the down direction. Value is \"cancel\".\n\t* @property {string} IN Constant indicating the in direction. Value is \"in\".\n\t* @property {string} OUT Constant indicating the out direction. Value is \"out\".\n\t*/\n\t$.fn.swipe.directions = {\n\t\tLEFT: LEFT,\n\t\tRIGHT: RIGHT,\n\t\tUP: UP,\n\t\tDOWN: DOWN,\n\t\tIN : IN,\n\t\tOUT: OUT\n\t};\n\t\n\t/**\n\t* The page scroll constants that can be used to set the value of allowPageScroll option\n\t* These properties are read only\n\t* @namespace\n\t* @readonly\n\t* @see $.fn.swipe.defaults#allowPageScroll\n\t* @property {string} NONE Constant indicating no page scrolling is allowed. Value is \"none\".\n\t* @property {string} HORIZONTAL Constant indicating horizontal page scrolling is allowed. Value is \"horizontal\".\n\t* @property {string} VERTICAL Constant indicating vertical page scrolling is allowed. Value is \"vertical\".\n\t* @property {string} AUTO Constant indicating either horizontal or vertical will be allowed, depending on the swipe handlers registered. Value is \"auto\".\n\t*/\n\t$.fn.swipe.pageScroll = {\n\t\tNONE: NONE,\n\t\tHORIZONTAL: HORIZONTAL,\n\t\tVERTICAL: VERTICAL,\n\t\tAUTO: AUTO\n\t};\n\n\t/**\n\t* Constants representing the number of fingers used in a swipe. These are used to set both the value of fingers in the \n\t* options object, as well as the value of the fingers event property.\n\t* These properties are read only, attempting to change them will not alter the values passed to the event handlers.\n\t* @namespace\n\t* @readonly\n\t* @see $.fn.swipe.defaults#fingers\n\t* @property {string} ONE Constant indicating 1 finger is to be detected / was detected. Value is 1.\n\t* @property {string} TWO Constant indicating 2 fingers are to be detected / were detected. Value is 1.\n\t* @property {string} THREE Constant indicating 3 finger are to be detected / were detected. Value is 1.\n\t* @property {string} ALL Constant indicating any combination of finger are to be detected. Value is \"all\".\n\t*/\n\t$.fn.swipe.fingers = {\n\t\tONE: 1,\n\t\tTWO: 2,\n\t\tTHREE: 3,\n\t\tALL: ALL_FINGERS\n\t};\n\n\t/**\n\t* Initialise the plugin for each DOM element matched\n\t* This creates a new instance of the main TouchSwipe class for each DOM element, and then\n\t* saves a reference to that instance in the elements data property.\n\t* @internal\n\t*/\n\tfunction init(options) {\n\t\t//Prep and extend the options\n\t\tif (options && (options.allowPageScroll === undefined && (options.swipe !== undefined || options.swipeStatus !== undefined))) {\n\t\t\toptions.allowPageScroll = NONE;\n\t\t}\n\t\t\n //Check for deprecated options\n\t\t//Ensure that any old click handlers are assigned to the new tap, unless we have a tap\n\t\tif(options.click!==undefined && options.tap===undefined) {\n\t\t options.tap = options.click;\n\t\t}\n\n\t\tif (!options) {\n\t\t\toptions = {};\n\t\t}\n\t\t\n //pass empty object so we dont modify the defaults\n\t\toptions = $.extend({}, $.fn.swipe.defaults, options);\n\n\t\t//For each element instantiate the plugin\n\t\treturn this.each(function () {\n\t\t\tvar $this = $(this);\n\n\t\t\t//Check we havent already initialised the plugin\n\t\t\tvar plugin = $this.data(PLUGIN_NS);\n\n\t\t\tif (!plugin) {\n\t\t\t\tplugin = new TouchSwipe(this, options);\n\t\t\t\t$this.data(PLUGIN_NS, plugin);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t* Main TouchSwipe Plugin Class.\n\t* Do not use this to construct your TouchSwipe object, use the jQuery plugin method $.fn.swipe(); {@link $.fn.swipe}\n\t* @private\n\t* @name TouchSwipe\n\t* @param {DOMNode} element The HTML DOM object to apply to plugin to\n\t* @param {Object} options The options to configure the plugin with. @link {$.fn.swipe.defaults}\n\t* @see $.fh.swipe.defaults\n\t* @see $.fh.swipe\n * @class\n\t*/\n\tfunction TouchSwipe(element, options) {\n var useTouchEvents = (SUPPORTS_TOUCH || SUPPORTS_POINTER || !options.fallbackToMouseEvents),\n START_EV = useTouchEvents ? (SUPPORTS_POINTER ? (SUPPORTS_POINTER_IE10 ? 'MSPointerDown' : 'pointerdown') : 'touchstart') : 'mousedown',\n MOVE_EV = useTouchEvents ? (SUPPORTS_POINTER ? (SUPPORTS_POINTER_IE10 ? 'MSPointerMove' : 'pointermove') : 'touchmove') : 'mousemove',\n END_EV = useTouchEvents ? (SUPPORTS_POINTER ? (SUPPORTS_POINTER_IE10 ? 'MSPointerUp' : 'pointerup') : 'touchend') : 'mouseup',\n LEAVE_EV = useTouchEvents ? null : 'mouseleave', //we manually detect leave on touch devices, so null event here\n CANCEL_EV = (SUPPORTS_POINTER ? (SUPPORTS_POINTER_IE10 ? 'MSPointerCancel' : 'pointercancel') : 'touchcancel');\n\n\n\n\t\t//touch properties\n\t\tvar distance = 0,\n\t\t\tdirection = null,\n\t\t\tduration = 0,\n\t\t\tstartTouchesDistance = 0,\n\t\t\tendTouchesDistance = 0,\n\t\t\tpinchZoom = 1,\n\t\t\tpinchDistance = 0,\n\t\t\tpinchDirection = 0,\n\t\t\tmaximumsMap=null;\n\n\t\t\n\t\t\n\t\t//jQuery wrapped element for this instance\n\t\tvar $element = $(element);\n\t\t\n\t\t//Current phase of th touch cycle\n\t\tvar phase = \"start\";\n\n\t\t// the current number of fingers being used.\n\t\tvar fingerCount = 0; \t\t\t\n\n\t\t//track mouse points / delta\n\t\tvar fingerData=null;\n\n\t\t//track times\n\t\tvar startTime = 0,\n\t\t\tendTime = 0,\n\t\t\tpreviousTouchEndTime=0,\n\t\t\tpreviousTouchFingerCount=0,\n\t\t\tdoubleTapStartTime=0;\n\n\t\t//Timeouts\n\t\tvar singleTapTimeout=null,\n\t\t\tholdTimeout=null;\n \n\t\t// Add gestures to all swipable areas if supported\n\t\ttry {\n\t\t\t$element.bind(START_EV, touchStart);\n\t\t\t$element.bind(CANCEL_EV, touchCancel);\n\t\t}\n\t\tcatch (e) {\n\t\t\t$.error('events not supported ' + START_EV + ',' + CANCEL_EV + ' on jQuery.swipe');\n\t\t}\n\n\t\t//\n\t\t//Public methods\n\t\t//\n\t\t\n\t\t/**\n\t\t* re-enables the swipe plugin with the previous configuration\n\t\t* @function\n\t\t* @name $.fn.swipe#enable\n\t\t* @return {DOMNode} The Dom element that was registered with TouchSwipe \n\t\t* @example $(\"#element\").swipe(\"enable\");\n\t\t*/\n\t\tthis.enable = function () {\n\t\t\t$element.bind(START_EV, touchStart);\n\t\t\t$element.bind(CANCEL_EV, touchCancel);\n\t\t\treturn $element;\n\t\t};\n\n\t\t/**\n\t\t* disables the swipe plugin\n\t\t* @function\n\t\t* @name $.fn.swipe#disable\n\t\t* @return {DOMNode} The Dom element that is now registered with TouchSwipe\n\t * @example $(\"#element\").swipe(\"disable\");\n\t\t*/\n\t\tthis.disable = function () {\n\t\t\tremoveListeners();\n\t\t\treturn $element;\n\t\t};\n\n\t\t/**\n\t\t* Destroy the swipe plugin completely. To use any swipe methods, you must re initialise the plugin.\n\t\t* @function\n\t\t* @name $.fn.swipe#destroy\n\t\t* @example $(\"#element\").swipe(\"destroy\");\n\t\t*/\n\t\tthis.destroy = function () {\n\t\t\tremoveListeners();\n\t\t\t$element.data(PLUGIN_NS, null);\n\t\t\t$element = null;\n\t\t};\n\n\t\t\n /**\n * Allows run time updating of the swipe configuration options.\n * @function\n \t * @name $.fn.swipe#option\n \t * @param {String} property The option property to get or set\n * @param {Object} [value] The value to set the property to\n\t\t * @return {Object} If only a property name is passed, then that property value is returned.\n\t\t * @example $(\"#element\").swipe(\"option\", \"threshold\"); // return the threshold\n * @example $(\"#element\").swipe(\"option\", \"threshold\", 100); // set the threshold after init\n * @see $.fn.swipe.defaults\n *\n */\n this.option = function (property, value) {\n if(options[property]!==undefined) {\n if(value===undefined) {\n return options[property];\n } else {\n options[property] = value;\n }\n } else {\n $.error('Option ' + property + ' does not exist on jQuery.swipe.options');\n }\n\n return null;\n }\n\n\t\t//\n\t\t// Private methods\n\t\t//\n\t\t\n\t\t//\n\t\t// EVENTS\n\t\t//\n\t\t/**\n\t\t* Event handler for a touch start event.\n\t\t* Stops the default click event from triggering and stores where we touched\n\t\t* @inner\n\t\t* @param {object} jqEvent The normalised jQuery event object.\n\t\t*/\n\t\tfunction touchStart(jqEvent) {\n\t\t\t//If we already in a touch event (a finger already in use) then ignore subsequent ones..\n\t\t\tif( getTouchInProgress() )\n\t\t\t\treturn;\n\t\t\t\n\t\t\t//Check if this element matches any in the excluded elements selectors, or its parent is excluded, if so, DON'T swipe\n\t\t\tif( $(jqEvent.target).closest( options.excludedElements, $element ).length>0 ) \n\t\t\t\treturn;\n\t\t\t\t\n\t\t\t//As we use Jquery bind for events, we need to target the original event object\n\t\t\t//If these events are being programmatically triggered, we don't have an original event object, so use the Jq one.\n\t\t\tvar event = jqEvent.originalEvent ? jqEvent.originalEvent : jqEvent;\n\t\t\t\n\t\t\tvar ret,\n\t\t\t\tevt = SUPPORTS_TOUCH ? event.touches[0] : event;\n\n\t\t\tphase = PHASE_START;\n\n\t\t\t//If we support touches, get the finger count\n\t\t\tif (SUPPORTS_TOUCH) {\n\t\t\t\t// get the total number of fingers touching the screen\n\t\t\t\tfingerCount = event.touches.length;\n\t\t\t}\n\t\t\t//Else this is the desktop, so stop the browser from dragging content\n\t\t\telse {\n\t\t\t\tjqEvent.preventDefault(); //call this on jq event so we are cross browser\n\t\t\t}\n\n\t\t\t//clear vars..\n\t\t\tdistance = 0;\n\t\t\tdirection = null;\n\t\t\tpinchDirection=null;\n\t\t\tduration = 0;\n\t\t\tstartTouchesDistance=0;\n\t\t\tendTouchesDistance=0;\n\t\t\tpinchZoom = 1;\n\t\t\tpinchDistance = 0;\n\t\t\tfingerData=createAllFingerData();\n\t\t\tmaximumsMap=createMaximumsData();\n\t\t\tcancelMultiFingerRelease();\n\n\t\t\t\n\t\t\t// check the number of fingers is what we are looking for, or we are capturing pinches\n\t\t\tif (!SUPPORTS_TOUCH || (fingerCount === options.fingers || options.fingers === ALL_FINGERS) || hasPinches()) {\n\t\t\t\t// get the coordinates of the touch\n\t\t\t\tcreateFingerData( 0, evt );\n\t\t\t\tstartTime = getTimeStamp();\n\t\t\t\t\n\t\t\t\tif(fingerCount==2) {\n\t\t\t\t\t//Keep track of the initial pinch distance, so we can calculate the diff later\n\t\t\t\t\t//Store second finger data as start\n\t\t\t\t\tcreateFingerData( 1, event.touches[1] );\n\t\t\t\t\tstartTouchesDistance = endTouchesDistance = calculateTouchesDistance(fingerData[0].start, fingerData[1].start);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (options.swipeStatus || options.pinchStatus) {\n\t\t\t\t\tret = triggerHandler(event, phase);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t//A touch with more or less than the fingers we are looking for, so cancel\n\t\t\t\tret = false; \n\t\t\t}\n\n\t\t\t//If we have a return value from the users handler, then return and cancel\n\t\t\tif (ret === false) {\n\t\t\t\tphase = PHASE_CANCEL;\n\t\t\t\ttriggerHandler(event, phase);\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options.hold) {\n\t\t\t\t\tholdTimeout = setTimeout($.proxy(function() {\n\t\t\t\t\t\t//Trigger the event\n\t\t\t\t\t\t$element.trigger('hold', [event.target]);\n\t\t\t\t\t\t//Fire the callback\n\t\t\t\t\t\tif(options.hold) {\n\t\t\t\t\t\t\tret = options.hold.call($element, event, event.target);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, this), options.longTapThreshold );\n\t\t\t\t}\n\n\t\t\t\tsetTouchInProgress(true);\n\t\t\t}\n\n return null;\n\t\t};\n\t\t\n\t\t\n\t\t\n\t\t/**\n\t\t* Event handler for a touch move event. \n\t\t* If we change fingers during move, then cancel the event\n\t\t* @inner\n\t\t* @param {object} jqEvent The normalised jQuery event object.\n\t\t*/\n\t\tfunction touchMove(jqEvent) {\n\t\t\t\n\t\t\t//As we use Jquery bind for events, we need to target the original event object\n\t\t\t//If these events are being programmatically triggered, we don't have an original event object, so use the Jq one.\n\t\t\tvar event = jqEvent.originalEvent ? jqEvent.originalEvent : jqEvent;\n\t\t\t\n\t\t\t//If we are ending, cancelling, or within the threshold of 2 fingers being released, don't track anything..\n\t\t\tif (phase === PHASE_END || phase === PHASE_CANCEL || inMultiFingerRelease())\n\t\t\t\treturn;\n\n\t\t\tvar ret,\n\t\t\t\tevt = SUPPORTS_TOUCH ? event.touches[0] : event;\n\t\t\t\n\n\t\t\t//Update the finger data \n\t\t\tvar currentFinger = updateFingerData(evt);\n\t\t\tendTime = getTimeStamp();\n\t\t\t\n\t\t\tif (SUPPORTS_TOUCH) {\n\t\t\t\tfingerCount = event.touches.length;\n\t\t\t}\n\n\t\t\tif (options.hold)\n\t\t\t\tclearTimeout(holdTimeout);\n\n\t\t\tphase = PHASE_MOVE;\n\n\t\t\t//If we have 2 fingers get Touches distance as well\n\t\t\tif(fingerCount==2) {\n\t\t\t\t\n\t\t\t\t//Keep track of the initial pinch distance, so we can calculate the diff later\n\t\t\t\t//We do this here as well as the start event, in case they start with 1 finger, and the press 2 fingers\n\t\t\t\tif(startTouchesDistance==0) {\n\t\t\t\t\t//Create second finger if this is the first time...\n\t\t\t\t\tcreateFingerData( 1, event.touches[1] );\n\t\t\t\t\t\n\t\t\t\t\tstartTouchesDistance = endTouchesDistance = calculateTouchesDistance(fingerData[0].start, fingerData[1].start);\n\t\t\t\t} else {\n\t\t\t\t\t//Else just update the second finger\n\t\t\t\t\tupdateFingerData(event.touches[1]);\n\t\t\t\t\n\t\t\t\t\tendTouchesDistance = calculateTouchesDistance(fingerData[0].end, fingerData[1].end);\n\t\t\t\t\tpinchDirection = calculatePinchDirection(fingerData[0].end, fingerData[1].end);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tpinchZoom = calculatePinchZoom(startTouchesDistance, endTouchesDistance);\n\t\t\t\tpinchDistance = Math.abs(startTouchesDistance - endTouchesDistance);\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\n\t\t\tif ( (fingerCount === options.fingers || options.fingers === ALL_FINGERS) || !SUPPORTS_TOUCH || hasPinches() ) {\n\t\t\t\t\n\t\t\t\tdirection = calculateDirection(currentFinger.start, currentFinger.end);\n\t\t\t\t\n\t\t\t\t//Check if we need to prevent default event (page scroll / pinch zoom) or not\n\t\t\t\tvalidateDefaultEvent(jqEvent, direction);\n\n\t\t\t\t//Distance and duration are all off the main finger\n\t\t\t\tdistance = calculateDistance(currentFinger.start, currentFinger.end);\n\t\t\t\tduration = calculateDuration();\n\n //Cache the maximum distance we made in this direction\n setMaxDistance(direction, distance);\n\n\n\t\t\t\tif (options.swipeStatus || options.pinchStatus) {\n\t\t\t\t\tret = triggerHandler(event, phase);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t//If we trigger end events when threshold are met, or trigger events when touch leaves element\n\t\t\t\tif(!options.triggerOnTouchEnd || options.triggerOnTouchLeave) {\n\t\t\t\t\t\n\t\t\t\t\tvar inBounds = true;\n\t\t\t\t\t\n\t\t\t\t\t//If checking if we leave the element, run the bounds check (we can use touchleave as its not supported on webkit)\n\t\t\t\t\tif(options.triggerOnTouchLeave) {\n\t\t\t\t\t\tvar bounds = getbounds( this );\n\t\t\t\t\t\tinBounds = isInBounds( currentFinger.end, bounds );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t//Trigger end handles as we swipe if thresholds met or if we have left the element if the user has asked to check these..\n\t\t\t\t\tif(!options.triggerOnTouchEnd && inBounds) {\n\t\t\t\t\t\tphase = getNextPhase( PHASE_MOVE );\n\t\t\t\t\t} \n\t\t\t\t\t//We end if out of bounds here, so set current phase to END, and check if its modified \n\t\t\t\t\telse if(options.triggerOnTouchLeave && !inBounds ) {\n\t\t\t\t\t\tphase = getNextPhase( PHASE_END );\n\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\tif(phase==PHASE_CANCEL || phase==PHASE_END)\t{\n\t\t\t\t\t\ttriggerHandler(event, phase);\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tphase = PHASE_CANCEL;\n\t\t\t\ttriggerHandler(event, phase);\n\t\t\t}\n\n\t\t\tif (ret === false) {\n\t\t\t\tphase = PHASE_CANCEL;\n\t\t\t\ttriggerHandler(event, phase);\n\t\t\t}\n\t\t}\n\n\n\n\t\t/**\n\t\t* Event handler for a touch end event. \n\t\t* Calculate the direction and trigger events\n\t\t* @inner\n\t\t* @param {object} jqEvent The normalised jQuery event object.\n\t\t*/\n\t\tfunction touchEnd(jqEvent) {\n\t\t\t//As we use Jquery bind for events, we need to target the original event object\n\t\t\tvar event = jqEvent.originalEvent;\n\t\t\t\t\n\n\t\t\t//If we are still in a touch with another finger return\n\t\t\t//This allows us to wait a fraction and see if the other finger comes up, if it does within the threshold, then we treat it as a multi release, not a single release.\n\t\t\tif (SUPPORTS_TOUCH) {\n\t\t\t\tif(event.touches.length>0) {\n\t\t\t\t\tstartMultiFingerRelease();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//If a previous finger has been released, check how long ago, if within the threshold, then assume it was a multifinger release.\n\t\t\t//This is used to allow 2 fingers to release fractionally after each other, whilst maintainig the event as containg 2 fingers, not 1\n\t\t\tif(inMultiFingerRelease()) {\t\n\t\t\t\tfingerCount=previousTouchFingerCount;\n\t\t\t}\t\n\t\t\n\t\t\t//Set end of swipe\n\t\t\tendTime = getTimeStamp();\n\t\t\t\n\t\t\t//Get duration incase move was never fired\n\t\t\tduration = calculateDuration();\n\t\t\t\n\t\t\t//If we trigger handlers at end of swipe OR, we trigger during, but they didnt trigger and we are still in the move phase\n\t\t\tif(didSwipeBackToCancel() || !validateSwipeDistance()) {\n\t\t\t phase = PHASE_CANCEL;\n triggerHandler(event, phase);\n\t\t\t} else if (options.triggerOnTouchEnd || (options.triggerOnTouchEnd == false && phase === PHASE_MOVE)) {\n\t\t\t\t//call this on jq event so we are cross browser \n\t\t\t\tjqEvent.preventDefault(); \n\t\t\t\tphase = PHASE_END;\n triggerHandler(event, phase);\n\t\t\t}\n\t\t\t//Special cases - A tap should always fire on touch end regardless,\n\t\t\t//So here we manually trigger the tap end handler by itself\n\t\t\t//We dont run trigger handler as it will re-trigger events that may have fired already\n\t\t\telse if (!options.triggerOnTouchEnd && hasTap()) {\n //Trigger the pinch events...\n\t\t\t phase = PHASE_END;\n\t\t\t triggerHandlerForGesture(event, phase, TAP);\n\t\t\t}\n\t\t\telse if (phase === PHASE_MOVE) {\n\t\t\t\tphase = PHASE_CANCEL;\n\t\t\t\ttriggerHandler(event, phase);\n\t\t\t}\n\n\t\t\tsetTouchInProgress(false);\n\n return null;\n\t\t}\n\n\n\n\t\t/**\n\t\t* Event handler for a touch cancel event. \n\t\t* Clears current vars\n\t\t* @inner\n\t\t*/\n\t\tfunction touchCancel() {\n\t\t\t// reset the variables back to default values\n\t\t\tfingerCount = 0;\n\t\t\tendTime = 0;\n\t\t\tstartTime = 0;\n\t\t\tstartTouchesDistance=0;\n\t\t\tendTouchesDistance=0;\n\t\t\tpinchZoom=1;\n\t\t\t\n\t\t\t//If we were in progress of tracking a possible multi touch end, then re set it.\n\t\t\tcancelMultiFingerRelease();\n\t\t\t\n\t\t\tsetTouchInProgress(false);\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t* Event handler for a touch leave event. \n\t\t* This is only triggered on desktops, in touch we work this out manually\n\t\t* as the touchleave event is not supported in webkit\n\t\t* @inner\n\t\t*/\n\t\tfunction touchLeave(jqEvent) {\n\t\t\tvar event = jqEvent.originalEvent;\n\t\t\t\n\t\t\t//If we have the trigger on leave property set....\n\t\t\tif(options.triggerOnTouchLeave) {\n\t\t\t\tphase = getNextPhase( PHASE_END );\n\t\t\t\ttriggerHandler(event, phase);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/**\n\t\t* Removes all listeners that were associated with the plugin\n\t\t* @inner\n\t\t*/\n\t\tfunction removeListeners() {\n\t\t\t$element.unbind(START_EV, touchStart);\n\t\t\t$element.unbind(CANCEL_EV, touchCancel);\n\t\t\t$element.unbind(MOVE_EV, touchMove);\n\t\t\t$element.unbind(END_EV, touchEnd);\n\t\t\t\n\t\t\t//we only have leave events on desktop, we manually calculate leave on touch as its not supported in webkit\n\t\t\tif(LEAVE_EV) { \n\t\t\t\t$element.unbind(LEAVE_EV, touchLeave);\n\t\t\t}\n\t\t\t\n\t\t\tsetTouchInProgress(false);\n\t\t}\n\n\t\t\n\t\t/**\n\t\t * Checks if the time and distance thresholds have been met, and if so then the appropriate handlers are fired.\n\t\t */\n\t\tfunction getNextPhase(currentPhase) {\n\t\t\t\n\t\t\tvar nextPhase = currentPhase;\n\t\t\t\n\t\t\t// Ensure we have valid swipe (under time and over distance and check if we are out of bound...)\n\t\t\tvar validTime = validateSwipeTime();\n\t\t\tvar validDistance = validateSwipeDistance();\n\t\t\tvar didCancel = didSwipeBackToCancel();\n\t\t\t\t\t\t\n\t\t\t//If we have exceeded our time, then cancel\t\n\t\t\tif(!validTime || didCancel) {\n\t\t\t\tnextPhase = PHASE_CANCEL;\n\t\t\t}\n\t\t\t//Else if we are moving, and have reached distance then end\n\t\t\telse if (validDistance && currentPhase == PHASE_MOVE && (!options.triggerOnTouchEnd || options.triggerOnTouchLeave) ) {\n\t\t\t\tnextPhase = PHASE_END;\n\t\t\t} \n\t\t\t//Else if we have ended by leaving and didn't reach distance, then cancel\n\t\t\telse if (!validDistance && currentPhase==PHASE_END && options.triggerOnTouchLeave) {\n\t\t\t\tnextPhase = PHASE_CANCEL;\n\t\t\t}\n\t\t\t\n\t\t\treturn nextPhase;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t* Trigger the relevant event handler\n\t\t* The handlers are passed the original event, the element that was swiped, and in the case of the catch all handler, the direction that was swiped, \"left\", \"right\", \"up\", or \"down\"\n\t\t* @param {object} event the original event object\n\t\t* @param {string} phase the phase of the swipe (start, end cancel etc) {@link $.fn.swipe.phases}\n\t\t* @inner\n\t\t*/\n\t\tfunction triggerHandler(event, phase) {\n\t\t\t\n\t\t\tvar ret = undefined;\n\t\t\t\n\t\t\t//Swipes and pinches are not mutually exclusive - can happend at same time, so need to trigger 2 events potentially\n\t\t\tif( (didSwipe() || hasSwipes()) || (didPinch() || hasPinches()) ) {\n\t\t\t\t// SWIPE GESTURES\n\t\t\t\tif(didSwipe() || hasSwipes()) { //hasSwipes as status needs to fire even if swipe is invalid\n\t\t\t\t\t//Trigger the swipe events...\n\t\t\t\t\tret = triggerHandlerForGesture(event, phase, SWIPE);\n\t\t\t\t}\t\n\n\t\t\t\t// PINCH GESTURES (if the above didn't cancel)\n\t\t\t\tif((didPinch() || hasPinches()) && ret!==false) {\n\t\t\t\t\t//Trigger the pinch events...\n\t\t\t\t\tret = triggerHandlerForGesture(event, phase, PINCH);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t \n\t\t\t\t// CLICK / TAP (if the above didn't cancel)\n\t\t\t\tif(didDoubleTap() && ret!==false) {\n\t\t\t\t\t//Trigger the tap events...\n\t\t\t\t\tret = triggerHandlerForGesture(event, phase, DOUBLE_TAP);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// CLICK / TAP (if the above didn't cancel)\n\t\t\t\telse if(didLongTap() && ret!==false) {\n\t\t\t\t\t//Trigger the tap events...\n\t\t\t\t\tret = triggerHandlerForGesture(event, phase, LONG_TAP);\n\t\t\t\t}\n\n\t\t\t\t// CLICK / TAP (if the above didn't cancel)\n\t\t\t\telse if(didTap() && ret!==false) {\n\t\t\t\t\t//Trigger the tap event..\n\t\t\t\t\tret = triggerHandlerForGesture(event, phase, TAP);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t// If we are cancelling the gesture, then manually trigger the reset handler\n\t\t\tif (phase === PHASE_CANCEL) {\n\t\t\t\ttouchCancel(event);\n\t\t\t}\n\t\t\t\n\t\t\t// If we are ending the gesture, then manually trigger the reset handler IF all fingers are off\n\t\t\tif(phase === PHASE_END) {\n\t\t\t\t//If we support touch, then check that all fingers are off before we cancel\n\t\t\t\tif (SUPPORTS_TOUCH) {\n\t\t\t\t\tif(event.touches.length==0) {\n\t\t\t\t\t\ttouchCancel(event);\t\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse {\n\t\t\t\t\ttouchCancel(event);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\t\t\n\t\t\treturn ret;\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t/**\n\t\t* Trigger the relevant event handler\n\t\t* The handlers are passed the original event, the element that was swiped, and in the case of the catch all handler, the direction that was swiped, \"left\", \"right\", \"up\", or \"down\"\n\t\t* @param {object} event the original event object\n\t\t* @param {string} phase the phase of the swipe (start, end cancel etc) {@link $.fn.swipe.phases}\n\t\t* @param {string} gesture the gesture to trigger a handler for : PINCH or SWIPE {@link $.fn.swipe.gestures}\n\t\t* @return Boolean False, to indicate that the event should stop propagation, or void.\n\t\t* @inner\n\t\t*/\n\t\tfunction triggerHandlerForGesture(event, phase, gesture) {\t\n\t\t\t\n\t\t\tvar ret=undefined;\n\t\t\t\n\t\t\t//SWIPES....\n\t\t\tif(gesture==SWIPE) {\n\t\t\t\t//Trigger status every time..\n\t\t\t\t\n\t\t\t\t//Trigger the event...\n\t\t\t\t$element.trigger('swipeStatus', [phase, direction || null, distance || 0, duration || 0, fingerCount, fingerData]);\n\t\t\t\t\n\t\t\t\t//Fire the callback\n\t\t\t\tif (options.swipeStatus) {\n\t\t\t\t\tret = options.swipeStatus.call($element, event, phase, direction || null, distance || 0, duration || 0, fingerCount, fingerData);\n\t\t\t\t\t//If the status cancels, then dont run the subsequent event handlers..\n\t\t\t\t\tif(ret===false) return false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tif (phase == PHASE_END && validateSwipe()) {\n\t\t\t\t\t//Fire the catch all event\n\t\t\t\t\t$element.trigger('swipe', [direction, distance, duration, fingerCount, fingerData]);\n\t\t\t\t\t\n\t\t\t\t\t//Fire catch all callback\n\t\t\t\t\tif (options.swipe) {\n\t\t\t\t\t\tret = options.swipe.call($element, event, direction, distance, duration, fingerCount, fingerData);\n\t\t\t\t\t\t//If the status cancels, then dont run the subsequent event handlers..\n\t\t\t\t\t\tif(ret===false) return false;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t//trigger direction specific event handlers\t\n\t\t\t\t\tswitch (direction) {\n\t\t\t\t\t\tcase LEFT:\n\t\t\t\t\t\t\t//Trigger the event\n\t\t\t\t\t\t\t$element.trigger('swipeLeft', [direction, distance, duration, fingerCount, fingerData]);\n\t\t\t\t\t\n\t\t\t\t\t //Fire the callback\n\t\t\t\t\t\t\tif (options.swipeLeft) {\n\t\t\t\t\t\t\t\tret = options.swipeLeft.call($element, event, direction, distance, duration, fingerCount, fingerData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\tcase RIGHT:\n\t\t\t\t\t\t\t//Trigger the event\n\t\t\t\t\t $element.trigger('swipeRight', [direction, distance, duration, fingerCount, fingerData]);\n\t\t\t\t\t\n\t\t\t\t\t //Fire the callback\n\t\t\t\t\t\t\tif (options.swipeRight) {\n\t\t\t\t\t\t\t\tret = options.swipeRight.call($element, event, direction, distance, duration, fingerCount, fingerData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\tcase UP:\n\t\t\t\t\t\t\t//Trigger the event\n\t\t\t\t\t $element.trigger('swipeUp', [direction, distance, duration, fingerCount, fingerData]);\n\t\t\t\t\t\n\t\t\t\t\t //Fire the callback\n\t\t\t\t\t\t\tif (options.swipeUp) {\n\t\t\t\t\t\t\t\tret = options.swipeUp.call($element, event, direction, distance, duration, fingerCount, fingerData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\n\t\t\t\t\t\tcase DOWN:\n\t\t\t\t\t\t\t//Trigger the event\n\t\t\t\t\t $element.trigger('swipeDown', [direction, distance, duration, fingerCount, fingerData]);\n\t\t\t\t\t\n\t\t\t\t\t //Fire the callback\n\t\t\t\t\t\t\tif (options.swipeDown) {\n\t\t\t\t\t\t\t\tret = options.swipeDown.call($element, event, direction, distance, duration, fingerCount, fingerData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t//PINCHES....\n\t\t\tif(gesture==PINCH) {\n\t\t\t\t//Trigger the event\n\t\t\t $element.trigger('pinchStatus', [phase, pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData]);\n\t\t\t\t\t\n //Fire the callback\n\t\t\t\tif (options.pinchStatus) {\n\t\t\t\t\tret = options.pinchStatus.call($element, event, phase, pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData);\n\t\t\t\t\t//If the status cancels, then dont run the subsequent event handlers..\n\t\t\t\t\tif(ret===false) return false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(phase==PHASE_END && validatePinch()) {\n\t\t\t\t\t\n\t\t\t\t\tswitch (pinchDirection) {\n\t\t\t\t\t\tcase IN:\n\t\t\t\t\t\t\t//Trigger the event\n $element.trigger('pinchIn', [pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData]);\n \n //Fire the callback\n if (options.pinchIn) {\n\t\t\t\t\t\t\t\tret = options.pinchIn.call($element, event, pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tcase OUT:\n\t\t\t\t\t\t\t//Trigger the event\n $element.trigger('pinchOut', [pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData]);\n \n //Fire the callback\n if (options.pinchOut) {\n\t\t\t\t\t\t\t\tret = options.pinchOut.call($element, event, pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\n\n \n\t \t\t\n\t\t\tif(gesture==TAP) {\n\t\t\t\tif(phase === PHASE_CANCEL || phase === PHASE_END) {\n\t\t\t\t\t\n \t\t\t \n \t\t\t //Cancel any existing double tap\n\t\t\t\t clearTimeout(singleTapTimeout);\n \t\t\t //Cancel hold timeout\n\t\t\t\t clearTimeout(holdTimeout);\n\t\t\t\t \n\t\t\t\t\t//If we are also looking for doubelTaps, wait incase this is one...\n\t\t\t\t if(hasDoubleTap() && !inDoubleTap()) {\n\t\t\t\t //Cache the time of this tap\n doubleTapStartTime = getTimeStamp();\n \n\t\t\t\t //Now wait for the double tap timeout, and trigger this single tap\n\t\t\t\t //if its not cancelled by a double tap\n\t\t\t\t singleTapTimeout = setTimeout($.proxy(function() {\n \t\t\t doubleTapStartTime=null;\n \t\t\t //Trigger the event\n \t\t\t$element.trigger('tap', [event.target]);\n\n \n //Fire the callback\n if(options.tap) {\n ret = options.tap.call($element, event, event.target);\n }\n \t\t\t }, this), options.doubleTapThreshold );\n \t\t\t \t\n \t\t\t } else {\n doubleTapStartTime=null;\n \n //Trigger the event\n $element.trigger('tap', [event.target]);\n\n \n //Fire the callback\n if(options.tap) {\n ret = options.tap.call($element, event, event.target);\n }\n\t \t\t }\n\t \t\t}\n\t\t\t}\n\t\t\t\n\t\t\telse if (gesture==DOUBLE_TAP) {\n\t\t\t\tif(phase === PHASE_CANCEL || phase === PHASE_END) {\n\t\t\t\t\t//Cancel any pending singletap \n\t\t\t\t clearTimeout(singleTapTimeout);\n\t\t\t\t doubleTapStartTime=null;\n\t\t\t\t \n //Trigger the event\n $element.trigger('doubletap', [event.target]);\n \n //Fire the callback\n if(options.doubleTap) {\n ret = options.doubleTap.call($element, event, event.target);\n }\n\t \t\t}\n\t\t\t}\n\t\t\t\n\t\t\telse if (gesture==LONG_TAP) {\n\t\t\t\tif(phase === PHASE_CANCEL || phase === PHASE_END) {\n\t\t\t\t\t//Cancel any pending singletap (shouldnt be one)\n\t\t\t\t clearTimeout(singleTapTimeout);\n\t\t\t\t doubleTapStartTime=null;\n\t\t\t\t \n //Trigger the event\n $element.trigger('longtap', [event.target]);\n \n //Fire the callback\n if(options.longTap) {\n ret = options.longTap.call($element, event, event.target);\n }\n\t \t\t}\n\t\t\t}\t\t\t\t\n\t\t\t\t\n\t\t\treturn ret;\n\t\t}\n\n\n\n\t\t\n\t\t//\n\t\t// GESTURE VALIDATION\n\t\t//\n\t\t\n\t\t/**\n\t\t* Checks the user has swipe far enough\n\t\t* @return Boolean if threshold has been set, return true if the threshold was met, else false.\n\t\t* If no threshold was set, then we return true.\n\t\t* @inner\n\t\t*/\n\t\tfunction validateSwipeDistance() {\n\t\t\tvar valid = true;\n\t\t\t//If we made it past the min swipe distance..\n\t\t\tif (options.threshold !== null) {\n\t\t\t\tvalid = distance >= options.threshold;\n\t\t\t}\n\t\t\t\n return valid;\n\t\t}\n\t\t\n\t\t/**\n\t\t* Checks the user has swiped back to cancel.\n\t\t* @return Boolean if cancelThreshold has been set, return true if the cancelThreshold was met, else false.\n\t\t* If no cancelThreshold was set, then we return true.\n\t\t* @inner\n\t\t*/\n\t\tfunction didSwipeBackToCancel() {\n var cancelled = false;\n \t\tif(options.cancelThreshold !== null && direction !==null) {\n \t\t cancelled = (getMaxDistance( direction ) - distance) >= options.cancelThreshold;\n\t\t\t}\n\t\t\t\n\t\t\treturn cancelled;\n\t\t}\n\n\t\t/**\n\t\t* Checks the user has pinched far enough\n\t\t* @return Boolean if pinchThreshold has been set, return true if the threshold was met, else false.\n\t\t* If no threshold was set, then we return true.\n\t\t* @inner\n\t\t*/\n\t\tfunction validatePinchDistance() {\n\t\t\tif (options.pinchThreshold !== null) {\n\t\t\t\treturn pinchDistance >= options.pinchThreshold;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t/**\n\t\t* Checks that the time taken to swipe meets the minimum / maximum requirements\n\t\t* @return Boolean\n\t\t* @inner\n\t\t*/\n\t\tfunction validateSwipeTime() {\n\t\t\tvar result;\n\t\t\t//If no time set, then return true\n\n\t\t\tif (options.maxTimeThreshold) {\n\t\t\t\tif (duration >= options.maxTimeThreshold) {\n\t\t\t\t\tresult = false;\n\t\t\t\t} else {\n\t\t\t\t\tresult = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tresult = true;\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\n\n\t\t/**\n\t\t* Checks direction of the swipe and the value allowPageScroll to see if we should allow or prevent the default behaviour from occurring.\n\t\t* This will essentially allow page scrolling or not when the user is swiping on a touchSwipe object.\n\t\t* @param {object} jqEvent The normalised jQuery representation of the event object.\n\t\t* @param {string} direction The direction of the event. See {@link $.fn.swipe.directions}\n\t\t* @see $.fn.swipe.directions\n\t\t* @inner\n\t\t*/\n\t\tfunction validateDefaultEvent(jqEvent, direction) {\n\n\t\t\t\n\t\t\tif( options.preventDefaultEvents === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (options.allowPageScroll === NONE) {\n\t\t\t\tjqEvent.preventDefault();\n\t\t\t} else {\n\t\t\t\tvar auto = options.allowPageScroll === AUTO;\n\n\t\t\t\tswitch (direction) {\n\t\t\t\t\tcase LEFT:\n\t\t\t\t\t\tif ((options.swipeLeft && auto) || (!auto && options.allowPageScroll != HORIZONTAL)) {\n\t\t\t\t\t\t\tjqEvent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase RIGHT:\n\t\t\t\t\t\tif ((options.swipeRight && auto) || (!auto && options.allowPageScroll != HORIZONTAL)) {\n\t\t\t\t\t\t\tjqEvent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UP:\n\t\t\t\t\t\tif ((options.swipeUp && auto) || (!auto && options.allowPageScroll != VERTICAL)) {\n\t\t\t\t\t\t\tjqEvent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase DOWN:\n\t\t\t\t\t\tif ((options.swipeDown && auto) || (!auto && options.allowPageScroll != VERTICAL)) {\n\t\t\t\t\t\t\tjqEvent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\n\t\t// PINCHES\n\t\t/**\n\t\t * Returns true of the current pinch meets the thresholds\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction validatePinch() {\n\t\t var hasCorrectFingerCount = validateFingers();\n\t\t var hasEndPoint = validateEndPoint();\n\t\t\tvar hasCorrectDistance = validatePinchDistance();\n\t\t\treturn hasCorrectFingerCount && hasEndPoint && hasCorrectDistance;\n\t\t\t\n\t\t}\n\t\t\n\t\t/**\n\t\t * Returns true if any Pinch events have been registered\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction hasPinches() {\n\t\t\t//Enure we dont return 0 or null for false values\n\t\t\treturn !!(options.pinchStatus || options.pinchIn || options.pinchOut);\n\t\t}\n\t\t\n\t\t/**\n\t\t * Returns true if we are detecting pinches, and have one\n\t\t * @return Boolean\n\t\t * @inner\n\t\t */\n\t\tfunction didPinch() {\n\t\t\t//Enure we dont return 0 or null for false values\n\t\t\treturn !!(validatePinch() && hasPinches());\n\t\t}\n\n\n\n\n\t\t// SWIPES\n\t\t/**\n\t\t * Returns true if the current swipe meets the thresholds\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction validateSwipe() {\n\t\t\t//Check validity of swipe\n\t\t\tvar hasValidTime = validateSwipeTime();\n\t\t\tvar hasValidDistance = validateSwipeDistance();\t\n\t\t\tvar hasCorrectFingerCount = validateFingers();\n\t\t var hasEndPoint = validateEndPoint();\n\t\t var didCancel = didSwipeBackToCancel();\t\n\t\t \n\t\t\t// if the user swiped more than the minimum length, perform the appropriate action\n\t\t\t// hasValidDistance is null when no distance is set \n\t\t\tvar valid = !didCancel && hasEndPoint && hasCorrectFingerCount && hasValidDistance && hasValidTime;\n\t\t\t\n\t\t\treturn valid;\n\t\t}\n\t\t\n\t\t/**\n\t\t * Returns true if any Swipe events have been registered\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction hasSwipes() {\n\t\t\t//Enure we dont return 0 or null for false values\n\t\t\treturn !!(options.swipe || options.swipeStatus || options.swipeLeft || options.swipeRight || options.swipeUp || options.swipeDown);\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Returns true if we are detecting swipes and have one\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction didSwipe() {\n\t\t\t//Enure we dont return 0 or null for false values\n\t\t\treturn !!(validateSwipe() && hasSwipes());\n\t\t}\n\n /**\n\t\t * Returns true if we have matched the number of fingers we are looking for\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n function validateFingers() {\n //The number of fingers we want were matched, or on desktop we ignore\n \t\treturn ((fingerCount === options.fingers || options.fingers === ALL_FINGERS) || !SUPPORTS_TOUCH);\n \t}\n \n /**\n\t\t * Returns true if we have an end point for the swipe\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n function validateEndPoint() {\n //We have an end value for the finger\n\t\t return fingerData[0].end.x !== 0;\n }\n\n\t\t// TAP / CLICK\n\t\t/**\n\t\t * Returns true if a click / tap events have been registered\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction hasTap() {\n\t\t\t//Enure we dont return 0 or null for false values\n\t\t\treturn !!(options.tap) ;\n\t\t}\n\t\t\n\t\t/**\n\t\t * Returns true if a double tap events have been registered\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction hasDoubleTap() {\n\t\t\t//Enure we dont return 0 or null for false values\n\t\t\treturn !!(options.doubleTap) ;\n\t\t}\n\t\t\n\t\t/**\n\t\t * Returns true if any long tap events have been registered\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction hasLongTap() {\n\t\t\t//Enure we dont return 0 or null for false values\n\t\t\treturn !!(options.longTap) ;\n\t\t}\n\t\t\n\t\t/**\n\t\t * Returns true if we could be in the process of a double tap (one tap has occurred, we are listening for double taps, and the threshold hasn't past.\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction validateDoubleTap() {\n\t\t if(doubleTapStartTime==null){\n\t\t return false;\n\t\t }\n\t\t var now = getTimeStamp();\n\t\t return (hasDoubleTap() && ((now-doubleTapStartTime) <= options.doubleTapThreshold));\n\t\t}\n\t\t\n\t\t/**\n\t\t * Returns true if we could be in the process of a double tap (one tap has occurred, we are listening for double taps, and the threshold hasn't past.\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction inDoubleTap() {\n\t\t return validateDoubleTap();\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Returns true if we have a valid tap\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction validateTap() {\n\t\t return ((fingerCount === 1 || !SUPPORTS_TOUCH) && (isNaN(distance) || distance < options.threshold));\n\t\t}\n\t\t\n\t\t/**\n\t\t * Returns true if we have a valid long tap\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction validateLongTap() {\n\t\t //slight threshold on moving finger\n return ((duration > options.longTapThreshold) && (distance < DOUBLE_TAP_THRESHOLD)); \n\t\t}\n\t\t\n\t\t/**\n\t\t * Returns true if we are detecting taps and have one\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction didTap() {\n\t\t //Enure we dont return 0 or null for false values\n\t\t\treturn !!(validateTap() && hasTap());\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Returns true if we are detecting double taps and have one\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction didDoubleTap() {\n\t\t //Enure we dont return 0 or null for false values\n\t\t\treturn !!(validateDoubleTap() && hasDoubleTap());\n\t\t}\n\t\t\n\t\t/**\n\t\t * Returns true if we are detecting long taps and have one\n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction didLongTap() {\n\t\t //Enure we dont return 0 or null for false values\n\t\t\treturn !!(validateLongTap() && hasLongTap());\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t// MULTI FINGER TOUCH\n\t\t/**\n\t\t * Starts tracking the time between 2 finger releases, and keeps track of how many fingers we initially had up\n\t\t * @inner\n\t\t*/\n\t\tfunction startMultiFingerRelease() {\n\t\t\tpreviousTouchEndTime = getTimeStamp();\n\t\t\tpreviousTouchFingerCount = event.touches.length+1;\n\t\t}\n\t\t\n\t\t/**\n\t\t * Cancels the tracking of time between 2 finger releases, and resets counters\n\t\t * @inner\n\t\t*/\n\t\tfunction cancelMultiFingerRelease() {\n\t\t\tpreviousTouchEndTime = 0;\n\t\t\tpreviousTouchFingerCount = 0;\n\t\t}\n\t\t\n\t\t/**\n\t\t * Checks if we are in the threshold between 2 fingers being released \n\t\t * @return Boolean\n\t\t * @inner\n\t\t*/\n\t\tfunction inMultiFingerRelease() {\n\t\t\t\n\t\t\tvar withinThreshold = false;\n\t\t\t\n\t\t\tif(previousTouchEndTime) {\t\n\t\t\t\tvar diff = getTimeStamp() - previousTouchEndTime\t\n\t\t\t\tif( diff<=options.fingerReleaseThreshold ) {\n\t\t\t\t\twithinThreshold = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn withinThreshold;\t\n\t\t}\n\t\t\n\n\t\t/**\n\t\t* gets a data flag to indicate that a touch is in progress\n\t\t* @return Boolean\n\t\t* @inner\n\t\t*/\n\t\tfunction getTouchInProgress() {\n\t\t\t//strict equality to ensure only true and false are returned\n\t\t\treturn !!($element.data(PLUGIN_NS+'_intouch') === true);\n\t\t}\n\t\t\n\t\t/**\n\t\t* Sets a data flag to indicate that a touch is in progress\n\t\t* @param {boolean} val The value to set the property to\n\t\t* @inner\n\t\t*/\n\t\tfunction setTouchInProgress(val) {\n\t\t\t\n\t\t\t//Add or remove event listeners depending on touch status\n\t\t\tif(val===true) {\n\t\t\t\t$element.bind(MOVE_EV, touchMove);\n\t\t\t\t$element.bind(END_EV, touchEnd);\n\t\t\t\t\n\t\t\t\t//we only have leave events on desktop, we manually calcuate leave on touch as its not supported in webkit\n\t\t\t\tif(LEAVE_EV) { \n\t\t\t\t\t$element.bind(LEAVE_EV, touchLeave);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$element.unbind(MOVE_EV, touchMove, false);\n\t\t\t\t$element.unbind(END_EV, touchEnd, false);\n\t\t\t\n\t\t\t\t//we only have leave events on desktop, we manually calcuate leave on touch as its not supported in webkit\n\t\t\t\tif(LEAVE_EV) { \n\t\t\t\t\t$element.unbind(LEAVE_EV, touchLeave, false);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\n\t\t\t//strict equality to ensure only true and false can update the value\n\t\t\t$element.data(PLUGIN_NS+'_intouch', val === true);\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Creates the finger data for the touch/finger in the event object.\n\t\t * @param {int} index The index in the array to store the finger data (usually the order the fingers were pressed)\n\t\t * @param {object} evt The event object containing finger data\n\t\t * @return finger data object\n\t\t * @inner\n\t\t*/\n\t\tfunction createFingerData( index, evt ) {\n\t\t\tvar id = evt.identifier!==undefined ? evt.identifier : 0; \n\t\t\t\n\t\t\tfingerData[index].identifier = id;\n\t\t\tfingerData[index].start.x = fingerData[index].end.x = evt.pageX||evt.clientX;\n\t\t\tfingerData[index].start.y = fingerData[index].end.y = evt.pageY||evt.clientY;\n\t\t\t\n\t\t\treturn fingerData[index];\n\t\t}\n\t\t\n\t\t/**\n\t\t * Updates the finger data for a particular event object\n\t\t * @param {object} evt The event object containing the touch/finger data to upadte\n\t\t * @return a finger data object.\n\t\t * @inner\n\t\t*/\n\t\tfunction updateFingerData(evt) {\n\t\t\t\n\t\t\tvar id = evt.identifier!==undefined ? evt.identifier : 0; \n\t\t\tvar f = getFingerData( id );\n\t\t\t\n\t\t\tf.end.x = evt.pageX||evt.clientX;\n\t\t\tf.end.y = evt.pageY||evt.clientY;\n\t\t\t\n\t\t\treturn f;\n\t\t}\n\t\t\n\t\t/**\n\t\t * Returns a finger data object by its event ID.\n\t\t * Each touch event has an identifier property, which is used \n\t\t * to track repeat touches\n\t\t * @param {int} id The unique id of the finger in the sequence of touch events.\n\t\t * @return a finger data object.\n\t\t * @inner\n\t\t*/\n\t\tfunction getFingerData( id ) {\n\t\t\tfor(var i=0; i= 0)) {\n\t\t\t\treturn LEFT;\n\t\t\t} else if ((angle <= 360) && (angle >= 315)) {\n\t\t\t\treturn LEFT;\n\t\t\t} else if ((angle >= 135) && (angle <= 225)) {\n\t\t\t\treturn RIGHT;\n\t\t\t} else if ((angle > 45) && (angle < 135)) {\n\t\t\t\treturn DOWN;\n\t\t\t} else {\n\t\t\t\treturn UP;\n\t\t\t}\n\t\t}\n\t\t\n\n\t\t/**\n\t\t* Returns a MS time stamp of the current time\n\t\t* @return int\n\t\t* @inner\n\t\t*/\n\t\tfunction getTimeStamp() {\n\t\t\tvar now = new Date();\n\t\t\treturn now.getTime();\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t/**\n\t\t * Returns a bounds object with left, right, top and bottom properties for the element specified.\n\t\t * @param {DomNode} The DOM node to get the bounds for.\n\t\t */\n\t\tfunction getbounds( el ) {\n\t\t\tel = $(el);\n\t\t\tvar offset = el.offset();\n\t\t\t\n\t\t\tvar bounds = {\t\n\t\t\t\t\tleft:offset.left,\n\t\t\t\t\tright:offset.left+el.outerWidth(),\n\t\t\t\t\ttop:offset.top,\n\t\t\t\t\tbottom:offset.top+el.outerHeight()\n\t\t\t\t\t}\n\t\t\t\n\t\t\treturn bounds;\t\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Checks if the point object is in the bounds object.\n\t\t * @param {object} point A point object.\n\t\t * @param {int} point.x The x value of the point.\n\t\t * @param {int} point.y The x value of the point.\n\t\t * @param {object} bounds The bounds object to test\n\t\t * @param {int} bounds.left The leftmost value\n\t\t * @param {int} bounds.right The righttmost value\n\t\t * @param {int} bounds.top The topmost value\n\t\t* @param {int} bounds.bottom The bottommost value\n\t\t */\n\t\tfunction isInBounds(point, bounds) {\n\t\t\treturn (point.x > bounds.left && point.x < bounds.right && point.y > bounds.top && point.y < bounds.bottom);\n\t\t};\n\t\n\t\n\t}\n\t\n\t\n\n\n/**\n * A catch all handler that is triggered for all swipe directions. \n * @name $.fn.swipe#swipe\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {int} direction The direction the user swiped in. See {@link $.fn.swipe.directions}\n * @param {int} distance The distance the user swiped\n * @param {int} duration The duration of the swipe in milliseconds\n * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}\n * @param {object} fingerData The coordinates of fingers in event\n */\n \n\n\n\n/**\n * A handler that is triggered for \"left\" swipes.\n * @name $.fn.swipe#swipeLeft\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {int} direction The direction the user swiped in. See {@link $.fn.swipe.directions}\n * @param {int} distance The distance the user swiped\n * @param {int} duration The duration of the swipe in milliseconds\n * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}\n * @param {object} fingerData The coordinates of fingers in event\n */\n \n/**\n * A handler that is triggered for \"right\" swipes.\n * @name $.fn.swipe#swipeRight\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {int} direction The direction the user swiped in. See {@link $.fn.swipe.directions}\n * @param {int} distance The distance the user swiped\n * @param {int} duration The duration of the swipe in milliseconds\n * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}\n * @param {object} fingerData The coordinates of fingers in event\n */\n\n/**\n * A handler that is triggered for \"up\" swipes.\n * @name $.fn.swipe#swipeUp\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {int} direction The direction the user swiped in. See {@link $.fn.swipe.directions}\n * @param {int} distance The distance the user swiped\n * @param {int} duration The duration of the swipe in milliseconds\n * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}\n * @param {object} fingerData The coordinates of fingers in event\n */\n \n/**\n * A handler that is triggered for \"down\" swipes.\n * @name $.fn.swipe#swipeDown\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {int} direction The direction the user swiped in. See {@link $.fn.swipe.directions}\n * @param {int} distance The distance the user swiped\n * @param {int} duration The duration of the swipe in milliseconds\n * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}\n * @param {object} fingerData The coordinates of fingers in event\n */\n \n/**\n * A handler triggered for every phase of the swipe. This handler is constantly fired for the duration of the pinch.\n * This is triggered regardless of swipe thresholds.\n * @name $.fn.swipe#swipeStatus\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {string} phase The phase of the swipe event. See {@link $.fn.swipe.phases}\n * @param {string} direction The direction the user swiped in. This is null if the user has yet to move. See {@link $.fn.swipe.directions}\n * @param {int} distance The distance the user swiped. This is 0 if the user has yet to move.\n * @param {int} duration The duration of the swipe in milliseconds\n * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}\n * @param {object} fingerData The coordinates of fingers in event\n */\n \n/**\n * A handler triggered for pinch in events.\n * @name $.fn.swipe#pinchIn\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {int} direction The direction the user pinched in. See {@link $.fn.swipe.directions}\n * @param {int} distance The distance the user pinched\n * @param {int} duration The duration of the swipe in milliseconds\n * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}\n * @param {int} zoom The zoom/scale level the user pinched too, 0-1.\n * @param {object} fingerData The coordinates of fingers in event\n */\n\n/**\n * A handler triggered for pinch out events.\n * @name $.fn.swipe#pinchOut\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {int} direction The direction the user pinched in. See {@link $.fn.swipe.directions}\n * @param {int} distance The distance the user pinched\n * @param {int} duration The duration of the swipe in milliseconds\n * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}\n * @param {int} zoom The zoom/scale level the user pinched too, 0-1.\n * @param {object} fingerData The coordinates of fingers in event\n */ \n\n/**\n * A handler triggered for all pinch events. This handler is constantly fired for the duration of the pinch. This is triggered regardless of thresholds.\n * @name $.fn.swipe#pinchStatus\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {int} direction The direction the user pinched in. See {@link $.fn.swipe.directions}\n * @param {int} distance The distance the user pinched\n * @param {int} duration The duration of the swipe in milliseconds\n * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}\n * @param {int} zoom The zoom/scale level the user pinched too, 0-1.\n * @param {object} fingerData The coordinates of fingers in event\n */\n\n/**\n * A click handler triggered when a user simply clicks, rather than swipes on an element.\n * This is deprecated since version 1.6.2, any assignment to click will be assigned to the tap handler.\n * You cannot use on to bind to this event as the default jQ click event will be triggered.\n * Use the tap event instead.\n * @name $.fn.swipe#click\n * @event\n * @deprecated since version 1.6.2, please use {@link $.fn.swipe#tap} instead \n * @default null\n * @param {EventObject} event The original event object\n * @param {DomObject} target The element clicked on.\n */\n \n /**\n * A click / tap handler triggered when a user simply clicks or taps, rather than swipes on an element.\n * @name $.fn.swipe#tap\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {DomObject} target The element clicked on.\n */\n \n/**\n * A double tap handler triggered when a user double clicks or taps on an element.\n * You can set the time delay for a double tap with the {@link $.fn.swipe.defaults#doubleTapThreshold} property. \n * Note: If you set both doubleTap and tap handlers, the tap event will be delayed by the doubleTapThreshold\n * as the script needs to check if its a double tap.\n * @name $.fn.swipe#doubleTap\n * @see $.fn.swipe.defaults#doubleTapThreshold\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {DomObject} target The element clicked on.\n */\n \n /**\n * A long tap handler triggered once a tap has been release if the tap was longer than the longTapThreshold.\n * You can set the time delay for a long tap with the {@link $.fn.swipe.defaults#longTapThreshold} property. \n * @name $.fn.swipe#longTap\n * @see $.fn.swipe.defaults#longTapThreshold\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {DomObject} target The element clicked on.\n */\n\n /**\n * A hold tap handler triggered as soon as the longTapThreshold is reached\n * You can set the time delay for a long tap with the {@link $.fn.swipe.defaults#longTapThreshold} property. \n * @name $.fn.swipe#hold\n * @see $.fn.swipe.defaults#longTapThreshold\n * @event\n * @default null\n * @param {EventObject} event The original event object\n * @param {DomObject} target The element clicked on.\n */\n\n}));\n\n$(function () {\n slidesView = {\n // default transition time between two slides\n scrollingSpeed: 1000,\n\n // currently used transition time. Can be different than the default when going through multiple slides during transitions\n currentScrollingSpeed: 1000,\n\n surpressCallbacks: false,\n\n indicatorPosition: null,\n\n getBeforeEnterCallbackName: function (slideId) {\n return \"on\" + slideId.replace('-', '_').capitalize() + 'Enter';\n },\n getBeforeLeaveCallbackName: function (slideId) {\n return \"on\" + slideId.replace('-', '_').capitalize() + 'Leave';\n },\n\n backgroundTransition: function (newSlideEl, direction) {\n //if ($(newSlideEl).attr(\"id\") == \"slide-9-transition\") {\n // $(\"#parallax #road\").hide();\n //} else {\n // $(\"#parallax #road\").show();\n //}\n\n // new slide is a transition slide, so instead of scrolling to it we need to skip over it to the next one\n // adjust the speed for a 2-slide scroll\n slidesView.setScrollingSpeed(4 * slidesView.scrollingSpeed);\n // reset speed after slide change is finished\n setTimeout(function () {\n slidesView.setScrollingSpeed(slidesView.scrollingSpeed);\n },\n 3 * slidesView.scrollingSpeed + 10\n );\n\n var targetSlide = $(newSlideEl).data(direction + 'Slide');\n // setTimeout is needed due to a bug in fullpage.js\n setTimeout(function () {\n $.fn.fullpage.moveTo(0, targetSlide);\n }, 5);\n },\n\n onBeforeSlideEnter: function (oldSlideEl, newSlideIndex, direction) {\n if (slidesView.surpressCallbacks) {\n return;\n }\n // this is called before the viewport enters a slide\n var newSlideEl = $(\"#slides .slide\")[newSlideIndex];\n var slideId = $(newSlideEl).attr(\"id\");\n\n if ($(newSlideEl).hasClass(\"transition\")) {\n this.backgroundTransition(newSlideEl, direction);\n } else {\n // \"where swelling can occur\" slides series without scrolling effect between them\n if ($.inArray(slideId, [\"slide-4\", \"slide-5\", \"slide-6\", \"slide-7\", \"slide-14\"]) != -1\n || (slideId == \"slide-3\" && direction == \"left\")\n || (slideId == \"slide-8\" && direction == \"right\")) {\n slidesView.setScrollingSpeed(0);\n setTimeout(function () {\n slidesView.setScrollingSpeed(slidesView.scrollingSpeed);\n }, 10);\n } else {\n // slidesView.setScrollingSpeed(slidesView.scrollingSpeed);\n }\n\n // call beforeLoad event for given slide\n var onBeforeEnterFnName = slidesView.getBeforeEnterCallbackName(slideId);\n if (typeof window[onBeforeEnterFnName] === \"function\") {\n window[onBeforeEnterFnName](oldSlideEl.attr('id'), direction);\n }\n }\n },\n\n setScrollingSpeed: function (speed) {\n slidesView.currentScrollingSpeed = speed;\n $.fn.fullpage.setScrollingSpeed(slidesView.currentScrollingSpeed);\n },\n\n onBeforeSlideLeave: function (slideEl, direction) {\n if (slidesView.surpressCallbacks) {\n return;\n }\n\n // this is called before the viewport leaves a slide\n var slideId = $(slideEl).attr(\"id\");\n var onBeforeLeaveFnName = this.getBeforeLeaveCallbackName(slideId);\n if (typeof window[onBeforeLeaveFnName] === \"function\") {\n window[onBeforeLeaveFnName](slideId, direction);\n }\n },\n\n onBeforeScroll: function (newLeftPos) {\n $(\"#parallax .layer:visible\").each(function () {\n var transition = 'all ' + slidesView.currentScrollingSpeed + 'ms ease';\n\n var elementLeft = $(this).data(\"speed\") * newLeftPos;\n var $layer = $(this);\n setTimeout(function () {\n $layer.css({\n '-webkit-transition': transition,\n 'transition': transition,\n '-webkit-transform': 'translate3d(-' + elementLeft + 'px, 0px, 0px)',\n 'transform': 'translate3d(-' + elementLeft + 'px, 0px, 0px)'\n });\n });\n });\n },\n\n onResize: function () {\n // maintain aspect ratio of 16:9 in case the browser is wider than that\n var ratio = 16 / 9;\n $(\".container\").each(function () {\n var $this = $(this);\n var $parent = $this.parent();\n var width = $parent.width();\n var height = $parent.height();\n\n if (height == 0) {\n return;\n }\n\n if (width / height > ratio) {\n $this.width(ratio * height);\n } else {\n $this.width(\"100%\");\n }\n slidesView.updateIndicator();\n });\n },\n\n setIndicatorPosition: function(a, b, c, d, sel1, sel2) {\n slidesView.indicatorPosition = {a: a, b: b, c: c, d: d, sel1: sel1, sel2: sel2};\n\n var $character = $(sel1);\n var $zoom = $(sel2);\n //$zoom.css({width: $character.width() * 1.5});\n var pivotX = $zoom.width() * c;\n var pivotY = $zoom.height() * d;\n\n $(sel2).css(\n {\n left: $character.width() * a - pivotX,\n top: $character.height() * b - pivotY\n }\n );\n },\n\n updateIndicator: function() {\n if (slidesView.indicatorPosition !== null) {\n slidesView.setIndicatorPosition(\n slidesView.indicatorPosition.a,\n slidesView.indicatorPosition.b,\n slidesView.indicatorPosition.c,\n slidesView.indicatorPosition.d,\n slidesView.indicatorPosition.sel1,\n slidesView.indicatorPosition.sel2\n );\n }\n }\n };\n\n function isPortrait() {\n return window.innerHeight > window.innerWidth;\n }\n\n function setNavActiveLink(slideId) {\n var slideNav = $('#slidesNav');\n slideNav.find('a:not([data-slide-id=\"' + slideId + '\"])').removeClass('active');\n slideNav.find('[data-slide-id=\"' + slideId + '\"]').addClass('active');\n }\n\n function showOrientationMessage() {\n $(\"#orientation-message\").show();\n $(\"#content\").hide();\n // $(\"#orientation-message\").dialog ();\n }\n\n function hideOrientationMessage() {\n $(\"#orientation-message\").hide();\n $(\"#content\").show();\n }\n\n if (isPortrait()) {\n showOrientationMessage();\n }\n\n window.addEventListener(\"resize\", function () {\n // $(window).on (\"resize\", function () {\n if (isPortrait())\n showOrientationMessage();\n else\n hideOrientationMessage();\n }, false);\n\n $('#fullpage').fullpage({\n css3: true,\n loopHorizontal: false,\n //anchors: [\"main\"],\n resize: true,\n autoscroll: false,\n scrollingSpeed: slidesView.scrollingSpeed,\n beforeScroll: slidesView.onBeforeScroll,\n afterResize: slidesView.onResize,\n onSlideLeave: function(anchorLink, index, slideIndex, direction) {\n slidesView.onBeforeSlideLeave(this, direction);\n slidesView.onBeforeSlideEnter(this, direction == \"right\" ? slideIndex + 1 : slideIndex - 1, direction);\n },\n afterSlideLoad: function(anchorLink, index, slideAnchor, slideIndex) {\n setNavActiveLink($(this).attr('id'));\n },\n afterLoad: function(anchorLink, index) {\n onSlide_1Enter(); // run first slide animation\n slidesView.onResize();\n }\n\n });\n\n // lazy load images\n $(\"img.lazy\").lazyload({\n event: \"imgLoad\"\n });\n $(window).bind(\"load\", function () {\n var timeout = setTimeout(function () {\n $(\"img.lazy\").trigger(\"imgLoad\");\n }, 1000);\n });\n\n // disable possibility of scrolling through sections by using the mouse wheel/trackpad or touch gestures.\n $.fn.fullpage.setAllowScrolling(false);\n\n $('html').mousewheel(function (event) {\n if (event.deltaY > 0) {\n $.fn.fullpage.moveSlideLeft();\n } else if (event.deltaY < 0) {\n $.fn.fullpage.moveSlideRight();\n }\n });\n\n // Enable swiping...\n $('html').swipe({\n //Generic swipe handler for all directions\n swipe: function (event, direction, distance, duration, fingerCount, fingerData) {\n if (direction === 'left') {\n $.fn.fullpage.moveSlideRight();\n } else if (direction === 'right') {\n $.fn.fullpage.moveSlideLeft();\n }\n },\n //Default is 75px, set to 0 so any distance triggers swipe\n threshold: 0\n });\n\n // Slides navigation\n $('#slidesNav a').click(function (e) {\n var targetSlideId = $(this).data('slideId');\n var activeSlideId = $('.slide.active').attr('id');\n var slideAnchor = 'slide' + targetSlideId.split(\"-\").pop();\n\n e.preventDefault();\n slidesView.surpressCallbacks = true;\n slidesView.setScrollingSpeed(0);\n if (targetSlideId === 'slide-1') {\n $.fn.fullpage.moveTo(0, 0);\n } else {\n $.fn.fullpage.moveTo(0, slideAnchor);\n }\n\n // hide all animations in active slide\n if (activeSlideId !== targetSlideId ) {\n setTimeout(function () {\n var onBeforeLeaveFnName = slidesView.getBeforeLeaveCallbackName(activeSlideId);\n if (typeof window[onBeforeLeaveFnName] === \"function\") {\n window[onBeforeLeaveFnName](null, null);\n }\n }, 5);\n }\n\n // show animations in new slide\n setTimeout(function () {\n slidesView.surpressCallbacks = false;\n var onBeforeEnterFnName = slidesView.getBeforeEnterCallbackName(targetSlideId);\n if (typeof window[onBeforeEnterFnName] === \"function\") {\n window[onBeforeEnterFnName](null, null);\n }\n\n slidesView.setScrollingSpeed(slidesView.scrollingSpeed);\n }, 5);\n });\n\n});\n\nString.prototype.capitalize = function () {\n return this.charAt(0).toUpperCase() + this.slice(1);\n};\n\n\nvar slide1Animations = {\n slide: $(\"#slide-1\"),\n kitesAnimations: function(enter) {\n var self = this;\n var $kite1 = self.slide.find(\".kite-1\");\n var $kite2 = self.slide.find(\".kite-2\");\n if (enter === true) {\n $kite1.velocity(\"transition.slideLeftIn\", {\n delay: 500,\n complete: function(elements) { // on enter\n $kite1.velocity({top: \"20%\"}).velocity({top: \"12%\"}, {duration: 2400, loop: true});\n $kite2.velocity(\"transition.slideLeftIn\", {\n complete: function(elements) {\n $kite2.velocity({top: \"33%\"}).velocity({top: \"27%\"}, {duration: 1800, loop: true});\n }\n });\n }\n });\n } else { // on leave\n $kite1.velocity('stop', true).velocity(\"transition.fadeOut\");\n $kite2.velocity('stop', true).velocity(\"transition.fadeOut\");\n }\n },\n charactersAnimations: function(enter) {\n var self = this;\n var $characters = self.slide.find(\".people-wrapper img\");\n if (enter === true) { // on enter\n $characters.velocity(\"transition.slideUpIn\", {stagger: 150}).delay(750);\n } else { // on leave\n $characters.velocity(\"transition.fadeOut\", {stagger: 100});\n }\n },\n textAnimations: function(enter) {\n var self = this;\n var $infoBox = self.slide.find(\".info-box\");\n var $title = self.slide.find(\".title\");\n var $start = self.slide.find(\".start\");\n if (enter === true) { // on enter\n $title.velocity(\"transition.slideDownBigIn\", {\n delay: 100, complete: function(elements) {\n $infoBox.velocity(\"transition.bounceDownIn\", {delay: 300});\n $start.velocity(\"transition.bounceUpIn\", {\n delay: 300,\n complete: function(elements) {\n $start.velocity(\"callout.swing\");\n }\n });\n }\n });\n } else { // on leave\n $title.velocity('stop', true).velocity(\"transition.slideUpBigOut\");\n $infoBox.velocity('stop', true).velocity(\"transition.slideDownOut\");\n $start.velocity('stop', true).velocity(\"transition.slideUpOut\");\n }\n }\n};\n\n// on slide enter\nfunction onSlide_1Enter(source, direction) {\n slide1Animations.kitesAnimations(true);\n slide1Animations.textAnimations(true);\n slide1Animations.charactersAnimations(true);\n}\n\n// on slide leave\nfunction onSlide_1Leave(source) {\n slide1Animations.kitesAnimations(false);\n slide1Animations.textAnimations(false);\n slide1Animations.charactersAnimations(false);\n}\nvar flag = false;\n$(\"#slide-1 .start.animation\").bind('touchstart click', function(){\n\tif (!flag) {\n\t\tflag = true;\n\t\tsetTimeout(function(){ flag = false; }, 100);\n\t\t$.fn.fullpage.moveSlideRight();\n\t}\n\n return false;\n});\n\nvar slide10Animations = {\n slide: $(\"#slide-10\"),\n charactersAnimations: function(enter, direction) {\n var self = this;\n var $characters = self.slide.find(\".character\");\n var $delay = (direction === 'right') ? 1000 : 100;\n if (enter === true) { // on enter\n $characters.velocity(\"transition.slideUpIn\", {\n delay: $delay,\n complete: function(elements) {\n self.textAnimations(true);\n }\n });\n } else { // on leave\n $characters.velocity('stop', true).velocity(\"transition.fadeOut\");\n self.textAnimations(false);\n }\n },\n textAnimations: function(enter) {\n var self = this;\n var $infoBox = self.slide.find(\".info-box\");\n var $pinkBubble = self.slide.find(\".pink-bubble\");\n var $orangeBubble = self.slide.find(\".orange-bubble\");\n var $greenBubble = self.slide.find(\".green-bubble\");\n var $desk = self.slide.find(\".desk\");\n if (enter === true) { // on enter\n $infoBox.velocity(\"transition.slideLeftBigIn\");\n $desk.velocity(\"transition.slideLeftBigIn\", {delay: 100});\n $pinkBubble.velocity(\"transition.bounceIn\", {delay: 100});\n $orangeBubble.velocity(\"transition.bounceIn\", {delay: 200});\n $greenBubble.velocity(\"transition.bounceIn\", {delay: 300});\n } else { // on leave\n $infoBox.velocity('stop', true).velocity(\"transition.fadeOut\");\n $desk.velocity('stop', true).velocity(\"transition.fadeOut\");\n $pinkBubble.velocity('stop', true).velocity(\"transition.fadeOut\");\n $orangeBubble.velocity('stop', true).velocity(\"transition.fadeOut\");\n $greenBubble.velocity('stop', true).velocity(\"transition.fadeOut\");\n }\n },\n backgroundAnimations: function(enter, direction) {\n var self = this;\n var $bgOffice = self.slide.find(\".office-building-bg\");\n var $bgBox = self.slide.find(\".slide-bg\");\n var $officeDelay = (direction === null) ? 100 : 2000;\n if (enter === true) { // on enter\n // make bigger office\n $bgOffice.velocity({height: \"260%\"}, {\n delay: $officeDelay,\n duration: $officeDelay\n });\n if (direction === 'right') { // only when enter from outside\n self.slide.find(\".slide-bg\").addClass('animation'); // hide slide-bg\n $bgBox.velocity(\"transition.slideRightBigIn\", {\n delay: $officeDelay + 1500,\n duration: $officeDelay - 750,\n complete: function(elements) {\n self.charactersAnimations(true);\n }\n });\n } else {\n // when enter from a nav link\n if (direction === null) {\n $bgBox.velocity('stop', true).attr(\"style\", \"\").removeClass('animation');\n }\n self.charactersAnimations(true);\n }\n } else { // on leave\n // only when leave to outside, and from nav link (direction is null)\n if (direction === 'left') {\n // make smaller office\n $officeDelay = 2000;\n $bgOffice.velocity('stop', true).velocity({height: \"100%\"}, {\n delay: $officeDelay - 2000,\n duration: $officeDelay - 1200\n });\n $bgBox.velocity('stop', true).velocity(\"transition.slideRightBigOut\");\n }\n }\n\n }\n};\n\nfunction onSlide_10Enter(source, direction) {\n slide10Animations.backgroundAnimations(true, direction);\n}\nfunction onSlide_10Leave(source, direction) {\n slide10Animations.charactersAnimations(false);\n slide10Animations.backgroundAnimations(false, direction);\n}\n\nvar slide11Animations = {\n slide: $(\"#slide-11\"),\n charactersAnimations: function(enter) {\n var self = this;\n var $characters = self.slide.find(\".character\");\n var $doctor = self.slide.find(\".doctor\");\n if (enter === true) { // on enter\n $characters.velocity(\"transition.slideUpIn\", {\n delay: 100,\n complete: function(elements) {\n $doctor.velocity(\"transition.slideRightBigIn\");\n self.textAnimations(true);\n self.furnitureAnimations(true);\n }\n });\n } else { // on leave\n $characters.velocity('stop', true).velocity(\"transition.fadeOut\");\n $doctor.velocity('stop', true).velocity(\"transition.slideLeftBigOut\");\n self.textAnimations(false);\n self.furnitureAnimations(false);\n }\n },\n textAnimations: function(enter) {\n var self = this;\n var $infoBox = self.slide.find(\".info-box\");\n var $pinkBubble = self.slide.find(\".pink-bubble\");\n var $orangeBubble = self.slide.find(\".orange-bubble\");\n var $greenBubble = self.slide.find(\".green-bubble\");\n if (enter === true) { // on enter\n $infoBox.velocity(\"transition.slideLeftBigIn\");\n $pinkBubble.velocity(\"transition.bounceIn\", {delay: 100});\n $orangeBubble.velocity(\"transition.bounceIn\", {delay: 200});\n $greenBubble.velocity(\"transition.bounceIn\", {delay: 300});\n } else { // on leave\n $infoBox.velocity('stop', true).velocity(\"transition.slideLeftBigOut\");\n $pinkBubble.velocity('stop', true).velocity(\"transition.bounceOut\");\n $orangeBubble.velocity('stop', true).velocity(\"transition.bounceOut\");\n $greenBubble.velocity('stop', true).velocity(\"transition.bounceOut\");\n }\n },\n furnitureAnimations: function(enter) {\n var self = this;\n var $table = self.slide.find(\".table\");\n var $picture = self.slide.find(\".picture\");\n if (enter === true) { // on enter\n $table.velocity(\"transition.slideRightBigIn\", {delay: 100});\n $picture.velocity(\"transition.bounceDownIn\", {delay: 100});\n } else { // on leave\n $table.velocity('stop', true).velocity(\"transition.slideRightBigOut\");\n $picture.velocity('stop', true).velocity(\"transition.bounceUpOut\");\n }\n },\n backgroundAnimations: function(enter, direction) {\n var self = this;\n var $bgBox = self.slide.find(\".slide-bg\");\n var $delay = (direction === null) ? 0 : 1000; // no delay for entry from a nav link\n var $effect = (direction === null) ? 'flipXIn' : 'expandIn'; // flipXIn for entry from a nav link\n if (enter === true) { // on enter\n if (direction !== 'left') { // only when enter from different room, and from a nav link (direction is null)\n $bgBox.velocity(\"transition.\" + $effect, {\n delay: $delay,\n complete: function(elements) {\n self.charactersAnimations(true);\n }\n });\n } else {\n self.charactersAnimations(true);\n }\n } else { // on leave\n // only when leave to different room, and from nav link (direction is null)\n if (direction === 'left' || direction === null) {\n $bgBox.velocity('stop', true).velocity(\"transition.expandOut\");\n }\n }\n }\n};\n\nfunction onSlide_11Enter(source, direction) {\n slide11Animations.backgroundAnimations(true, direction);\n\n}\nfunction onSlide_11Leave(source, direction) {\n slide11Animations.charactersAnimations(false);\n slide11Animations.backgroundAnimations(false, direction);\n}\n\nvar slide12Animations = {\n slide: $(\"#slide-12\"),\n charactersAnimations: function(enter) {\n var self = this;\n var $characters = self.slide.find(\".character\");\n var $doctor = self.slide.find(\".doctor\");\n if (enter === true) { // on enter\n $characters.velocity(\"transition.slideLeftBigIn\", {\n complete: function(elements) {\n $doctor.velocity(\"transition.slideRightBigIn\");\n }\n });\n } else { // on leave\n $characters.velocity('stop', true).velocity(\"transition.fadeOut\");\n $doctor.velocity('stop', true).velocity(\"transition.fadeOut\");\n }\n },\n textAnimations: function(enter) {\n var self = this;\n var $infoBox = self.slide.find(\".info-box\");\n var $checklist = self.slide.find(\".checklist\");\n if (enter === true) { // on enter\n $infoBox.velocity(\"transition.slideLeftBigIn\");\n $checklist.velocity(\"transition.slideUpBigIn\", {\n complete: function(elements) {\n self.charactersAnimations(true);\n }\n });\n } else { // on leave\n $infoBox.velocity('stop', true).velocity(\"transition.fadeOut\");\n $checklist.velocity('stop', true).velocity(\"transition.slideDownOut\");\n self.charactersAnimations(false);\n }\n }\n};\n\nfunction onSlide_12Enter(source, direction) {\n slide12Animations.textAnimations(true);\n\n}\nfunction onSlide_12Leave(source) {\n slide12Animations.textAnimations(false);\n}\n\nvar slide13Animations = {\n slide: $(\"#slide-13\"),\n textAnimations: function(enter) {\n var self = this;\n var $familyTree = self.slide.find(\".family-tree\");\n var $infoBox = self.slide.find(\".info-box\");\n var $pinkBubble = self.slide.find(\".pink-bubble\");\n var $orangeBubble = self.slide.find(\".orange-bubble\");\n var $legend = self.slide.find(\".legend\");\n if (enter === true) { // on enter\n $infoBox.velocity(\"transition.slideLeftBigIn\", {delay: 400});\n $pinkBubble.velocity(\"transition.bounceIn\", {delay: 500});\n $orangeBubble.velocity(\"transition.bounceIn\", {\n delay: 600,\n complete: function() {\n $familyTree.velocity(\"transition.shrinkIn\");\n $legend.velocity(\"transition.slideRightBigIn\", {delay: 200});\n }\n });\n } else { // on leave\n $infoBox.velocity('stop', true).velocity(\"transition.fadeOut\");\n $familyTree.velocity('stop', true).velocity(\"transition.fadeOut\");\n $pinkBubble.velocity('stop', true).velocity(\"transition.bounceOut\");\n $orangeBubble.velocity('stop', true).velocity(\"transition.bounceOut\");\n $legend.velocity('stop', true).velocity(\"transition.slideRightBigOut\");\n }\n },\n backgroundAnimations: function(enter, direction) {\n var self = this;\n var $bgBox = self.slide.find(\".slide-bg\");\n var $delay = (direction === null) ? 0 : 1000; // no delay for entry from a nav link\n var $effect = (direction === null) ? 'flipXIn' : 'expandIn'; // flipXIn for entry from a nav link\n if (enter === true) { // on enter\n if (direction !== 'left') { // only when enter from different room, and from a nav link (direction is null)\n $bgBox.velocity(\"transition.\" + $effect, {\n delay: $delay,\n complete: function(elements) {\n self.textAnimations(true);\n }\n });\n } else {\n self.textAnimations(true);\n }\n } else { // on leave\n // only when leave to different room, and from nav link (direction is null)\n if (direction === 'left' || direction === null) {\n $bgBox.velocity('stop', true).velocity(\"transition.expandOut\");\n }\n }\n }\n};\n\nfunction onSlide_13Enter(source, direction) {\n slide13Animations.backgroundAnimations(true, direction);\n\n\n}\nfunction onSlide_13Leave(source, direction) {\n slide13Animations.textAnimations(false);\n slide13Animations.backgroundAnimations(false, direction);\n}\n\nvar slide14Animations = {\n slide: $(\"#slide-14\"),\n charactersAnimations: function(enter, direction) {\n var self = this;\n var $delay = (direction === 'left') ? 2000 : 100;\n var $characters = self.slide.find(\".character\");\n if (enter === true) { // on enter\n $characters.velocity(\"transition.slideUpIn\", {\n delay: $delay,\n complete: function(elements) {\n self.textAnimations(true);\n }\n });\n } else { // on leave\n $characters.velocity('stop', true).velocity(\"transition.fadeOut\");\n self.textAnimations(false);\n }\n },\n textAnimations: function(enter) {\n var self = this;\n var $infoBox = self.slide.find(\".info-box\");\n var $clock = self.slide.find(\".clock\");\n var $picture = self.slide.find(\".picture\");\n if (enter === true) { // on enter\n $infoBox.velocity(\"transition.slideLeftBigIn\");\n $clock.velocity(\"transition.perspectiveDownIn\", {delay: 100});\n $picture.velocity(\"transition.slideUpBigIn\", {delay: 200});\n } else { // on leave\n $infoBox.velocity('stop', true).velocity(\"transition.slideLeftBigOut\");\n $clock.velocity('stop', true).velocity(\"transition.perspectiveDownOut\");\n $picture.velocity('stop', true).velocity(\"transition.slideDownBigOut\");\n }\n },\n backgroundAnimations: function(enter, direction) {\n var self = this;\n var $transitionBox = $('#slide-13-transition');\n var $bgBox = self.slide.find(\".slide-bg\");\n var $bgHome = $transitionBox.find(\".home-outside-bg\");\n var $homeDelay = 300;\n var $homeDuration = 2300;\n if (enter === true) { // on enter\n if (direction === 'left') { // when enter from outside\n // make bigger home\n $bgHome.velocity('stop', true).velocity({height: \"303%\", left: \"-26%\", bottom: \"-20%\"}, {\n delay: $homeDelay - 300,\n duration: $homeDuration\n });\n $bgBox.velocity('stop', true).velocity(\"transition.fadeOut\", {\n delay: $homeDelay + 1200,\n duration: $homeDuration - 500,\n complete: function(elements) {\n self.charactersAnimations(true);\n }\n });\n } else { // no background fade when enter from a nav link (direction is null)\n $bgBox.hide(); // hide yellow slide-bg\n self.charactersAnimations(true);\n }\n } else { // on leave\n // only when leave to outside, and from nav link (direction is null)\n if (direction !== 'left') {\n $bgHome.velocity({height: \"100%\", left: \"0\", bottom: \"0\"}, {\n delay: $homeDelay,\n duration: $homeDuration\n });\n $bgBox.velocity(\"transition.fadeIn\", {\n duration: $homeDuration - 500\n });\n }\n }\n },\n prepareBackgroundAnimations: function() {\n var self = this;\n var $transitionBox = $('#slide-13-transition');\n var $bgBox = self.slide.find(\".slide-bg\");\n var $bgHome = $transitionBox.find(\".home-outside-bg\");\n $transitionBox.css('overflow', 'hidden');\n $bgHome.velocity('stop', true).velocity({height: \"303%\", left: \"-26%\", bottom: \"-20%\"}, {\n complete: function(elements) {\n self.slide.css('overflow', '');\n }\n });\n $bgBox.velocity('stop', true).hide();\n }\n};\n\nfunction onSlide_14Enter(source, direction) {\n slide14Animations.backgroundAnimations(true, direction);\n // enter from previous slide and nav link\n if(direction !== 'left') {\n // prepare transition background\n slide14Animations.prepareBackgroundAnimations();\n }\n}\nfunction onSlide_14Leave(source, direction) {\n slide14Animations.charactersAnimations(false);\n slide14Animations.backgroundAnimations(false, direction);\n}\n\nvar slide15Animations = {\n slide: $(\"#slide-15\"),\n charactersAnimations: function(enter, direction) {\n var self = this;\n var $delay = (direction === 'right') ? 1500 : 500;\n var $characters = self.slide.find(\".people-wrapper img\");\n var $cyclist = self.slide.find(\".cyclist\");\n var $girlWithDog = self.slide.find(\".girl-with-dog\");\n if (enter === true) { // on enter\n $characters.velocity(\"transition.slideUpIn\", {\n stagger: 150,\n delay: $delay,\n complete: function(elements) {\n $cyclist.velocity(\"transition.slideLeftBigIn\");\n $girlWithDog.velocity(\"transition.slideRightBigIn\", {delay: 300});\n slide15Animations.textAnimations(true);\n }\n });\n } else { // on leave\n $characters.velocity('stop', true).velocity(\"transition.fadeOut\", {stagger: 100});\n $cyclist.velocity('stop', true).velocity(\"transition.fadeOut\");\n $girlWithDog.velocity('stop', true).velocity(\"transition.fadeOut\");\n slide15Animations.textAnimations(false);\n }\n },\n textAnimations: function(enter) {\n var self = this;\n var $title = self.slide.find(\".title\");\n var $infoBox = self.slide.find(\".info-box\");\n if (enter === true) { // on enter\n $title.velocity(\"transition.slideUpIn\");\n $infoBox.velocity(\"transition.bounceDownIn\");\n } else { // on leave\n $title.velocity('stop', true).velocity(\"transition.slideLeftBigOut\");\n $infoBox.velocity('stop', true).velocity(\"transition.slideLeftBigOut\");\n }\n }\n};\n\nfunction onSlide_15Enter(source, direction) {\n slide15Animations.charactersAnimations(true, direction);\n\n\n}\nfunction onSlide_15Leave(source) {\n slide15Animations.charactersAnimations(false);\n}\n\nvar slide16Animations = {\n slide: $(\"#slide-16\"),\n isReferencesVisible: false,\n textAnimations: function(enter) {\n var self = this;\n var $infoBox = self.slide.find(\".info-box\");\n var $logo = self.slide.find(\".logo\");\n var $references = self.slide.find(\".references\");\n var $footerInfo = self.slide.find(\".footer-info\");\n if (enter === true) { // on enter\n $logo.velocity(\"transition.bounceDownIn\", {delay: 400});\n $infoBox.velocity(\"transition.expandIn\", {delay: 500});\n $references.velocity(\"transition.slideLeftBigIn\", {delay: 600});\n $footerInfo.velocity(\"transition.slideUpBigIn\", {delay: 600});\n } else { // on leave\n $logo.velocity('stop', true).velocity(\"transition.bounceUpOut\");\n $infoBox.velocity('stop', true).velocity(\"transition.bounceOut\");\n $references.velocity('stop', true).velocity(\"transition.slideLeftBigOut\");\n $footerInfo.velocity('stop', true).velocity(\"transition.slideDownBigOut\");\n }\n }\n};\nvar references = slide16Animations.slide.find(\".references\");\nvar referencesInfo = slide16Animations.slide.find(\".references-info\");\n\nreferences.on('touchstart click', function() {\n slide16Animations.textAnimations(false);\n referencesInfo.velocity(\"transition.slideUpBigIn\", {delay: 700});\n referencesInfo.addClass('visible');\n slide16Animations.isReferencesVisible = true;\n});\n\nreferencesInfo.on('touchstart click', function() {\n if (slide16Animations.isReferencesVisible === true) {\n referencesInfo.velocity('stop', true).velocity(\"transition.slideDownOut\");\n referencesInfo.removeClass('visible');\n slide16Animations.textAnimations(true);\n }\n});\n\nfunction onSlide_16Enter(source, direction) {\n slide16Animations.textAnimations(true);\n\n}\nfunction onSlide_16Leave(source) {\n slide16Animations.textAnimations(false);\n if (slide16Animations.isReferencesVisible === true) {\n referencesInfo.velocity('stop', true).velocity(\"transition.slideDownOut\");\n }\n}\n\nvar slide2Animations = {\n slide: $(\"#slide-2\"),\n isHoverVisible: true,\n charactersAnimations: function(enter) {\n var self = this;\n var $characters = self.slide.find(\".character\");\n var $infoHover = self.slide.find(\".info-hover\");\n if (enter === true) { // on enter\n $characters.velocity(\"transition.slideUpIn\", {\n stagger: 100,\n complete: function(elements) {\n if (self.isHoverVisible === true) {\n // Show \"Hover over people..\" information\n $infoHover.velocity(\"transition.bounceIn\", {\n complete: function(elements) {\n self.textAnimations(true);\n }\n });\n // Hide \"Hover over people..\" information after hovering on character\n $characters.one('touchstart mouseover', function(e) {\n $infoHover.velocity(\"transition.fadeOut\");\n self.isHoverVisible = false; // don't show information any more\n });\n } else {\n self.textAnimations(true);\n }\n }\n });\n } else { // on leave\n $characters.velocity('stop', true).velocity(\"transition.fadeOut\", {stagger: 100});\n $infoHover.velocity(\"transition.fadeOut\");\n self.textAnimations(false);\n }\n },\n textAnimations: function(enter) {\n var self = this;\n var $infoBox = self.slide.find(\".info-box\");\n if (enter === true) { // on enter\n $infoBox.velocity(\"transition.bounceDownIn\");\n } else { // on leave\n $infoBox.velocity('stop', true).velocity(\"transition.bounceUpOut\");\n }\n }\n};\n\nvar character = slide2Animations.slide.find(\".character\");\n\ncharacter.on('tap', function() {\n $(this).find('.character-data').fadeIn();\n $(this).find('.character-arrow .blue').fadeIn();\n $(this).find('.character-arrow .yellow').fadeOut();\n});\n\nfunction onSlide_2Enter(source, direction) {\n slide2Animations.charactersAnimations(true);\n // enter from previous slide and nav link\n if (direction !== 'left') {\n // prepare next slide and hide slide-bg\n slide3Animations.prepareBackgroundAnimations();\n }\n}\nfunction onSlide_2Leave(source) {\n slide2Animations.charactersAnimations(false);\n}\n\nvar slide3Animations = {\n slide: $(\"#slide-3\"),\n charactersAnimations: function(enter, direction) {\n var self = this;\n var $delay = (direction === 'right') ? 1000 : 100;\n var $characters = self.slide.find(\".character\");\n if (enter === true) { // on enter\n $characters.velocity(\"transition.slideUpIn\", {\n delay: $delay,\n complete: function(elements) {\n self.textAnimations(true);\n }\n });\n } else { // on leave\n $characters.velocity('stop', true).velocity(\"transition.fadeOut\");\n self.textAnimations(false);\n }\n },\n textAnimations: function(enter) {\n var self = this;\n var $infoBox = self.slide.find(\".info-box\");\n var $pinkBubble = self.slide.find(\".pink-bubble\");\n var $orangeBubble = self.slide.find(\".orange-bubble\");\n var $clock = self.slide.find(\".clock\");\n if (enter === true) { // on enter\n $infoBox.velocity(\"transition.slideLeftBigIn\");\n $clock.velocity(\"transition.perspectiveDownIn\", {delay: 100});\n $pinkBubble.velocity(\"transition.bounceIn\", {delay: 100});\n $orangeBubble.velocity(\"transition.bounceIn\", {delay: 200});\n } else { // on leave\n $infoBox.velocity('stop', true).velocity(\"transition.slideLeftBigOut\");\n $pinkBubble.velocity('stop', true).velocity(\"transition.bounceOut\");\n $orangeBubble.velocity('stop', true).velocity(\"transition.bounceOut\");\n $clock.velocity('stop', true).velocity(\"transition.perspectiveDownOut\");\n }\n },\n backgroundAnimations: function(enter, direction) {\n var self = this;\n var $bgHome = self.slide.find(\".home-bg\");\n var $bgBox = self.slide.find(\".slide-bg\");\n var $homeDelay = 800;\n var $homeDuration = 4000;\n if (enter === true) { // on enter\n if (direction === 'right') { // only when enter from outside\n $bgBox.addClass('animation'); // hide slide-bg\n $bgHome.velocity({width: \"270%\", right: \"-8%\", bottom: '-32%'}, {\n delay: $homeDelay,\n duration: $homeDuration\n });\n $bgBox.velocity(\"transition.fadeIn\", {\n delay: $homeDuration - 500,\n duration: $homeDelay + 500,\n complete: function(elements) {\n self.charactersAnimations(true);\n }\n });\n } else {\n $bgBox.velocity('stop', true).attr(\"style\", \"\").removeClass('animation');\n self.charactersAnimations(true);\n }\n } else { // on leave\n // when leave outside\n if (direction === 'left') {\n $bgBox.velocity('stop', true).velocity(\"transition.expandOut\", {\n duration: $homeDelay + 500\n });\n // make smaller home\n $bgHome.velocity('stop', true).velocity({width: \"100%\", right: \"28%\", bottom: \"0\"}, {\n duration: $homeDuration - 1500,\n complete: function(elements) {\n // back to entry point\n self.prepareBackgroundAnimations();\n }\n });\n } else if (direction === null) {\n // back to entry point\n self.prepareBackgroundAnimations();\n }\n }\n },\n prepareBackgroundAnimations: function() {\n var self = this;\n var $bgHome = self.slide.find(\".home-bg\");\n var $bgBox = self.slide.find(\".slide-bg\");\n self.slide.css('overflow', 'hidden');\n $bgHome.velocity('stop', true).velocity({width: \"100%\", right: \"0\", bottom: \"0\"}, {\n complete: function(elements) {\n self.slide.css('overflow', '');\n }\n });\n $bgBox.velocity('stop', true).hide();\n self.charactersAnimations(false);\n\n }\n};\n\nfunction onSlide_3Enter(source, direction) {\n slide3Animations.backgroundAnimations(true, direction);\n\n}\nfunction onSlide_3Leave(source, direction) {\n slide3Animations.charactersAnimations(false);\n slide3Animations.backgroundAnimations(false, direction);\n}\n\nvar slide4Animations = {\n slide: $(\"#slide-4\"),\n indicatorAnimations: function(enter) {\n var self = this;\n var $indicator = self.slide.find(\".indicator-hands\");\n if (enter === true) { // on enter\n $indicator.velocity(\"transition.bounceDownIn\");\n } else { // on leave\n $indicator.velocity('stop', true).velocity(\"transition.fadeOut\");\n }\n }\n};\n\nfunction onSlide_4Enter(source, direction) {\n slidesView.setIndicatorPosition(0.86, 0.6, 0.1, 0.85, \"#slide-4 .character\", \"#slide-4 .indicator-hands\");\n slide4Animations.indicatorAnimations(true);\n\n}\nfunction onSlide_4Leave(source) {\n slide4Animations.indicatorAnimations(false);\n}\n\nvar slide5Animations = {\n slide: $(\"#slide-5\"),\n indicatorAnimations: function(enter) {\n var self = this;\n var $indicator = self.slide.find(\".indicator-feet\");\n if (enter === true) { // on enter\n $indicator.velocity(\"transition.bounceRightIn\");\n } else { // on leave\n $indicator.velocity('stop', true).velocity(\"transition.fadeOut\");\n }\n }\n};\n\nfunction onSlide_5Enter(source, direction) {\n slidesView.setIndicatorPosition(0.6, 0.98, 0.06, 0.93, \"#slide-5 .character\", \".indicator-feet\");\n slide5Animations.indicatorAnimations(true);\n\n}\nfunction onSlide_5Leave(source) {\n slide5Animations.indicatorAnimations(false);\n}\n\nvar slide6Animations = {\n slide: $(\"#slide-6\"),\n indicatorAnimations: function(enter) {\n var self = this;\n var $indicator = self.slide.find(\".indicator-abdomen\");\n if (enter === true) { // on enter\n $indicator.velocity(\"transition.bounceDownIn\");\n } else { // on leave\n $indicator.velocity('stop', true).velocity(\"transition.fadeOut\");\n }\n }\n};\n\nfunction onSlide_6Enter(source, direction) {\n slidesView.setIndicatorPosition(0.48, 0.5, 0.08, 0.9, \"#slide-6 .character\", \".indicator-abdomen\");\n slide6Animations.indicatorAnimations(true);\n\n}\nfunction onSlide_6Leave(source) {\n slide6Animations.indicatorAnimations(false);\n}\n\nvar slide7Animations = {\n slide: $(\"#slide-7\"),\n indicatorAnimations: function(enter) {\n var self = this;\n var $indicator = self.slide.find(\".indicator-face\");\n if (enter === true) { // on enter\n $indicator.velocity(\"transition.bounceRightIn\");\n } else { // on leave\n $indicator.velocity('stop', true).velocity(\"transition.fadeOut\");\n }\n }\n};\n\nfunction onSlide_7Enter(source, direction) {\n slidesView.setIndicatorPosition(0.73, 0.23, 0.08, 0.5, \"#slide-7 .character\", \".indicator-face\");\n slide7Animations.indicatorAnimations(true);\n\n}\nfunction onSlide_7Leave(source) {\n slide7Animations.indicatorAnimations(false);\n}\n\nvar slide8Animations = {\n slide: $(\"#slide-8\"),\n indicatorAnimations: function(enter) {\n var self = this;\n var $indicator = self.slide.find(\".indicator-upper-airway\");\n var $greenBubble = self.slide.find(\".green-bubble\");\n var $violetBubble = self.slide.find(\".violet-bubble\");\n if (enter === true) { // on enter\n $indicator.velocity(\"transition.bounceDownIn\");\n $greenBubble.velocity(\"transition.bounceIn\", {delay: 100});\n $violetBubble.velocity(\"transition.bounceIn\", {delay: 200});\n } else { // on leave\n $indicator.velocity('stop', true).velocity(\"transition.fadeOut\");\n $greenBubble.velocity('stop', true).velocity(\"transition.bounceOut\");\n $violetBubble.velocity('stop', true).velocity(\"transition.bounceOut\");\n }\n }\n};\n\nfunction onSlide_8Enter(source, direction) {\n slidesView.setIndicatorPosition(0.47, 0.26, 0.08, 0.53, \"#slide-8 .character\", \".indicator-upper-airway\");\n slide8Animations.indicatorAnimations(true);\n\n}\nfunction onSlide_8Leave(source) {\n slide8Animations.indicatorAnimations(false);\n}\n\nvar slide9Animations = {\n slide: $(\"#slide-9\"),\n charactersAnimations: function(enter, direction) {\n var self = this;\n var $characters = self.slide.find(\".character\");\n var $delay = (direction === 'left') ? 1000 : 100;\n if (enter === true) { // on enter\n $characters.velocity(\"transition.slideUpIn\", {\n delay: $delay,\n complete: function(elements) {\n self.textAnimations(true);\n self.triggersAnimations(true);\n }\n });\n } else { // on leave\n $characters.velocity('stop', true).velocity(\"transition.fadeOut\");\n self.textAnimations(false);\n self.triggersAnimations(false);\n }\n },\n textAnimations: function(enter) {\n var self = this;\n var $infoBox = self.slide.find(\".info-box\");\n var $attacksInfo = self.slide.find(\".attacks-info\");\n if (enter === true) { // on enter\n $infoBox.velocity(\"transition.slideLeftBigIn\", {delay: 200});\n $attacksInfo.velocity(\"transition.bounceIn\", {delay: 400});\n } else { // on leave\n $infoBox.velocity('stop', true).velocity(\"transition.slideLeftBigOut\");\n $attacksInfo.velocity('stop', true).velocity(\"transition.bounceOut\");\n }\n },\n triggersAnimations: function(enter) {\n var self = this;\n var $triggers = self.slide.find(\".trigger\");\n if (enter === true) { // on enter\n $triggers.velocity(\"transition.bounceIn\", {stagger: 250, drag: true});\n } else { // on leave\n $triggers.velocity('stop', true).velocity(\"transition.bounceOut\");\n }\n },\n backgroundAnimations: function(enter, direction) {\n var self = this;\n var $transitionBox = $('#slide-9-transition');\n var $bgBox = self.slide.find(\".slide-bg\");\n var $bgHome = $transitionBox.find(\".home-outside-bg\");\n var $homeDelay = 300;\n var $homeDuration = 2300;\n if (enter === true) { // on enter\n if (direction === 'left') { // when enter from outside\n // make bigger home\n $bgHome.velocity('stop', true).velocity({height: \"303%\", left: \"-26%\", bottom: \"-20%\"}, {\n delay: $homeDelay - 300,\n duration: $homeDuration\n });\n $bgBox.velocity('stop', true).velocity(\"transition.fadeOut\", {\n delay: $homeDelay + 1200,\n duration: $homeDuration - 500,\n complete: function(elements) {\n self.charactersAnimations(true);\n }\n });\n } else { // no background fade when enter from a nav link (direction is null)\n $bgBox.hide(); // hide yellow slide-bg\n self.charactersAnimations(true);\n }\n } else { // on leave\n // only when leave to outside, and from nav link (direction is null)\n if (direction !== 'left') {\n $bgHome.velocity({height: \"100%\", left: \"35%\", bottom: \"0\"}, {\n delay: $homeDelay,\n duration: $homeDuration\n });\n $bgBox.velocity(\"transition.fadeIn\", {\n duration: $homeDuration - 500\n });\n }\n }\n },\n prepareBackgroundAnimations: function() {\n var self = this;\n var $transitionBox = $('#slide-9-transition');\n var $bgBox = self.slide.find(\".slide-bg\");\n var $bgHome = $transitionBox.find(\".home-outside-bg\");\n $transitionBox.css('overflow', 'hidden');\n $bgHome.velocity('stop', true).velocity({height: \"303%\", left: \"-26%\", bottom: \"-20%\"}, {\n complete: function(elements) {\n self.slide.css('overflow', '');\n }\n });\n $bgBox.velocity('stop', true).hide();\n}\n};\n\nfunction onSlide_9Enter(source, direction) {\n // ensure that skyscraper is small and background hidden on next slide\n slide10Animations.backgroundAnimations(false, 'left');\n slide10Animations.charactersAnimations(false);\n\n slide9Animations.backgroundAnimations(true, direction);\n // enter from previous slide and nav link\n if(direction !== 'left') {\n // prepare transition background\n slide9Animations.prepareBackgroundAnimations();\n }\n}\nfunction onSlide_9Leave(source, direction) {\n slide9Animations.charactersAnimations(false);\n slide9Animations.backgroundAnimations(false, direction);\n}\n"],"sourceRoot":"/source/"}