From 185b63ba6cfae53e6843ed5409d638a856d2e680 Mon Sep 17 00:00:00 2001 From: vmelnik-ukraine Date: Fri, 20 Dec 2013 09:38:19 +0200 Subject: [PATCH] common error page added --- .../views/Exception/error.html.twig | 39 ++ .../Resources/public/css/error_page.css | 25 + .../Resources/public/images/bart.gif | Bin 0 -> 22492 bytes .../Resources/public/js/error_page.js | 14 + .../public/js/vendor/jquery.parallax.js | 481 ++++++++++++++++++ 5 files changed, 559 insertions(+) create mode 100644 app/Resources/TwigBundle/views/Exception/error.html.twig create mode 100644 src/FDevs/CommonBundle/Resources/public/css/error_page.css create mode 100644 src/FDevs/CommonBundle/Resources/public/images/bart.gif create mode 100644 src/FDevs/CommonBundle/Resources/public/js/error_page.js create mode 100644 src/FDevs/CommonBundle/Resources/public/js/vendor/jquery.parallax.js diff --git a/app/Resources/TwigBundle/views/Exception/error.html.twig b/app/Resources/TwigBundle/views/Exception/error.html.twig new file mode 100644 index 0000000..7ae51b2 --- /dev/null +++ b/app/Resources/TwigBundle/views/Exception/error.html.twig @@ -0,0 +1,39 @@ + + + + + {{ 'An Error Occured' | trans }}: {{ status_text }} + + + + +
+
+
+

{{ "We've got a problem" | trans }}

+
+
+
+
+
    +
  • +
