commit 4371d8e5b218a33b95599c547206bb2a0a48c470
Author: xfnw <xfnw@ttm.sh>
Date: Thu, 22 Oct 2020 11:39:08 -0400
track website with git
Diffstat:
9 files changed, 489 insertions(+), 0 deletions(-)
diff --git a/assets/xfnw.css b/assets/xfnw.css
@@ -0,0 +1,57 @@
+/* ~xfnw's css! */
+/* gpl affero v3 */
+body {
+background: #141415;
+font-family: sans-serif;
+color: #cdcdcd;
+}
+
+h1, h2, h3, h4, h5 {
+ font-weight: 100;
+}
+
+div {
+border: 1px solid #cdcdcd;
+border-left: 3px solid #cdcdcd;
+padding: 10px;
+border-radius: 0px 15px 15px 0px;
+margin-top: 5px;
+}
+
+html {
+width: 700px;
+margin: 0 auto;
+}
+
+a {
+text-decoration: none;
+color: #acc;
+}
+
+a:hover {
+text-decoration: underline;
+}
+
+
+code, kbd, pre {
+background: #555;
+color: #eee;
+}
+
+pre {
+padding: 10px;
+border-radius: 0px 10px 10px 0px;
+border: 1px solid #cdcdcd;
+border-left: 3px solid #cdcdcd;
+overflow:auto;
+}
+
+
+@media screen and (max-width:700px) {
+html {
+width: 100%;
+}
+}
+
+
+
diff --git a/avatar.png b/avatar.png
Binary files differ.
diff --git a/badge/s.php b/badge/s.php
@@ -0,0 +1,26 @@
+<?php
+if (isset($_GET['t']) && isset($_GET['c'])) {
+$title = $_GET['t'];
+$content = $_GET['c'];
+$len = (strlen($title . $content)*9)+20;
+$offset = (strlen($title)*9)+10;
+
+// Set the content-type
+header('Content-type: image/png');
+
+$img = imagecreate($len, 30);
+
+ $textbgcolor = imagecolorallocate($img, 30, 30, 32);
+ $textcolor = imagecolorallocate($img, 70, 255, 155);
+
+imagestring($img, 5, 5, 5, $title, $textcolor);
+imagefilledrectangle( $img, $offset, 0, 2000, 30, $textcolor );
+imagestring($img, 5, $offset + 5, 5, $content, $textbgcolor);
+
+ ob_start();
+ imagepng($img);
+} else {
+echo "error<br>";
+echo "please set the `t` and `c` query perams to use this";
+}
+?>
diff --git a/countdown.html b/countdown.html
@@ -0,0 +1,156 @@
+
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<style>
+h1, h2 {
+ font-weight: 100
+}
+h1 {
+ text-align: center;
+ font-size: 110px;
+ margin:0;
+ margin-top: 50px;
+ margin-bottom: 0px;
+ font-family: monospace;
+ color: #0f0;
+}
+h2 {
+ text-align: center;
+ font-family: monospace;
+ color: #0f0;
+ font-size: 40px;
+ margin:0;
+ margin-top: 60px;
+}
+body {
+ background-image: url('https://xfnw.ttm.sh/avatar.png');
+ background-color: black;
+ background-size:256px;
+ border-radius:32px;
+ background-repeat: no-repeat;
+ background-attachment: fixed;
+ background-position: center;
+ overflow: hidden;
+ margin:0;
+ padding:0;
+}
+
+
+.blur {
+ -webkit-filter: url(#blur-filter);
+ filter: url(#blur-filter);
+ filter: blur(10px);
+ animation: blur 2s linear infinite;
+ }
+.blur-svg {
+ display: none;
+ }
+@keyframes blur {
+ 50% { filter: blur(0px) }
+ }
+
+
+
+.blink {
+ //animation: blinker 2s linear infinite;
+ position: fixed;
+ width: 100%;
+ opacity: 1;
+ }
+ @keyframes blinker {
+ 0% {transform: translateX(100%);}
+ 50% { opacity: 1; }
+ 100% {transform: translateX(-100%);}
+ }
+
+.blinkb {
+ background: black;
+ animation: blinkers 2s linear infinite;
+ position: fixed;
+ margin: 0px;
+ top: 0px;
+ left: 0px;
+ width: 100%;
+ height: 100%;
+ opacity: 1;
+ z-index: 1;
+ }
+ @keyframes blinkers {
+ 50% { opacity: 0; }
+ }
+
+
+</style>
+
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="blur-svg">
+ <defs>
+ <filter id="blur-filter">
+ <feGaussianBlur stdDeviation="3"></feGaussianBlur>
+ </filter>
+ </defs>
+</svg>
+
+</head>
+<body>
+
+<h1 id="timer" class="blink"></h1>
+<h2 id="message"></h2>
+
+<div class="blinkb"></div>
+
+<script>
+// get the query string
+function getQueryVariable(variable) {
+ var query = window.location.search.substring(1);
+ var vars = query.split("&");
+ for (var i=0;i<vars.length;i++) {
+ var pair = vars[i].split("=");
+ if(pair[0] == variable){return pair[1];}
+ }
+ return(false);
+}
+
+// better replacing
+String.prototype.replaceAll = function(search, replacement) {
+ var target = this;
+ return target.replace(new RegExp(search, 'g'), replacement);
+};
+
+// Set the date were counting down to
+var countDownDate = new Date(decodeURI(getQueryVariable("time"))).getTime();
+
+// set the text
+document.getElementById('message').innerHTML = getQueryVariable("text").replaceAll("%20", " ");
+
+// Update the count down every 1 second
+var x = setInterval(function() {
+
+ // Get todays date and time
+ var now = new Date().getTime();
+
+ // Find the distance between now and the count down date
+ var distance = countDownDate - now;
+
+ // Time calculations for days, hours, minutes and seconds
+ var days = Math.floor(distance / (1000 * 60 * 60 * 24));
+ var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
+ var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
+ var seconds = Math.floor((distance % (1000 * 60)) / 1000);
+
+ // Output the result in an element with id="demo"
+ document.getElementById("timer").innerHTML = days + "d " + hours + "h "
+ + minutes + "m " + seconds + "s ";
+
+ // If the count down is over, write some text
+ if (distance < 0) {
+ clearInterval(x);
+ document.getElementById("timer").innerHTML = "Stream Starting... Please Wait...";
+ }
+}, 1000);
+</script>
+
+</body>
+</html>
+
diff --git a/index.html b/index.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>xfnw</title>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="assets/xfnw.css">
+</head>
+<body>
+ <h1>xfnw</h1>
+ <div>
+ <a href="https://tildegit.org/xfnw">(tilde)</a><a href="https://xfnw.ttm.sh/git">git</a><a href="https://github.com/xfnw">(hub)</a>
+ <a href="https://twitch.tv/xfnw">Twitch</a>
+ <a href="mailto:xfnw+does+not+like+spam@ttm.sh">Email</a>
+ <a href="https://tilde.zone/@xfnw" rel="me">Fedi</a>
+ </div>
+
+ <h1>About me</h1>
+ <p>
+ hey, im owen. im a student interested in open-source, linux, and software stuff in general.
+ when not doing this i enjoy amateur radio, reading, biking, building slightly unsafe
+ things with old computer parts and <a href="https://tilde.chat">going on irc</a>.
+ </p>
+ <p>
+ im a quite quiet person so dont be offended if i "ignore" you if we meet in person
+ </p>
+
+ <h2>Feast your eyes on</h2>
+ <a href="https://xfnw.ttm.sh/blog">my blog</a>
+ or
+ <a href="https://xfnw.ttm.sh/xfwc">these images</a>
+
+ <h2>i use lots of irc</h2>
+ <ul>
+ <li>freenode ##xfnw - freenode channel</li>
+ <li>tilde.chat #xfnw - tilde channel</li>
+ <li>irc.wppnx.pii.at #xfnw - channel on my weird testnet (<a href="https://jucelo.de">jucelo</a> want to peer with it?)</li>
+ </ul>
+
+ <h1>public keys</h1>
+ <a href="proof.txt">proof</a>
+ <ul>
+ <li><b>tox:</b> 5EC5998A3EFC0663A5D2EDAF822A14FCA7AB11931A95CEF409CF6EB32E8EE4128D34CC31AFC7</li>
+ <li><b>age:</b> age15nwugsw8hdf20edhvmkpx357jvhq843k7vkp56fz5td8wnd6susqdt093l</li>
+ <li><b>signify:</b> RWQkR1Es1uIhT2VZdWpaITfS9bDh+uJiEEIOo1SrZltgRwBWdi3+ejSe</li>
+ <li><b>pgp:</b> <a href="gpg-armor.txt">AFC2DBC06ADB4DF6353C2F396DD55FE390CCCC7C</a></li>
+ <li><b>ssh:</b> <a href="ssh.txt">too many</a></li>
+ </ul>
+
+</body>
diff --git a/proof.txt b/proof.txt
@@ -0,0 +1,9 @@
+# proofs
+go verify it at https://xfnw.ttm.sh/proof.txt.sig
+ - **age**: age15nwugsw8hdf20edhvmkpx357jvhq843k7vkp56fz5td8wnd6susqdt093l
+ - **signify**: RWQkR1Es1uIhT2VZdWpaITfS9bDh+uJiEEIOo1SrZltgRwBWdi3+ejSe
+ - **gpg**: AFC2DBC06ADB4DF6353C2F396DD55FE390CCCC7C
+
+This document will expire on 2021-01-01 and will need to be re-signed.
+If that does not happen i probably forgot but it might be an imposter!
+
diff --git a/proof.txt.sig b/proof.txt.sig
@@ -0,0 +1,11 @@
+untrusted comment: verify with xfnw.pub
+RWQkR1Es1uIhT3aUptrc/RtzNDOwZ+c92luTWtiVqqFlCXY+XZaK6SVVIrFe9LFT3nOYTuPT5xFBmnJ7yau4KkpWwQiFDcaqsgw=
+# proofs
+go verify it at https://xfnw.ttm.sh/proof.txt.sig
+ - **age**: age15nwugsw8hdf20edhvmkpx357jvhq843k7vkp56fz5td8wnd6susqdt093l
+ - **signify**: RWQkR1Es1uIhT2VZdWpaITfS9bDh+uJiEEIOo1SrZltgRwBWdi3+ejSe
+ - **gpg**: AFC2DBC06ADB4DF6353C2F396DD55FE390CCCC7C
+
+This document will expire on 2021-01-01 and will need to be re-signed.
+If that does not happen i probably forgot but it might be an imposter!
+
diff --git a/ssh.txt b/ssh.txt
@@ -0,0 +1,31 @@
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGWrzyntW1bgfQ10SBIOMR0ZBkLVtBL1OAGzC2nmUGds ltc@cbarchbtw
+
+# i really need to get rid of these useless rsa keys lol
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDal1r7GYcDarvsNBV+0ZHM4968MLvzzzeMVYfF5VwFB6sAlrNUu0hAN9Y7Mdsq5aXbz4SIcMPfe6N6tHsCNct+8djuVP1VZBdPGcjjCXAHZIIFdYLfK3JprtiSQZ0Es0PJGYsimXWQNzqztSqevd0RA64kPY/G5VOGCB+JtHM2iwg29BWk4K4CRHpsrhf4M8LiYx0cZUcJoOoz4MHz1O4LMIR4I3FKndIDkosacEDthe6LUhLC0C7nXLb+G8hlZfWpCEUstsjCe85aMyJ1W/6C0JeUgg4SV+ka5ZFwPhZfELwYjhPUpKhyqw4EKpewr2P1gYOVxCiU8LDD2gNaYQ1pai5d125vII56qIcoFWNfb5eptF3ZVfZns4eCfgZx/E5BL9u3nu4qvdqoSs0RSeVTOcQ9T1ZL889OVJyeNMzRQ7KaDI5sGVecomILuPeV55OhP2IZ1UtMP8X+u0CDqNgLRwTGHxQhrqDkTmwV9SlaxxaFhIfA8y7U2/DKpnjm+BhAz3rqgCitNxG625m7uwfRsPsV41SBCHKYIYtB6k6IdgXwvFxOimO2Pq5VphtkTT5lQ6KRSfzStxLzOhbeSGx8OaUqR4RIWfQd8lpBXVxVk8p70lgqCKdfHH+Sh4URFoFhzx2EKA/myR6YO60n5I8s6pgvleA141N37Mv3lFHAVQ== lickthecheese@linuxmail.org
+
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDal1r7GYcDarvsNBV+0ZHM4968MLvzzzeMVYfF5VwFB6sAlrNUu0hAN9Y7Mdsq5aXbz4SIcMPfe6N6tHsCNct+8djuVP1VZBdPGcjjCXAHZIIFdYLfK3JprtiSQZ0Es0PJGYsimXWQNzqztSqevd0RA64kPY/G5VOGCB+JtHM2iwg29BWk4K4CRHpsrhf4M8LiYx0cZUcJoOoz4MHz1O4LMIR4I3FKndIDkosacEDthe6LUhLC0C7nXLb+G8hlZfWpCEUstsjCe85aMyJ1W/6C0JeUgg4SV+ka5ZFwPhZfELwYjhPUpKhyqw4EKpewr2P1gYOVxCiU8LDD2gNaYQ1pai5d125vII56qIcoFWNfb5eptF3ZVfZns4eCfgZx/E5BL9u3nu4qvdqoSs0RSeVTOcQ9T1ZL889OVJyeNMzRQ7KaDI5sGVecomILuPeV55OhP2IZ1UtMP8X+u0CDqNgLRwTGHxQhrqDkTmwV9SlaxxaFhIfA8y7U2/DKpnjm+BhAz3rqgCitNxG625m7uwfRsPsV41SBCHKYIYtB6k6IdgXwvFxOimO2Pq5VphtkTT5lQ6KRSfzStxLzOhbeSGx8OaUqR4RIWfQd8lpBXVxVk8p70lgqCKdfHH+Sh4URFoFhzx2EKA/myR6YO60n5I8s6pgvleA141N37Mv3lFHAVQ== pi@raspberrypi
+
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD0/8zzLzI5l11zjAiUAUUIv6ysiYki62BAN4xac2ILtvWA9P+aSfAiJnnSmSKfKoWqaOJpE8S3ZGsmwS12WhXcT6Bt9dnqwZLMai0IrDmai9Wewwb9q7uIKIwlYEs+I1AjSnb22YL24rQag37Rf8D6F2xKD1W8U9qOK0MUepoNyapUHmNkdBBhhQwmwdfU5dF6KU6mibtZAcze3flEzEa0Epk8CYPR2R66R9Cz3gCfqIV2GwW+JTgvzZLu6+Z2CnkGhYozl74do2VNukZcymNx5vdnpkxCHt19F0vj+9gS73XHp2Hid+q75i96UDKJjp2ldl26uSiWGqwOjkQDipzn owen@falcon
+
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDYLISO6NsUGVM7kpncANYlBw0GwN7d+beDsE+L2bOwvvPqs/otCin2TGwXQrWusnSSGQW0q9E61NFkYMGf70DTyeat6RN/mg0zXeY7iK/mCo9mpT5/w3jHsS2MmEj+Q19gr58rnXx0NabLj8LZEmAj3CG8RKHu33xTy6BKkN2pMNpn9Bu329EkGUoHBbDTj6jk19YCCn81c7aYfvEYweD1rc6Z6AZdIQ9jqn0MRAdWy1K2MzOp3fz38bDB1D1qw5E70BgZYXa9klL3mVEGK1DNrA1tRYZrrqVJhXQ6Peo3BIXshJ+eK5y7EBlhKkRrW8bf3bwtMlZj4dCYWztU2EFgESBXoc/XxCSiH92iSflrSUM2v8onFo4t06KGFS71ojiTHG/IHS+oHHlfGx0D2wEQcC1EHgHlHxz/n7ba4tGZG9+gC5kJzdbskHc/tsKlwwt7ilqUrprWOOVL9v06F8WOz9pza7KWFo8X18k/FvluWflEkL55dOxQzIPGHHaG0OyW+zx1DpP02fswbZfd2pPIlN7Lsc/d8/l7n9c36o4yoXAjKyb/7zw+itG5t41CtSiYrGYKvSfdB21eU4hdZZa2GGlSSwzEBJN3rjm5WDYJU7zAz2QwfQsImsESQ4IRHlxriyDejc/noldmdMnds//keOyFgPpaYpV6bzuUOp0K8Q== pythonpro55@gmail.com
+
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+lT2t47JkogjVVuIi3dYsUl+4RLtr5v74kFGvwHx8J7ijj2KWLhyYEF0KvW3GcbtlqtMhvZVuBh/lWtsvTN4hVCcRkesZbGVA+795HFtOMKoeQCuM+kzGG5KcGZISLdY8SLlhxrPdZbJDHZQ/V1IbH7El6wd0nAl9FyC3XcgCp26AcKcbwtOIXpAzNc/bQyY9bc5eC4FLnSGUzRrrsotE6uQGm+sq4va89wqH12TimqbRK/bAhKtde2eoUif7vPs+OW+H566zni1jCZfoifpc+2RX5XZPkm4HapYI2vTL5kInv/pRilVk7Y+McYzNXGJLqRO04VMLDbzTLCzzhUzx JuiceSSH
+
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC74Zn0IBK+WSVglutuuQuH6vJSvi5DPR8fLw61lh/6r1RCcEkNdrPU3LpKXLVEFKVo52n1ww6JtijRbOsbwBrvBrXJ5H0Jx21btqmjdiIRC7IB6Tqo0D+ee7OJ9Ir0wDjvgMSkPmzdKe8YL+uovypQQBS2MAw/dSKhkGVKiqgFs+wq3yHf5Sl18xTeeTO7RQw74lX1JPFQtJmvMT/AwcZUWZcsbFDveJQ5oZjPCrLZebEj+FWgis2rFDOVyiiiqCLiD8HK3SyONc3Ue0tqwziz0fn+s2OFJ7abOqvQIRbmeN2mWqxGOjeoMIjXHPh5GurPQi3auB7eSPxzgLKosPXD root@localhost
+
+
+# ah yes the nice and small curve 25519 owo
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGWrzyntW1bgfQ10SBIOMR0ZBkLVtBL1OAGzC2nmUGds ltc@cbarchbtw
+
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEEzpEn2Mrl2eYaL4eoyTHuvtFc+at2lpf+2J5SrpxGI lickthecheese@ltcboot
+
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINOc3Tszy1sVU59fNsnpQ2Ze065Mo2qY2tA3KUlWTkW3 xfnw@tilde
+
+
+
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIg4oINXfoka5d5WrjClwSOV8BT54pjjYWu5hKgSXwG+ xfnw@sparrow
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIImbwvjTzjkeLJapFt9s1QiCBF8a16OmYgQR1irlFqP9 xfnw@rawtext.club
+
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP63ZNgCwRQXWUo4f2gKSItRWjN7IfvlAwqK/VTioQHh xfnw@shadow
+
+
diff --git a/weather/index.html b/weather/index.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>xfnw's weather radar</title>
+
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <link rel="stylesheet" href="https://unpkg.com/leaflet@1.5.1/dist/leaflet.css"/>
+ <script src="https://unpkg.com/leaflet@1.5.1/dist/leaflet.js"></script>
+</head>
+<body>
+ <div style="text-align:center; position: absolute;bottom: 0px; left: 0; right: 0; height: 80px;color:white;font-family: mono,monospace,fixed-width;z-index:10000"><span id="timestamp"></span><br>Radar data © RainViewer, Map data © Carto CC BY 3.0 and OpenStreetMap</div>
+
+<input style="position: absolute;bottom:10px;right: 10px;z-index:10000;background-color:black;font-family:mono,monospace,fixed-width;color:white;border:1px solid white" type="button" onclick="playStop();" value="Play" />
+
+
+<div id="mapid" style="position: absolute; top: 0px; left: 0; bottom: 0; right: 0;background-color: black"></div>
+
+<script>
+
+ var map = L.map('mapid').setView([39.132190775931036, -77.19543457031251], 9);
+/*
+ L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
+ attributions: 'Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors'
+ }).addTo(map);
+*/
+
+
+ L.tileLayer('https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png', {
+ attributions: 'Map data © Carto CC BY 3.0 and <a href="https://openstreetmap.org">OpenStreetMap</a> contributors'
+ }).addTo(map);
+
+ /**
+ * RainViewer radar animation part
+ * @type {number[]}
+ */
+ var timestamps = [];
+ var radarLayers = [];
+
+ var animationPosition = 0;
+ var animationTimer = false;
+
+ /**
+ * Load actual radar animation frames timestamps from RainViewer API
+ */
+ var apiRequest = new XMLHttpRequest();
+ apiRequest.open("GET", "https://api.rainviewer.com/public/maps.json", true);
+ apiRequest.onload = function(e) {
+
+ // save available timestamps and show the latest frame: "-1" means "timestamp.lenght - 1"
+ timestamps = JSON.parse(apiRequest.response);
+ showFrame(-1);
+ };
+ apiRequest.send();
+
+ /**
+ * Animation functions
+ * @param ts
+ */
+ function addLayer(ts) {
+ if (!radarLayers[ts]) {
+ radarLayers[ts] = new L.TileLayer('https://tilecache.rainviewer.com/v2/radar/' + ts + '/256/{z}/{x}/{y}/2/1_1.png', {
+ tileSize: 256,
+ opacity: 0.01,
+ zIndex: ts
+ });
+ }
+ if (!map.hasLayer(radarLayers[ts])) {
+ map.addLayer(radarLayers[ts]);
+ }
+ }
+
+ /**
+ * Display particular frame of animation for the @position
+ * If preloadOnly parameter is set to true, the frame layer only adds for the tiles preloading purpose
+ * @param position
+ * @param preloadOnly
+ */
+ function changeRadarPosition(position, preloadOnly) {
+ while (position >= timestamps.length) {
+ position -= timestamps.length;
+ }
+ while (position < 0) {
+ position += timestamps.length;
+ }
+
+ var currentTimestamp = timestamps[animationPosition];
+ var nextTimestamp = timestamps[position];
+
+ addLayer(nextTimestamp);
+
+ if (preloadOnly) {
+ return;
+ }
+
+ animationPosition = position;
+
+ if (radarLayers[currentTimestamp]) {
+ radarLayers[currentTimestamp].setOpacity(0);
+ }
+ radarLayers[nextTimestamp].setOpacity(0.3);
+
+ document.getElementById("timestamp").innerHTML = (new Date(nextTimestamp * 1000)).toString();
+ }
+
+ /**
+ * Check avialability and show particular frame position from the timestamps list
+ */
+ function showFrame(nextPosition) {
+ var preloadingDirection = nextPosition - animationPosition > 0 ? 1 : -1;
+
+ changeRadarPosition(nextPosition);
+
+ // preload next next frame (typically, +1 frame)
+ // if don't do that, the animation will be blinking at the first loop
+ changeRadarPosition(nextPosition + preloadingDirection, true);
+ }
+
+ /**
+ * Stop the animation
+ * Check if the animation timeout is set and clear it.
+ */
+ function stop() {
+ if (animationTimer) {
+ clearTimeout(animationTimer);
+ animationTimer = false;
+ return true;
+ }
+ return false;
+ }
+
+ function play() {
+ showFrame(animationPosition + 1);
+
+ // Main animation driver. Run this function every 500 ms
+ animationTimer = setTimeout(play, 500);
+ }
+
+ function playStop() {
+ if (!stop()) {
+ play();
+ }
+ }
+</script>
+
+</body>
+</html>
+
+