From 2550832138ad535a01f0baa0841c82f720bb298c Mon Sep 17 00:00:00 2001
From: Jonas Leder <git@jonasled.de>
Date: Tue, 4 May 2021 23:42:14 +0200
Subject: [PATCH] add pleaserotate.js

---
 src/js/rotate.js        | 279 ++++++++++++++++++++++++++++++++++++++++
 src/js/script.js        |   2 +
 src/scss/_portrait.scss |   0
 src/scss/style.scss     |  16 ++-
 4 files changed, 293 insertions(+), 4 deletions(-)
 create mode 100644 src/js/rotate.js
 create mode 100644 src/scss/_portrait.scss

diff --git a/src/js/rotate.js b/src/js/rotate.js
new file mode 100644
index 0000000..ca6c97f
--- /dev/null
+++ b/src/js/rotate.js
@@ -0,0 +1,279 @@
+(function(){
+    var PleaseRotate = {},
+        currentOrientation = null,
+        isMobile = /Android|iPhone|iPad|iPod|IEMobile|Opera Mini/i.test(navigator.userAgent),
+        init = false;
+
+    var options = {
+        startOnPageLoad: true,
+        onHide: function(){},
+        onShow: function(){},
+        forcePortrait: false,
+        message: "Please Rotate Your Device",
+        subMessage: "",
+        allowClickBypass: false,
+        onlyMobile: true,
+        zIndex: 1000,
+        iconNode: null
+    };
+
+    var cssRules = [
+       "#pleaserotate-graphic { margin-left: 50px; width: 200px; animation: pleaserotateframes ease 2s; animation-iteration-count: infinite; transform-origin: 50% 50%; -webkit-animation: pleaserotateframes ease 2s; -webkit-animation-iteration-count: infinite; -webkit-transform-origin: 50% 50%; -moz-animation: pleaserotateframes ease 2s; -moz-animation-iteration-count: infinite; -moz-transform-origin: 50% 50%; -ms-animation: pleaserotateframes ease 2s; -ms-animation-iteration-count: infinite; -ms-transform-origin: 50% 50%; }",
+        "#pleaserotate-backdrop { background-color: white; top: 0; left: 0; position: fixed; width: 100%; height: 100%; }",
+        "#pleaserotate-container { width: 300px; position: absolute; top: 50%; left: 50%; margin-right: -50%; transform: translate(-50%, -50%); -webkit-transform: translate(-50%, -50%); }",
+        "#pleaserotate-message { margin-top: 20px; font-size: 1.3em; text-align: center; font-family: Verdana, Geneva, sans-serif; text-transform: uppercase }",
+        "#pleaserotate-message small { opacity: .5; display: block; font-size: .6em}"
+    ];
+    
+    var cssKeyframeRules = [
+        "pleaserotateframes{ 0% { transform:  rotate(0deg) ; -moz-transform:  rotate(0deg) ;-webkit-transform:  rotate(0deg) ;-ms-transform:  rotate(0deg) ;} 49% { transform:  rotate(-90deg) ;-moz-transform:  rotate(-90deg) ;-webkit-transform:  rotate(-90deg) ; -ms-transform:  rotate(-90deg) ;  } 100% { transform:  rotate(90deg) ;-moz-transform:  rotate(-90deg) ;-webkit-transform:  rotate(-90deg) ; -ms-transform:  rotate(-90deg) ;  } }",
+    ];
+
+    /* private functions */
+   
+    function overrideOptions(updates){
+        var prop;
+        for (var prop in updates){
+            options[prop] = updates[prop];
+        }
+    }
+
+    function setBodyClass(state){
+        if(document.documentElement){
+            document.documentElement.className = document.documentElement.className.replace( /(?:^|\s)pleaserotate-\S*/g , '' );
+            document.documentElement.className += " pleaserotate-" + state;
+        }
+    }
+
+    function addRules(sheet){
+
+        var i;
+
+        for(i = 0; i< cssRules.length; i++){
+            sheet.insertRule(cssRules[i], 0);
+        }
+
+        sheet.insertRule("#pleaserotate-backdrop { z-index: " + options.zIndex + "}", 0);
+
+        if(options.allowClickBypass){
+            sheet.insertRule("#pleaserotate-backdrop { cursor: pointer }", 0);
+        }
+
+        if(options.forcePortrait){
+            sheet.insertRule("#pleaserotate-backdrop { -webkit-transform-origin: 50% }", 0);
+
+        }
+
+        for(i = 0; i< cssKeyframeRules.length; i++){
+            if (CSSRule.WEBKIT_KEYFRAMES_RULE) { // WebKit
+                sheet.insertRule("@-webkit-keyframes " + cssKeyframeRules[i], 0);
+            }
+            else if (CSSRule.MOZ_KEYFRAMES_RULE) { // Mozilla
+                sheet.insertRule("@-moz-keyframes " + cssKeyframeRules[i], 0);
+            }
+            else if (CSSRule.KEYFRAMES_RULE) { // W3C
+                sheet.insertRule("@keyframes " + cssKeyframeRules[i], 0);
+            }
+        }
+
+    }
+
+    function createStyleSheet(){
+        var style = document.createElement("style");
+        style.appendChild(document.createTextNode("")); // I'm told we need this hack... something to do with safari but I don't feel like checking for sure
+        document.head.insertBefore(style, document.head.firstChild);
+        addRules(style.sheet);
+    }
+
+    function createElements(){
+        var backdrop = document.createElement("div"),
+            container = document.createElement("div"),
+            message = document.createElement("div"),
+            subMessage = document.createElement("small");
+
+        backdrop.setAttribute("id", "pleaserotate-backdrop");
+        container.setAttribute("id", "pleaserotate-container");
+        message.setAttribute("id", "pleaserotate-message");
+
+        backdrop.appendChild(container);
+
+        if(options.iconNode !== null){
+            container.appendChild(options.iconNode);
+        } else {
+            container.appendChild(createPhoneSVG());
+        }
+
+        container.appendChild(message);
+        message.appendChild(document.createTextNode(options.message));
+        subMessage.appendChild(document.createTextNode(options.subMessage));
+
+        message.appendChild(subMessage);
+
+        document.body.appendChild(backdrop);
+
+    }
+
+    function createPhoneSVG(){
+        var svg = document.createElementNS('http://www.w3.org/2000/svg','svg');
+        svg.setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:xlink','http://www.w3.org/1999/xlink');
+        svg.setAttribute('id','pleaserotate-graphic');
+        svg.setAttribute('viewBox','0 0 250 250');
+
+        var group = document.createElementNS('http://www.w3.org/2000/svg','g');
+        group.setAttribute('id','pleaserotate-graphic-path');
+
+        if(options.forcePortrait){
+            group.setAttribute('transform','rotate(-90 125 125)');
+        }
+
+        var path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
+        path.setAttribute('d', 'M190.5,221.3c0,8.3-6.8,15-15,15H80.2c-8.3,0-15-6.8-15-15V28.7c0-8.3,6.8-15,15-15h95.3c8.3,0,15,6.8,15,15V221.3z' +
+            'M74.4,33.5l-0.1,139.2c0,8.3,0,17.9,0,21.5c0,3.6,0,6.9,0,7.3c0,0.5,0.2,0.8,0.4,0.8s7.2,0,15.4,0h75.6c8.3,0,15.1,0,15.2,0' + 
+            's0.2-6.8,0.2-15V33.5c0-2.6-1-5-2.6-6.5c-1.3-1.3-3-2.1-4.9-2.1H81.9c-2.7,0-5,1.6-6.3,4C74.9,30.2,74.4,31.8,74.4,33.5z' + 
+            'M127.7,207c-5.4,0-9.8,5.1-9.8,11.3s4.4,11.3,9.8,11.3s9.8-5.1,9.8-11.3S133.2,207,127.7,207z');
+        svg.appendChild(group);
+        group.appendChild(path);
+
+        return svg;
+    }
+
+    function setVisibility(visible){
+        var backdropElement = document.getElementById("pleaserotate-backdrop");
+
+        if(visible){
+            if(backdropElement){
+                backdropElement.style["display"] = "block";
+            }
+        } else {
+            if(backdropElement){
+                backdropElement.style["display"] = "none";
+
+            }
+        }
+    }
+
+    function orientationChanged(){
+        var triggerOn = currentOrientation && !options.forcePortrait || !currentOrientation && options.forcePortrait,
+            propogate;
+            
+        if(triggerOn){
+            propogate = options.onShow();
+            setBodyClass("showing");
+        } else {
+            propogate = options.onHide();
+            setBodyClass("hiding");
+        }
+
+
+        if(propogate !== undefined && !propogate){
+            return;
+        }
+
+        PleaseRotate.Showing = triggerOn;
+
+        setVisibility(triggerOn);
+
+    }
+
+    function isPortrait(){
+        return ( window.innerWidth < window.innerHeight);
+    }
+
+    function checkOrientationChange(){
+        if(!isMobile && options.onlyMobile){
+            if(!init){
+                init = true;
+                setVisibility(false);
+                setBodyClass("hiding");
+                options.onHide(); // run this exactly once if not mobile
+            }
+            return;
+        }
+
+        if(currentOrientation !== isPortrait()){
+            currentOrientation = isPortrait();
+            orientationChanged();
+        }
+    }
+
+    /* public functions */
+
+    PleaseRotate.start = function(opts){
+        if(!document.body){
+            window.addEventListener('load', PleaseRotate.start.bind(null, opts), false);
+            return;
+        }
+
+        if(opts){
+            overrideOptions(opts);
+        }
+        
+        createStyleSheet();
+        createElements();
+        checkOrientationChange();
+        window.addEventListener( 'resize', checkOrientationChange, false );
+
+        if(options.allowClickBypass){
+            document.getElementById("pleaserotate-backdrop").addEventListener("click", function(){
+                var propogate = options.onHide();
+                setBodyClass("hiding");
+                PleaseRotate.Showing = false;
+                
+                if(propogate === undefined || propogate){
+                    setVisibility(false);
+                }
+            });
+        }
+    }
+
+    PleaseRotate.stop = function(){
+        window.removeEventListener('resize', onWindowResize, false);
+    }
+
+    PleaseRotate.onShow = function(fn){
+        options.onShow = fn;
+
+        if(init){
+            // if we have already been initialized, force a check
+            init = false;
+            currentOrientation = null;
+            checkOrientationChange();
+        }
+    };
+
+    PleaseRotate.onHide = function(fn){
+        options.onHide = fn;
+
+        if(init){
+            // if we have already been initialized, force a check so that onHide gets called
+            currentOrientation = null;
+            init = false;
+            checkOrientationChange();
+        }
+    };
+
+    PleaseRotate.Showing = false;
+
+    /* plumbing to support AMD, CommonJS, or Globals */
+
+    if (typeof define === 'function' && define.amd) {
+        setBodyClass("initialized");
+        define(['PleaseRotate'], function() {
+            return PleaseRotate;
+        });
+        PleaseRotate.start();
+    } else if (typeof exports === 'object') {
+        setBodyClass("initialized");
+        module.exports = PleaseRotate;
+        PleaseRotate.start();
+    } else {
+        setBodyClass("initialized");
+        window.PleaseRotate = PleaseRotate;
+        overrideOptions(window.PleaseRotateOptions);
+
+        if (options.startOnPageLoad) {
+            PleaseRotate.start();
+        }
+    }
+
+})();
\ No newline at end of file
diff --git a/src/js/script.js b/src/js/script.js
index 567d301..e6c0a2a 100644
--- a/src/js/script.js
+++ b/src/js/script.js
@@ -1,6 +1,8 @@
 require("./questions")
 require("./helper")
 require("./lightbox")
+require("./rotate")
+
 const basicLightbox = require('basiclightbox')
 
 document.querySelector(".buttonJumanji img").onclick = () => {
diff --git a/src/scss/_portrait.scss b/src/scss/_portrait.scss
new file mode 100644
index 0000000..e69de29
diff --git a/src/scss/style.scss b/src/scss/style.scss
index 1a8c76b..fc14c18 100644
--- a/src/scss/style.scss
+++ b/src/scss/style.scss
@@ -1,6 +1,14 @@
 @import "font";
 
-@import "body";
-@import "buttonJumanji";
-@import "question";
-@import "keyframes";
\ No newline at end of file
+@media screen and (orientation: landscape) {
+  @import "body";
+  @import "buttonJumanji";
+  @import "question";
+  @import "keyframes";
+}
+
+@media screen and (orientation: portrait) {
+    .buttonJumanji {
+        display: none;
+    }
+}
-- 
GitLab