{"version":3,"sources":["main.js","animation.js","logoScroll.js","skrollr.js"],"names":["itemHome","document","getElementsByClassName","barHome","smHome","bibItem","TweenMax","staggerTo","opacity","delay","ease","Sine","easeInOut","width","$","window","on","scrollTop","html","ready","burger","addClass","css","overflow","burgerClose","removeClass","hasClass","undefined","Skrollr","options","documentElement","body","detectCSSPrefix","_instance","this","_constants","constants","easing","e","easings","_edgeStrategy","edgeStrategy","_listeners","beforerender","render","keyframe","_forceHeight","forceHeight","_scale","scale","_mobileDeceleration","mobileDeceleration","DEFAULT_MOBILE_DECELERATION","_smoothScrollingEnabled","smoothScrolling","_smoothScrollingDuration","smoothScrollingDuration","DEFAULT_SMOOTH_SCROLLING_DURATION","_smoothScrolling","targetTop","getScrollTop","_isMobile","mobileCheck","test","navigator","userAgent","vendor","opera","_skrollrBody","getElementById","skrollrBody","DEFAULT_SKROLLRBODY","_detect3DTransforms","_initMobile","_updateClass","SKROLLR_CLASS","SKROLLR_MOBILE_CLASS","NO_SKROLLR_CLASS","SKROLLR_DESKTOP_CLASS","refresh","_addEvent","clientWidth","height","clientHeight","_lastViewportHeight","_lastViewportWidth","_requestReflow","requestAnimFrame","polyfillRAF","animloop","_render","_animFrame","skrollr","get","init","VERSION","hasProp","Object","prototype","hasOwnProperty","Math","getStyle","getComputedStyle","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHCANCEL","EVENT_TOUCHEND","SKROLLABLE_CLASS","SKROLLABLE_BEFORE_CLASS","SKROLLABLE_BETWEEN_CLASS","SKROLLABLE_AFTER_CLASS","DEFAULT_EASING","DEFAULT_DURATION","ANCHOR_START","ANCHOR_END","ANCHOR_CENTER","ANCHOR_BOTTOM","SKROLLABLE_ID_DOM_PROPERTY","rxTouchIgnoreTags","rxTrim","rxKeyframeAttribute","rxPropValue","rxPropEasing","rxCamelCase","rxCamelCaseFn","str","letter","toUpperCase","rxNumericValue","rxInterpolateString","rxRGBAIntegerColor","rxGradient","theCSSPrefix","theDashedCSSPrefix","rxPrefixes","style","k","match","slice","-webkit-","-moz-","-ms-","-o-","toLowerCase","requestAnimationFrame","lastTime","_now","callback","deltaTime","max","setTimeout","polyfillCAF","cancelAnimFrame","cancelAnimationFrame","timeout","clearTimeout","begin","end","linear","p","quadratic","cubic","swing","cos","PI","sqrt","outCubic","pow","bounce","a","abs","elements","elementIndex","elementsLength","ignoreID","_skrollables","_skrollableIdCounter","getElementsByTagName","length","el","anchorTarget","keyFrames","smoothScrollThis","emitEvents","attributes","attributeIndex","attributesLength","attr","name","kf","props","value","element","eventType","replace","push","constant","substr","offset","isPercentage","anchor1","anchor2","mode","anchors","isEnd","querySelector","styleAttr","classAttr","id","cssText","_getClass","lastFrameIndex","_reflow","sk","_parseProps","_fillProps","relativeToAbsolute","viewportAnchor","elementAnchor","viewportHeight","box","getBoundingClientRect","absolute","top","boxHeight","bottom","animateTo","now","duration","_scrollAnimation","startTop","topDiff","startTime","endTime","done","call","stopAnimateTo","isAnimatingTo","isMobile","setScrollTop","force","_forceRender","_mobileOffset","min","_maxKeyFrame","scrollTo","pageYOffset","getMaxScrollTop","fn","off","destroy","_removeAllEvents","skrollableIndex","skrollablesLength","_reset","setStyle","_direction","_lastTop","_translateZ","initialElement","initialTouchY","initialTouchX","currentElement","currentTouchY","currentTouchX","lastTouchY","deltaY","initialTouchTime","currentTouchTime","lastTouchTime","join","touch","changedTouches","target","nodeType","parentNode","clientY","clientX","timeStamp","tagName","preventDefault","type","blur","activeElement","distanceY","distanceX","distance2","focus","clickEvent","createEvent","initMouseEvent","view","screenX","screenY","ctrlKey","altKey","shiftKey","metaKey","dispatchEvent","speed","targetOffset","targetRatio","_updateDependentKeyFrames","skrollable","keyFrameIndex","keyFramesLength","constantValue","processedConstants","_processConstants","frame","_getDocumentHeight","sort","_keyFrameComparator","_calcSteps","fakeFrame","actualFrame","key","frames","framesLength","firstFrame","lastFrame","beforeFirst","afterLast","firstOrLastFrame","edge","_emitEvent","_interpolateString","indexOf","setAttribute","left","right","progress","_calcInterpolation","afterAnimationCallback","renderTop","smoothScrollingDiff","_lastRenderCall","listenerParams","curTop","lastTop","maxTop","direction","continueRendering","prop","exec","_parseProp","val","numbers","lastIndex","rgba","n","s","unshift","propList","_fillPropForFrame","val1","val2","valueIndex","val1Length","interpolated","undo","concat","elementsIndex","dirtyStyleAttr","dirtyClassAttr","computedStyle","computedTransform","getPropertyValue","computedTransformWithPrefix","has3D","isNaN","styleFloat","cssFloat","ignore","addEvent","names","intermediate","event","srcElement","returnValue","defaultPrevented","split","nameCounter","namesLength","addEventListener","attachEvent","_registeredEvents","listener","_removeEvent","removeEvent","removeEventListener","detachEvent","eventData","eventCounter","eventsLength","pos","copy","bodyHeight","skrollrBodyHeight","offsetHeight","scrollHeight","SVGElement","add","remove","classRemoveIndex","removeLength","_untrim","_trim","classAddIndex","addLength","Date","b","define","amd","module","exports"],"mappings":"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","file":"main.js","sourcesContent":["$(document).ready(function(){\n\tfunction burger() {\n\t\t$('.burger__trigger__line').addClass('line__active');\n\t\t$('.menu__container').addClass(\"menu__container-active\");\n\t\t$('.menu__mask').addClass('menu__active-mask');\n\t\t$('.body').css({'overflow': 'hidden'});\n\t} \n\t\t\t\n\n\tfunction burgerClose() {\n\t\t$('.burger__trigger__line').removeClass('line__active');\n\t\t$('.menu__container').removeClass(\"menu__container-active\");\n\t\t$('.menu__mask').removeClass('menu__active-mask');\n\t\t$('.body').css({'overflow': 'visible'});\n\t}\n\t\t\t\t\n\t\t\t\n\n\t$('.burger').on('click', function() {\n\t\tif($('.menu__container').hasClass('menu__container-active')) {\n\t\t\tburgerClose();\n\t\t} else {\n\t\t\t\tburger();\n\t\t\t}\n\t})\n\n});"," var itemHome = document.getElementsByClassName('animation-item');\n var barHome = document.getElementsByClassName('animation-item__bar');\n var smHome = document.getElementsByClassName('animation-item__sm');\n\n var bibItem = document.getElementsByClassName('animation-column');\n\n\n\n\n TweenMax.staggerTo(itemHome, 0.4, {opacity: 1, delay: 0.1, ease: Sine.easeInOut},0.6);\n TweenMax.staggerTo(barHome, 0.3, {width: \"100%\", delay: 1.1});\n TweenMax.staggerTo(smHome, 0.3, {opacity: 1, delay: 0.2}, 0.6);\n\n TweenMax.staggerTo(bibItem, 0.4, {opacity: 1, delay: 0.1, ease: Sine.easeInOut},0.2);\n\n\n","\t$(window).on('scroll', function(){\n if($(window).scrollTop() > 54){\n \t$('.logo').html('AC');\n } else {\n \t\t$('.logo').html('Angelo Candiano');\n \t}\n \t});\n","/*!\n * skrollr core\n *\n * Alexander Prinzhorn - https://github.com/Prinzhorn/skrollr\n *\n * Free to use under terms of MIT license\n */\n(function(window, document, undefined) {\n\t'use strict';\n\n\t/*\n\t * Global api.\n\t */\n\tvar skrollr = {\n\t\tget: function() {\n\t\t\treturn _instance;\n\t\t},\n\t\t//Main entry point.\n\t\tinit: function(options) {\n\t\t\treturn _instance || new Skrollr(options);\n\t\t},\n\t\tVERSION: '0.6.30'\n\t};\n\n\t//Minify optimization.\n\tvar hasProp = Object.prototype.hasOwnProperty;\n\tvar Math = window.Math;\n\tvar getStyle = window.getComputedStyle;\n\n\t//They will be filled when skrollr gets initialized.\n\tvar documentElement;\n\tvar body;\n\n\tvar EVENT_TOUCHSTART = 'touchstart';\n\tvar EVENT_TOUCHMOVE = 'touchmove';\n\tvar EVENT_TOUCHCANCEL = 'touchcancel';\n\tvar EVENT_TOUCHEND = 'touchend';\n\n\tvar SKROLLABLE_CLASS = 'skrollable';\n\tvar SKROLLABLE_BEFORE_CLASS = SKROLLABLE_CLASS + '-before';\n\tvar SKROLLABLE_BETWEEN_CLASS = SKROLLABLE_CLASS + '-between';\n\tvar SKROLLABLE_AFTER_CLASS = SKROLLABLE_CLASS + '-after';\n\n\tvar SKROLLR_CLASS = 'skrollr';\n\tvar NO_SKROLLR_CLASS = 'no-' + SKROLLR_CLASS;\n\tvar SKROLLR_DESKTOP_CLASS = SKROLLR_CLASS + '-desktop';\n\tvar SKROLLR_MOBILE_CLASS = SKROLLR_CLASS + '-mobile';\n\n\tvar DEFAULT_EASING = 'linear';\n\tvar DEFAULT_DURATION = 1000;//ms\n\tvar DEFAULT_MOBILE_DECELERATION = 0.004;//pixel/msĀ²\n\n\tvar DEFAULT_SKROLLRBODY = 'skrollr-body';\n\n\tvar DEFAULT_SMOOTH_SCROLLING_DURATION = 200;//ms\n\n\tvar ANCHOR_START = 'start';\n\tvar ANCHOR_END = 'end';\n\tvar ANCHOR_CENTER = 'center';\n\tvar ANCHOR_BOTTOM = 'bottom';\n\n\t//The property which will be added to the DOM element to hold the ID of the skrollable.\n\tvar SKROLLABLE_ID_DOM_PROPERTY = '___skrollable_id';\n\n\tvar rxTouchIgnoreTags = /^(?:input|textarea|button|select)$/i;\n\n\tvar rxTrim = /^\\s+|\\s+$/g;\n\n\t//Find all data-attributes. data-[_constant]-[offset]-[anchor]-[anchor].\n\tvar rxKeyframeAttribute = /^data(?:-(_\\w+))?(?:-?(-?\\d*\\.?\\d+p?))?(?:-?(start|end|top|center|bottom))?(?:-?(top|center|bottom))?$/;\n\n\tvar rxPropValue = /\\s*(@?[\\w\\-\\[\\]]+)\\s*:\\s*(.+?)\\s*(?:;|$)/gi;\n\n\t//Easing function names follow the property in square brackets.\n\tvar rxPropEasing = /^(@?[a-z\\-]+)\\[(\\w+)\\]$/;\n\n\tvar rxCamelCase = /-([a-z0-9_])/g;\n\tvar rxCamelCaseFn = function(str, letter) {\n\t\treturn letter.toUpperCase();\n\t};\n\n\t//Numeric values with optional sign.\n\tvar rxNumericValue = /[\\-+]?[\\d]*\\.?[\\d]+/g;\n\n\t//Used to replace occurences of {?} with a number.\n\tvar rxInterpolateString = /\\{\\?\\}/g;\n\n\t//Finds rgb(a) colors, which don't use the percentage notation.\n\tvar rxRGBAIntegerColor = /rgba?\\(\\s*-?\\d+\\s*,\\s*-?\\d+\\s*,\\s*-?\\d+/g;\n\n\t//Finds all gradients.\n\tvar rxGradient = /[a-z\\-]+-gradient/g;\n\n\t//Vendor prefix. Will be set once skrollr gets initialized.\n\tvar theCSSPrefix = '';\n\tvar theDashedCSSPrefix = '';\n\n\t//Will be called once (when skrollr gets initialized).\n\tvar detectCSSPrefix = function() {\n\t\t//Only relevant prefixes. May be extended.\n\t\t//Could be dangerous if there will ever be a CSS property which actually starts with \"ms\". Don't hope so.\n\t\tvar rxPrefixes = /^(?:O|Moz|webkit|ms)|(?:-(?:o|moz|webkit|ms)-)/;\n\n\t\t//Detect prefix for current browser by finding the first property using a prefix.\n\t\tif(!getStyle) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar style = getStyle(body, null);\n\n\t\tfor(var k in style) {\n\t\t\t//We check the key and if the key is a number, we check the value as well, because safari's getComputedStyle returns some weird array-like thingy.\n\t\t\ttheCSSPrefix = (k.match(rxPrefixes) || (+k == k && style[k].match(rxPrefixes)));\n\n\t\t\tif(theCSSPrefix) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Did we even detect a prefix?\n\t\tif(!theCSSPrefix) {\n\t\t\ttheCSSPrefix = theDashedCSSPrefix = '';\n\n\t\t\treturn;\n\t\t}\n\n\t\ttheCSSPrefix = theCSSPrefix[0];\n\n\t\t//We could have detected either a dashed prefix or this camelCaseish-inconsistent stuff.\n\t\tif(theCSSPrefix.slice(0,1) === '-') {\n\t\t\ttheDashedCSSPrefix = theCSSPrefix;\n\n\t\t\t//There's no logic behind these. Need a look up.\n\t\t\ttheCSSPrefix = ({\n\t\t\t\t'-webkit-': 'webkit',\n\t\t\t\t'-moz-': 'Moz',\n\t\t\t\t'-ms-': 'ms',\n\t\t\t\t'-o-': 'O'\n\t\t\t})[theCSSPrefix];\n\t\t} else {\n\t\t\ttheDashedCSSPrefix = '-' + theCSSPrefix.toLowerCase() + '-';\n\t\t}\n\t};\n\n\tvar polyfillRAF = function() {\n\t\tvar requestAnimFrame = window.requestAnimationFrame || window[theCSSPrefix.toLowerCase() + 'RequestAnimationFrame'];\n\n\t\tvar lastTime = _now();\n\n\t\tif(_isMobile || !requestAnimFrame) {\n\t\t\trequestAnimFrame = function(callback) {\n\t\t\t\t//How long did it take to render?\n\t\t\t\tvar deltaTime = _now() - lastTime;\n\t\t\t\tvar delay = Math.max(0, 1000 / 60 - deltaTime);\n\n\t\t\t\treturn window.setTimeout(function() {\n\t\t\t\t\tlastTime = _now();\n\t\t\t\t\tcallback();\n\t\t\t\t}, delay);\n\t\t\t};\n\t\t}\n\n\t\treturn requestAnimFrame;\n\t};\n\n\tvar polyfillCAF = function() {\n\t\tvar cancelAnimFrame = window.cancelAnimationFrame || window[theCSSPrefix.toLowerCase() + 'CancelAnimationFrame'];\n\n\t\tif(_isMobile || !cancelAnimFrame) {\n\t\t\tcancelAnimFrame = function(timeout) {\n\t\t\t\treturn window.clearTimeout(timeout);\n\t\t\t};\n\t\t}\n\n\t\treturn cancelAnimFrame;\n\t};\n\n\t//Built-in easing functions.\n\tvar easings = {\n\t\tbegin: function() {\n\t\t\treturn 0;\n\t\t},\n\t\tend: function() {\n\t\t\treturn 1;\n\t\t},\n\t\tlinear: function(p) {\n\t\t\treturn p;\n\t\t},\n\t\tquadratic: function(p) {\n\t\t\treturn p * p;\n\t\t},\n\t\tcubic: function(p) {\n\t\t\treturn p * p * p;\n\t\t},\n\t\tswing: function(p) {\n\t\t\treturn (-Math.cos(p * Math.PI) / 2) + 0.5;\n\t\t},\n\t\tsqrt: function(p) {\n\t\t\treturn Math.sqrt(p);\n\t\t},\n\t\toutCubic: function(p) {\n\t\t\treturn (Math.pow((p - 1), 3) + 1);\n\t\t},\n\t\t//see https://www.desmos.com/calculator/tbr20s8vd2 for how I did this\n\t\tbounce: function(p) {\n\t\t\tvar a;\n\n\t\t\tif(p <= 0.5083) {\n\t\t\t\ta = 3;\n\t\t\t} else if(p <= 0.8489) {\n\t\t\t\ta = 9;\n\t\t\t} else if(p <= 0.96208) {\n\t\t\t\ta = 27;\n\t\t\t} else if(p <= 0.99981) {\n\t\t\t\ta = 91;\n\t\t\t} else {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\treturn 1 - Math.abs(3 * Math.cos(p * a * 1.028) / a);\n\t\t}\n\t};\n\n\t/**\n\t * Constructor.\n\t */\n\tfunction Skrollr(options) {\n\t\tdocumentElement = document.documentElement;\n\t\tbody = document.body;\n\n\t\tdetectCSSPrefix();\n\n\t\t_instance = this;\n\n\t\toptions = options || {};\n\n\t\t_constants = options.constants || {};\n\n\t\t//We allow defining custom easings or overwrite existing.\n\t\tif(options.easing) {\n\t\t\tfor(var e in options.easing) {\n\t\t\t\teasings[e] = options.easing[e];\n\t\t\t}\n\t\t}\n\n\t\t_edgeStrategy = options.edgeStrategy || 'set';\n\n\t\t_listeners = {\n\t\t\t//Function to be called right before rendering.\n\t\t\tbeforerender: options.beforerender,\n\n\t\t\t//Function to be called right after finishing rendering.\n\t\t\trender: options.render,\n\n\t\t\t//Function to be called whenever an element with the `data-emit-events` attribute passes a keyframe.\n\t\t\tkeyframe: options.keyframe\n\t\t};\n\n\t\t//forceHeight is true by default\n\t\t_forceHeight = options.forceHeight !== false;\n\n\t\tif(_forceHeight) {\n\t\t\t_scale = options.scale || 1;\n\t\t}\n\n\t\t_mobileDeceleration = options.mobileDeceleration || DEFAULT_MOBILE_DECELERATION;\n\n\t\t_smoothScrollingEnabled = options.smoothScrolling !== false;\n\t\t_smoothScrollingDuration = options.smoothScrollingDuration || DEFAULT_SMOOTH_SCROLLING_DURATION;\n\n\t\t//Dummy object. Will be overwritten in the _render method when smooth scrolling is calculated.\n\t\t_smoothScrolling = {\n\t\t\ttargetTop: _instance.getScrollTop()\n\t\t};\n\n\t\t//A custom check function may be passed.\n\t\t_isMobile = ((options.mobileCheck || function() {\n\t\t\treturn (/Android|iPhone|iPad|iPod|BlackBerry/i).test(navigator.userAgent || navigator.vendor || window.opera);\n\t\t})());\n\n\t\tif(_isMobile) {\n\t\t\t_skrollrBody = document.getElementById(options.skrollrBody || DEFAULT_SKROLLRBODY);\n\n\t\t\t//Detect 3d transform if there's a skrollr-body (only needed for #skrollr-body).\n\t\t\tif(_skrollrBody) {\n\t\t\t\t_detect3DTransforms();\n\t\t\t}\n\n\t\t\t_initMobile();\n\t\t\t_updateClass(documentElement, [SKROLLR_CLASS, SKROLLR_MOBILE_CLASS], [NO_SKROLLR_CLASS]);\n\t\t} else {\n\t\t\t_updateClass(documentElement, [SKROLLR_CLASS, SKROLLR_DESKTOP_CLASS], [NO_SKROLLR_CLASS]);\n\t\t}\n\n\t\t//Triggers parsing of elements and a first reflow.\n\t\t_instance.refresh();\n\n\t\t_addEvent(window, 'resize orientationchange', function() {\n\t\t\tvar width = documentElement.clientWidth;\n\t\t\tvar height = documentElement.clientHeight;\n\n\t\t\t//Only reflow if the size actually changed (#271).\n\t\t\tif(height !== _lastViewportHeight || width !== _lastViewportWidth) {\n\t\t\t\t_lastViewportHeight = height;\n\t\t\t\t_lastViewportWidth = width;\n\n\t\t\t\t_requestReflow = true;\n\t\t\t}\n\t\t});\n\n\t\tvar requestAnimFrame = polyfillRAF();\n\n\t\t//Let's go.\n\t\t(function animloop(){\n\t\t\t_render();\n\t\t\t_animFrame = requestAnimFrame(animloop);\n\t\t}());\n\n\t\treturn _instance;\n\t}\n\n\t/**\n\t * (Re)parses some or all elements.\n\t */\n\tSkrollr.prototype.refresh = function(elements) {\n\t\tvar elementIndex;\n\t\tvar elementsLength;\n\t\tvar ignoreID = false;\n\n\t\t//Completely reparse anything without argument.\n\t\tif(elements === undefined) {\n\t\t\t//Ignore that some elements may already have a skrollable ID.\n\t\t\tignoreID = true;\n\n\t\t\t_skrollables = [];\n\t\t\t_skrollableIdCounter = 0;\n\n\t\t\telements = document.getElementsByTagName('*');\n\t\t} else if(elements.length === undefined) {\n\t\t\t//We also accept a single element as parameter.\n\t\t\telements = [elements];\n\t\t}\n\n\t\telementIndex = 0;\n\t\telementsLength = elements.length;\n\n\t\tfor(; elementIndex < elementsLength; elementIndex++) {\n\t\t\tvar el = elements[elementIndex];\n\t\t\tvar anchorTarget = el;\n\t\t\tvar keyFrames = [];\n\n\t\t\t//If this particular element should be smooth scrolled.\n\t\t\tvar smoothScrollThis = _smoothScrollingEnabled;\n\n\t\t\t//The edge strategy for this particular element.\n\t\t\tvar edgeStrategy = _edgeStrategy;\n\n\t\t\t//If this particular element should emit keyframe events.\n\t\t\tvar emitEvents = false;\n\n\t\t\t//If we're reseting the counter, remove any old element ids that may be hanging around.\n\t\t\tif(ignoreID && SKROLLABLE_ID_DOM_PROPERTY in el) {\n\t\t\t\tdelete el[SKROLLABLE_ID_DOM_PROPERTY];\n\t\t\t}\n\n\t\t\tif(!el.attributes) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//Iterate over all attributes and search for key frame attributes.\n\t\t\tvar attributeIndex = 0;\n\t\t\tvar attributesLength = el.attributes.length;\n\n\t\t\tfor (; attributeIndex < attributesLength; attributeIndex++) {\n\t\t\t\tvar attr = el.attributes[attributeIndex];\n\n\t\t\t\tif(attr.name === 'data-anchor-target') {\n\t\t\t\t\tanchorTarget = document.querySelector(attr.value);\n\n\t\t\t\t\tif(anchorTarget === null) {\n\t\t\t\t\t\tthrow 'Unable to find anchor target \"' + attr.value + '\"';\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t//Global smooth scrolling can be overridden by the element attribute.\n\t\t\t\tif(attr.name === 'data-smooth-scrolling') {\n\t\t\t\t\tsmoothScrollThis = attr.value !== 'off';\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t//Global edge strategy can be overridden by the element attribute.\n\t\t\t\tif(attr.name === 'data-edge-strategy') {\n\t\t\t\t\tedgeStrategy = attr.value;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t//Is this element tagged with the `data-emit-events` attribute?\n\t\t\t\tif(attr.name === 'data-emit-events') {\n\t\t\t\t\temitEvents = true;\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar match = attr.name.match(rxKeyframeAttribute);\n\n\t\t\t\tif(match === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar kf = {\n\t\t\t\t\tprops: attr.value,\n\t\t\t\t\t//Point back to the element as well.\n\t\t\t\t\telement: el,\n\t\t\t\t\t//The name of the event which this keyframe will fire, if emitEvents is\n\t\t\t\t\teventType: attr.name.replace(rxCamelCase, rxCamelCaseFn)\n\t\t\t\t};\n\n\t\t\t\tkeyFrames.push(kf);\n\n\t\t\t\tvar constant = match[1];\n\n\t\t\t\tif(constant) {\n\t\t\t\t\t//Strip the underscore prefix.\n\t\t\t\t\tkf.constant = constant.substr(1);\n\t\t\t\t}\n\n\t\t\t\t//Get the key frame offset.\n\t\t\t\tvar offset = match[2];\n\n\t\t\t\t//Is it a percentage offset?\n\t\t\t\tif(/p$/.test(offset)) {\n\t\t\t\t\tkf.isPercentage = true;\n\t\t\t\t\tkf.offset = (offset.slice(0, -1) | 0) / 100;\n\t\t\t\t} else {\n\t\t\t\t\tkf.offset = (offset | 0);\n\t\t\t\t}\n\n\t\t\t\tvar anchor1 = match[3];\n\n\t\t\t\t//If second anchor is not set, the first will be taken for both.\n\t\t\t\tvar anchor2 = match[4] || anchor1;\n\n\t\t\t\t//\"absolute\" (or \"classic\") mode, where numbers mean absolute scroll offset.\n\t\t\t\tif(!anchor1 || anchor1 === ANCHOR_START || anchor1 === ANCHOR_END) {\n\t\t\t\t\tkf.mode = 'absolute';\n\n\t\t\t\t\t//data-end needs to be calculated after all key frames are known.\n\t\t\t\t\tif(anchor1 === ANCHOR_END) {\n\t\t\t\t\t\tkf.isEnd = true;\n\t\t\t\t\t} else if(!kf.isPercentage) {\n\t\t\t\t\t\t//For data-start we can already set the key frame w/o calculations.\n\t\t\t\t\t\t//#59: \"scale\" options should only affect absolute mode.\n\t\t\t\t\t\tkf.offset = kf.offset * _scale;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//\"relative\" mode, where numbers are relative to anchors.\n\t\t\t\telse {\n\t\t\t\t\tkf.mode = 'relative';\n\t\t\t\t\tkf.anchors = [anchor1, anchor2];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Does this element have key frames?\n\t\t\tif(!keyFrames.length) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//Will hold the original style and class attributes before we controlled the element (see #80).\n\t\t\tvar styleAttr, classAttr;\n\n\t\t\tvar id;\n\n\t\t\tif(!ignoreID && SKROLLABLE_ID_DOM_PROPERTY in el) {\n\t\t\t\t//We already have this element under control. Grab the corresponding skrollable id.\n\t\t\t\tid = el[SKROLLABLE_ID_DOM_PROPERTY];\n\t\t\t\tstyleAttr = _skrollables[id].styleAttr;\n\t\t\t\tclassAttr = _skrollables[id].classAttr;\n\t\t\t} else {\n\t\t\t\t//It's an unknown element. Asign it a new skrollable id.\n\t\t\t\tid = (el[SKROLLABLE_ID_DOM_PROPERTY] = _skrollableIdCounter++);\n\t\t\t\tstyleAttr = el.style.cssText;\n\t\t\t\tclassAttr = _getClass(el);\n\t\t\t}\n\n\t\t\t_skrollables[id] = {\n\t\t\t\telement: el,\n\t\t\t\tstyleAttr: styleAttr,\n\t\t\t\tclassAttr: classAttr,\n\t\t\t\tanchorTarget: anchorTarget,\n\t\t\t\tkeyFrames: keyFrames,\n\t\t\t\tsmoothScrolling: smoothScrollThis,\n\t\t\t\tedgeStrategy: edgeStrategy,\n\t\t\t\temitEvents: emitEvents,\n\t\t\t\tlastFrameIndex: -1\n\t\t\t};\n\n\t\t\t_updateClass(el, [SKROLLABLE_CLASS], []);\n\t\t}\n\n\t\t//Reflow for the first time.\n\t\t_reflow();\n\n\t\t//Now that we got all key frame numbers right, actually parse the properties.\n\t\telementIndex = 0;\n\t\telementsLength = elements.length;\n\n\t\tfor(; elementIndex < elementsLength; elementIndex++) {\n\t\t\tvar sk = _skrollables[elements[elementIndex][SKROLLABLE_ID_DOM_PROPERTY]];\n\n\t\t\tif(sk === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//Parse the property string to objects\n\t\t\t_parseProps(sk);\n\n\t\t\t//Fill key frames with missing properties from left and right\n\t\t\t_fillProps(sk);\n\t\t}\n\n\t\treturn _instance;\n\t};\n\n\t/**\n\t * Transform \"relative\" mode to \"absolute\" mode.\n\t * That is, calculate anchor position and offset of element.\n\t */\n\tSkrollr.prototype.relativeToAbsolute = function(element, viewportAnchor, elementAnchor) {\n\t\tvar viewportHeight = documentElement.clientHeight;\n\t\tvar box = element.getBoundingClientRect();\n\t\tvar absolute = box.top;\n\n\t\t//#100: IE doesn't supply \"height\" with getBoundingClientRect.\n\t\tvar boxHeight = box.bottom - box.top;\n\n\t\tif(viewportAnchor === ANCHOR_BOTTOM) {\n\t\t\tabsolute -= viewportHeight;\n\t\t} else if(viewportAnchor === ANCHOR_CENTER) {\n\t\t\tabsolute -= viewportHeight / 2;\n\t\t}\n\n\t\tif(elementAnchor === ANCHOR_BOTTOM) {\n\t\t\tabsolute += boxHeight;\n\t\t} else if(elementAnchor === ANCHOR_CENTER) {\n\t\t\tabsolute += boxHeight / 2;\n\t\t}\n\n\t\t//Compensate scrolling since getBoundingClientRect is relative to viewport.\n\t\tabsolute += _instance.getScrollTop();\n\n\t\treturn (absolute + 0.5) | 0;\n\t};\n\n\t/**\n\t * Animates scroll top to new position.\n\t */\n\tSkrollr.prototype.animateTo = function(top, options) {\n\t\toptions = options || {};\n\n\t\tvar now = _now();\n\t\tvar scrollTop = _instance.getScrollTop();\n\t\tvar duration = options.duration === undefined ? DEFAULT_DURATION : options.duration;\n\n\t\t//Setting this to a new value will automatically cause the current animation to stop, if any.\n\t\t_scrollAnimation = {\n\t\t\tstartTop: scrollTop,\n\t\t\ttopDiff: top - scrollTop,\n\t\t\ttargetTop: top,\n\t\t\tduration: duration,\n\t\t\tstartTime: now,\n\t\t\tendTime: now + duration,\n\t\t\teasing: easings[options.easing || DEFAULT_EASING],\n\t\t\tdone: options.done\n\t\t};\n\n\t\t//Don't queue the animation if there's nothing to animate.\n\t\tif(!_scrollAnimation.topDiff) {\n\t\t\tif(_scrollAnimation.done) {\n\t\t\t\t_scrollAnimation.done.call(_instance, false);\n\t\t\t}\n\n\t\t\t_scrollAnimation = undefined;\n\t\t}\n\n\t\treturn _instance;\n\t};\n\n\t/**\n\t * Stops animateTo animation.\n\t */\n\tSkrollr.prototype.stopAnimateTo = function() {\n\t\tif(_scrollAnimation && _scrollAnimation.done) {\n\t\t\t_scrollAnimation.done.call(_instance, true);\n\t\t}\n\n\t\t_scrollAnimation = undefined;\n\t};\n\n\t/**\n\t * Returns if an animation caused by animateTo is currently running.\n\t */\n\tSkrollr.prototype.isAnimatingTo = function() {\n\t\treturn !!_scrollAnimation;\n\t};\n\n\tSkrollr.prototype.isMobile = function() {\n\t\treturn _isMobile;\n\t};\n\n\tSkrollr.prototype.setScrollTop = function(top, force) {\n\t\t_forceRender = (force === true);\n\n\t\tif(_isMobile) {\n\t\t\t_mobileOffset = Math.min(Math.max(top, 0), _maxKeyFrame);\n\t\t} else {\n\t\t\twindow.scrollTo(0, top);\n\t\t}\n\n\t\treturn _instance;\n\t};\n\n\tSkrollr.prototype.getScrollTop = function() {\n\t\tif(_isMobile) {\n\t\t\treturn _mobileOffset;\n\t\t} else {\n\t\t\treturn window.pageYOffset || documentElement.scrollTop || body.scrollTop || 0;\n\t\t}\n\t};\n\n\tSkrollr.prototype.getMaxScrollTop = function() {\n\t\treturn _maxKeyFrame;\n\t};\n\n\tSkrollr.prototype.on = function(name, fn) {\n\t\t_listeners[name] = fn;\n\n\t\treturn _instance;\n\t};\n\n\tSkrollr.prototype.off = function(name) {\n\t\tdelete _listeners[name];\n\n\t\treturn _instance;\n\t};\n\n\tSkrollr.prototype.destroy = function() {\n\t\tvar cancelAnimFrame = polyfillCAF();\n\t\tcancelAnimFrame(_animFrame);\n\t\t_removeAllEvents();\n\n\t\t_updateClass(documentElement, [NO_SKROLLR_CLASS], [SKROLLR_CLASS, SKROLLR_DESKTOP_CLASS, SKROLLR_MOBILE_CLASS]);\n\n\t\tvar skrollableIndex = 0;\n\t\tvar skrollablesLength = _skrollables.length;\n\n\t\tfor(; skrollableIndex < skrollablesLength; skrollableIndex++) {\n\t\t\t_reset(_skrollables[skrollableIndex].element);\n\t\t}\n\n\t\tdocumentElement.style.overflow = body.style.overflow = '';\n\t\tdocumentElement.style.height = body.style.height = '';\n\n\t\tif(_skrollrBody) {\n\t\t\tskrollr.setStyle(_skrollrBody, 'transform', 'none');\n\t\t}\n\n\t\t_instance = undefined;\n\t\t_skrollrBody = undefined;\n\t\t_listeners = undefined;\n\t\t_forceHeight = undefined;\n\t\t_maxKeyFrame = 0;\n\t\t_scale = 1;\n\t\t_constants = undefined;\n\t\t_mobileDeceleration = undefined;\n\t\t_direction = 'down';\n\t\t_lastTop = -1;\n\t\t_lastViewportWidth = 0;\n\t\t_lastViewportHeight = 0;\n\t\t_requestReflow = false;\n\t\t_scrollAnimation = undefined;\n\t\t_smoothScrollingEnabled = undefined;\n\t\t_smoothScrollingDuration = undefined;\n\t\t_smoothScrolling = undefined;\n\t\t_forceRender = undefined;\n\t\t_skrollableIdCounter = 0;\n\t\t_edgeStrategy = undefined;\n\t\t_isMobile = false;\n\t\t_mobileOffset = 0;\n\t\t_translateZ = undefined;\n\t};\n\n\t/*\n\t\tPrivate methods.\n\t*/\n\n\tvar _initMobile = function() {\n\t\tvar initialElement;\n\t\tvar initialTouchY;\n\t\tvar initialTouchX;\n\t\tvar currentElement;\n\t\tvar currentTouchY;\n\t\tvar currentTouchX;\n\t\tvar lastTouchY;\n\t\tvar deltaY;\n\n\t\tvar initialTouchTime;\n\t\tvar currentTouchTime;\n\t\tvar lastTouchTime;\n\t\tvar deltaTime;\n\n\t\t_addEvent(documentElement, [EVENT_TOUCHSTART, EVENT_TOUCHMOVE, EVENT_TOUCHCANCEL, EVENT_TOUCHEND].join(' '), function(e) {\n\t\t\tvar touch = e.changedTouches[0];\n\n\t\t\tcurrentElement = e.target;\n\n\t\t\t//We don't want text nodes.\n\t\t\twhile(currentElement.nodeType === 3) {\n\t\t\t\tcurrentElement = currentElement.parentNode;\n\t\t\t}\n\n\t\t\tcurrentTouchY = touch.clientY;\n\t\t\tcurrentTouchX = touch.clientX;\n\t\t\tcurrentTouchTime = e.timeStamp;\n\n\t\t\tif(!rxTouchIgnoreTags.test(currentElement.tagName)) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\tswitch(e.type) {\n\t\t\t\tcase EVENT_TOUCHSTART:\n\t\t\t\t\t//The last element we tapped on.\n\t\t\t\t\tif(initialElement) {\n\t\t\t\t\t\tinitialElement.blur();\n\t\t\t\t\t}\n\n\t\t\t\t\t_instance.stopAnimateTo();\n\n\t\t\t\t\tinitialElement = currentElement;\n\n\t\t\t\t\tinitialTouchY = lastTouchY = currentTouchY;\n\t\t\t\t\tinitialTouchX = currentTouchX;\n\t\t\t\t\tinitialTouchTime = currentTouchTime;\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase EVENT_TOUCHMOVE:\n\t\t\t\t\t//Prevent default event on touchIgnore elements in case they don't have focus yet.\n\t\t\t\t\tif(rxTouchIgnoreTags.test(currentElement.tagName) && document.activeElement !== currentElement) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\n\t\t\t\t\tdeltaY = currentTouchY - lastTouchY;\n\t\t\t\t\tdeltaTime = currentTouchTime - lastTouchTime;\n\n\t\t\t\t\t_instance.setScrollTop(_mobileOffset - deltaY, true);\n\n\t\t\t\t\tlastTouchY = currentTouchY;\n\t\t\t\t\tlastTouchTime = currentTouchTime;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\tcase EVENT_TOUCHCANCEL:\n\t\t\t\tcase EVENT_TOUCHEND:\n\t\t\t\t\tvar distanceY = initialTouchY - currentTouchY;\n\t\t\t\t\tvar distanceX = initialTouchX - currentTouchX;\n\t\t\t\t\tvar distance2 = distanceX * distanceX + distanceY * distanceY;\n\n\t\t\t\t\t//Check if it was more like a tap (moved less than 7px).\n\t\t\t\t\tif(distance2 < 49) {\n\t\t\t\t\t\tif(!rxTouchIgnoreTags.test(initialElement.tagName)) {\n\t\t\t\t\t\t\tinitialElement.focus();\n\n\t\t\t\t\t\t\t//It was a tap, click the element.\n\t\t\t\t\t\t\tvar clickEvent = document.createEvent('MouseEvents');\n\t\t\t\t\t\t\tclickEvent.initMouseEvent('click', true, true, e.view, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, 0, null);\n\t\t\t\t\t\t\tinitialElement.dispatchEvent(clickEvent);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tinitialElement = undefined;\n\n\t\t\t\t\tvar speed = deltaY / deltaTime;\n\n\t\t\t\t\t//Cap speed at 3 pixel/ms.\n\t\t\t\t\tspeed = Math.max(Math.min(speed, 3), -3);\n\n\t\t\t\t\tvar duration = Math.abs(speed / _mobileDeceleration);\n\t\t\t\t\tvar targetOffset = speed * duration + 0.5 * _mobileDeceleration * duration * duration;\n\t\t\t\t\tvar targetTop = _instance.getScrollTop() - targetOffset;\n\n\t\t\t\t\t//Relative duration change for when scrolling above bounds.\n\t\t\t\t\tvar targetRatio = 0;\n\n\t\t\t\t\t//Change duration proportionally when scrolling would leave bounds.\n\t\t\t\t\tif(targetTop > _maxKeyFrame) {\n\t\t\t\t\t\ttargetRatio = (_maxKeyFrame - targetTop) / targetOffset;\n\n\t\t\t\t\t\ttargetTop = _maxKeyFrame;\n\t\t\t\t\t} else if(targetTop < 0) {\n\t\t\t\t\t\ttargetRatio = -targetTop / targetOffset;\n\n\t\t\t\t\t\ttargetTop = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = duration * (1 - targetRatio);\n\n\t\t\t\t\t_instance.animateTo((targetTop + 0.5) | 0, {easing: 'outCubic', duration: duration});\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\n\t\t//Just in case there has already been some native scrolling, reset it.\n\t\twindow.scrollTo(0, 0);\n\t\tdocumentElement.style.overflow = body.style.overflow = 'hidden';\n\t};\n\n\t/**\n\t * Updates key frames which depend on others / need to be updated on resize.\n\t * That is \"end\" in \"absolute\" mode and all key frames in \"relative\" mode.\n\t * Also handles constants, because they may change on resize.\n\t */\n\tvar _updateDependentKeyFrames = function() {\n\t\tvar viewportHeight = documentElement.clientHeight;\n\t\tvar processedConstants = _processConstants();\n\t\tvar skrollable;\n\t\tvar element;\n\t\tvar anchorTarget;\n\t\tvar keyFrames;\n\t\tvar keyFrameIndex;\n\t\tvar keyFramesLength;\n\t\tvar kf;\n\t\tvar skrollableIndex;\n\t\tvar skrollablesLength;\n\t\tvar offset;\n\t\tvar constantValue;\n\n\t\t//First process all relative-mode elements and find the max key frame.\n\t\tskrollableIndex = 0;\n\t\tskrollablesLength = _skrollables.length;\n\n\t\tfor(; skrollableIndex < skrollablesLength; skrollableIndex++) {\n\t\t\tskrollable = _skrollables[skrollableIndex];\n\t\t\telement = skrollable.element;\n\t\t\tanchorTarget = skrollable.anchorTarget;\n\t\t\tkeyFrames = skrollable.keyFrames;\n\n\t\t\tkeyFrameIndex = 0;\n\t\t\tkeyFramesLength = keyFrames.length;\n\n\t\t\tfor(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {\n\t\t\t\tkf = keyFrames[keyFrameIndex];\n\n\t\t\t\toffset = kf.offset;\n\t\t\t\tconstantValue = processedConstants[kf.constant] || 0;\n\n\t\t\t\tkf.frame = offset;\n\n\t\t\t\tif(kf.isPercentage) {\n\t\t\t\t\t//Convert the offset to percentage of the viewport height.\n\t\t\t\t\toffset = offset * viewportHeight;\n\n\t\t\t\t\t//Absolute + percentage mode.\n\t\t\t\t\tkf.frame = offset;\n\t\t\t\t}\n\n\t\t\t\tif(kf.mode === 'relative') {\n\t\t\t\t\t_reset(element);\n\n\t\t\t\t\tkf.frame = _instance.relativeToAbsolute(anchorTarget, kf.anchors[0], kf.anchors[1]) - offset;\n\n\t\t\t\t\t_reset(element, true);\n\t\t\t\t}\n\n\t\t\t\tkf.frame += constantValue;\n\n\t\t\t\t//Only search for max key frame when forceHeight is enabled.\n\t\t\t\tif(_forceHeight) {\n\t\t\t\t\t//Find the max key frame, but don't use one of the data-end ones for comparison.\n\t\t\t\t\tif(!kf.isEnd && kf.frame > _maxKeyFrame) {\n\t\t\t\t\t\t_maxKeyFrame = kf.frame;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//#133: The document can be larger than the maxKeyFrame we found.\n\t\t_maxKeyFrame = Math.max(_maxKeyFrame, _getDocumentHeight());\n\n\t\t//Now process all data-end keyframes.\n\t\tskrollableIndex = 0;\n\t\tskrollablesLength = _skrollables.length;\n\n\t\tfor(; skrollableIndex < skrollablesLength; skrollableIndex++) {\n\t\t\tskrollable = _skrollables[skrollableIndex];\n\t\t\tkeyFrames = skrollable.keyFrames;\n\n\t\t\tkeyFrameIndex = 0;\n\t\t\tkeyFramesLength = keyFrames.length;\n\n\t\t\tfor(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {\n\t\t\t\tkf = keyFrames[keyFrameIndex];\n\n\t\t\t\tconstantValue = processedConstants[kf.constant] || 0;\n\n\t\t\t\tif(kf.isEnd) {\n\t\t\t\t\tkf.frame = _maxKeyFrame - kf.offset + constantValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tskrollable.keyFrames.sort(_keyFrameComparator);\n\t\t}\n\t};\n\n\t/**\n\t * Calculates and sets the style properties for the element at the given frame.\n\t * @param fakeFrame The frame to render at when smooth scrolling is enabled.\n\t * @param actualFrame The actual frame we are at.\n\t */\n\tvar _calcSteps = function(fakeFrame, actualFrame) {\n\t\t//Iterate over all skrollables.\n\t\tvar skrollableIndex = 0;\n\t\tvar skrollablesLength = _skrollables.length;\n\n\t\tfor(; skrollableIndex < skrollablesLength; skrollableIndex++) {\n\t\t\tvar skrollable = _skrollables[skrollableIndex];\n\t\t\tvar element = skrollable.element;\n\t\t\tvar frame = skrollable.smoothScrolling ? fakeFrame : actualFrame;\n\t\t\tvar frames = skrollable.keyFrames;\n\t\t\tvar framesLength = frames.length;\n\t\t\tvar firstFrame = frames[0];\n\t\t\tvar lastFrame = frames[frames.length - 1];\n\t\t\tvar beforeFirst = frame < firstFrame.frame;\n\t\t\tvar afterLast = frame > lastFrame.frame;\n\t\t\tvar firstOrLastFrame = beforeFirst ? firstFrame : lastFrame;\n\t\t\tvar emitEvents = skrollable.emitEvents;\n\t\t\tvar lastFrameIndex = skrollable.lastFrameIndex;\n\t\t\tvar key;\n\t\t\tvar value;\n\n\t\t\t//If we are before/after the first/last frame, set the styles according to the given edge strategy.\n\t\t\tif(beforeFirst || afterLast) {\n\t\t\t\t//Check if we already handled this edge case last time.\n\t\t\t\t//Note: using setScrollTop it's possible that we jumped from one edge to the other.\n\t\t\t\tif(beforeFirst && skrollable.edge === -1 || afterLast && skrollable.edge === 1) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t//Add the skrollr-before or -after class.\n\t\t\t\tif(beforeFirst) {\n\t\t\t\t\t_updateClass(element, [SKROLLABLE_BEFORE_CLASS], [SKROLLABLE_AFTER_CLASS, SKROLLABLE_BETWEEN_CLASS]);\n\n\t\t\t\t\t//This handles the special case where we exit the first keyframe.\n\t\t\t\t\tif(emitEvents && lastFrameIndex > -1) {\n\t\t\t\t\t\t_emitEvent(element, firstFrame.eventType, _direction);\n\t\t\t\t\t\tskrollable.lastFrameIndex = -1;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t_updateClass(element, [SKROLLABLE_AFTER_CLASS], [SKROLLABLE_BEFORE_CLASS, SKROLLABLE_BETWEEN_CLASS]);\n\n\t\t\t\t\t//This handles the special case where we exit the last keyframe.\n\t\t\t\t\tif(emitEvents && lastFrameIndex < framesLength) {\n\t\t\t\t\t\t_emitEvent(element, lastFrame.eventType, _direction);\n\t\t\t\t\t\tskrollable.lastFrameIndex = framesLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//Remember that we handled the edge case (before/after the first/last keyframe).\n\t\t\t\tskrollable.edge = beforeFirst ? -1 : 1;\n\n\t\t\t\tswitch(skrollable.edgeStrategy) {\n\t\t\t\t\tcase 'reset':\n\t\t\t\t\t\t_reset(element);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase 'ease':\n\t\t\t\t\t\t//Handle this case like it would be exactly at first/last keyframe and just pass it on.\n\t\t\t\t\t\tframe = firstOrLastFrame.frame;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase 'set':\n\t\t\t\t\t\tvar props = firstOrLastFrame.props;\n\n\t\t\t\t\t\tfor(key in props) {\n\t\t\t\t\t\t\tif(hasProp.call(props, key)) {\n\t\t\t\t\t\t\t\tvalue = _interpolateString(props[key].value);\n\n\t\t\t\t\t\t\t\t//Set style or attribute.\n\t\t\t\t\t\t\t\tif(key.indexOf('@') === 0) {\n\t\t\t\t\t\t\t\t\telement.setAttribute(key.substr(1), value);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tskrollr.setStyle(element, key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t//Did we handle an edge last time?\n\t\t\t\tif(skrollable.edge !== 0) {\n\t\t\t\t\t_updateClass(element, [SKROLLABLE_CLASS, SKROLLABLE_BETWEEN_CLASS], [SKROLLABLE_BEFORE_CLASS, SKROLLABLE_AFTER_CLASS]);\n\t\t\t\t\tskrollable.edge = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Find out between which two key frames we are right now.\n\t\t\tvar keyFrameIndex = 0;\n\n\t\t\tfor(; keyFrameIndex < framesLength - 1; keyFrameIndex++) {\n\t\t\t\tif(frame >= frames[keyFrameIndex].frame && frame <= frames[keyFrameIndex + 1].frame) {\n\t\t\t\t\tvar left = frames[keyFrameIndex];\n\t\t\t\t\tvar right = frames[keyFrameIndex + 1];\n\n\t\t\t\t\tfor(key in left.props) {\n\t\t\t\t\t\tif(hasProp.call(left.props, key)) {\n\t\t\t\t\t\t\tvar progress = (frame - left.frame) / (right.frame - left.frame);\n\n\t\t\t\t\t\t\t//Transform the current progress using the given easing function.\n\t\t\t\t\t\t\tprogress = left.props[key].easing(progress);\n\n\t\t\t\t\t\t\t//Interpolate between the two values\n\t\t\t\t\t\t\tvalue = _calcInterpolation(left.props[key].value, right.props[key].value, progress);\n\n\t\t\t\t\t\t\tvalue = _interpolateString(value);\n\n\t\t\t\t\t\t\t//Set style or attribute.\n\t\t\t\t\t\t\tif(key.indexOf('@') === 0) {\n\t\t\t\t\t\t\t\telement.setAttribute(key.substr(1), value);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tskrollr.setStyle(element, key, value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t//Are events enabled on this element?\n\t\t\t\t\t//This code handles the usual cases of scrolling through different keyframes.\n\t\t\t\t\t//The special cases of before first and after last keyframe are handled above.\n\t\t\t\t\tif(emitEvents) {\n\t\t\t\t\t\t//Did we pass a new keyframe?\n\t\t\t\t\t\tif(lastFrameIndex !== keyFrameIndex) {\n\t\t\t\t\t\t\tif(_direction === 'down') {\n\t\t\t\t\t\t\t\t_emitEvent(element, left.eventType, _direction);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_emitEvent(element, right.eventType, _direction);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tskrollable.lastFrameIndex = keyFrameIndex;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Renders all elements.\n\t */\n\tvar _render = function() {\n\t\tif(_requestReflow) {\n\t\t\t_requestReflow = false;\n\t\t\t_reflow();\n\t\t}\n\n\t\t//We may render something else than the actual scrollbar position.\n\t\tvar renderTop = _instance.getScrollTop();\n\n\t\t//If there's an animation, which ends in current render call, call the callback after rendering.\n\t\tvar afterAnimationCallback;\n\t\tvar now = _now();\n\t\tvar progress;\n\n\t\t//Before actually rendering handle the scroll animation, if any.\n\t\tif(_scrollAnimation) {\n\t\t\t//It's over\n\t\t\tif(now >= _scrollAnimation.endTime) {\n\t\t\t\trenderTop = _scrollAnimation.targetTop;\n\t\t\t\tafterAnimationCallback = _scrollAnimation.done;\n\t\t\t\t_scrollAnimation = undefined;\n\t\t\t} else {\n\t\t\t\t//Map the current progress to the new progress using given easing function.\n\t\t\t\tprogress = _scrollAnimation.easing((now - _scrollAnimation.startTime) / _scrollAnimation.duration);\n\n\t\t\t\trenderTop = (_scrollAnimation.startTop + progress * _scrollAnimation.topDiff) | 0;\n\t\t\t}\n\n\t\t\t_instance.setScrollTop(renderTop, true);\n\t\t}\n\t\t//Smooth scrolling only if there's no animation running and if we're not forcing the rendering.\n\t\telse if(!_forceRender) {\n\t\t\tvar smoothScrollingDiff = _smoothScrolling.targetTop - renderTop;\n\n\t\t\t//The user scrolled, start new smooth scrolling.\n\t\t\tif(smoothScrollingDiff) {\n\t\t\t\t_smoothScrolling = {\n\t\t\t\t\tstartTop: _lastTop,\n\t\t\t\t\ttopDiff: renderTop - _lastTop,\n\t\t\t\t\ttargetTop: renderTop,\n\t\t\t\t\tstartTime: _lastRenderCall,\n\t\t\t\t\tendTime: _lastRenderCall + _smoothScrollingDuration\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t//Interpolate the internal scroll position (not the actual scrollbar).\n\t\t\tif(now <= _smoothScrolling.endTime) {\n\t\t\t\t//Map the current progress to the new progress using easing function.\n\t\t\t\tprogress = easings.sqrt((now - _smoothScrolling.startTime) / _smoothScrollingDuration);\n\n\t\t\t\trenderTop = (_smoothScrolling.startTop + progress * _smoothScrolling.topDiff) | 0;\n\t\t\t}\n\t\t}\n\n\t\t//Did the scroll position even change?\n\t\tif(_forceRender || _lastTop !== renderTop) {\n\t\t\t//Remember in which direction are we scrolling?\n\t\t\t_direction = (renderTop > _lastTop) ? 'down' : (renderTop < _lastTop ? 'up' : _direction);\n\n\t\t\t_forceRender = false;\n\n\t\t\tvar listenerParams = {\n\t\t\t\tcurTop: renderTop,\n\t\t\t\tlastTop: _lastTop,\n\t\t\t\tmaxTop: _maxKeyFrame,\n\t\t\t\tdirection: _direction\n\t\t\t};\n\n\t\t\t//Tell the listener we are about to render.\n\t\t\tvar continueRendering = _listeners.beforerender && _listeners.beforerender.call(_instance, listenerParams);\n\n\t\t\t//The beforerender listener function is able the cancel rendering.\n\t\t\tif(continueRendering !== false) {\n\t\t\t\t//Now actually interpolate all the styles.\n\t\t\t\t_calcSteps(renderTop, _instance.getScrollTop());\n\n\t\t\t\t//That's were we actually \"scroll\" on mobile.\n\t\t\t\tif(_isMobile && _skrollrBody) {\n\t\t\t\t\t//Set the transform (\"scroll it\").\n\t\t\t\t\tskrollr.setStyle(_skrollrBody, 'transform', 'translate(0, ' + -(_mobileOffset) + 'px) ' + _translateZ);\n\t\t\t\t}\n\n\t\t\t\t//Remember when we last rendered.\n\t\t\t\t_lastTop = renderTop;\n\n\t\t\t\tif(_listeners.render) {\n\t\t\t\t\t_listeners.render.call(_instance, listenerParams);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(afterAnimationCallback) {\n\t\t\t\tafterAnimationCallback.call(_instance, false);\n\t\t\t}\n\t\t}\n\n\t\t_lastRenderCall = now;\n\t};\n\n\t/**\n\t * Parses the properties for each key frame of the given skrollable.\n\t */\n\tvar _parseProps = function(skrollable) {\n\t\t//Iterate over all key frames\n\t\tvar keyFrameIndex = 0;\n\t\tvar keyFramesLength = skrollable.keyFrames.length;\n\n\t\tfor(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {\n\t\t\tvar frame = skrollable.keyFrames[keyFrameIndex];\n\t\t\tvar easing;\n\t\t\tvar value;\n\t\t\tvar prop;\n\t\t\tvar props = {};\n\n\t\t\tvar match;\n\n\t\t\twhile((match = rxPropValue.exec(frame.props)) !== null) {\n\t\t\t\tprop = match[1];\n\t\t\t\tvalue = match[2];\n\n\t\t\t\teasing = prop.match(rxPropEasing);\n\n\t\t\t\t//Is there an easing specified for this prop?\n\t\t\t\tif(easing !== null) {\n\t\t\t\t\tprop = easing[1];\n\t\t\t\t\teasing = easing[2];\n\t\t\t\t} else {\n\t\t\t\t\teasing = DEFAULT_EASING;\n\t\t\t\t}\n\n\t\t\t\t//Exclamation point at first position forces the value to be taken literal.\n\t\t\t\tvalue = value.indexOf('!') ? _parseProp(value) : [value.slice(1)];\n\n\t\t\t\t//Save the prop for this key frame with his value and easing function\n\t\t\t\tprops[prop] = {\n\t\t\t\t\tvalue: value,\n\t\t\t\t\teasing: easings[easing]\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tframe.props = props;\n\t\t}\n\t};\n\n\t/**\n\t * Parses a value extracting numeric values and generating a format string\n\t * for later interpolation of the new values in old string.\n\t *\n\t * @param val The CSS value to be parsed.\n\t * @return Something like [\"rgba(?%,?%, ?%,?)\", 100, 50, 0, .7]\n\t * where the first element is the format string later used\n\t * and all following elements are the numeric value.\n\t */\n\tvar _parseProp = function(val) {\n\t\tvar numbers = [];\n\n\t\t//One special case, where floats don't work.\n\t\t//We replace all occurences of rgba colors\n\t\t//which don't use percentage notation with the percentage notation.\n\t\trxRGBAIntegerColor.lastIndex = 0;\n\t\tval = val.replace(rxRGBAIntegerColor, function(rgba) {\n\t\t\treturn rgba.replace(rxNumericValue, function(n) {\n\t\t\t\treturn n / 255 * 100 + '%';\n\t\t\t});\n\t\t});\n\n\t\t//Handle prefixing of \"gradient\" values.\n\t\t//For now only the prefixed value will be set. Unprefixed isn't supported anyway.\n\t\tif(theDashedCSSPrefix) {\n\t\t\trxGradient.lastIndex = 0;\n\t\t\tval = val.replace(rxGradient, function(s) {\n\t\t\t\treturn theDashedCSSPrefix + s;\n\t\t\t});\n\t\t}\n\n\t\t//Now parse ANY number inside this string and create a format string.\n\t\tval = val.replace(rxNumericValue, function(n) {\n\t\t\tnumbers.push(+n);\n\t\t\treturn '{?}';\n\t\t});\n\n\t\t//Add the formatstring as first value.\n\t\tnumbers.unshift(val);\n\n\t\treturn numbers;\n\t};\n\n\t/**\n\t * Fills the key frames with missing left and right hand properties.\n\t * If key frame 1 has property X and key frame 2 is missing X,\n\t * but key frame 3 has X again, then we need to assign X to key frame 2 too.\n\t *\n\t * @param sk A skrollable.\n\t */\n\tvar _fillProps = function(sk) {\n\t\t//Will collect the properties key frame by key frame\n\t\tvar propList = {};\n\t\tvar keyFrameIndex;\n\t\tvar keyFramesLength;\n\n\t\t//Iterate over all key frames from left to right\n\t\tkeyFrameIndex = 0;\n\t\tkeyFramesLength = sk.keyFrames.length;\n\n\t\tfor(; keyFrameIndex < keyFramesLength; keyFrameIndex++) {\n\t\t\t_fillPropForFrame(sk.keyFrames[keyFrameIndex], propList);\n\t\t}\n\n\t\t//Now do the same from right to fill the last gaps\n\n\t\tpropList = {};\n\n\t\t//Iterate over all key frames from right to left\n\t\tkeyFrameIndex = sk.keyFrames.length - 1;\n\n\t\tfor(; keyFrameIndex >= 0; keyFrameIndex--) {\n\t\t\t_fillPropForFrame(sk.keyFrames[keyFrameIndex], propList);\n\t\t}\n\t};\n\n\tvar _fillPropForFrame = function(frame, propList) {\n\t\tvar key;\n\n\t\t//For each key frame iterate over all right hand properties and assign them,\n\t\t//but only if the current key frame doesn't have the property by itself\n\t\tfor(key in propList) {\n\t\t\t//The current frame misses this property, so assign it.\n\t\t\tif(!hasProp.call(frame.props, key)) {\n\t\t\t\tframe.props[key] = propList[key];\n\t\t\t}\n\t\t}\n\n\t\t//Iterate over all props of the current frame and collect them\n\t\tfor(key in frame.props) {\n\t\t\tpropList[key] = frame.props[key];\n\t\t}\n\t};\n\n\t/**\n\t * Calculates the new values for two given values array.\n\t */\n\tvar _calcInterpolation = function(val1, val2, progress) {\n\t\tvar valueIndex;\n\t\tvar val1Length = val1.length;\n\n\t\t//They both need to have the same length\n\t\tif(val1Length !== val2.length) {\n\t\t\tthrow 'Can\\'t interpolate between \"' + val1[0] + '\" and \"' + val2[0] + '\"';\n\t\t}\n\n\t\t//Add the format string as first element.\n\t\tvar interpolated = [val1[0]];\n\n\t\tvalueIndex = 1;\n\n\t\tfor(; valueIndex < val1Length; valueIndex++) {\n\t\t\t//That's the line where the two numbers are actually interpolated.\n\t\t\tinterpolated[valueIndex] = val1[valueIndex] + ((val2[valueIndex] - val1[valueIndex]) * progress);\n\t\t}\n\n\t\treturn interpolated;\n\t};\n\n\t/**\n\t * Interpolates the numeric values into the format string.\n\t */\n\tvar _interpolateString = function(val) {\n\t\tvar valueIndex = 1;\n\n\t\trxInterpolateString.lastIndex = 0;\n\n\t\treturn val[0].replace(rxInterpolateString, function() {\n\t\t\treturn val[valueIndex++];\n\t\t});\n\t};\n\n\t/**\n\t * Resets the class and style attribute to what it was before skrollr manipulated the element.\n\t * Also remembers the values it had before reseting, in order to undo the reset.\n\t */\n\tvar _reset = function(elements, undo) {\n\t\t//We accept a single element or an array of elements.\n\t\telements = [].concat(elements);\n\n\t\tvar skrollable;\n\t\tvar element;\n\t\tvar elementsIndex = 0;\n\t\tvar elementsLength = elements.length;\n\n\t\tfor(; elementsIndex < elementsLength; elementsIndex++) {\n\t\t\telement = elements[elementsIndex];\n\t\t\tskrollable = _skrollables[element[SKROLLABLE_ID_DOM_PROPERTY]];\n\n\t\t\t//Couldn't find the skrollable for this DOM element.\n\t\t\tif(!skrollable) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(undo) {\n\t\t\t\t//Reset class and style to the \"dirty\" (set by skrollr) values.\n\t\t\t\telement.style.cssText = skrollable.dirtyStyleAttr;\n\t\t\t\t_updateClass(element, skrollable.dirtyClassAttr);\n\t\t\t} else {\n\t\t\t\t//Remember the \"dirty\" (set by skrollr) class and style.\n\t\t\t\tskrollable.dirtyStyleAttr = element.style.cssText;\n\t\t\t\tskrollable.dirtyClassAttr = _getClass(element);\n\n\t\t\t\t//Reset class and style to what it originally was.\n\t\t\t\telement.style.cssText = skrollable.styleAttr;\n\t\t\t\t_updateClass(element, skrollable.classAttr);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Detects support for 3d transforms by applying it to the skrollr-body.\n\t */\n\tvar _detect3DTransforms = function() {\n\t\t_translateZ = 'translateZ(0)';\n\t\tskrollr.setStyle(_skrollrBody, 'transform', _translateZ);\n\n\t\tvar computedStyle = getStyle(_skrollrBody);\n\t\tvar computedTransform = computedStyle.getPropertyValue('transform');\n\t\tvar computedTransformWithPrefix = computedStyle.getPropertyValue(theDashedCSSPrefix + 'transform');\n\t\tvar has3D = (computedTransform && computedTransform !== 'none') || (computedTransformWithPrefix && computedTransformWithPrefix !== 'none');\n\n\t\tif(!has3D) {\n\t\t\t_translateZ = '';\n\t\t}\n\t};\n\n\t/**\n\t * Set the CSS property on the given element. Sets prefixed properties as well.\n\t */\n\tskrollr.setStyle = function(el, prop, val) {\n\t\tvar style = el.style;\n\n\t\t//Camel case.\n\t\tprop = prop.replace(rxCamelCase, rxCamelCaseFn).replace('-', '');\n\n\t\t//Make sure z-index gets a .\n\t\t//This is the only case we need to handle.\n\t\tif(prop === 'zIndex') {\n\t\t\tif(isNaN(val)) {\n\t\t\t\t//If it's not a number, don't touch it.\n\t\t\t\t//It could for example be \"auto\" (#351).\n\t\t\t\tstyle[prop] = val;\n\t\t\t} else {\n\t\t\t\t//Floor the number.\n\t\t\t\tstyle[prop] = '' + (val | 0);\n\t\t\t}\n\t\t}\n\t\t//#64: \"float\" can't be set across browsers. Needs to use \"cssFloat\" for all except IE.\n\t\telse if(prop === 'float') {\n\t\t\tstyle.styleFloat = style.cssFloat = val;\n\t\t}\n\t\telse {\n\t\t\t//Need try-catch for old IE.\n\t\t\ttry {\n\t\t\t\t//Set prefixed property if there's a prefix.\n\t\t\t\tif(theCSSPrefix) {\n\t\t\t\t\tstyle[theCSSPrefix + prop.slice(0,1).toUpperCase() + prop.slice(1)] = val;\n\t\t\t\t}\n\n\t\t\t\t//Set unprefixed.\n\t\t\t\tstyle[prop] = val;\n\t\t\t} catch(ignore) {}\n\t\t}\n\t};\n\n\t/**\n\t * Cross browser event handling.\n\t */\n\tvar _addEvent = skrollr.addEvent = function(element, names, callback) {\n\t\tvar intermediate = function(e) {\n\t\t\t//Normalize IE event stuff.\n\t\t\te = e || window.event;\n\n\t\t\tif(!e.target) {\n\t\t\t\te.target = e.srcElement;\n\t\t\t}\n\n\t\t\tif(!e.preventDefault) {\n\t\t\t\te.preventDefault = function() {\n\t\t\t\t\te.returnValue = false;\n\t\t\t\t\te.defaultPrevented = true;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn callback.call(this, e);\n\t\t};\n\n\t\tnames = names.split(' ');\n\n\t\tvar name;\n\t\tvar nameCounter = 0;\n\t\tvar namesLength = names.length;\n\n\t\tfor(; nameCounter < namesLength; nameCounter++) {\n\t\t\tname = names[nameCounter];\n\n\t\t\tif(element.addEventListener) {\n\t\t\t\telement.addEventListener(name, callback, false);\n\t\t\t} else {\n\t\t\t\telement.attachEvent('on' + name, intermediate);\n\t\t\t}\n\n\t\t\t//Remember the events to be able to flush them later.\n\t\t\t_registeredEvents.push({\n\t\t\t\telement: element,\n\t\t\t\tname: name,\n\t\t\t\tlistener: callback\n\t\t\t});\n\t\t}\n\t};\n\n\tvar _removeEvent = skrollr.removeEvent = function(element, names, callback) {\n\t\tnames = names.split(' ');\n\n\t\tvar nameCounter = 0;\n\t\tvar namesLength = names.length;\n\n\t\tfor(; nameCounter < namesLength; nameCounter++) {\n\t\t\tif(element.removeEventListener) {\n\t\t\t\telement.removeEventListener(names[nameCounter], callback, false);\n\t\t\t} else {\n\t\t\t\telement.detachEvent('on' + names[nameCounter], callback);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar _removeAllEvents = function() {\n\t\tvar eventData;\n\t\tvar eventCounter = 0;\n\t\tvar eventsLength = _registeredEvents.length;\n\n\t\tfor(; eventCounter < eventsLength; eventCounter++) {\n\t\t\teventData = _registeredEvents[eventCounter];\n\n\t\t\t_removeEvent(eventData.element, eventData.name, eventData.listener);\n\t\t}\n\n\t\t_registeredEvents = [];\n\t};\n\n\tvar _emitEvent = function(element, name, direction) {\n\t\tif(_listeners.keyframe) {\n\t\t\t_listeners.keyframe.call(_instance, element, name, direction);\n\t\t}\n\t};\n\n\tvar _reflow = function() {\n\t\tvar pos = _instance.getScrollTop();\n\n\t\t//Will be recalculated by _updateDependentKeyFrames.\n\t\t_maxKeyFrame = 0;\n\n\t\tif(_forceHeight && !_isMobile) {\n\t\t\t//un-\"force\" the height to not mess with the calculations in _updateDependentKeyFrames (#216).\n\t\t\tbody.style.height = '';\n\t\t}\n\n\t\t_updateDependentKeyFrames();\n\n\t\tif(_forceHeight && !_isMobile) {\n\t\t\t//\"force\" the height.\n\t\t\tbody.style.height = (_maxKeyFrame + documentElement.clientHeight) + 'px';\n\t\t}\n\n\t\t//The scroll offset may now be larger than needed (on desktop the browser/os prevents scrolling farther than the bottom).\n\t\tif(_isMobile) {\n\t\t\t_instance.setScrollTop(Math.min(_instance.getScrollTop(), _maxKeyFrame));\n\t\t} else {\n\t\t\t//Remember and reset the scroll pos (#217).\n\t\t\t_instance.setScrollTop(pos, true);\n\t\t}\n\n\t\t_forceRender = true;\n\t};\n\n\t/*\n\t * Returns a copy of the constants object where all functions and strings have been evaluated.\n\t */\n\tvar _processConstants = function() {\n\t\tvar viewportHeight = documentElement.clientHeight;\n\t\tvar copy = {};\n\t\tvar prop;\n\t\tvar value;\n\n\t\tfor(prop in _constants) {\n\t\t\tvalue = _constants[prop];\n\n\t\t\tif(typeof value === 'function') {\n\t\t\t\tvalue = value.call(_instance);\n\t\t\t}\n\t\t\t//Percentage offset.\n\t\t\telse if((/p$/).test(value)) {\n\t\t\t\tvalue = (value.slice(0, -1) / 100) * viewportHeight;\n\t\t\t}\n\n\t\t\tcopy[prop] = value;\n\t\t}\n\n\t\treturn copy;\n\t};\n\n\t/*\n\t * Returns the height of the document.\n\t */\n\tvar _getDocumentHeight = function() {\n\t\tvar skrollrBodyHeight = 0;\n\t\tvar bodyHeight;\n\n\t\tif(_skrollrBody) {\n\t\t\tskrollrBodyHeight = Math.max(_skrollrBody.offsetHeight, _skrollrBody.scrollHeight);\n\t\t}\n\n\t\tbodyHeight = Math.max(skrollrBodyHeight, body.scrollHeight, body.offsetHeight, documentElement.scrollHeight, documentElement.offsetHeight, documentElement.clientHeight);\n\n\t\treturn bodyHeight - documentElement.clientHeight;\n\t};\n\n\t/**\n\t * Returns a string of space separated classnames for the current element.\n\t * Works with SVG as well.\n\t */\n\tvar _getClass = function(element) {\n\t\tvar prop = 'className';\n\n\t\t//SVG support by using className.baseVal instead of just className.\n\t\tif(window.SVGElement && element instanceof window.SVGElement) {\n\t\t\telement = element[prop];\n\t\t\tprop = 'baseVal';\n\t\t}\n\n\t\treturn element[prop];\n\t};\n\n\t/**\n\t * Adds and removes a CSS classes.\n\t * Works with SVG as well.\n\t * add and remove are arrays of strings,\n\t * or if remove is ommited add is a string and overwrites all classes.\n\t */\n\tvar _updateClass = function(element, add, remove) {\n\t\tvar prop = 'className';\n\n\t\t//SVG support by using className.baseVal instead of just className.\n\t\tif(window.SVGElement && element instanceof window.SVGElement) {\n\t\t\telement = element[prop];\n\t\t\tprop = 'baseVal';\n\t\t}\n\n\t\t//When remove is ommited, we want to overwrite/set the classes.\n\t\tif(remove === undefined) {\n\t\t\telement[prop] = add;\n\t\t\treturn;\n\t\t}\n\n\t\t//Cache current classes. We will work on a string before passing back to DOM.\n\t\tvar val = element[prop];\n\n\t\t//All classes to be removed.\n\t\tvar classRemoveIndex = 0;\n\t\tvar removeLength = remove.length;\n\n\t\tfor(; classRemoveIndex < removeLength; classRemoveIndex++) {\n\t\t\tval = _untrim(val).replace(_untrim(remove[classRemoveIndex]), ' ');\n\t\t}\n\n\t\tval = _trim(val);\n\n\t\t//All classes to be added.\n\t\tvar classAddIndex = 0;\n\t\tvar addLength = add.length;\n\n\t\tfor(; classAddIndex < addLength; classAddIndex++) {\n\t\t\t//Only add if el not already has class.\n\t\t\tif(_untrim(val).indexOf(_untrim(add[classAddIndex])) === -1) {\n\t\t\t\tval += ' ' + add[classAddIndex];\n\t\t\t}\n\t\t}\n\n\t\telement[prop] = _trim(val);\n\t};\n\n\tvar _trim = function(a) {\n\t\treturn a.replace(rxTrim, '');\n\t};\n\n\t/**\n\t * Adds a space before and after the string.\n\t */\n\tvar _untrim = function(a) {\n\t\treturn ' ' + a + ' ';\n\t};\n\n\tvar _now = Date.now || function() {\n\t\treturn +new Date();\n\t};\n\n\tvar _keyFrameComparator = function(a, b) {\n\t\treturn a.frame - b.frame;\n\t};\n\n\t/*\n\t * Private variables.\n\t */\n\n\t//Singleton\n\tvar _instance;\n\n\t/*\n\t\tA list of all elements which should be animated associated with their the metadata.\n\t\tExmaple skrollable with two key frames animating from 100px width to 20px:\n\t\tskrollable = {\n\t\t\telement: ,\n\t\t\tstyleAttr: