+
FixPhrase
@@ -8,6 +33,7 @@
+
@@ -20,92 +46,6 @@
-
+
diff --git a/js/app.js b/js/app.js
new file mode 100644
index 0000000..28b1763
--- /dev/null
+++ b/js/app.js
@@ -0,0 +1,160 @@
+/*
+ Copyright 2021 Netsyms Technologies.
+
+ Redistribution and use in source and binary forms, with or without modification, are permitted
+ provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions
+ and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of
+ conditions and the following disclaimer in the documentation and/or other materials provided with
+ the distribution.
+
+ 3. Neither the name of the copyright holder nor the names of its contributors may be used to
+ endorse or promote products derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+window.onload = function () {
+ $("#mapbox").css("height", "calc(100% - " + $("#map-style-switcher").css("height") + ")");
+
+ createMap();
+
+ var bgs = [
+ "dale-nibbe-GR09HcWwP-w-unsplash.jpg",
+ "hide-obara-VzWx1l2LuIA-unsplash.jpg",
+ "john-fowler-jcbq3qWpKoo-unsplash.jpg",
+ "mark-harpur-K2s_YE031CA-unsplash.jpg",
+ "renns-art-TXhxOXHN1EE-unsplash.jpg",
+ "solotravelgoals-7kLufxYoqWk-unsplash.jpg"
+ ];
+ var bgimg = bgs[Math.floor(Math.random() * bgs.length)];
+ $("body").css("background-image", "url(./img/bg/" + bgimg + ")");
+
+ map.resize();
+
+ // Load style preference from cookie
+ var cookies = decodeURIComponent(document.cookie).split("; ");
+ cookies.forEach(val => {
+ if (val.indexOf("mapstyle") === 0) {
+ var style = val.substring(9);
+ setMapStyle(style);
+ $("#map-style-switcher a.nav-link").removeClass("active");
+ $("#map-style-switcher a.nav-link[data-style=" + style + "]").addClass("active");
+ }
+ });
+
+ $("body").on("click", ".copyonclick", function () {
+ var copyitem = $(this);
+ var copytext = copyitem.text();
+ if (copytext == "Copied to clipboard!") {
+ // prevent copying copied text if double-clicked
+ return;
+ }
+ navigator.clipboard.writeText(copytext).then(() => {
+ copyitem.text("Copied to clipboard!");
+ setTimeout(function () {
+ copyitem.text(copytext);
+ }, 1000);
+ });
+ });
+
+ $("body").on("keypress", "#wordbox,#wordbox-mobile", function (e) {
+ if (e.which == 13) {
+ dolookup($(this).val());
+ }
+ });
+
+ $("#map-style-switcher").on("click", "a.nav-link", function (e) {
+ e.preventDefault();
+ $("#map-style-switcher a.nav-link").removeClass("active");
+ setMapStyle($(this).data("style"));
+ $(this).addClass("active");
+
+ // Save style preference in cookie
+ var date = new Date();
+ date.setTime(date.getTime() + (90 * 24 * 60 * 60 * 1000));
+ document.cookie = "mapstyle=" + $(this).data("style") + "; expires=" + date.toUTCString();
+ });
+
+ // Read URL hash and try to parse it
+ window.addEventListener('hashchange', function () {
+ parseWindowHash();
+ }, false);
+ // Don't try to read hash until map is loaded, this prevents errors
+ var checkIfMapLoaded = function () {
+ if (map.isStyleLoaded()) {
+ parseWindowHash();
+ } else {
+ setTimeout(checkIfMapLoaded, 200);
+ }
+ };
+ checkIfMapLoaded();
+};
+
+function dolookup(words) {
+ try {
+ words = words.trim().toLowerCase().replace(/\s+/g, ' ');
+
+ if (!/^[a-z ]+?$/i.test(words)) {
+ // Not a FixPhrase, run a search
+ $.getJSON("lookup.php", {
+ search: words
+ }, function (resp) {
+ if (resp.status == "OK") {
+ lookupAndShowCoords(resp.coords[0], resp.coords[1]);
+ } else {
+ alert("Error: " + resp.msg);
+ }
+ });
+ return;
+ }
+
+ var coords = FixPhrase.decode(words);
+
+ showLocationPopup(coords[0], coords[1], coords[3], coords[2]);
+ $("#wordbox").val(coords[3]);
+ $("#wordbox-mobile").val(coords[3]);
+
+ var zoomlevel = 18;
+ switch (coords[2]) {
+ case 0.1:
+ zoomlevel = 10;
+ break;
+ case 0.01:
+ zoomlevel = 13;
+ break;
+ }
+ map.animateMapIn(coords[0], coords[1], zoomlevel);
+ } catch (e) {
+ alert(e);
+ }
+}
+
+function parseWindowHash() {
+ var hash = window.location.hash.substr(1);
+ if (/^-?[0-9]{1,2}\.?[0-9]*,-?[0-9]{1,3}\.?[0-9]*$/.test(hash)) {
+ var lat = hash.split(",")[0];
+ var lon = hash.split(",")[1];
+ lat = (Math.round(lat * 10000) / 10000);
+ lon = (Math.round(lon * 10000) / 10000);
+ lookupAndShowCoords(lat, lon);
+ } else if (/^[a-z]+\-[a-z]+\-?[a-z]+?\-?[a-z]+?$/.test(hash)) {
+ var words = hash.replaceAll("-", " ");
+ dolookup(words);
+ $("#wordbox").val(words);
+ $("#wordbox-mobile").val(words);
+ } else if (/^[a-z]+\ [a-z]+\ ?[a-z]+?\ ?[a-z]+?$/.test(decodeURI(hash))) {
+ var words = decodeURI(hash);
+ dolookup(words);
+ }
+}
\ No newline at end of file
diff --git a/lookup.php b/lookup.php
index ccec33d..e8fee77 100644
--- a/lookup.php
+++ b/lookup.php
@@ -1,5 +1,31 @@