phcthemes_web_theme_pack 2.0.1 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/phcthemes_web_theme_pack_antlr.js +1 -0
  3. data/app/assets/javascripts/phcthemes_web_theme_pack_hostinza.js +28 -0
  4. data/app/assets/javascripts/phcthemes_web_theme_pack_pressroom.js +0 -0
  5. data/app/assets/javascripts/themes/antlr/theme/sidebar.js +36 -0
  6. data/app/assets/javascripts/themes/hostinza/theme/hostslide.js +94 -0
  7. data/app/assets/javascripts/themes/hostinza/theme/jquery.parallax-scroll.js +185 -0
  8. data/app/assets/javascripts/themes/hostinza/theme/jquery.parallax.js +521 -0
  9. data/app/assets/javascripts/themes/hostinza/theme/main.js +1106 -0
  10. data/app/assets/javascripts/themes/hostinza/theme/plugins.js +31 -0
  11. data/app/assets/javascripts/themes/hostinza/theme/shuffle-letters.js +140 -0
  12. data/app/assets/javascripts/themes/hostinza/theme/tweetie.js +130 -0
  13. data/app/assets/javascripts/themes/hostinza/theme/vps-slider-month-products.js +66 -0
  14. data/app/assets/javascripts/themes/hostinza/theme/vps-slider-month-settings.js +134 -0
  15. data/app/assets/javascripts/themes/hostinza/theme/vps-slider-year-products.js +66 -0
  16. data/app/assets/javascripts/themes/hostinza/theme/vps-slider-year-settings.js +134 -0
  17. data/app/assets/stylesheets/phcthemes_web_theme_pack_antlr.scss +2 -1
  18. data/app/assets/stylesheets/phcthemes_web_theme_pack_hostinza.scss +24 -0
  19. data/app/assets/stylesheets/phcthemes_web_theme_pack_pressroom.scss +24 -0
  20. data/app/assets/stylesheets/themes/antlr/filter.css +189 -0
  21. data/lib/phcthemes_web_theme_pack/version.rb +1 -1
  22. metadata +19 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e779715cb2bf86969be2d8e1c76f36aa0a577248f5434f0661ed3c1574d6040
4
- data.tar.gz: 2c2e99440ff831cd310e8dc4f809636deb0842202984fc9d56074091b053db22
3
+ metadata.gz: e776f79f9ac5ac96519ca3346633ca86837655b40947a977a86d72e0a96ea120
4
+ data.tar.gz: b245c1776f17dea87e3ef8874c61a6d99299d663de9b02a08961db1924eccbfc
5
5
  SHA512:
6
- metadata.gz: 9a97980e4bf1f51c433430ebc316783c0d408a160ad15d0f49fad61f778a9ca55ab4f0e165d40adc8caa6bddfe5b6e4651d429ed31f78490bf46ea3f85119904
7
- data.tar.gz: b6700f8dcffa25bfdfaba6c3d0fd19328d565a515455181afedf53d5d080f036223d66de9d669e47707cca4daa7348ed93088e423f6f034cd4c4e545dabb73f3
6
+ metadata.gz: a6cd58472c0515b287e03b9d114e3f22e44f25690b7f2b8976d72646fb08ecda5467fc7d74836988295885d1c76cfc2cc2e20ab4431ba9779d954fe2366357f6
7
+ data.tar.gz: 521b37986eb9ea685f2c7d207fea35fd24806f4bcce7927b83490a4d521c0f96e850f7729fee9bb45d9bc10652fbc72fa758ed759bd5ee95c9acb3604c7759cf
@@ -13,4 +13,5 @@
13
13
  //= require themes/antlr/theme/swiper.min.js
14
14
  //= require themes/antlr/theme/lazysizes.min.js
15
15
  //= require themes/antlr/theme/wow.min.js
16
+ //= require themes/antlr/theme/sidebar.js
16
17
  //= require themes/antlr/theme/scripts.js