+
+
+
{{ status_code }}
+
+
+
+
+
{{ status_text }}
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/src/FDevs/CommonBundle/Resources/public/css/error_page.css b/src/FDevs/CommonBundle/Resources/public/css/error_page.css new file mode 100644 index 0000000..673232a --- /dev/null +++ b/src/FDevs/CommonBundle/Resources/public/css/error_page.css @@ -0,0 +1,25 @@ +.error-container { + text-align: center; +} + +.error-container img { + width: 350px; +} + +.error-container h1 { + margin: 50px 0; +} + +.error-container .error-code { + font-size: 150px; + line-height: 150px; + margin: 80px 0 0 0; + font-weight: bold; + color: #AA3333; +} +.error-container .error-msg { + font-size: 60px; + line-height: 60px; + font-weight: bold; + margin: 20px 0; +} \ No newline at end of file diff --git a/src/FDevs/CommonBundle/Resources/public/images/bart.gif b/src/FDevs/CommonBundle/Resources/public/images/bart.gif new file mode 100644 index 0000000000000000000000000000000000000000..36136f1da431b06f1eccd167b219eb689079f1b4 GIT binary patch literal 22492 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 CSsf_= literal 0 HcmV?d00001 diff --git a/src/FDevs/CommonBundle/Resources/public/js/error_page.js b/src/FDevs/CommonBundle/Resources/public/js/error_page.js new file mode 100644 index 0000000..db0cd96 --- /dev/null +++ b/src/FDevs/CommonBundle/Resources/public/js/error_page.js @@ -0,0 +1,14 @@ +$(document).ready(function() { + $('#scene').parallax({ + calibrateX: false, + calibrateY: false, + invertX: true, + invertY: true, + limitX: false, + limitY: false, + scalarX: 5, + scalarY: 4, + frictionX: 0.3, + frictionY: 0.6 + }); +}); diff --git a/src/FDevs/CommonBundle/Resources/public/js/vendor/jquery.parallax.js b/src/FDevs/CommonBundle/Resources/public/js/vendor/jquery.parallax.js new file mode 100644 index 0000000..ad91709 --- /dev/null +++ b/src/FDevs/CommonBundle/Resources/public/js/vendor/jquery.parallax.js @@ -0,0 +1,481 @@ +//============================================================ +// +// The MIT License +// +// Copyright (C) 2013 Matthew Wagerfield - @mwagerfield +// +// Permission is hereby granted, free of charge, to any +// person obtaining a copy of this software and associated +// documentation files (the "Software"), to deal in the +// Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, +// sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice +// shall be included in all copies or substantial portions +// of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY +// OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +// EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +// OR OTHER DEALINGS IN THE SOFTWARE. +// +//============================================================ + +/** + * jQuery/Zepto Parallax Plugin + * @author Matthew Wagerfield - @mwagerfield + * @description Creates a parallax effect between an array of layers, + * driving the motion from the gyroscope output of a smartdevice. + * If no gyroscope is available, the cursor position is used. + */ +;(function($, window, document, undefined) { + + var NAME = 'parallax'; + var MAGIC_NUMBER = 30; + var DEFAULTS = { + calibrationThreshold: 100, + calibrationDelay: 500, + supportDelay: 500, + calibrateX: false, + calibrateY: true, + invertX: true, + invertY: true, + limitX: false, + limitY: false, + scalarX: 10.0, + scalarY: 10.0, + frictionX: 0.1, + frictionY: 0.1 + }; + + function Plugin(element, options) { + + // DOM Context + this.element = element; + + // Selections + this.$context = $(element).data('api', this); + this.$layers = this.$context.find('.layer'); + + // Data Extraction + 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 + }; + + // Delete Null Data Values + for (var key in data) { + if (data[key] === null) delete data[key]; + } + + // Compose Settings Object + $.extend(this, DEFAULTS, options, data); + + // States + this.calibrationTimer = null; + this.calibrationFlag = true; + this.enabled = false; + this.depths = []; + this.raf = null; + + // Offset + this.ox = 0; + this.oy = 0; + this.ow = 0; + this.oh = 0; + + // Calibration + this.cx = 0; + this.cy = 0; + + // Input + this.ix = 0; + this.iy = 0; + + // Motion + this.mx = 0; + this.my = 0; + + // Velocity + this.vx = 0; + this.vy = 0; + + // Callbacks + 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); + + // Initialise + this.initialise(); + } + + Plugin.prototype.transformSupport = function(value) { + var element = document.createElement('div'); + var propertySupport = false; + var propertyValue = null; + var featureSupport = false; + var cssProperty = null; + var jsProperty = null; + for (var i = 0, l = this.vendors.length; i < l; i++) { + if (this.vendors[i] !== null) { + cssProperty = this.vendors[i][0] + 'transform'; + jsProperty = this.vendors[i][1] + 'Transform'; + } else { + cssProperty = 'transform'; + jsProperty = 'transform'; + } + if (element.style[jsProperty] !== undefined) { + propertySupport = true; + break; + } + } + switch(value) { + case '2D': + featureSupport = propertySupport; + break; + case '3D': + if (propertySupport) { + document.body.appendChild(element); + element.style[jsProperty] = 'translate3d(1px,1px,1px)'; + propertyValue = window.getComputedStyle(element).getPropertyValue(cssProperty); + featureSupport = propertyValue !== undefined && propertyValue.length > 0 && propertyValue !== "none"; + document.body.removeChild(element); + } + break; + } + return featureSupport; + }; + + Plugin.prototype.ww = null; + Plugin.prototype.wh = null; + Plugin.prototype.hw = null; + Plugin.prototype.hh = 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.initialise = function() { + + // Configure Styles + if (this.$context.css('position') === 'static') { + this.$context.css({ + position:'relative' + }); + } + this.$layers.css({ + position:'absolute', + display:'block', + height:'100%', + width:'100%', + left: 0, + top: 0 + }); + this.$layers.first().css({ + position:'relative' + }); + + // Cache Depths + this.$layers.each($.proxy(function(index, element) { + this.depths.push($(element).data('depth') || 0); + }, this)); + + // Hardware Accelerate Elements + this.accelerate(this.$context); + this.accelerate(this.$layers); + + // Setup + this.updateDimensions(); + this.enable(); + this.queueCalibration(this.calibrationDelay); + }; + + Plugin.prototype.updateDimensions = function() { + + // Cache Context Dimensions + this.ox = this.$context.offset().left; + this.oy = this.$context.offset().top; + this.ow = this.$context.width(); + this.oh = this.$context.height(); + + // Cache Window Dimensions + this.ww = window.innerWidth; + this.wh = window.innerHeight; + this.hw = this.ww / 2; + this.hh = this.wh / 2; + }; + + Plugin.prototype.queueCalibration = function(delay) { + clearTimeout(this.calibrationTimer); + this.calibrationTimer = setTimeout(this.onCalibrationTimer, delay); + }; + + Plugin.prototype.enable = function() { + if (!this.enabled) { + this.enabled = true; + 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 = false; + window.addEventListener('mousemove', this.onMouseMove); + } + window.addEventListener('resize', this.onWindowResize); + this.raf = requestAnimationFrame(this.onAnimationFrame); + } + }; + + Plugin.prototype.disable = function() { + if (this.enabled) { + this.enabled = false; + 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.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 = null; + for (var i = 0, l = this.vendors.length; i < l; i++) { + if (this.vendors[i] !== null) { + jsProperty = $.camelCase(this.vendors[i][1] + '-' + property); + } else { + jsProperty = property; + } + if (element.style[jsProperty] !== undefined) { + element.style[jsProperty] = value; + break; + } + } + }; + + Plugin.prototype.accelerate = function($element) { + for (var i = 0, l = $element.length; i < l; i++) { + var element = $element[i]; + this.css(element, 'transform', 'translate3d(0,0,0)'); + this.css(element, 'transform-style', 'preserve-3d'); + this.css(element, 'backface-visibility', 'hidden'); + } + }; + + Plugin.prototype.setPosition = function(element, x, y) { + x += '%'; + y += '%'; + if (this.transform3DSupport) { + this.css(element, 'transform', 'translate3d('+x+','+y+',0)'); + } else if (this.transform2DSupport) { + this.css(element, 'transform', 'translate('+x+','+y+')'); + } else { + element.style.left = x; + element.style.top = y; + } + }; + + Plugin.prototype.onOrientationTimer = function(event) { + if (this.orientationSupport && this.orientationStatus === 0) { + this.disable(); + this.orientationSupport = false; + this.enable(); + } + }; + + Plugin.prototype.onCalibrationTimer = function(event) { + this.calibrationFlag = true; + }; + + Plugin.prototype.onWindowResize = function(event) { + this.updateDimensions(); + }; + + Plugin.prototype.onAnimationFrame = function() { + var dx = this.ix - this.cx; + var dy = this.iy - this.cy; + if ((Math.abs(dx) > this.calibrationThreshold) || (Math.abs(dy) > this.calibrationThreshold)) { + this.queueCalibration(0); + } + if (this.portrait) { + this.mx = (this.calibrateX ? dy : this.iy) * this.scalarX; + this.my = (this.calibrateY ? dx : this.ix) * this.scalarY; + } else { + this.mx = (this.calibrateX ? dx : this.ix) * this.scalarX; + this.my = (this.calibrateY ? dy : this.iy) * this.scalarY; + } + 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; i < l; i++) { + var depth = this.depths[i]; + var layer = this.$layers[i]; + var xOffset = this.vx * depth * (this.invertX ? -1 : 1); + var yOffset = this.vy * depth * (this.invertY ? -1 : 1); + this.setPosition(layer, xOffset, yOffset); + } + this.raf = requestAnimationFrame(this.onAnimationFrame); + }; + + Plugin.prototype.onDeviceOrientation = function(event) { + + // Validate environment and event properties. + if (!this.desktop && event.beta !== null && event.gamma !== null) { + + // Set orientation status. + this.orientationStatus = 1; + + // Extract Rotation + var x = (event.beta || 0) / MAGIC_NUMBER; // -90 :: 90 + var y = (event.gamma || 0) / MAGIC_NUMBER; // -180 :: 180 + + // Detect Orientation Change + var portrait = window.innerHeight > window.innerWidth; + if (this.portrait !== portrait) { + this.portrait = portrait; + this.calibrationFlag = true; + } + + // Set Calibration + if (this.calibrationFlag) { + this.calibrationFlag = false; + this.cx = x; + this.cy = y; + } + + // Set Input + this.ix = x; + this.iy = y; + } + }; + + Plugin.prototype.onMouseMove = function(event) { + + // Calculate Input + this.ix = (event.pageX - this.hw) / this.hw; + this.iy = (event.pageY - this.hh) / this.hh; + }; + + var API = { + enable: Plugin.prototype.enable, + disable: Plugin.prototype.disable, + calibrate: Plugin.prototype.calibrate, + friction: Plugin.prototype.friction, + invert: Plugin.prototype.invert, + scalar: Plugin.prototype.scalar, + limit: Plugin.prototype.limit + }; + + $.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); + +/** + * Request Animation Frame Polyfill. + * @author Tino Zijdel + * @author Paul Irish + * @see https://gist.github.com/paulirish/1579671 + */ +;(function() { + + var lastTime = 0; + var vendors = ['ms', 'moz', 'webkit', 'o']; + + for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; + } + + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = function(callback, element) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = window.setTimeout(function() { callback(currTime + timeToCall); }, + timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + } + + if (!window.cancelAnimationFrame) { + window.cancelAnimationFrame = function(id) { + clearTimeout(id); + }; + } + +}());