(function($,window,document,undefined){'use strict';var NAME='parallax';var MAGIC_NUMBER=30;var DEFAULTS={relativeInput:!1,clipRelativeInput:!1,calibrationThreshold:100,calibrationDelay:500,supportDelay:500,calibrateX:!1,calibrateY:!0,invertX:!0,invertY:!0,limitX:!1,limitY:!1,scalarX:10.0,scalarY:10.0,frictionX:0.1,frictionY:0.1,originX:0.5,originY:0.5,pointerEvents:!0,precision:1};function Plugin(element,options){this.element=element;this.$context=$(element).data('api',this);this.$layers=this.$context.find('.layer');var data={calibrateX:this.$context.data('calibrate-x')||null,calibrateY:this.$context.data('calibrate-y')||null,invertX:this.$context.data('invert-x')||null,invertY:this.$context.data('invert-y')||null,limitX:parseFloat(this.$context.data('limit-x'))||null,limitY:parseFloat(this.$context.data('limit-y'))||null,scalarX:parseFloat(this.$context.data('scalar-x'))||null,scalarY:parseFloat(this.$context.data('scalar-y'))||null,frictionX:parseFloat(this.$context.data('friction-x'))||null,frictionY:parseFloat(this.$context.data('friction-y'))||null,originX:parseFloat(this.$context.data('origin-x'))||null,originY:parseFloat(this.$context.data('origin-y'))||null,pointerEvents:this.$context.data('pointer-events')||!0,precision:parseFloat(this.$context.data('precision'))||1};for(var key in data){if(data[key]===null)delete data[key]} $.extend(this,DEFAULTS,options,data);this.calibrationTimer=null;this.calibrationFlag=!0;this.enabled=!1;this.depthsX=[];this.depthsY=[];this.raf=null;this.bounds=null;this.ex=0;this.ey=0;this.ew=0;this.eh=0;this.ecx=0;this.ecy=0;this.erx=0;this.ery=0;this.cx=0;this.cy=0;this.ix=0;this.iy=0;this.mx=0;this.my=0;this.vx=0;this.vy=0;this.onMouseMove=this.onMouseMove.bind(this);this.onDeviceOrientation=this.onDeviceOrientation.bind(this);this.onOrientationTimer=this.onOrientationTimer.bind(this);this.onCalibrationTimer=this.onCalibrationTimer.bind(this);this.onAnimationFrame=this.onAnimationFrame.bind(this);this.onWindowResize=this.onWindowResize.bind(this);this.initialise()} Plugin.prototype.transformSupport=function(value){var element=document.createElement('div');var propertySupport=!1;var propertyValue=null;var featureSupport=!1;var cssProperty=null;var jsProperty=null;for(var i=0,l=this.vendors.length;i0&&propertyValue!=="none";documentElement.style.overflow=documentOverflow;body.removeChild(element);if(isCreatedBody){body.removeAttribute('style');body.parentNode.removeChild(body)}} break} return featureSupport};Plugin.prototype.ww=null;Plugin.prototype.wh=null;Plugin.prototype.wcx=null;Plugin.prototype.wcy=null;Plugin.prototype.wrx=null;Plugin.prototype.wry=null;Plugin.prototype.portrait=null;Plugin.prototype.desktop=!navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|BB10|mobi|tablet|opera mini|nexus 7)/i);Plugin.prototype.vendors=[null,['-webkit-','webkit'],['-moz-','Moz'],['-o-','O'],['-ms-','ms']];Plugin.prototype.motionSupport=!!window.DeviceMotionEvent;Plugin.prototype.orientationSupport=!!window.DeviceOrientationEvent;Plugin.prototype.orientationStatus=0;Plugin.prototype.transform2DSupport=Plugin.prototype.transformSupport('2D');Plugin.prototype.transform3DSupport=Plugin.prototype.transformSupport('3D');Plugin.prototype.propertyCache={};Plugin.prototype.initialise=function(){if(this.$context.css('position')==='static'){this.$context.css({position:'relative'})} if(!this.pointerEvents){this.$context.css({pointerEvents:'none'})} this.accelerate(this.$context);this.updateLayers();this.updateDimensions();this.enable();this.queueCalibration(this.calibrationDelay)};Plugin.prototype.updateLayers=function(){this.$layers=this.$context.find('.layer');this.depthsX=[];this.depthsY=[];this.$layers.css({position:'absolute',display:'block',left:0,top:0});this.$layers.first().css({position:'relative'});this.accelerate(this.$layers);this.$layers.each($.proxy(function(index,element){var depth=$(element).data('depth')||0;this.depthsX.push($(element).data('depth-x')||depth);this.depthsY.push($(element).data('depth-y')||depth)},this))};Plugin.prototype.updateDimensions=function(){this.ww=window.innerWidth;this.wh=window.innerHeight;this.wcx=this.ww*this.originX;this.wcy=this.wh*this.originY;this.wrx=Math.max(this.wcx,this.ww-this.wcx);this.wry=Math.max(this.wcy,this.wh-this.wcy)};Plugin.prototype.updateBounds=function(){this.bounds=this.element.getBoundingClientRect();this.ex=this.bounds.left;this.ey=this.bounds.top;this.ew=this.bounds.width;this.eh=this.bounds.height;this.ecx=this.ew*this.originX;this.ecy=this.eh*this.originY;this.erx=Math.max(this.ecx,this.ew-this.ecx);this.ery=Math.max(this.ecy,this.eh-this.ecy)};Plugin.prototype.queueCalibration=function(delay){clearTimeout(this.calibrationTimer);this.calibrationTimer=setTimeout(this.onCalibrationTimer,delay)};Plugin.prototype.enable=function(){if(!this.enabled){this.enabled=!0;if(this.orientationSupport){this.portrait=null;window.addEventListener('deviceorientation',this.onDeviceOrientation);setTimeout(this.onOrientationTimer,this.supportDelay)}else{this.cx=0;this.cy=0;this.portrait=!1;window.addEventListener('mousemove',this.onMouseMove)} window.addEventListener('resize',this.onWindowResize);this.raf=requestAnimationFrame(this.onAnimationFrame)}};Plugin.prototype.disable=function(){if(this.enabled){this.enabled=!1;if(this.orientationSupport){window.removeEventListener('deviceorientation',this.onDeviceOrientation)}else{window.removeEventListener('mousemove',this.onMouseMove)} window.removeEventListener('resize',this.onWindowResize);cancelAnimationFrame(this.raf)}};Plugin.prototype.calibrate=function(x,y){this.calibrateX=x===undefined?this.calibrateX:x;this.calibrateY=y===undefined?this.calibrateY:y};Plugin.prototype.invert=function(x,y){this.invertX=x===undefined?this.invertX:x;this.invertY=y===undefined?this.invertY:y};Plugin.prototype.friction=function(x,y){this.frictionX=x===undefined?this.frictionX:x;this.frictionY=y===undefined?this.frictionY:y};Plugin.prototype.scalar=function(x,y){this.scalarX=x===undefined?this.scalarX:x;this.scalarY=y===undefined?this.scalarY:y};Plugin.prototype.limit=function(x,y){this.limitX=x===undefined?this.limitX:x;this.limitY=y===undefined?this.limitY:y};Plugin.prototype.origin=function(x,y){this.originX=x===undefined?this.originX:x;this.originY=y===undefined?this.originY:y};Plugin.prototype.clamp=function(value,min,max){value=Math.max(value,min);value=Math.min(value,max);return value};Plugin.prototype.css=function(element,property,value){var jsProperty=this.propertyCache[property];if(!jsProperty){for(var i=0,l=this.vendors.length;ithis.calibrationThreshold)||(Math.abs(dy)>this.calibrationThreshold)){this.queueCalibration(0)} if(this.portrait){this.mx=this.calibrateX?dy:this.iy;this.my=this.calibrateY?dx:this.ix}else{this.mx=this.calibrateX?dx:this.ix;this.my=this.calibrateY?dy:this.iy} this.mx*=this.ew*(this.scalarX/100);this.my*=this.eh*(this.scalarY/100);if(!isNaN(parseFloat(this.limitX))){this.mx=this.clamp(this.mx,-this.limitX,this.limitX)} if(!isNaN(parseFloat(this.limitY))){this.my=this.clamp(this.my,-this.limitY,this.limitY)} this.vx+=(this.mx-this.vx)*this.frictionX;this.vy+=(this.my-this.vy)*this.frictionY;for(var i=0,l=this.$layers.length;iwindow.innerWidth;if(this.portrait!==portrait){this.portrait=portrait;this.calibrationFlag=!0} if(this.calibrationFlag){this.calibrationFlag=!1;this.cx=x;this.cy=y} this.ix=x;this.iy=y}};Plugin.prototype.onMouseMove=function(event){var clientX=event.clientX;var clientY=event.clientY;if(!this.orientationSupport&&this.relativeInput){if(this.clipRelativeInput){clientX=Math.max(clientX,this.ex);clientX=Math.min(clientX,this.ex+this.ew);clientY=Math.max(clientY,this.ey);clientY=Math.min(clientY,this.ey+this.eh)} this.ix=(clientX-this.ex-this.ecx)/this.erx;this.iy=(clientY-this.ey-this.ecy)/this.ery}else{this.ix=(clientX-this.wcx)/this.wrx;this.iy=(clientY-this.wcy)/this.wry}};var API={enable:Plugin.prototype.enable,disable:Plugin.prototype.disable,updateLayers:Plugin.prototype.updateLayers,calibrate:Plugin.prototype.calibrate,friction:Plugin.prototype.friction,invert:Plugin.prototype.invert,scalar:Plugin.prototype.scalar,limit:Plugin.prototype.limit,origin:Plugin.prototype.origin};$.fn[NAME]=function(value){var args=arguments;return this.each(function(){var $this=$(this);var plugin=$this.data(NAME);if(!plugin){plugin=new Plugin(this,value);$this.data(NAME,plugin)} if(API[value]){plugin[value].apply(plugin,Array.prototype.slice.call(args,1))}})}})(window.jQuery||window.Zepto,window,document)