@@ -0,0 +1,28 @@
1
+ //= require jquery3
2
+ //= require rails-ujs
3
+ //= require activestorage
4
+ //= require jquery-ui
5
+ //= require common/bootstrap/bootstrap.bundle.js
6
+ //= require common/magnific-popup/jquery.magnific-popup.js
7
+ //= require themes/antlr/theme/owl.carousel.min.js
8
+ //= require themes/hostinza/theme/tweetie.js
9
+ //= require themes/hostinza/theme/jquery.parallax-scroll.js
10
+ //= require themes/hostinza/theme/jquery.parallax.js
11
+ //= require themes/hostinza/theme/hostslide.js
12
+ //= require themes/hostinza/theme/vps-slider-month-products.js
13
+ //= require themes/hostinza/theme/vps-slider-month-settings.js
14
+ //= require themes/hostinza/theme/vps-slider-year-products.js
15
+ //= require themes/hostinza/theme/vps-slider-year-settings.js
16
+ //= require common/rev-slider/jquery.themepunch.tools.min.js
17
+ //= require common/rev-slider/jquery.themepunch.revolution.js
18
+ //= require common/rev-slider/extensions/revolution.extension.actions.js
19
+ //= require common/rev-slider/extensions/revolution.extension.carousel.js
20
+ //= require common/rev-slider/extensions/revolution.extension.kenburn.js
21
+ //= require common/rev-slider/extensions/revolution.extension.layeranimation.js
22
+ //= require common/rev-slider/extensions/revolution.extension.migration.js
23
+ //= require common/rev-slider/extensions/revolution.extension.navigation.js
24
+ //= require common/rev-slider/extensions/revolution.extension.parallax.js
25
+ //= require common/rev-slider/extensions/revolution.extension.slideanims.js
26
+ //= require common/rev-slider/extensions/revolution.extension.video.js
27
+ //= require themes/hostinza/theme/shuffle-letters.js
28
+ //= require themes/hostinza/theme/main.js
@@ -0,0 +1,36 @@
1
+ document.addEventListener('DOMContentLoaded', function() {
2
+ "use strict";
3
+ sticky();
4
+ });
5
+ /*----------------------*/
6
+ /* Sticky Sidebar */
7
+ /*----------------------*/
8
+ function sticky() {
9
+ $.fn.scrollBottom = function() {
10
+ return $(document).height() - this.scrollTop() - this.height();
11
+ };
12
+ var $el = $('#sidebar');
13
+ var $window = $(window);
14
+ var top = $el.parent().position().top;
15
+ $window.bind("scroll resize", function() {
16
+ var gap = $window.height() - $el.height() - -35;
17
+ var visibleFoot = 965 - $window.scrollBottom();
18
+ var scrollTop = $window.scrollTop()
19
+ if (scrollTop < top + -35) {
20
+ $el.css({
21
+ top: (top - scrollTop) + "px",
22
+ bottom: "auto"
23
+ });
24
+ } else if (visibleFoot > gap) {
25
+ $el.css({
26
+ top: "auto",
27
+ bottom: visibleFoot + "px"
28
+ });
29
+ } else {
30
+ $el.css({
31
+ top: -35,
32
+ bottom: "auto"
33
+ });
34
+ }
35
+ }).scroll();
36
+ }
@@ -0,0 +1,94 @@
1
+ (function($) {
2
+
3
+ $.fn.xsslide = function(type, plans, currentplan, id, orientation) {
4
+ if (typeof type != 'string') {
5
+ console.error("XSSlide: 'type' is not a string");
6
+ return false;
7
+ }
8
+ if (plans[0].length < 2) {
9
+ console.error("XSSlide: Not enough plans provided");
10
+ return false;
11
+ }
12
+ if (typeof currentplan != 'number') {
13
+ console.error("XSSlide: 'currentplan' is not a number");
14
+ return false;
15
+ }
16
+ if (typeof id != 'string') {
17
+ console.error("XSSlide: 'id' is not a string");
18
+ return false;
19
+ }
20
+ if (typeof orientation != 'string') {
21
+ console.error("XSSlide: 'orientation' is not a string");
22
+ return false;
23
+ }
24
+ if (orientation != 'horizontal' && orientation != 'vertical') {
25
+ console.error("XSSlide: " + orientation + " is not a valid slider orientation.");
26
+ return false;
27
+ }
28
+ if (type === "single") {
29
+ for (var i = 0, tot = plans.length; i < tot; i++) {
30
+ $("." + id + i).each(function() {
31
+ if ($(this).is("input")) {
32
+ $(this).val(plans[i][currentplan - 1]);
33
+ } else {
34
+ $(this).html(plans[i][currentplan - 1]);
35
+ }
36
+ });
37
+ }
38
+ this.slider({
39
+ orientation: orientation,
40
+ value: currentplan,
41
+ range: "min",
42
+ min: 1,
43
+ max: plans[0].length + 1,
44
+ slide: function(event, ui) {
45
+ for (var i = 0, tot = plans.length; i < tot; i++) {
46
+ $("." + id + i).each(function() {
47
+ if ($(this).is("input")) {
48
+ $(this).val(plans[i][ui.value - 1]);
49
+ } else {
50
+ $(this).html(plans[i][ui.value - 1]);
51
+ }
52
+ });
53
+ }
54
+ }
55
+ });
56
+ return this;
57
+ } else if (type === "multiple") {
58
+ for (var i = 0, tot = plans.length; i < tot; i++) {
59
+ (function(i) {
60
+ $("." + id + i + "data").each(function() {
61
+ if ($(this).is("input")) {
62
+ $(this).val(plans[i][currentplan - 1]);
63
+ } else {
64
+ $(this).html(plans[i][currentplan - 1]);
65
+ }
66
+ });
67
+ $("." + id + i).slider({
68
+ orientation: orientation,
69
+ value: currentplan,
70
+ range: "min",
71
+ min: 1,
72
+ max: plans[i].length + 1,
73
+ step: 1,
74
+ slide: function(event, ui) {
75
+ $("." + id + i + "data").each(function() {
76
+ if ($(this).is("input")) {
77
+ $(this).val(plans[i][ui.value - 1]);
78
+ } else {
79
+ $(this).html(plans[i][ui.value - 1]);
80
+ }
81
+ });
82
+ }
83
+ });
84
+ })(i);
85
+ }
86
+ return this;
87
+ } else {
88
+ console.error("XSSlide: " + type + " is not a valid slider type.");
89
+ return false;
90
+ }
91
+
92
+ };
93
+
94
+ }(jQuery));
@@ -0,0 +1,185 @@
1
+ $(function() {
2
+ ParallaxScroll.init();
3
+ });
4
+
5
+ var ParallaxScroll = {
6
+ /* PUBLIC VARIABLES */
7
+ showLogs: false,
8
+ round: 1000,
9
+
10
+ /* PUBLIC FUNCTIONS */
11
+ init: function() {
12
+ this._log("init");
13
+ if (this._inited) {
14
+ this._log("Already Inited");
15
+ this._inited = true;
16
+ return;
17
+ }
18
+ this._requestAnimationFrame = (function(){
19
+ return window.requestAnimationFrame ||
20
+ window.webkitRequestAnimationFrame ||
21
+ window.mozRequestAnimationFrame ||
22
+ window.oRequestAnimationFrame ||
23
+ window.msRequestAnimationFrame ||
24
+ function(/* function */ callback, /* DOMElement */ element){
25
+ window.setTimeout(callback, 1000 / 60);
26
+ };
27
+ })();
28
+ this._onScroll(true);
29
+ },
30
+
31
+ /* PRIVATE VARIABLES */
32
+ _inited: false,
33
+ _properties: ['x', 'y', 'z', 'rotateX', 'rotateY', 'rotateZ', 'scaleX', 'scaleY', 'scaleZ', 'scale'],
34
+ _requestAnimationFrame:null,
35
+
36
+ /* PRIVATE FUNCTIONS */
37
+ _log: function(message) {
38
+ if (this.showLogs) console.log("Parallax Scroll / " + message);
39
+ },
40
+ _onScroll: function(noSmooth) {
41
+ var scroll = $(document).scrollTop();
42
+ var windowHeight = $(window).height();
43
+ this._log("onScroll " + scroll);
44
+ $("[data-parallax]").each($.proxy(function(index, el) {
45
+ var $el = $(el);
46
+ var properties = [];
47
+ var applyProperties = false;
48
+ var style = $el.data("style");
49
+ if (style == undefined) {
50
+ style = $el.attr("style") || "";
51
+ $el.data("style", style);
52
+ }
53
+ var datas = [$el.data("parallax")];
54
+ var iData;
55
+ for(iData = 2; ; iData++) {
56
+ if($el.data("parallax"+iData)) {
57
+ datas.push($el.data("parallax-"+iData));
58
+ }
59
+ else {
60
+ break;
61
+ }
62
+ }
63
+ var datasLength = datas.length;
64
+ for(iData = 0; iData < datasLength; iData ++) {
65
+ var data = datas[iData];
66
+ var scrollFrom = data["from-scroll"];
67
+ if (scrollFrom == undefined) scrollFrom = Math.max(0, $(el).offset().top - windowHeight);
68
+ scrollFrom = scrollFrom | 0;
69
+ var scrollDistance = data["distance"];
70
+ var scrollTo = data["to-scroll"];
71
+ if (scrollDistance == undefined && scrollTo == undefined) scrollDistance = windowHeight;
72
+ scrollDistance = Math.max(scrollDistance | 0, 1);
73
+ var easing = data["easing"];
74
+ var easingReturn = data["easing-return"];
75
+ if (easing == undefined || !$.easing|| !$.easing[easing]) easing = null;
76
+ if (easingReturn == undefined || !$.easing|| !$.easing[easingReturn]) easingReturn = easing;
77
+ if (easing) {
78
+ var totalTime = data["duration"];
79
+ if (totalTime == undefined) totalTime = scrollDistance;
80
+ totalTime = Math.max(totalTime | 0, 1);
81
+ var totalTimeReturn = data["duration-return"];
82
+ if (totalTimeReturn == undefined) totalTimeReturn = totalTime;
83
+ scrollDistance = 1;
84
+ var currentTime = $el.data("current-time");
85
+ if(currentTime == undefined) currentTime = 0;
86
+ }
87
+ if (scrollTo == undefined) scrollTo = scrollFrom + scrollDistance;
88
+ scrollTo = scrollTo | 0;
89
+ var smoothness = data["smoothness"];
90
+ if (smoothness == undefined) smoothness = 30;
91
+ smoothness = smoothness | 0;
92
+ if (noSmooth || smoothness == 0) smoothness = 1;
93
+ smoothness = smoothness | 0;
94
+ var scrollCurrent = scroll;
95
+ scrollCurrent = Math.max(scrollCurrent, scrollFrom);
96
+ scrollCurrent = Math.min(scrollCurrent, scrollTo);
97
+ if(easing) {
98
+ if($el.data("sens") == undefined) $el.data("sens", "back");
99
+ if(scrollCurrent>scrollFrom) {
100
+ if($el.data("sens") == "back") {
101
+ currentTime = 1;
102
+ $el.data("sens", "go");
103
+ }
104
+ else {
105
+ currentTime++;
106
+ }
107
+ }
108
+ if(scrollCurrent<scrollTo) {
109
+ if($el.data("sens") == "go") {
110
+ currentTime = 1;
111
+ $el.data("sens", "back");
112
+ }
113
+ else {
114
+ currentTime++;
115
+ }
116
+ }
117
+ if(noSmooth) currentTime = totalTime;
118
+ $el.data("current-time", currentTime);
119
+ }
120
+ this._properties.map($.proxy(function(prop) {
121
+ var defaultProp = 0;
122
+ var to = data[prop];
123
+ if (to == undefined) return;
124
+ if(prop=="scale" || prop=="scaleX" || prop=="scaleY" || prop=="scaleZ" ) {
125
+ defaultProp = 1;
126
+ }
127
+ else {
128
+ to = to | 0;
129
+ }
130
+ var prev = $el.data("_" + prop);
131
+ if (prev == undefined) prev = defaultProp;
132
+ var next = ((to-defaultProp) * ((scrollCurrent - scrollFrom) / (scrollTo - scrollFrom))) + defaultProp;
133
+ var val = prev + (next - prev) / smoothness;
134
+ if(easing && currentTime>0 && currentTime<=totalTime) {
135
+ var from = defaultProp;
136
+ if($el.data("sens") == "back") {
137
+ from = to;
138
+ to = -to;
139
+ easing = easingReturn;
140
+ totalTime = totalTimeReturn;
141
+ }
142
+ val = $.easing[easing](null, currentTime, from, to, totalTime);
143
+ }
144
+ val = Math.ceil(val * this.round) / this.round;
145
+ if(val==prev&&next==to) val = to;
146
+ if(!properties[prop]) properties[prop] = 0;
147
+ properties[prop] += val;
148
+ if (prev != properties[prop]) {
149
+ $el.data("_" + prop, properties[prop]);
150
+ applyProperties = true;
151
+ }
152
+ }, this));
153
+ }
154
+ if (applyProperties) {
155
+ if (properties["z"] != undefined) {
156
+ var perspective = data["perspective"];
157
+ if (perspective == undefined) perspective = 800;
158
+ var $parent = $el.parent();
159
+ if(!$parent.data("style")) $parent.data("style", $parent.attr("style") || "");
160
+ $parent.attr("style", "perspective:" + perspective + "px; -webkit-perspective:" + perspective + "px; "+ $parent.data("style"));
161
+ }
162
+ if(properties["scaleX"] == undefined) properties["scaleX"] = 1;
163
+ if(properties["scaleY"] == undefined) properties["scaleY"] = 1;
164
+ if(properties["scaleZ"] == undefined) properties["scaleZ"] = 1;
165
+ if (properties["scale"] != undefined) {
166
+ properties["scaleX"] *= properties["scale"];
167
+ properties["scaleY"] *= properties["scale"];
168
+ properties["scaleZ"] *= properties["scale"];
169
+ }
170
+ var translate3d = "translate3d(" + (properties["x"] ? properties["x"] : 0) + "px, " + (properties["y"] ? properties["y"] : 0) + "px, " + (properties["z"] ? properties["z"] : 0) + "px)";
171
+ var rotate3d = "rotateX(" + (properties["rotateX"] ? properties["rotateX"] : 0) + "deg) rotateY(" + (properties["rotateY"] ? properties["rotateY"] : 0) + "deg) rotateZ(" + (properties["rotateZ"] ? properties["rotateZ"] : 0) + "deg)";
172
+ var scale3d = "scaleX(" + properties["scaleX"] + ") scaleY(" + properties["scaleY"] + ") scaleZ(" + properties["scaleZ"] + ")";
173
+ var cssTransform = translate3d + " " + rotate3d + " " + scale3d + ";";
174
+ this._log(cssTransform);
175
+ $el.attr("style", "transform:" + cssTransform + " -webkit-transform:" + cssTransform + " " + style);
176
+ }
177
+ }, this));
178
+ if(window.requestAnimationFrame) {
179
+ window.requestAnimationFrame($.proxy(this._onScroll, this, false));
180
+ }
181
+ else {
182
+ this._requestAnimationFrame($.proxy(this._onScroll, this, false));
183
+ }
184
+ }
185
+ };
@@ -0,0 +1,521 @@
1
+ /**
2
+ * jQuery || Zepto Parallax Plugin
3
+ * @author Matthew Wagerfield - @wagerfield
4
+ * @description Creates a parallax effect between an array of layers,
5
+ * driving the motion from the gyroscope output of a smartdevice.
6
+ * If no gyroscope is available, the cursor position is used.
7
+ */
8
+ ;(function($, window, document, undefined) {
9
+
10
+ // Strict Mode
11
+ 'use strict';
12
+
13
+ // Constants
14
+ var NAME = 'parallax';
15
+ var MAGIC_NUMBER = 30;
16
+ var DEFAULTS = {
17
+ relativeInput: false,
18
+ clipRelativeInput: false,
19
+ calibrationThreshold: 100,
20
+ calibrationDelay: 500,
21
+ supportDelay: 500,
22
+ calibrateX: false,
23
+ calibrateY: true,
24
+ invertX: true,
25
+ invertY: true,
26
+ limitX: false,
27
+ limitY: false,
28
+ scalarX: 10.0,
29
+ scalarY: 10.0,
30
+ frictionX: 0.1,
31
+ frictionY: 0.1,
32
+ originX: 0.5,
33
+ originY: 0.5,
34
+ pointerEvents: true,
35
+ precision: 1
36
+ };
37
+
38
+ function Plugin(element, options) {
39
+
40
+ // DOM Context
41
+ this.element = element;
42
+
43
+ // Selections
44
+ this.$context = $(element).data('api', this);
45
+ this.$layers = this.$context.find('.layer');
46
+
47
+ // Data Extraction
48
+ var data = {
49
+ calibrateX: this.$context.data('calibrate-x') || null,
50
+ calibrateY: this.$context.data('calibrate-y') || null,
51
+ invertX: this.$context.data('invert-x') || null,
52
+ invertY: this.$context.data('invert-y') || null,
53
+ limitX: parseFloat(this.$context.data('limit-x')) || null,
54
+ limitY: parseFloat(this.$context.data('limit-y')) || null,
55
+ scalarX: parseFloat(this.$context.data('scalar-x')) || null,
56
+ scalarY: parseFloat(this.$context.data('scalar-y')) || null,
57
+ frictionX: parseFloat(this.$context.data('friction-x')) || null,
58
+ frictionY: parseFloat(this.$context.data('friction-y')) || null,
59
+ originX: parseFloat(this.$context.data('origin-x')) || null,
60
+ originY: parseFloat(this.$context.data('origin-y')) || null,
61
+ pointerEvents: this.$context.data('pointer-events') || true,
62
+ precision: parseFloat(this.$context.data('precision')) || 1
63
+ };
64
+
65
+ // Delete Null Data Values
66
+ for (var key in data) {
67
+ if (data[key] === null) delete data[key];
68
+ }
69
+
70
+ // Compose Settings Object
71
+ $.extend(this, DEFAULTS, options, data);
72
+
73
+ // States
74
+ this.calibrationTimer = null;
75
+ this.calibrationFlag = true;
76
+ this.enabled = false;
77
+ this.depthsX = [];
78
+ this.depthsY = [];
79
+ this.raf = null;
80
+
81
+ // Element Bounds
82
+ this.bounds = null;
83
+ this.ex = 0;
84
+ this.ey = 0;
85
+ this.ew = 0;
86
+ this.eh = 0;
87
+
88
+ // Element Center
89
+ this.ecx = 0;
90
+ this.ecy = 0;
91
+
92
+ // Element Range
93
+ this.erx = 0;
94
+ this.ery = 0;
95
+
96
+ // Calibration
97
+ this.cx = 0;
98
+ this.cy = 0;
99
+
100
+ // Input
101
+ this.ix = 0;
102
+ this.iy = 0;
103
+
104
+ // Motion
105
+ this.mx = 0;
106
+ this.my = 0;
107
+
108
+ // Velocity
109
+ this.vx = 0;
110
+ this.vy = 0;
111
+
112
+ // Callbacks
113
+ this.onMouseMove = this.onMouseMove.bind(this);
114
+ this.onDeviceOrientation = this.onDeviceOrientation.bind(this);
115
+ this.onOrientationTimer = this.onOrientationTimer.bind(this);
116
+ this.onCalibrationTimer = this.onCalibrationTimer.bind(this);
117
+ this.onAnimationFrame = this.onAnimationFrame.bind(this);
118
+ this.onWindowResize = this.onWindowResize.bind(this);
119
+
120
+ // Initialise
121
+ this.initialise();
122
+ }
123
+
124
+ Plugin.prototype.transformSupport = function(value) {
125
+ var element = document.createElement('div');
126
+ var propertySupport = false;
127
+ var propertyValue = null;
128
+ var featureSupport = false;
129
+ var cssProperty = null;
130
+ var jsProperty = null;
131
+ for (var i = 0, l = this.vendors.length; i < l; i++) {
132
+ if (this.vendors[i] !== null) {
133
+ cssProperty = this.vendors[i][0] + 'transform';
134
+ jsProperty = this.vendors[i][1] + 'Transform';
135
+ } else {
136
+ cssProperty = 'transform';
137
+ jsProperty = 'transform';
138
+ }
139
+ if (element.style[jsProperty] !== undefined) {
140
+ propertySupport = true;
141
+ break;
142
+ }
143
+ }
144
+ switch(value) {
145
+ case '2D':
146
+ featureSupport = propertySupport;
147
+ break;
148
+ case '3D':
149
+ if (propertySupport) {
150
+ var body = document.body || document.createElement('body');
151
+ var documentElement = document.documentElement;
152
+ var documentOverflow = documentElement.style.overflow;
153
+ var isCreatedBody = false;
154
+ if (!document.body) {
155
+ isCreatedBody = true;
156
+ documentElement.style.overflow = 'hidden';
157
+ documentElement.appendChild(body);
158
+ body.style.overflow = 'hidden';
159
+ body.style.background = '';
160
+ }
161
+ body.appendChild(element);
162
+ element.style[jsProperty] = 'translate3d(1px,1px,1px)';
163
+ propertyValue = window.getComputedStyle(element).getPropertyValue(cssProperty);
164
+ featureSupport = propertyValue !== undefined && propertyValue.length > 0 && propertyValue !== "none";
165
+ documentElement.style.overflow = documentOverflow;
166
+ body.removeChild(element);
167
+ if ( isCreatedBody ) {
168
+ body.removeAttribute('style');
169
+ body.parentNode.removeChild(body);
170
+ }
171
+ }
172
+ break;
173
+ }
174
+ return featureSupport;
175
+ };
176
+
177
+ Plugin.prototype.ww = null;
178
+ Plugin.prototype.wh = null;
179
+ Plugin.prototype.wcx = null;
180
+ Plugin.prototype.wcy = null;
181
+ Plugin.prototype.wrx = null;
182
+ Plugin.prototype.wry = null;
183
+ Plugin.prototype.portrait = null;
184
+ Plugin.prototype.desktop = !navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|BB10|mobi|tablet|opera mini|nexus 7)/i);
185
+ Plugin.prototype.vendors = [null,['-webkit-','webkit'],['-moz-','Moz'],['-o-','O'],['-ms-','ms']];
186
+ Plugin.prototype.motionSupport = !!window.DeviceMotionEvent;
187
+ Plugin.prototype.orientationSupport = !!window.DeviceOrientationEvent;
188
+ Plugin.prototype.orientationStatus = 0;
189
+ Plugin.prototype.transform2DSupport = Plugin.prototype.transformSupport('2D');
190
+ Plugin.prototype.transform3DSupport = Plugin.prototype.transformSupport('3D');
191
+ Plugin.prototype.propertyCache = {};
192
+
193
+ Plugin.prototype.initialise = function() {
194
+
195
+ // Configure Styles
196
+ if (this.$context.css('position') === 'static') {
197
+ this.$context.css({
198
+ position:'relative'
199
+ });
200
+ }
201
+
202
+ // Pointer events
203
+ if(!this.pointerEvents){
204
+ this.$context.css({
205
+ pointerEvents: 'none'
206
+ });
207
+ }
208
+
209
+ // Hardware Accelerate Context
210
+ this.accelerate(this.$context);
211
+
212
+ // Setup
213
+ this.updateLayers();
214
+ this.updateDimensions();
215
+ this.enable();
216
+ this.queueCalibration(this.calibrationDelay);
217
+ };
218
+
219
+ Plugin.prototype.updateLayers = function() {
220
+
221
+ // Cache Layer Elements
222
+ this.$layers = this.$context.find('.layer');
223
+ this.depthsX = [];
224
+ this.depthsY = [];
225
+
226
+ // Configure Layer Styles
227
+ this.$layers.css({
228
+ position:'absolute',
229
+ display:'block',
230
+ left: 0,
231
+ top: 0
232
+ });
233
+ this.$layers.first().css({
234
+ position:'relative'
235
+ });
236
+
237
+ // Hardware Accelerate Layers
238
+ this.accelerate(this.$layers);
239
+
240
+ // Cache Depths
241
+ this.$layers.each($.proxy(function(index, element) {
242
+ //Graceful fallback on depth if depth-x or depth-y is absent
243
+ var depth = $(element).data('depth') || 0;
244
+ this.depthsX.push($(element).data('depth-x') || depth);
245
+ this.depthsY.push($(element).data('depth-y') || depth);
246
+ }, this));
247
+ };
248
+
249
+ Plugin.prototype.updateDimensions = function() {
250
+ this.ww = window.innerWidth;
251
+ this.wh = window.innerHeight;
252
+ this.wcx = this.ww * this.originX;
253
+ this.wcy = this.wh * this.originY;
254
+ this.wrx = Math.max(this.wcx, this.ww - this.wcx);
255
+ this.wry = Math.max(this.wcy, this.wh - this.wcy);
256
+ };
257
+
258
+ Plugin.prototype.updateBounds = function() {
259
+ this.bounds = this.element.getBoundingClientRect();
260
+ this.ex = this.bounds.left;
261
+ this.ey = this.bounds.top;
262
+ this.ew = this.bounds.width;
263
+ this.eh = this.bounds.height;
264
+ this.ecx = this.ew * this.originX;
265
+ this.ecy = this.eh * this.originY;
266
+ this.erx = Math.max(this.ecx, this.ew - this.ecx);
267
+ this.ery = Math.max(this.ecy, this.eh - this.ecy);
268
+ };
269
+
270
+ Plugin.prototype.queueCalibration = function(delay) {
271
+ clearTimeout(this.calibrationTimer);
272
+ this.calibrationTimer = setTimeout(this.onCalibrationTimer, delay);
273
+ };
274
+
275
+ Plugin.prototype.enable = function() {
276
+ if (!this.enabled) {
277
+ this.enabled = true;
278
+ if (this.orientationSupport) {
279
+ this.portrait = null;
280
+ window.addEventListener('deviceorientation', this.onDeviceOrientation);
281
+ setTimeout(this.onOrientationTimer, this.supportDelay);
282
+ } else {
283
+ this.cx = 0;
284
+ this.cy = 0;
285
+ this.portrait = false;
286
+ window.addEventListener('mousemove', this.onMouseMove);
287
+ }
288
+ window.addEventListener('resize', this.onWindowResize);
289
+ this.raf = requestAnimationFrame(this.onAnimationFrame);
290
+ }
291
+ };
292
+
293
+ Plugin.prototype.disable = function() {
294
+ if (this.enabled) {
295
+ this.enabled = false;
296
+ if (this.orientationSupport) {
297
+ window.removeEventListener('deviceorientation', this.onDeviceOrientation);
298
+ } else {
299
+ window.removeEventListener('mousemove', this.onMouseMove);
300
+ }
301
+ window.removeEventListener('resize', this.onWindowResize);
302
+ cancelAnimationFrame(this.raf);
303
+ }
304
+ };
305
+
306
+ Plugin.prototype.calibrate = function(x, y) {
307
+ this.calibrateX = x === undefined ? this.calibrateX : x;
308
+ this.calibrateY = y === undefined ? this.calibrateY : y;
309
+ };
310
+
311
+ Plugin.prototype.invert = function(x, y) {
312
+ this.invertX = x === undefined ? this.invertX : x;
313
+ this.invertY = y === undefined ? this.invertY : y;
314
+ };
315
+
316
+ Plugin.prototype.friction = function(x, y) {
317
+ this.frictionX = x === undefined ? this.frictionX : x;
318
+ this.frictionY = y === undefined ? this.frictionY : y;
319
+ };
320
+
321
+ Plugin.prototype.scalar = function(x, y) {
322
+ this.scalarX = x === undefined ? this.scalarX : x;
323
+ this.scalarY = y === undefined ? this.scalarY : y;
324
+ };
325
+
326
+ Plugin.prototype.limit = function(x, y) {
327
+ this.limitX = x === undefined ? this.limitX : x;
328
+ this.limitY = y === undefined ? this.limitY : y;
329
+ };
330
+
331
+ Plugin.prototype.origin = function(x, y) {
332
+ this.originX = x === undefined ? this.originX : x;
333
+ this.originY = y === undefined ? this.originY : y;
334
+ };
335
+
336
+ Plugin.prototype.clamp = function(value, min, max) {
337
+ value = Math.max(value, min);
338
+ value = Math.min(value, max);
339
+ return value;
340
+ };
341
+
342
+ Plugin.prototype.css = function(element, property, value) {
343
+ var jsProperty = this.propertyCache[property];
344
+ if (!jsProperty) {
345
+ for (var i = 0, l = this.vendors.length; i < l; i++) {
346
+ if (this.vendors[i] !== null) {
347
+ jsProperty = $.camelCase(this.vendors[i][1] + '-' + property);
348
+ } else {
349
+ jsProperty = property;
350
+ }
351
+ if (element.style[jsProperty] !== undefined) {
352
+ this.propertyCache[property] = jsProperty;
353
+ break;
354
+ }
355
+ }
356
+ }
357
+ element.style[jsProperty] = value;
358
+ };
359
+
360
+ Plugin.prototype.accelerate = function($element) {
361
+ for (var i = 0, l = $element.length; i < l; i++) {
362
+ var element = $element[i];
363
+ this.css(element, 'transform', 'translate3d(0,0,0)');
364
+ this.css(element, 'transform-style', 'preserve-3d');
365
+ this.css(element, 'backface-visibility', 'hidden');
366
+ }
367
+ };
368
+
369
+ Plugin.prototype.setPosition = function(element, x, y) {
370
+ x += 'px';
371
+ y += 'px';
372
+ if (this.transform3DSupport) {
373
+ this.css(element, 'transform', 'translate3d('+x+','+y+',0)');
374
+ } else if (this.transform2DSupport) {
375
+ this.css(element, 'transform', 'translate('+x+','+y+')');
376
+ } else {
377
+ element.style.left = x;
378
+ element.style.top = y;
379
+ }
380
+ };
381
+
382
+ Plugin.prototype.onOrientationTimer = function(event) {
383
+ if (this.orientationSupport && this.orientationStatus === 0) {
384
+ this.disable();
385
+ this.orientationSupport = false;
386
+ this.enable();
387
+ }
388
+ };
389
+
390
+ Plugin.prototype.onCalibrationTimer = function(event) {
391
+ this.calibrationFlag = true;
392
+ };
393
+
394
+ Plugin.prototype.onWindowResize = function(event) {
395
+ this.updateDimensions();
396
+ };
397
+
398
+ Plugin.prototype.onAnimationFrame = function() {
399
+ this.updateBounds();
400
+ var dx = this.ix - this.cx;
401
+ var dy = this.iy - this.cy;
402
+ if ((Math.abs(dx) > this.calibrationThreshold) || (Math.abs(dy) > this.calibrationThreshold)) {
403
+ this.queueCalibration(0);
404
+ }
405
+ if (this.portrait) {
406
+ this.mx = this.calibrateX ? dy : this.iy;
407
+ this.my = this.calibrateY ? dx : this.ix;
408
+ } else {
409
+ this.mx = this.calibrateX ? dx : this.ix;
410
+ this.my = this.calibrateY ? dy : this.iy;
411
+ }
412
+ this.mx *= this.ew * (this.scalarX / 100);
413
+ this.my *= this.eh * (this.scalarY / 100);
414
+ if (!isNaN(parseFloat(this.limitX))) {
415
+ this.mx = this.clamp(this.mx, -this.limitX, this.limitX);
416
+ }
417
+ if (!isNaN(parseFloat(this.limitY))) {
418
+ this.my = this.clamp(this.my, -this.limitY, this.limitY);
419
+ }
420
+ this.vx += (this.mx - this.vx) * this.frictionX;
421
+ this.vy += (this.my - this.vy) * this.frictionY;
422
+ for (var i = 0, l = this.$layers.length; i < l; i++) {
423
+ var depthX = this.depthsX[i];
424
+ var depthY = this.depthsY[i];
425
+ var layer = this.$layers[i];
426
+ var xOffset = this.vx * (depthX * (this.invertX ? -1 : 1));
427
+ var yOffset = this.vy * (depthY * (this.invertY ? -1 : 1));
428
+ this.setPosition(layer, xOffset, yOffset);
429
+ }
430
+ this.raf = requestAnimationFrame(this.onAnimationFrame);
431
+ };
432
+
433
+ Plugin.prototype.onDeviceOrientation = function(event) {
434
+
435
+ // Validate environment and event properties.
436
+ if (!this.desktop && event.beta !== null && event.gamma !== null) {
437
+
438
+ // Set orientation status.
439
+ this.orientationStatus = 1;
440
+
441
+ // Extract Rotation
442
+ var x = (event.beta || 0) / MAGIC_NUMBER; // -90 :: 90
443
+ var y = (event.gamma || 0) / MAGIC_NUMBER; // -180 :: 180
444
+
445
+ // Detect Orientation Change
446
+ var portrait = window.innerHeight > window.innerWidth;
447
+ if (this.portrait !== portrait) {
448
+ this.portrait = portrait;
449
+ this.calibrationFlag = true;
450
+ }
451
+
452
+ // Set Calibration
453
+ if (this.calibrationFlag) {
454
+ this.calibrationFlag = false;
455
+ this.cx = x;
456
+ this.cy = y;
457
+ }
458
+
459
+ // Set Input
460
+ this.ix = x;
461
+ this.iy = y;
462
+ }
463
+ };
464
+
465
+ Plugin.prototype.onMouseMove = function(event) {
466
+
467
+ // Cache mouse coordinates.
468
+ var clientX = event.clientX;
469
+ var clientY = event.clientY;
470
+
471
+ // Calculate Mouse Input
472
+ if (!this.orientationSupport && this.relativeInput) {
473
+
474
+ // Clip mouse coordinates inside element bounds.
475
+ if (this.clipRelativeInput) {
476
+ clientX = Math.max(clientX, this.ex);
477
+ clientX = Math.min(clientX, this.ex + this.ew);
478
+ clientY = Math.max(clientY, this.ey);
479
+ clientY = Math.min(clientY, this.ey + this.eh);
480
+ }
481
+
482
+ // Calculate input relative to the element.
483
+ this.ix = (clientX - this.ex - this.ecx) / this.erx;
484
+ this.iy = (clientY - this.ey - this.ecy) / this.ery;
485
+
486
+ } else {
487
+
488
+ // Calculate input relative to the window.
489
+ this.ix = (clientX - this.wcx) / this.wrx;
490
+ this.iy = (clientY - this.wcy) / this.wry;
491
+ }
492
+ };
493
+
494
+ var API = {
495
+ enable: Plugin.prototype.enable,
496
+ disable: Plugin.prototype.disable,
497
+ updateLayers: Plugin.prototype.updateLayers,
498
+ calibrate: Plugin.prototype.calibrate,
499
+ friction: Plugin.prototype.friction,
500
+ invert: Plugin.prototype.invert,
501
+ scalar: Plugin.prototype.scalar,
502
+ limit: Plugin.prototype.limit,
503
+ origin: Plugin.prototype.origin
504
+ };
505
+
506
+ $.fn[NAME] = function (value) {
507
+ var args = arguments;
508
+ return this.each(function () {
509
+ var $this = $(this);
510
+ var plugin = $this.data(NAME);
511
+ if (!plugin) {
512
+ plugin = new Plugin(this, value);
513
+ $this.data(NAME, plugin);
514
+ }
515
+ if (API[value]) {
516
+ plugin[value].apply(plugin, Array.prototype.slice.call(args, 1));
517
+ }
518
+ });
519
+ };
520
+
521
+ })(window.jQuery || window.Zepto, window, document);