diff --git a/js/9.2/scripts.js b/js/9.2/scripts.js
deleted file mode 100644
index 5adf140..0000000
--- a/js/9.2/scripts.js
+++ /dev/null
@@ -1,76 +0,0 @@
-import { retrieveData } from "./storage.js";
-import sha256 from "./sha256.min.js";
-import XORCipher from "./xorc.js";
-import getBrowserFingerprint from "./identify.js"
-
-
-export const passwordHash = {
- toString: () => {
- let fp = getBrowserFingerprint( { hardwareOnly: true } );
- let data;
- try {
- data = window.sessionStorage.getItem(sha256(fp));
- } catch (e) {
- return "none";
- }
- if (data === null) return "none";
- return XORCipher.decode(fp, data);
- },
-
- set: (pw) => {
- let fp = getBrowserFingerprint( { hardwareOnly: true } );
- window.sessionStorage.setItem(sha256(fp), XORCipher.encode(fp, pw));
- }
-}
-
-
-
-function setPassword() {
- let x = document.getElementById("loginForm");
- let pw = x.elements[0].value;
-
- if (pw != "" || pw !== "undefined") {
- let pwOld = pw;
- passwordHash.set(sha256(pw));
- let templateFiles = retrieveData("templateFiles");
- if (templateFiles != "") {
- try {
- JSON.parse(templateFiles);
- } catch (e) {
- document.getElementById("wrongPWAlert").style.display = "block";
- const alertTimeout = setTimeout(() => {
- document.getElementById("wrongPWAlert").style.display = "none";
- }, 5000);
- passwordHash.set(pwOld);
- x.elements[0].value = "";
- return;
- }
- }
- //user logged in
-
- document.getElementById("login").style.display = "none";
- window.sessionStorage.setItem(sha256("verified"), XORCipher.encode(sha256("passwordHash"), passwordHash));
- }
-}
-
-export function getUsrId() {
- const fingerprint = getBrowserFingerprint( { hardwareOnly: true } );
- return cyrb53(fingerprint + passwordHash);
-}
-
-const cyrb53 = (str, seed = 21) => {
- let h1 = 0xdeadbeef ^ seed,
- h2 = 0x41c6ce57 ^ seed;
- for (let i = 0, ch; i < str.length; i++) {
- ch = str.charCodeAt(i);
- h1 = Math.imul(h1 ^ ch, 2654435761);
- h2 = Math.imul(h2 ^ ch, 1597334677);
- }
-
- h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
- h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
-
- return 4294967296 * (2097151 & h2) + (h1 >>> 0);
-};
-
-export default setPassword;
diff --git a/js/9.2/buildForm.js b/js/9.9.6/buildForm.js
similarity index 92%
rename from js/9.2/buildForm.js
rename to js/9.9.6/buildForm.js
index 3807d4c..e22322e 100644
--- a/js/9.2/buildForm.js
+++ b/js/9.9.6/buildForm.js
@@ -1,393 +1,405 @@
-import { getFileName } from "./storage.js";
-
-function transformTemplateObject(objects) {
- let form = document.createElement("FORM");
- form.setAttribute("method", "post");
- form.setAttribute("action", "javascript:void(0)");
- form.setAttribute("id", "mainFormObj");
- form.classList.add("w3-row");
-
- let sidebarList = document.createElement("ul");
- sidebarList.classList.add("w3-ul");
-
- for (let i = 0; i < objects.length; i++) {
- buildField(objects[i], form, sidebarList);
- }
-
- //console.log(objects);
-
- //create sidebar submit button
- let sidebarSubmitButton = document.createElement("li");
- sidebarSubmitButton.classList.add(
- "w3-bar-item",
- "w3-padding-large",
- "w3-button"
- );
- sidebarSubmitButton.style.borderTop = "2px solid #ddd";
- sidebarSubmitButton.id = "sb-submit";
- sidebarSubmitButton.innerHTML = "Save & Copy";
- sidebarList.appendChild(sidebarSubmitButton);
-
- //add sidebar elemnts to sidebar
- document.getElementById("sidebar").appendChild(sidebarList);
-
- //add form to mainForm Div
- document.getElementById("mainForm").appendChild(form);
-
- //create username and append field to site
- let fileName = getFileName();
- document.getElementById("submitContainer").appendChild(userFileNameDiv(fileName));
-
- // create a Save button
- let saveBtn = document.createElement("input");
- saveBtn.setAttribute("type", "submit");
- saveBtn.setAttribute("value", "Save");
- saveBtn.classList.add("w3-button");
- saveBtn.classList.add("w3-grey");
- saveBtn.style.margin = "20px";
- //append submit button to submitContainer
- document.getElementById("submitContainer").appendChild(saveBtn);
-
- // create a Copy button
- let copyBtn = document.createElement("input");
- copyBtn.setAttribute("type", "submit");
- copyBtn.setAttribute("value", "Copy");
- copyBtn.classList.add("w3-button");
- copyBtn.classList.add("w3-grey");
- copyBtn.style.margin = "20px 0px";
- //append submit button to submitContainer
- document.getElementById("submitContainer").appendChild(copyBtn);
-
-}
-
-
-function buildField(obj, form, sidebarList) {
- //create template Input fields
-
- let divContainer = document.createElement("DIV");
- divContainer.classList.add("w3-half");
- divContainer.classList.add("w3-container");
-
- let div = document.createElement("DIV");
- div.classList.add("w3-section");
- div.classList.add("w3-flat-silver");
-
- div.setAttribute("style", "padding: 10px");
-
- let label = document.createElement("LABEL");
-
- let connectedListsArray = [];
-
- let ltPlaceholder;
-
- //check for longtext:!li and convert it to standard longText
- if (obj.type.indexOf("longText") !== -1) {
- if (obj.type.indexOf(":") !== -1) {
- ltPlaceholder = obj.type.split(":")[1];
- if (ltPlaceholder !== undefined) {
- let textarea = document.createElement("textarea");
- textarea.setAttribute("name", obj.word.replace(/ /g, "_"));
- textarea.setAttribute("id", obj.word.replace(/ /g, "_"));
- textarea.setAttribute("cols", "100");
- textarea.setAttribute("rows", "15");
- textarea.classList.add("w3-input");
- textarea.id = obj.word.replace(/ /g, "_");
- divContainer.classList.remove("w3-half");
- divContainer.classList.add("w3-center");
- label.innerHTML = obj.word;
- div.appendChild(label);
- div.appendChild(textarea);
- }
- }
- }
-
-
- if (obj.type.indexOf("simpleInput") !== -1) {
- if (obj.type.indexOf(":") !== -1) {
- ltPlaceholder = obj.type.split(":")[1];
- if (ltPlaceholder !== undefined) {
- let input = document.createElement("input");
- input.setAttribute("type", "text");
- input.setAttribute("name", obj.word.replace(/ /g, "_"));
- input.setAttribute("id", obj.word.replace(/ /g, "_"));
- input.classList.add("w3-input");
- input.id = obj.word.replace(/ /g, "_");
- label.innerHTML = obj.word;
- div.appendChild(label);
- div.appendChild(input);
- }
- }
- }
-
- //check for markup:title and display it as none
- if (obj.type.indexOf("markup") !== -1) {
- if (obj.type.indexOf(":") !== -1) {
- ltPlaceholder = obj.type.split(":")[1];
- if (ltPlaceholder !== undefined) {
- divContainer.classList.add("hidden");
- let input = document.createElement("input");
- input.setAttribute("type", "text");
- input.setAttribute("name", obj.word.replace(/ /g, "_"));
- input.id = obj.word.replace(/ /g, "_");
- input.value = obj.word;
- divContainer.style.display = "none";
- label.innerHTML = obj.word;
- div.appendChild(label);
- div.appendChild(input);
- }
- }
- }
-
-
- switch (obj.type) {
- case "genderSpecific":
- let select = document.createElement("select");
- select.setAttribute("name", obj.word.replace(/ /g, "_"));
- select.id = obj.word.replace(/ /g, "_");
- select.classList.add("w3-select");
- if (typeof obj.m !== "undefined") {
- let optionM = document.createElement("option");
- optionM.value = obj.m;
- optionM.text = obj.m;
- select.appendChild(optionM);
- }
- if (typeof obj.w !== "undefined") {
- let optionW = document.createElement("option");
- optionW.value = obj.w;
- optionW.text = obj.w;
- select.appendChild(optionW);
- }
- if (typeof obj.d !== "undefined") {
- let optionD = document.createElement("option");
- optionD.value = obj.d;
- optionD.text = obj.d;
- select.appendChild(optionD);
- }
- label.innerHTML = obj.word;
- div.appendChild(label);
- div.appendChild(select);
- break;
-
- case "list":
- let select2 = document.createElement("select");
- select2.setAttribute("name", obj.word.replace(/ /g, "_"));
- select2.classList.add("w3-select");
- select2.id = obj.word.replace(/ /g, "_");
- select2.setAttribute("id", obj.word.replace(/ /g, "_"));
-
- for (let listItem = 0; listItem < obj.listCount + 1; listItem++) {
- //console.log(obj[listItem]);
- if (typeof obj[listItem] !== "undefined") {
- let optionL = document.createElement("option");
- optionL.value = obj[listItem];
- optionL.text = obj[listItem];
- select2.appendChild(optionL);
- }
- }
- label.innerHTML = obj.word;
- div.appendChild(label);
- div.appendChild(select2);
- break;
-
- case "conList":
- let select3 = document.createElement("select");
- select3.setAttribute("name", "clM-"+obj.word.replace(/ /g, "_"));
- select3.classList.add("w3-select");
- select3.id = obj.word.replace(/ /g, "_");
- let optionDefault = document.createElement("option");
- optionDefault.value = "!none";
- optionDefault.text = "Choose one";
- select3.appendChild(optionDefault);
-
-
- for (let listItem = 0; listItem < obj.listCount + 1; listItem++) {
- //console.log(obj[listItem]);
- if (typeof obj[listItem] !== "undefined") {
- let optionL = document.createElement("option");
- let item = obj[listItem];
- optionL.value = item;
- optionL.text = item;
- select3.appendChild(optionL);
- connectedListsArray.push({
- word: item,
- type: obj["clType-"+item],
- cl: obj.word
- });
- }
- }
- label.innerHTML = obj.word;
-
- if (obj.listCount == 0) {
- select3 = document.createElement("button");
- select3.setAttribute("value", "!none");
- select3.classList.add("w3-button", "w3-grey", "w3-left-align");
- select3.id = obj.word.replace(/ /g, "_");
- select3.innerHTML = "Show";
- select3.setAttribute("name", "clM-"+obj.word.replace(/ /g, "_"));
- select3.setAttribute("data-word", connectedListsArray[0].word);
- }
-
- div.appendChild(label);
- div.appendChild(document.createElement("br"));
-
- div.appendChild(select3);
-
-
- break;
-
- case "simpleInput":
- let input = document.createElement("input");
- input.setAttribute("type", "text");
- input.setAttribute("name", obj.word.replace(/ /g, "_"));
- input.classList.add("w3-input");
- input.id = obj.word.replace(/ /g, "_");
- label.innerHTML = obj.word;
- div.appendChild(label);
- div.appendChild(input);
- break;
- case "longText":
- let textarea = document.createElement("textarea");
- textarea.setAttribute("name", obj.word.replace(/ /g, "_"));
- textarea.setAttribute("cols", "100");
- textarea.setAttribute("rows", "15");
- textarea.classList.add("w3-input");
- textarea.id = obj.word.replace(/ /g, "_");
- label.innerHTML = obj.word;
- divContainer.classList.remove("w3-half");
- divContainer.classList.add("w3-center");
- div.appendChild(label);
- div.appendChild(textarea);
- break;
- case "current_time":
- let input2 = document.createElement("input");
- let today = new Date();
- let currentTime =
- today.getHours() + ":" + ("0" + today.getMinutes()).slice(-2);
- //console.log(currentTime);
- input2.setAttribute("type", "text");
- input2.setAttribute("name", obj.word.replace(/ /g, "_"));
- input2.setAttribute("value", currentTime);
- input2.id = obj.word.replace(/ /g, "_");
- div.setAttribute("style", "display: none;");
- input2.classList.add("w3-input");
- label.innerHTML = obj.word;
- div.appendChild(label);
- div.appendChild(input2);
- break;
- case "current_date":
- let input3 = document.createElement("input");
- var today2 = new Date();
- var dd = String(today2.getDate()).padStart(2, "0");
- var mm = String(today2.getMonth() + 1).padStart(2, "0"); //January is 0!
- var yyyy = today2.getFullYear();
- currentDate = dd + "." + mm + "." + yyyy;
- input3.setAttribute("type", "text");
- input3.setAttribute("name", obj.word.replace(/ /g, "_"));
- input3.setAttribute("value", currentDate);
- input3.id = obj.word.replace(/ /g, "_");
- div.setAttribute("style", "display: none;");
- input3.classList.add("w3-input");
- label.innerHTML = obj.word;
- div.appendChild(label);
- div.appendChild(input3);
- break;
- }
-
- //check if item is connected list item cl
- if (obj.cl !== undefined) divContainer.classList.add("hidden");
- if (obj.cl !== undefined) {
- div.lastChild.setAttribute("name",
- (ltPlaceholder !== undefined) ? "cl-"+obj.word.replace(/ /g, "_") +":"+ltPlaceholder : "cl-"+obj.word.replace(/ /g, "_"));
- }
-
- //append field to wrapper and add to mainForm
- divContainer.appendChild(div);
- form.appendChild(divContainer);
-
- buildSidebarList(obj, sidebarList)
-
- //handle conList items
- if (obj.type == "conList") {
- //build connected list fields according to obj
- for (let conObj of connectedListsArray) {
- buildField(conObj, form, sidebarList);
- }
-
- //set formEvent for selection detection to mainForm
- if (obj.listCount == 0) {
- document.getElementById("mainForm").addEventListener("click", (e) => {
- if (e.target && e.target.matches("button#"+obj.word.replace(/ /g, "_"))) {
- let button = document.getElementById(obj.word.replace(/ /g, "_"));
- let con = button.dataset.word;
- let conElement = document.getElementById(con);
- if (conElement.parentElement.parentElement.classList.contains("hidden")) {
- conElement.parentElement.parentElement.classList.remove("hidden");
- button.value = "!selected";
- } else {
- conElement.parentElement.parentElement.classList.add("hidden");
- button.value = "!none";
- }
- }
- });
- } else {
- document.getElementById("mainForm").addEventListener("change", (e) => {
- if (e.target && e.target.matches("select#"+obj.word.replace(/ /g, "_"))) {
- let select = document.getElementById(obj.word.replace(/ /g, "_"));
- for (let opt of select.options) {
- if (opt.value == "!none") continue;
- if (opt.innerHTML != select.value) {
- document.getElementById(opt.innerHTML.replace(/ /g, "_")).parentElement.parentElement.classList.add("hidden");
- } else {
- document.getElementById(select.value.replace(/ /g, "_")).parentElement.parentElement.classList.remove("hidden");
- }
- }
- for (let hiddenItems of document.getElementsByClassName("cl")) {
- if (hiddenItems.innerHTML != select.value) {
- hiddenItems.classList.add("hidden");
- } else {
- hiddenItems.classList.remove("hidden");
- }
- }
- }
- });
- }
- }
-}
-
-function buildSidebarList(obj, sidebarList) {
- //build sidebarlist item and append
- let sidebarListItem = document.createElement("li");
- sidebarListItem.classList.add(
- "w3-bar-item",
- "w3-padding-large",
- "w3-button",
- "sb-item"
- );
- if (obj.cl !== undefined) sidebarListItem.classList.add("hidden", "cl");
- sidebarListItem.style.borderBottom = "1px solid #ddd";
- sidebarListItem.id = "sb-item";
- sidebarListItem.setAttribute("data-item", obj.word.replace(/ /g, "_"));
- sidebarListItem.innerHTML = obj.word;
- sidebarListItem;
- sidebarList.appendChild(sidebarListItem);
-}
-
-function userFileNameDiv(fileName) {
- let divContainer = document.createElement("DIV");
- divContainer.classList.add("w3-third", "w3-container");
- divContainer.setAttribute("style", "padding: 0px");
- let div = document.createElement("DIV");
- div.classList.add("w3-section", "w3-flat-silver");
- div.setAttribute("style", "padding: 5px");
- let userFileNameInput = document.createElement("input");
- userFileNameInput.setAttribute("type", "text");
- userFileNameInput.setAttribute("name", "userFileName");
- userFileNameInput.setAttribute("placeholder", fileName);
- userFileNameInput.classList.add("w3-input");
- userFileNameInput.id = "userFileName";
- div.appendChild(userFileNameInput);
- divContainer.appendChild(div);
- return divContainer;
-}
-
-export default transformTemplateObject;
+import { getFileName } from "./storage.js";
+
+function transformTemplateObject(objects) {
+ let form = document.createElement("FORM");
+ form.setAttribute("method", "post");
+ form.setAttribute("action", "javascript:void(0)");
+ form.setAttribute("id", "mainFormObj");
+ form.classList.add("w3-row");
+
+ let sidebarList = document.createElement("ul");
+ sidebarList.classList.add("w3-ul");
+
+ for (let i = 0; i < objects.length; i++) {
+ buildField(objects[i], form, sidebarList);
+ }
+
+ //console.log(objects);
+
+ //create sidebar submit button
+ let sidebarSubmitButton = document.createElement("li");
+ sidebarSubmitButton.classList.add(
+ "w3-bar-item",
+ "w3-padding-large",
+ "w3-button"
+ );
+ sidebarSubmitButton.style.borderTop = "2px solid #ddd";
+ sidebarSubmitButton.id = "sb-submit";
+ sidebarSubmitButton.innerHTML = "Save & Copy";
+ sidebarList.appendChild(sidebarSubmitButton);
+
+ //add sidebar elemnts to sidebar
+ document.getElementById("sidebar").appendChild(sidebarList);
+
+ //add form to mainForm Div
+ document.getElementById("mainForm").appendChild(form);
+
+ //create username and append field to site
+ let fileName = getFileName();
+ document.getElementById("submitContainer").appendChild(userFileNameDiv(fileName));
+
+ // create a Save button
+ let saveBtn = document.createElement("input");
+ saveBtn.setAttribute("type", "submit");
+ saveBtn.setAttribute("value", "Save");
+ saveBtn.classList.add("w3-button");
+ saveBtn.classList.add("w3-grey");
+ saveBtn.style.margin = "20px";
+ //append submit button to submitContainer
+ document.getElementById("submitContainer").appendChild(saveBtn);
+
+ // create a Copy button
+ let copyBtn = document.createElement("input");
+ copyBtn.setAttribute("type", "submit");
+ copyBtn.setAttribute("value", "Copy");
+ copyBtn.classList.add("w3-button");
+ copyBtn.classList.add("w3-grey");
+ copyBtn.style.margin = "20px 0px";
+ //append submit button to submitContainer
+ document.getElementById("submitContainer").appendChild(copyBtn);
+
+}
+
+
+function buildField(obj, form, sidebarList) {
+ //create template Input fields
+
+ let divContainer = document.createElement("DIV");
+ divContainer.classList.add("w3-half");
+ divContainer.classList.add("w3-container");
+
+ let div = document.createElement("DIV");
+ div.classList.add("w3-section");
+ div.classList.add("w3-left-align");
+
+ div.setAttribute("style", "padding: 10px");
+
+ let label = document.createElement("LABEL");
+ label.style.display = "inline-block";
+ label.style.width = "100%";
+ label.style.paddingBottom = "5px";
+ label.style.borderBottom = "thin solid #9e9e9e";
+ label.style.fontWeight = "800";
+
+ let connectedListsArray = [];
+
+ let ltPlaceholder;
+
+ //check for longtext:!li and convert it to standard longText
+ if (obj.type.indexOf("longText") !== -1) {
+ if (obj.type.indexOf(":") !== -1) {
+ ltPlaceholder = obj.type.split(":")[1];
+ if (ltPlaceholder !== undefined) {
+ let textarea = document.createElement("textarea");
+ textarea.setAttribute("name", obj.word.replace(/ /g, "_"));
+ textarea.setAttribute("id", obj.word.replace(/ /g, "_"));
+ textarea.setAttribute("cols", "100");
+ textarea.setAttribute("rows", "15");
+ textarea.classList.add("w3-input");
+ textarea.id = obj.word.replace(/ /g, "_");
+ divContainer.classList.remove("w3-half");
+ divContainer.classList.add("w3-center");
+ label.innerHTML = obj.word;
+ div.appendChild(label);
+ div.appendChild(textarea);
+ }
+ }
+ }
+
+
+ if (obj.type.indexOf("simpleInput") !== -1) {
+ if (obj.type.indexOf(":") !== -1) {
+ ltPlaceholder = obj.type.split(":")[1];
+ if (ltPlaceholder !== undefined) {
+ let input = document.createElement("input");
+ input.setAttribute("type", "text");
+ input.setAttribute("name", obj.word.replace(/ /g, "_"));
+ input.setAttribute("id", obj.word.replace(/ /g, "_"));
+ input.classList.add("w3-input");
+ input.id = obj.word.replace(/ /g, "_");
+ label.innerHTML = obj.word;
+ div.appendChild(label);
+ div.appendChild(input);
+ }
+ }
+ }
+
+ //check for markup:title and display it as none
+ if (obj.type.indexOf("markup") !== -1) {
+ if (obj.type.indexOf(":") !== -1) {
+ ltPlaceholder = obj.type.split(":")[1];
+ if (ltPlaceholder !== undefined) {
+ divContainer.classList.add("hidden");
+ let input = document.createElement("input");
+ input.setAttribute("type", "text");
+ input.setAttribute("name", obj.word.replace(/ /g, "_"));
+ input.id = obj.word.replace(/ /g, "_");
+ input.value = obj.word;
+ divContainer.style.display = "none";
+ label.innerHTML = obj.word;
+ div.appendChild(label);
+ div.appendChild(input);
+ }
+ }
+ }
+
+
+ switch (obj.type) {
+ case "genderSpecific":
+ let select = document.createElement("select");
+ select.setAttribute("name", obj.word.replace(/ /g, "_"));
+ select.id = obj.word.replace(/ /g, "_");
+ select.classList.add("w3-select");
+ if (typeof obj.m !== "undefined") {
+ let optionM = document.createElement("option");
+ optionM.value = obj.m;
+ optionM.text = obj.m;
+ select.appendChild(optionM);
+ }
+ if (typeof obj.w !== "undefined") {
+ let optionW = document.createElement("option");
+ optionW.value = obj.w;
+ optionW.text = obj.w;
+ select.appendChild(optionW);
+ }
+ if (typeof obj.d !== "undefined") {
+ let optionD = document.createElement("option");
+ optionD.value = obj.d;
+ optionD.text = obj.d;
+ select.appendChild(optionD);
+ }
+ label.innerHTML = obj.word;
+ div.appendChild(label);
+ div.appendChild(select);
+ break;
+
+ case "list":
+ let select2 = document.createElement("select");
+ select2.setAttribute("name", obj.word.replace(/ /g, "_"));
+ select2.classList.add("w3-select");
+ select2.id = obj.word.replace(/ /g, "_");
+ select2.setAttribute("id", obj.word.replace(/ /g, "_"));
+
+ for (let listItem = 0; listItem < obj.listCount + 1; listItem++) {
+ //console.log(obj[listItem]);
+ if (typeof obj[listItem] !== "undefined") {
+ let optionL = document.createElement("option");
+ optionL.value = obj[listItem];
+ optionL.text = obj[listItem];
+ select2.appendChild(optionL);
+ }
+ }
+ label.innerHTML = obj.word;
+ div.appendChild(label);
+ div.appendChild(select2);
+ break;
+
+ case "conList":
+ let select3 = document.createElement("select");
+ select3.setAttribute("name", "clM-"+obj.word.replace(/ /g, "_"));
+ select3.classList.add("w3-select");
+ select3.id = obj.word.replace(/ /g, "_");
+ let optionDefault = document.createElement("option");
+ optionDefault.value = "!none";
+ optionDefault.text = "Choose one";
+ select3.appendChild(optionDefault);
+
+
+ for (let listItem = 0; listItem < obj.listCount + 1; listItem++) {
+ //console.log(obj[listItem]);
+ if (typeof obj[listItem] !== "undefined") {
+ let optionL = document.createElement("option");
+ let item = obj[listItem];
+ optionL.value = item;
+ optionL.text = item;
+ select3.appendChild(optionL);
+ connectedListsArray.push({
+ word: item,
+ type: obj["clType-"+item],
+ cl: obj.word
+ });
+ }
+ }
+ label.innerHTML = obj.word;
+
+ if (obj.listCount == 0) {
+ select3 = document.createElement("button");
+ select3.setAttribute("value", "!none");
+ select3.classList.add("w3-button", "w3-grey", "w3-left-align", "w3-padding-16");
+ select3.id = obj.word.replace(/ /g, "_");
+ select3.innerHTML = connectedListsArray[0].word;
+ select3.setAttribute("name", "clM-"+obj.word.replace(/ /g, "_"));
+ select3.setAttribute("data-word", connectedListsArray[0].word);
+ label = document.createElement("LABEL");
+ label.innerHTML = '';
+ //div.classList.add("w3-center");
+ div.classList.replace("w3-flat-silver", "w3-flat-clouds");
+ div.appendChild(label);
+ div.appendChild(select3);
+ } else {
+ div.appendChild(label);
+ div.appendChild(document.createElement("br"));
+ div.appendChild(select3);
+ }
+
+
+
+ break;
+
+ case "simpleInput":
+ let input = document.createElement("input");
+ input.setAttribute("type", "text");
+ input.setAttribute("name", obj.word.replace(/ /g, "_"));
+ input.classList.add("w3-input");
+ input.id = obj.word.replace(/ /g, "_");
+ label.innerHTML = obj.word;
+ div.appendChild(label);
+ div.appendChild(input);
+ break;
+ case "longText":
+ let textarea = document.createElement("textarea");
+ textarea.setAttribute("name", obj.word.replace(/ /g, "_"));
+ textarea.setAttribute("cols", "100");
+ textarea.setAttribute("rows", "15");
+ textarea.classList.add("w3-input");
+ textarea.id = obj.word.replace(/ /g, "_");
+ label.innerHTML = obj.word;
+ divContainer.classList.remove("w3-half");
+ divContainer.classList.add("w3-center");
+ div.appendChild(label);
+ div.appendChild(textarea);
+ break;
+ case "current_time":
+ let input2 = document.createElement("input");
+ let today = new Date();
+ let currentTime =
+ today.getHours() + ":" + ("0" + today.getMinutes()).slice(-2);
+ //console.log(currentTime);
+ input2.setAttribute("type", "text");
+ input2.setAttribute("name", obj.word.replace(/ /g, "_"));
+ input2.setAttribute("value", currentTime);
+ input2.id = obj.word.replace(/ /g, "_");
+ div.setAttribute("style", "display: none;");
+ input2.classList.add("w3-input");
+ label.innerHTML = obj.word;
+ div.appendChild(label);
+ div.appendChild(input2);
+ break;
+ case "current_date":
+ let input3 = document.createElement("input");
+ var today2 = new Date();
+ var dd = String(today2.getDate()).padStart(2, "0");
+ var mm = String(today2.getMonth() + 1).padStart(2, "0"); //January is 0!
+ var yyyy = today2.getFullYear();
+ currentDate = dd + "." + mm + "." + yyyy;
+ input3.setAttribute("type", "text");
+ input3.setAttribute("name", obj.word.replace(/ /g, "_"));
+ input3.setAttribute("value", currentDate);
+ input3.id = obj.word.replace(/ /g, "_");
+ div.setAttribute("style", "display: none;");
+ input3.classList.add("w3-input");
+ label.innerHTML = obj.word;
+ div.appendChild(label);
+ div.appendChild(input3);
+ break;
+ }
+
+ //check if item is connected list item cl
+ if (obj.cl !== undefined) divContainer.classList.add("hidden");
+ if (obj.cl !== undefined) {
+ div.lastChild.setAttribute("name",
+ (ltPlaceholder !== undefined) ? "cl-"+obj.word.replace(/ /g, "_") +":"+ltPlaceholder : "cl-"+obj.word.replace(/ /g, "_"));
+ divContainer.classList.add("w3-animate-opacity")
+ }
+
+ //append field to wrapper and add to mainForm
+ divContainer.appendChild(div);
+ form.appendChild(divContainer);
+
+ buildSidebarList(obj, sidebarList)
+
+ //handle conList items
+ if (obj.type == "conList") {
+ //build connected list fields according to obj
+ for (let conObj of connectedListsArray) {
+ buildField(conObj, form, sidebarList);
+ }
+
+ //set formEvent for selection detection to mainForm
+ if (obj.listCount == 0) {
+ document.getElementById("mainForm").addEventListener("click", (e) => {
+ if (e.target && e.target.matches("button#"+obj.word.replace(/ /g, "_"))) {
+ let button = document.getElementById(obj.word.replace(/ /g, "_"));
+ let con = button.dataset.word;
+ let conElement = document.getElementById(con);
+ if (conElement.parentElement.parentElement.classList.contains("hidden")) {
+ conElement.parentElement.parentElement.classList.remove("hidden");
+ button.value = "!selected";
+ } else {
+ conElement.parentElement.parentElement.classList.add("hidden");
+ button.value = "!none";
+ }
+ }
+ });
+ } else {
+ document.getElementById("mainForm").addEventListener("change", (e) => {
+ if (e.target && e.target.matches("select#"+obj.word.replace(/ /g, "_"))) {
+ let select = document.getElementById(obj.word.replace(/ /g, "_"));
+ for (let opt of select.options) {
+ if (opt.value == "!none") continue;
+ if (opt.innerHTML != select.value) {
+ document.getElementById(opt.innerHTML.replace(/ /g, "_")).parentElement.parentElement.classList.add("hidden");
+ } else {
+ document.getElementById(select.value.replace(/ /g, "_")).parentElement.parentElement.classList.remove("hidden");
+ }
+ }
+ for (let hiddenItems of document.getElementsByClassName("cl")) {
+ if (hiddenItems.innerHTML != select.value) {
+ hiddenItems.classList.add("hidden");
+ } else {
+ hiddenItems.classList.remove("hidden");
+ }
+ }
+ }
+ });
+ }
+ }
+}
+
+function buildSidebarList(obj, sidebarList) {
+ //build sidebarlist item and append
+ let sidebarListItem = document.createElement("li");
+ sidebarListItem.classList.add(
+ "w3-bar-item",
+ "w3-padding-large",
+ "w3-button",
+ "sb-item"
+ );
+ if (obj.cl !== undefined) sidebarListItem.classList.add("hidden", "cl");
+ sidebarListItem.style.borderBottom = "1px solid #ddd";
+ sidebarListItem.id = "sb-item";
+ sidebarListItem.setAttribute("data-item", obj.word.replace(/ /g, "_"));
+ sidebarListItem.innerHTML = obj.word;
+ sidebarListItem;
+ sidebarList.appendChild(sidebarListItem);
+}
+
+function userFileNameDiv(fileName) {
+ let divContainer = document.createElement("DIV");
+ divContainer.classList.add("w3-third", "w3-container");
+ divContainer.setAttribute("style", "padding: 0px");
+ let div = document.createElement("DIV");
+ div.classList.add("w3-section", "w3-flat-silver");
+ div.setAttribute("style", "padding: 5px");
+ let userFileNameInput = document.createElement("input");
+ userFileNameInput.setAttribute("type", "text");
+ userFileNameInput.setAttribute("name", "userFileName");
+ userFileNameInput.setAttribute("placeholder", fileName);
+ userFileNameInput.classList.add("w3-input");
+ userFileNameInput.id = "userFileName";
+ div.appendChild(userFileNameInput);
+ divContainer.appendChild(div);
+ return divContainer;
+}
+
+export default transformTemplateObject;
diff --git a/js/9.2/createTemplate.js b/js/9.9.6/createTemplate.js
similarity index 94%
rename from js/9.2/createTemplate.js
rename to js/9.9.6/createTemplate.js
index 26125d6..6ebbc00 100644
--- a/js/9.2/createTemplate.js
+++ b/js/9.9.6/createTemplate.js
@@ -1,209 +1,200 @@
-import {setNewTemplate, loadTemplate} from "./web.js";
-import { retrieveData } from "./storage.js";
-import { hideMenus, modalNotifier } from "./evts.js";
-
-function createTemplate(template = false) {
-
-
- //set current page value in activeState object
- activeState.activePage = "createTemplate";
-
- //check if user is authenticated and templateFilesArray is decryptable
- let tF = retrieveData("templateFiles");
- if (tF != "") {
- try {
- tF = JSON.parse(tF);
- } catch (e) {
- alert("Decryption failed; are you authenticated?");
- window.location.reload();
- return;
- }
- }
-
-
- if (screen.width > 992) {
- document.getElementById("siteTitle").innerHTML = "Manage templates";
- } else {
- document.getElementById("siteTitle").innerHTML = "TG";
- }
-
- //hide set Form button
- document.getElementById("setFormButton").style.display = "none";
-
- if (template) {
- document.getElementById("templateInput").value = loadTemplate(template, false, "createTemplate");
- return;
- }
-
- //reset page and event listeners
-
- hideMenus();
-
- let mainFormDiv = document.getElementById("mainForm");
- let outputDiv = document.getElementById("output");
- let submitContainerDiv = document.getElementById("submitContainer");
- let sidebarDiv = document.getElementById("sidebar");
-
- mainFormDiv.innerHTML = "";
- mainFormDiv.replaceWith(mainFormDiv.cloneNode(true));
- outputDiv.innerHTML = "";
- outputDiv.replaceWith(outputDiv.cloneNode(true));
- submitContainerDiv.innerHTML = "";
- submitContainerDiv.replaceWith(submitContainerDiv.cloneNode(true));
- sidebarDiv.innerHTML = "";
- sidebarDiv.replaceWith(sidebarDiv.cloneNode(true));
-
- document.getElementById("mainForm").appendChild(createTemplateInput());
- document.getElementById("sidebar").appendChild(loadTemplateSidebar(activeState.templates));
-
- //add events
- if (!template) formEvts();
- }
-
- function createTemplateCallBack(fileName, data) {
-
- document.getElementById("templateInput").value = data;
- document.getElementById("userFileName").setAttribute("placeholder", fileName);
- }
-
- function loadTemplateSidebar(templates) {
- let sidebarList = document.createElement("ul");
- sidebarList.classList.add("w3-ul");
-
-
- for (let template of templates) {
- let sidebarListItem = document.createElement("li");
-
- sidebarListItem.classList.add(
- "w3-bar-item",
- "w3-padding-large",
- "w3-button"
- );
- sidebarListItem.style.borderBottom = "1px solid #ddd";
- sidebarListItem.id = "sb-item";
- sidebarListItem.setAttribute("data-template", template);
- sidebarListItem.innerHTML = template.replace(/_/g, " ");
- sidebarList.appendChild(sidebarListItem);
- }
-
- return sidebarList;
-
- }
-
- function createTemplateInput() {
-
- let createTemplateDisplay = document.createElement("DIV");
- createTemplateDisplay.classList.add(
- "w3-row-padding",
- "w3-padding-24",
- "w3-container",
- "w3-flat-clouds"
- );
- createTemplateDisplay.id = "createTemplateDisplayWrapper";
-
-
- //start building submitContainer with save and filename
-
-
- document.getElementById("submitContainer").appendChild(userFileNameDiv());
-
- let saveButton = document.createElement("input");
- saveButton.setAttribute("type", "submit");
- saveButton.setAttribute("value", "Save");
- saveButton.classList.add("w3-button");
- saveButton.classList.add("w3-grey");
- saveButton.style.margin = "20px";
- document.getElementById("submitContainer").appendChild(saveButton);
-
-
-
- let divContainer = document.createElement("DIV");
- divContainer.classList.add("w3-container", "w3-center");
-
- let div = document.createElement("DIV");
- div.classList.add("w3-section");
- div.classList.add("w3-flat-silver");
-
- div.setAttribute("style", "padding: 10px");
-
-
-
- let textarea = document.createElement("textarea");
- textarea.setAttribute("name", "templateInput");
- textarea.setAttribute("id", "templateInput");
- textarea.setAttribute("cols", "100");
- textarea.setAttribute("rows", "30");
- textarea.classList.add("w3-input");
-
-
- div.appendChild(textarea);
- divContainer.appendChild(div);
-
-
- createTemplateDisplay.appendChild(divContainer);
- return createTemplateDisplay;
-
- }
-
-
- function formEvts() {
- //add event listener to submitContainer
- document.getElementById("submitContainer").addEventListener("click", (e) => {
- if (e.target && e.target.tagName === "INPUT") {
- switch (e.target.value) {
- case "Save":
- let fileName;
- let userFileNameField = document.getElementById("userFileName");
- let userFileName = userFileNameField.value;
- let userFileNamePH = userFileNameField.getAttribute("placeholder");
- if (userFileName.length != 0) {
- fileName = userFileName;
- //clear old data as file switches to new filename
- } else if (userFileNamePH.length != 0) {
- fileName = userFileNamePH;
- }
- let data = document.getElementById("templateInput").value;
- setNewTemplate(fileName, data);
- modalNotifier(fileName+" saved!", 1);
- e.target.className = e.target.className.replace(" w3-grey", " w3-flat-nephritis");
- e.target.style.pointerEvents = "none";
- const timeoutSave = setTimeout(() => {
- e.target.className = e.target.className.replace(" w3-flat-nephritis"," w3-grey");
- e.target.style.pointerEvents = "auto";
- }, 250);
- e.preventDefault;
- break;
- default:
- e.preventDefault;
- }
- }
- });
- document.getElementById("sidebar").addEventListener("click", (e) => {
- if (e.target && e.target.matches("li.w3-bar-item")) {
- let template = e.target.dataset.template;
- createTemplate(template);
- }
- });
- }
-
-
-
- function userFileNameDiv() {
- let divContainer = document.createElement("DIV");
- divContainer.classList.add("w3-third", "w3-container");
- divContainer.setAttribute("style", "padding: 0px");
- let div = document.createElement("DIV");
- div.classList.add("w3-section", "w3-flat-silver", "w3-margin-left");
- div.setAttribute("style", "padding: 5px");
- let userFileNameInput = document.createElement("input");
- userFileNameInput.setAttribute("type", "text");
- userFileNameInput.setAttribute("name", "userFileName");
- userFileNameInput.setAttribute("placeholder", "Enter a filename");
- userFileNameInput.classList.add("w3-input");
- userFileNameInput.id = "userFileName";
- div.appendChild(userFileNameInput);
- divContainer.appendChild(div);
- return divContainer;
- }
-
+import {setNewTemplate, loadTemplate} from "./web.js";
+import { retrieveData } from "./storage.js";
+import { hideMenus, modalNotifier } from "./evts.js";
+
+function createTemplate(template = false) {
+
+
+ //set current page value in activeState object
+ activeState.activePage = "createTemplate";
+
+
+ if (screen.width > 992) {
+ document.getElementById("siteTitle").innerHTML = "Manage templates";
+ } else {
+ document.getElementById("siteTitle").innerHTML = "TG";
+ }
+
+ //hide set Form button
+ document.getElementById("setFormButton").style.display = "none";
+
+ if (template) {
+ document.getElementById("templateInput").value = loadTemplate(template, false, "createTemplate");
+ return;
+ }
+
+ //reset page and event listeners
+
+ hideMenus();
+
+ let mainFormDiv = document.getElementById("mainForm");
+ let outputDiv = document.getElementById("output");
+ let submitContainerDiv = document.getElementById("submitContainer");
+ let sidebarDiv = document.getElementById("sidebar");
+
+ mainFormDiv.innerHTML = "";
+ mainFormDiv.replaceWith(mainFormDiv.cloneNode(true));
+ outputDiv.innerHTML = "";
+ outputDiv.replaceWith(outputDiv.cloneNode(true));
+ submitContainerDiv.innerHTML = "";
+ submitContainerDiv.replaceWith(submitContainerDiv.cloneNode(true));
+ sidebarDiv.innerHTML = "";
+ sidebarDiv.replaceWith(sidebarDiv.cloneNode(true));
+
+ document.getElementById("mainForm").appendChild(createTemplateInput());
+ document.getElementById("sidebar").appendChild(loadTemplateSidebar(activeState.templates));
+
+ //add events
+ if (!template) formEvts();
+ }
+
+ function createTemplateCallBack(fileName, data) {
+
+ document.getElementById("templateInput").value = data;
+ document.getElementById("userFileName").setAttribute("placeholder", fileName);
+ }
+
+ function loadTemplateSidebar(templates) {
+ let sidebarList = document.createElement("ul");
+ sidebarList.classList.add("w3-ul");
+ if (!templates.includes('_textBlocks')) {
+ templates.push('_textBlocks');
+ }
+
+
+ for (let template of templates) {
+ let sidebarListItem = document.createElement("li");
+
+ sidebarListItem.classList.add(
+ "w3-bar-item",
+ "w3-padding-large",
+ "w3-button"
+ );
+ sidebarListItem.style.borderBottom = "1px solid #ddd";
+ sidebarListItem.id = "sb-item";
+ sidebarListItem.setAttribute("data-template", template);
+ sidebarListItem.innerHTML = template.replace(/_/g, " ");
+ sidebarList.appendChild(sidebarListItem);
+ }
+
+ return sidebarList;
+
+ }
+
+ function createTemplateInput() {
+
+ let createTemplateDisplay = document.createElement("DIV");
+ createTemplateDisplay.classList.add(
+ "w3-row-padding",
+ "w3-padding-24",
+ "w3-container",
+ "w3-flat-clouds"
+ );
+ createTemplateDisplay.id = "createTemplateDisplayWrapper";
+
+
+ //start building submitContainer with save and filename
+
+
+ document.getElementById("submitContainer").appendChild(userFileNameDiv());
+
+ let saveButton = document.createElement("input");
+ saveButton.setAttribute("type", "submit");
+ saveButton.setAttribute("value", "Save");
+ saveButton.classList.add("w3-button");
+ saveButton.classList.add("w3-grey");
+ saveButton.style.margin = "20px";
+ document.getElementById("submitContainer").appendChild(saveButton);
+
+
+
+ let divContainer = document.createElement("DIV");
+ divContainer.classList.add("w3-container", "w3-center");
+
+ let div = document.createElement("DIV");
+ div.classList.add("w3-section");
+ div.classList.add("w3-flat-silver");
+
+ div.setAttribute("style", "padding: 10px");
+
+
+
+ let textarea = document.createElement("textarea");
+ textarea.setAttribute("name", "templateInput");
+ textarea.setAttribute("id", "templateInput");
+ textarea.setAttribute("cols", "100");
+ textarea.setAttribute("rows", "30");
+ textarea.classList.add("w3-input");
+
+
+ div.appendChild(textarea);
+ divContainer.appendChild(div);
+
+
+ createTemplateDisplay.appendChild(divContainer);
+ return createTemplateDisplay;
+
+ }
+
+
+ function formEvts() {
+ //add event listener to submitContainer
+ document.getElementById("submitContainer").addEventListener("click", (e) => {
+ if (e.target && e.target.tagName === "INPUT") {
+ switch (e.target.value) {
+ case "Save":
+ let fileName;
+ let userFileNameField = document.getElementById("userFileName");
+ let userFileName = userFileNameField.value;
+ let userFileNamePH = userFileNameField.getAttribute("placeholder");
+ if (userFileName.length != 0) {
+ fileName = userFileName;
+ //clear old data as file switches to new filename
+ } else if (userFileNamePH.length != 0) {
+ fileName = userFileNamePH;
+ }
+ let data = document.getElementById("templateInput").value;
+ setNewTemplate(fileName, data);
+ modalNotifier(fileName+" saved!", 1);
+ e.target.className = e.target.className.replace(" w3-grey", " w3-flat-nephritis");
+ e.target.style.pointerEvents = "none";
+ const timeoutSave = setTimeout(() => {
+ e.target.className = e.target.className.replace(" w3-flat-nephritis"," w3-grey");
+ e.target.style.pointerEvents = "auto";
+ }, 250);
+ e.preventDefault;
+ break;
+ default:
+ e.preventDefault;
+ }
+ }
+ });
+ document.getElementById("sidebar").addEventListener("click", (e) => {
+ if (e.target && e.target.matches("li.w3-bar-item")) {
+ let template = e.target.dataset.template;
+ createTemplate(template);
+ }
+ });
+ }
+
+
+
+ function userFileNameDiv() {
+ let divContainer = document.createElement("DIV");
+ divContainer.classList.add("w3-third", "w3-container");
+ divContainer.setAttribute("style", "padding: 0px");
+ let div = document.createElement("DIV");
+ div.classList.add("w3-section", "w3-flat-silver", "w3-margin-left");
+ div.setAttribute("style", "padding: 5px");
+ let userFileNameInput = document.createElement("input");
+ userFileNameInput.setAttribute("type", "text");
+ userFileNameInput.setAttribute("name", "userFileName");
+ userFileNameInput.setAttribute("placeholder", "Enter a filename");
+ userFileNameInput.classList.add("w3-input");
+ userFileNameInput.id = "userFileName";
+ div.appendChild(userFileNameInput);
+ divContainer.appendChild(div);
+ return divContainer;
+ }
+
export {createTemplate, createTemplateCallBack};
\ No newline at end of file
diff --git a/js/9.2/evts.js b/js/9.9.6/evts.js
similarity index 83%
rename from js/9.2/evts.js
rename to js/9.9.6/evts.js
index 7b168b0..ff66b5c 100644
--- a/js/9.2/evts.js
+++ b/js/9.9.6/evts.js
@@ -1,193 +1,220 @@
-import {
- clearData,
- createStorageObj,
- createBookShelf,
- importBookShelf,
-} from "./storage.js";
-import {
- loadTemplate,
- storeFilesToServer,
- setTemplatePreset,
- checkForStoredDataOnServer,
- delStoredDataOnServer
-} from "./web.js";
-import parseFormOnSubmit from "./parseForm.js";
-import { getUsrId } from "./scripts.js";
-
-function showMenu() {
- var x = document.getElementById("navMob");
- if (x.className.indexOf("w3-show") == -1) {
- x.className += " w3-show";
- } else {
- x.className = x.className.replace(" w3-show", "");
- }
-
- if (screen.width < 993) {
- let sidebar = document.getElementById("sidebar");
- sidebar.style.display = "none";
- }
-}
-function showSidebar() {
- let sidebar = document.getElementById("sidebar");
- if (getComputedStyle(sidebar).display === "none") {
- sidebar.style.display = "block";
- sidebar.style.marginTop = "35px";
- } else {
- sidebar.style.display = "none";
- }
-
- if (screen.width < 993) {
- let navBar = document.getElementById("navMob");
- navBar.className = navBar.className.replace(" w3-show", "");
- }
-}
-
-function showTextBlocks() {
- var x = document.getElementById("navTb");
- if (x.className.indexOf("w3-show") == -1) {
- x.className += " w3-show";
- } else {
- x.className = x.className.replace(" w3-show", "");
- }
-
- if (screen.width < 993) {
- let sidebar = document.getElementById("sidebar");
- sidebar.style.display = "none";
- }
-}
-
-function insertTextBlocks(t) {
- let insert = "!" + t.innerText.split(":")[0] + " ";
- let id = activeState.lastElement;
- let element = document.getElementById(id);
- if (element === null) {
- return;
- }
- element.value += insert;
- let tB = document.getElementById("navTb");
- tB.className.replace(" w3-show", "");
- element.focus();
-}
-
-function handleOnBlur(t) {
- activeState.lastElement = t.id;
- createStorageObj();
-}
-
-function clickClearForm() {
- //document.activeElement.blur();
- //document.getElementById("sidebar").focus();
- clearData("userInput");
- let lT = activeState.loadedTemplate;
- loadTemplate(lT);
-}
-
-function hideMenus() {
- let sidebar = document.getElementById("sidebar");
- sidebar.style.display = "none";
- let navBar = document.getElementById("navMob");
- navBar.className = navBar.className.replace(" w3-show", "");
- let tbBar = document.getElementById("navTb");
- tbBar.className = tbBar.className.replace(" w3-show", "");
-}
-
-function modalNotifier(msg, timeout) {
- let modalElement = document.getElementById("modalNotifier");
- let msgElement = document.getElementById("modalMsg");
-
- modalElement.style.display = "block";
- msgElement.innerHTML = msg;
- if (timeout === undefined) {
- const run = setTimeout(() => (modalElement.style.display = "none"), 5000);
- } else if (timeout >= 1) {
- const run = setTimeout(
- () => (modalElement.style.display = "none"),
- timeout * 1000
- );
- }
-}
-
-function clickSetForm(e) {
- e.preventDefault;
- let dataArray = parseFormOnSubmit(true);
- let lT = activeState.loadedTemplate;
- setTemplatePreset(lT, JSON.stringify(dataArray));
- modalNotifier("Form Saved", 2);
-}
-
-function clickImportFiles() {
- checkForStoredDataOnServer();
- document.getElementById("modalMsg").addEventListener("click", (e) => {
- if (e.target && e.target.tagName === "BUTTON") {
- let modal = document.getElementById("modalNotifier");
- switch (e.target.innerHTML) {
- case "Import":
- modal.replaceWith(modal.cloneNode(true));
- document.getElementById("modalMsg").addEventListener("click", (e) => {
- if (e.target && e.target.tagName === "BUTTON") {
- let modal = document.getElementById("modalNotifier");
-
- switch (e.target.innerHTML) {
- case "Yes":
- importBookShelf();
- modal.replaceWith(modal.cloneNode(true));
- modalNotifier("Imported!", 2);
- break;
- case "Cancel":
- modal.replaceWith(modal.cloneNode(true));
- document.getElementById("modalNotifier").style.display = "none";
- break;
- default:
- e.preventDefault;
- }
- }
- })
- modalNotifier(
- "
\
- Would you like to import the backup created on: "+activeState.serverFilesTs.replace("_", " - ")+ " \
- Yes \
- Cancel
",
- 0);
- break;
- case "Save":
- storeFilesToServer(createBookShelf());
- modal.replaceWith(modal.cloneNode(true));
- modalNotifier(
- "Files saved to server would you like to download them?"
- );
- break;
- case "Delete":
- delStoredDataOnServer();
- break;
-
- default:
- e.preventDefault;
- }
- }
- });
- modalNotifier(
- "Here you can manage if your files should be saved on the server \
- If there are stored files already on the server you can inport them \
- It will overwrite any saved documents \
- \
- Import \
- Save \
- Delete
",
- 0);
-
-}
-
-export {
- hideMenus,
- showMenu,
- showSidebar,
- showTextBlocks,
- insertTextBlocks,
- handleOnBlur,
- clickClearForm,
- modalNotifier,
- clickSetForm,
- clickImportFiles,
-};
+import {
+ clearData,
+ createStorageObj,
+ createBookShelf,
+ importBookShelf,
+} from "./storage.js";
+import {
+ loadTemplate,
+ storeFilesToServer,
+ setTemplatePreset,
+ checkForStoredDataOnServer,
+ delStoredDataOnServer
+} from "./web.js";
+import parseFormOnSubmit from "./parseForm.js";
+import { getUsrId } from "./scripts.js";
+
+function showMenu() {
+ var x = document.getElementById("navMob");
+ if (x.className.indexOf("w3-show") == -1) {
+ x.className += " w3-show";
+ } else {
+ x.className = x.className.replace(" w3-show", "");
+ }
+
+ if (screen.width < 993) {
+ let sidebar = document.getElementById("sidebar");
+ sidebar.style.display = "none";
+ }
+}
+function showSidebar() {
+ let sidebar = document.getElementById("sidebar");
+ if (getComputedStyle(sidebar).display === "none") {
+ sidebar.style.display = "block";
+ sidebar.style.marginTop = "35px";
+ } else {
+ sidebar.style.display = "none";
+ }
+
+ if (screen.width < 993) {
+ let navBar = document.getElementById("navMob");
+ navBar.className = navBar.className.replace(" w3-show", "");
+ }
+}
+
+function showTextBlocks() {
+ var x = document.getElementById("navTb");
+ if (x.className.indexOf("w3-show") == -1) {
+ x.className += " w3-show";
+ } else {
+ x.className = x.className.replace(" w3-show", "");
+ }
+
+ if (screen.width < 993) {
+ let sidebar = document.getElementById("sidebar");
+ sidebar.style.display = "none";
+ }
+}
+
+function insertTextBlocks(t) {
+ let insert = "!" + t.innerText.split(":")[0] + " ";
+ let id = activeState.lastElement;
+ let element = document.getElementById(id);
+ if (element === null) {
+ return;
+ }
+ element.value += insert;
+ let tB = document.getElementById("navTb");
+ tB.className.replace(" w3-show", "");
+ element.focus();
+}
+
+function handleOnBlur(t) {
+ activeState.lastElement = t.id;
+ createStorageObj();
+}
+
+function clickClearForm() {
+ //document.activeElement.blur();
+ //document.getElementById("sidebar").focus();
+ clearData("userInput");
+ let lT = activeState.loadedTemplate;
+ loadTemplate(lT);
+}
+
+function hideMenus() {
+ let sidebar = document.getElementById("sidebar");
+ sidebar.style.display = "none";
+ let navBar = document.getElementById("navMob");
+ navBar.className = navBar.className.replace(" w3-show", "");
+ let tbBar = document.getElementById("navTb");
+ tbBar.className = tbBar.className.replace(" w3-show", "");
+}
+
+function modalNotifier(msg, timeout) {
+ let modalElement = document.getElementById("modalNotifier");
+ let msgElement = document.getElementById("modalMsg");
+
+ modalElement.style.display = "block";
+ msgElement.innerHTML = msg;
+ if (timeout === undefined) {
+ const run = setTimeout(() => (modalElement.style.display = "none"), 5000);
+ } else if (timeout >= 1) {
+ const run = setTimeout(
+ () => (modalElement.style.display = "none"),
+ timeout * 1000
+ );
+ }
+}
+
+function clickSetForm(e) {
+ e.preventDefault;
+ let dataArray = parseFormOnSubmit(true);
+ let lT = activeState.loadedTemplate;
+ setTemplatePreset(lT, JSON.stringify(dataArray));
+ modalNotifier("Form Saved", 2);
+}
+
+function clickImportFiles() {
+ if (activeState.localOnly) {
+ createBookShelfDownload();
+ return;
+ }
+ checkForStoredDataOnServer();
+ document.getElementById("modalMsg").addEventListener("click", (e) => {
+ if (e.target && e.target.tagName === "BUTTON") {
+ let modal = document.getElementById("modalNotifier");
+ switch (e.target.innerHTML) {
+ case "Import":
+ modal.replaceWith(modal.cloneNode(true));
+ document.getElementById("modalMsg").addEventListener("click", (e) => {
+ if (e.target && e.target.tagName === "BUTTON") {
+ let modal = document.getElementById("modalNotifier");
+
+ switch (e.target.innerHTML) {
+ case "Yes":
+ importBookShelf();
+ modal.replaceWith(modal.cloneNode(true));
+ modalNotifier("Imported!", 2);
+ break;
+ case "Cancel":
+ modal.replaceWith(modal.cloneNode(true));
+ document.getElementById("modalNotifier").style.display = "none";
+ break;
+ default:
+ e.preventDefault;
+ }
+ }
+ })
+ modalNotifier(
+ " \
+ Would you like to import the backup created on: "+activeState.serverFilesTs.replace("_", " - ")+ " \
+ Yes \
+ Cancel
",
+ 0);
+ break;
+ case "Save":
+ storeFilesToServer(createBookShelf());
+ modal.replaceWith(modal.cloneNode(true));
+ modalNotifier(
+ "Files saved to server would you like to download them?"
+ ,0);
+ break;
+ case "Delete":
+ delStoredDataOnServer();
+ break;
+
+ default:
+ e.preventDefault;
+ }
+ }
+ });
+ modalNotifier(
+ "Here you can manage if your files should be saved on the server \
+ If there are stored files already on the server you can inport them \
+ It will overwrite any saved documents \
+ \
+ Import \
+ Save \
+ Delete
",
+ 0);
+
+}
+
+function createBookShelfDownload() {
+ let data = createBookShelf();
+ let filename = data[0]['data'] + ".txt";
+ document.getElementById("modalMsg").addEventListener("click", (e) => {
+ if (e.target && e.target.tagName === "BUTTON") {
+ var element = document.createElement('a');
+ element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(JSON.stringify(data)));
+ element.setAttribute('download', filename);
+ element.style.display = 'none';
+ document.body.appendChild(element);
+ element.click();
+ document.body.removeChild(element);
+ }
+ });
+ modalNotifier(
+ "Since you are in local only mode you can only export a backup of your files \
+ \
+ \
+ Export
"
+ ,0);
+
+}
+
+export {
+ hideMenus,
+ showMenu,
+ showSidebar,
+ showTextBlocks,
+ insertTextBlocks,
+ handleOnBlur,
+ clickClearForm,
+ modalNotifier,
+ clickSetForm,
+ clickImportFiles
+};
diff --git a/js/9.2/files.js b/js/9.9.6/files.js
similarity index 75%
rename from js/9.2/files.js
rename to js/9.9.6/files.js
index 1bcbb0b..41b2e42 100644
--- a/js/9.2/files.js
+++ b/js/9.9.6/files.js
@@ -1,313 +1,360 @@
-import {
- storeData,
- clearData,
- retrieveData,
- createStorageObj,
-} from "./storage.js";
-import { loadTemplate } from "./web.js";
-import parseFormOnSubmit from "./parseForm.js";
-
-function buildFile() {
- createStorageObj();
-
-
- //set current page value in activeState object
- activeState.activePage = "files";
-
- //check if user is authenticated and templateFilesArray is decryptable
- let tF = retrieveData("templateFiles");
- if (tF != "") {
- try {
- tF = JSON.parse(tF);
- } catch (e) {
- alert("Decryption failed; are you authenticated?");
- window.location.reload();
- return;
- }
- }
-
- if (tF == null) {
- //console.log("none yet");
- alert("there are no saved texts yet");
- return;
- }
-
- if (screen.width > 992) {
- document.getElementById("siteTitle").innerHTML = "Template Gen";
- } else {
- document.getElementById("siteTitle").innerHTML = "TG";
- }
-
- //hide set Form button
- document.getElementById("setFormButton").style.display = "none";
-
- //reset page and event listeners
- let mainFormDiv = document.getElementById("mainForm");
- let outputDiv = document.getElementById("output");
- let submitContainerDiv = document.getElementById("submitContainer");
- let sidebarDiv = document.getElementById("sidebar");
-
- mainFormDiv.innerHTML = "";
- mainFormDiv.replaceWith(mainFormDiv.cloneNode(true));
- outputDiv.innerHTML = "";
- outputDiv.replaceWith(outputDiv.cloneNode(true));
- submitContainerDiv.innerHTML = "";
- submitContainerDiv.replaceWith(submitContainerDiv.cloneNode(true));
- sidebarDiv.innerHTML = "";
- sidebarDiv.replaceWith(sidebarDiv.cloneNode(true));
-
- document.getElementById("mainForm").innerHTML = mainFormPlaceholder();
-
- document.getElementById("sidebar").appendChild(loadFileSidebar(tF));
- document.getElementById("sidebar").addEventListener("click", (e) => {
- if (e.target && e.target.matches("li.w3-bar-item")) {
- let fileName = e.target.dataset.file;
- let template = e.target.dataset.template;
- clickLoadFileDiv(fileName, template);
- }
- });
-}
-
-function loadFileDiv(fileName, template) {
- activeState.fileName = fileName;
- activeState.loadedTemplate = template;
-
- storeData("userInputForce", retrieveData(fileName, template));
-
- loadTemplate(template, false, true);
-}
-
-function loadFileDivCallBack() {
- let tF = JSON.parse(retrieveData("templateFiles"));
- document.getElementById("sidebar").appendChild(loadFileSidebar(tF));
-
- let lT = activeState.loadedTemplate;
- let fN = activeState.fileName;
- let storageName = fN + "-" + lT;
-
- let fileDisplay = document.createElement("DIV");
- fileDisplay.classList.add(
- "w3-row-padding",
- "w3-padding-24",
- "w3-container",
- "w3-flat-clouds"
- );
- fileDisplay.id = "fileDisplayWrapper";
-
- //start building submitContainer with edit copy and delete
- let editButton = document.createElement("input");
- editButton.setAttribute("type", "submit");
- editButton.setAttribute("value", "Edit");
- editButton.classList.add("w3-button");
- editButton.classList.add("w3-grey");
- document.getElementById("submitContainer").appendChild(editButton);
-
- document
- .getElementById("submitContainer")
- .appendChild(document.createTextNode(" "));
-
- let copyButton = document.createElement("input");
- copyButton.setAttribute("type", "submit");
- copyButton.setAttribute("value", "Copy");
- copyButton.classList.add("w3-button");
- copyButton.classList.add("w3-grey");
- document.getElementById("submitContainer").appendChild(copyButton);
-
- document
- .getElementById("submitContainer")
- .appendChild(document.createTextNode(" "));
-
- let deleteButton = document.createElement("input");
- deleteButton.setAttribute("type", "submit");
- deleteButton.setAttribute("value", "Delete");
- deleteButton.classList.add("w3-button");
- deleteButton.classList.add("w3-red");
- document.getElementById("submitContainer").appendChild(deleteButton);
-
- if (screen.width > 992) {
- document.getElementById("siteTitle").innerHTML = lT.replace(/_/g, " ");
- } else {
- document.getElementById("siteTitle").innerHTML = "TG";
- }
-
-
- let title = document.createElement("div");
- title.classList.add("w3-panel");
- let titleText = document.createElement("h2");
- titleText.innerText = fN.replace(/_/g, " ");
- titleText.style.margin = "0px";
- title.appendChild(titleText);
- fileDisplay.appendChild(title);
-
- let div = document.createElement("div");
- div.appendChild(parseFormOnSubmit(false, true));
- fileDisplay.appendChild(div);
- document.getElementById("mainForm").appendChild(fileDisplay);
-
- //add events
- formEvts(storageName);
-}
-
-function clickLoadFileDiv(fileName, template) {
- document.getElementById("mainForm").innerHTML = "";
- loadFileDiv(fileName, template);
-}
-
-function clearFileData(storData) {
- let fileName = storData.split("-")[0];
-
- let tF = JSON.parse(retrieveData("templateFiles"));
- let newArray = [];
- for (let obj of tF) {
- if (obj.fileName != fileName) {
- newArray.push(obj);
- }
- }
- storeData("templateFiles", JSON.stringify(newArray));
-
- clearData(fileName);
- clearData("userInput");
-
- document.getElementById("mainForm").innerHTML = "";
- document.getElementById("output").innerHTML = "";
- document.getElementById("submitContainer").innerHTML = "";
- document.getElementById("sidebar").innerHTML = "";
- document.getElementById("mainForm").innerHTML = mainFormPlaceholder();
- document.getElementById("sidebar").appendChild(loadFileSidebar(newArray));
-}
-
-function loadFileSidebar(tF) {
- let sidebarList = document.createElement("ul");
- sidebarList.classList.add("w3-ul");
-
- for (let obj of tF) {
- let sidebarListItem = document.createElement("li");
- sidebarListItem.classList.add(
- "w3-bar-item",
- "w3-padding-large",
- "w3-button"
- );
- sidebarListItem.style.borderBottom = "1px solid #ddd";
- sidebarListItem.id = "sb-" + obj.fileName.replace(/:/g, "_");
- sidebarListItem.innerHTML =
- obj.fileName.replace(/_/g, " ") + " - " + obj.template.replace(/_/g, " ");
- sidebarListItem.setAttribute("data-file", obj.fileName);
- sidebarListItem.setAttribute("data-template", obj.template);
- sidebarList.appendChild(sidebarListItem);
- }
- return sidebarList;
-}
-
-function mainFormPlaceholder(msg = "Select a file") {
- return "";
-}
-
-function copyFileToClipboard() {
- const fileDisplay = document.getElementById("fileDisplay");
- if (fileDisplay != null) {
- copyToClipBoard(fileDisplay.innerHTML);
- } else {
- console.log("error file not found");
- }
-
-}
-
-function copyToClipBoard(html) {
- // Create an iframe (isolated container) for the HTML
- var container = document.createElement("div");
- container.innerHTML = html;
-
- // Hide element
- container.style.position = "fixed";
- container.style.pointerEvents = "none";
- container.style.opacity = 0;
-
- // Detect all style sheets of the page
- var activeSheets = Array.prototype.slice
- .call(document.styleSheets)
- .filter(function (sheet) {
- return !sheet.disabled;
- });
-
- // Mount the iframe to the DOM to make `contentWindow` available
- document.body.appendChild(container);
-
- // Copy to clipboard
- window.getSelection().removeAllRanges();
-
- var range = document.createRange();
- range.selectNode(container);
- window.getSelection().addRange(range);
-
- document.execCommand("copy");
- for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = true;
- document.execCommand("copy");
- for (var i = 0; i < activeSheets.length; i++)
- activeSheets[i].disabled = false;
-
- // Remove the iframe
- document.body.removeChild(container);
-}
-
-function formEvts(storageName) {
- //add event listener to submitContainer
- document.getElementById("submitContainer").addEventListener("click", (e) => {
- if (e.target && e.target.tagName === "INPUT") {
- switch (e.target.value) {
- case "Edit":
- loadSpecificTemplate(storageName);
- break;
- case "Copy":
- copyFileToClipboard();
- e.target.className = e.target.className.replace(" w3-grey", " w3-flat-carrot");
- e.target.style.pointerEvents = "none";
- const timeoutCopy = setTimeout(() => {
- e.target.className = e.target.className.replace(" w3-flat-carrot"," w3-grey");
- e.target.style.pointerEvents = "auto";
- }, 250);
- break;
- case "Delete":
- let previousFile = getPreviousFile(storageName);
- clearFileData(storageName);
- document.getElementById("mainForm").innerHTML = "";
- if (previousFile) {
- loadFileDiv(previousFile.fileName, previousFile.template);
- } else {
- document.getElementById("mainForm").innerHTML = mainFormPlaceholder("No file yet");
- }
-
- break;
- default:
- e.preventDefault;
- }
- }
- });
-}
-
-function loadSpecificTemplate(storageName) {
- storeData(
- "userInputForce",
- retrieveData(storageName.split("-")[0], storageName.split("-")[1])
- );
- loadTemplate(storageName.split("-")[1]);
-}
-
-function getPreviousFile(storageName) {
-
- let orgFileName = storageName.split("-")[0];
- let tF = JSON.parse(retrieveData("templateFiles"));
- let i = 0;
- let previousFile;
-
- for (let obj of tF) {
- if (obj.fileName == orgFileName) {
- previousFile = tF[i-1];
- break;
- }
- i++;
- }
-
- return (previousFile != undefined) ? previousFile : false;
-}
-
-export { buildFile, loadFileDivCallBack };
+import {
+ storeData,
+ clearData,
+ retrieveData,
+ createStorageObj,
+} from "./storage.js";
+import { loadTemplate } from "./web.js";
+import parseFormOnSubmit from "./parseForm.js";
+import { modalNotifier } from "./evts.js";
+
+function buildFile() {
+ createStorageObj();
+
+
+ //set current page value in activeState object
+ activeState.activePage = "files";
+
+ //set templateFiles array
+ let tF = JSON.parse(retrieveData("templateFiles"));
+
+ if (tF == null || tF.length == 0) {
+ //console.log("none yet");
+ modalNotifier("there are no saved texts yet");
+ return;
+ }
+
+
+ if (screen.width < 993) {
+ document.getElementById("siteTitle").innerHTML = "Saved files";
+ } else {
+ document.getElementById("siteTitle").innerHTML = "TG";
+ }
+
+ //hide set Form button
+ document.getElementById("setFormButton").style.display = "none";
+
+ //reset page and event listeners
+ let mainFormDiv = document.getElementById("mainForm");
+ let outputDiv = document.getElementById("output");
+ let submitContainerDiv = document.getElementById("submitContainer");
+ let sidebarDiv = document.getElementById("sidebar");
+
+ mainFormDiv.innerHTML = "";
+ mainFormDiv.replaceWith(mainFormDiv.cloneNode(true));
+ outputDiv.innerHTML = "";
+ outputDiv.replaceWith(outputDiv.cloneNode(true));
+ submitContainerDiv.innerHTML = "";
+ submitContainerDiv.replaceWith(submitContainerDiv.cloneNode(true));
+ sidebarDiv.innerHTML = "";
+ sidebarDiv.replaceWith(sidebarDiv.cloneNode(true));
+
+ document.getElementById("mainForm").innerHTML = mainFormPlaceholder();
+
+ document.getElementById("sidebar").appendChild(loadFileSidebar(tF));
+ document.getElementById("sidebar").addEventListener("click", (e) => {
+ if (e.target && e.target.matches("li.w3-bar-item")) {
+ let fileName = e.target.dataset.file;
+ let template = e.target.dataset.template;
+ clickLoadFileDiv(fileName, template);
+ }
+ });
+}
+
+function loadFileDiv(fileName, template) {
+ activeState.fileName = fileName;
+ activeState.loadedTemplate = template;
+
+ storeData("userInputForce", retrieveData(fileName, template));
+
+ loadTemplate(template, false, true);
+}
+
+function loadFileDivCallBack() {
+ let tF = JSON.parse(retrieveData("templateFiles"));
+ document.getElementById("sidebar").appendChild(loadFileSidebar(tF));
+
+ let lT = activeState.loadedTemplate;
+ let fN = activeState.fileName;
+ let storageName = fN + "_m21_" + lT;
+
+ let fileDisplay = document.createElement("DIV");
+ fileDisplay.classList.add(
+ "w3-row-padding",
+ "w3-padding-24",
+ "w3-container",
+ "w3-flat-clouds"
+ );
+ fileDisplay.id = "fileDisplayWrapper";
+
+ //start building submitContainer with edit copy and delete
+ let editButton = document.createElement("input");
+ editButton.setAttribute("type", "submit");
+ editButton.setAttribute("value", "Edit");
+ editButton.classList.add("w3-button");
+ editButton.classList.add("w3-grey");
+ document.getElementById("submitContainer").appendChild(editButton);
+
+ document
+ .getElementById("submitContainer")
+ .appendChild(document.createTextNode(" "));
+
+ let copyButton = document.createElement("input");
+ copyButton.setAttribute("type", "submit");
+ copyButton.setAttribute("value", "Copy");
+ copyButton.classList.add("w3-button");
+ copyButton.classList.add("w3-grey");
+ document.getElementById("submitContainer").appendChild(copyButton);
+
+ document
+ .getElementById("submitContainer")
+ .appendChild(document.createTextNode(" "));
+
+ let deleteButton = document.createElement("input");
+ deleteButton.setAttribute("type", "submit");
+ deleteButton.setAttribute("value", "Delete");
+ deleteButton.classList.add("w3-button");
+ deleteButton.classList.add("w3-red");
+ document.getElementById("submitContainer").appendChild(deleteButton);
+
+ if (screen.width > 992) {
+ document.getElementById("siteTitle").innerHTML = lT.replace(/_/g, " ");
+ } else {
+ document.getElementById("siteTitle").innerHTML = "TG";
+ }
+
+
+ let title = document.createElement("div");
+ title.classList.add("w3-panel");
+ let titleText = document.createElement("h2");
+ titleText.innerText = fN.replace(/_/g, " ");
+ titleText.style.margin = "0px";
+ title.appendChild(titleText);
+ fileDisplay.appendChild(title);
+
+ let div = document.createElement("div");
+ div.appendChild(parseFormOnSubmit(false, true));
+ fileDisplay.appendChild(div);
+ document.getElementById("mainForm").appendChild(fileDisplay);
+
+ //add events
+ formEvts(storageName);
+}
+
+function clickLoadFileDiv(fileName, template) {
+ if (fileName == "_overflow") return;
+
+ if (fileName == "_clearAll") {
+ clearAllFiles();
+ return;
+ }
+
+ document.getElementById("mainForm").innerHTML = "";
+ loadFileDiv(fileName, template);
+}
+
+function clearFileData(storData) {
+ let fileName = storData.split("_m21_")[0];
+
+ let tF = JSON.parse(retrieveData("templateFiles"));
+ let newArray = [];
+ for (let obj of tF) {
+ if (obj.fileName != fileName) {
+ newArray.push(obj);
+ }
+ }
+ storeData("templateFiles", JSON.stringify(newArray));
+
+ clearData(fileName);
+ clearData("userInput");
+
+ document.getElementById("mainForm").innerHTML = "";
+ document.getElementById("output").innerHTML = "";
+ document.getElementById("submitContainer").innerHTML = "";
+ document.getElementById("sidebar").innerHTML = "";
+ document.getElementById("mainForm").innerHTML = mainFormPlaceholder();
+ document.getElementById("sidebar").appendChild(loadFileSidebar(newArray));
+}
+
+function loadFileSidebar(tF) {
+ let sidebarList = document.createElement("ul");
+ sidebarList.classList.add("w3-ul");
+ let c = 0;
+ let sidebarItemsAmount = 10;
+ let sidebarListItem;
+ for (let obj of tF.reverse()) {
+ sidebarListItem = document.createElement("li");
+ sidebarListItem.classList.add(
+ "w3-bar-item",
+ "w3-padding-large",
+ "w3-button"
+ );
+ sidebarListItem.style.borderBottom = "1px solid #ddd";
+ sidebarListItem.id = "sb-" + obj.fileName.replace(/:/g, "_");
+
+ if (c > sidebarItemsAmount) {
+ sidebarListItem.setAttribute("data-template", '_overflow');
+ sidebarListItem.setAttribute("data-file", '_overflow');
+ sidebarListItem.classList.add("w3-flat-clouds");
+ sidebarListItem.classList.remove("w3-button");
+ sidebarListItem.style.borderRight = "1px solid rgb(221, 221, 221)"
+ sidebarListItem.innerHTML = tF.length - sidebarItemsAmount + " files not shown";
+ sidebarList.appendChild(sidebarListItem);
+ break;
+ }
+ sidebarListItem.innerHTML = obj.fileName.replace(/_/g, " ");
+ sidebarListItem.setAttribute("data-file", obj.fileName);
+ sidebarListItem.setAttribute("data-template", obj.template);
+ sidebarList.appendChild(sidebarListItem);
+ c++;
+ }
+
+ sidebarListItem = document.createElement("li");
+ sidebarListItem.classList.add(
+ "w3-bar-item",
+ "w3-padding-large",
+ "w3-button"
+ );
+ sidebarListItem.style.borderBottom = "1px solid #ddd";
+ sidebarListItem.setAttribute("data-template", '_clearAll');
+ sidebarListItem.setAttribute("data-file", '_clearAll');
+ sidebarListItem.classList.add("w3-flat-pomegranate", "w3-bottom");
+ sidebarListItem.style.borderRight = "1px solid rgb(221, 221, 221)";
+ sidebarListItem.style.width = "300px";
+ sidebarListItem.innerHTML = "Clear all files";
+ sidebarList.appendChild(sidebarListItem);
+
+ return sidebarList;
+}
+
+function mainFormPlaceholder(msg = "Select a file") {
+ return "";
+}
+
+function copyFileToClipboard() {
+ const fileDisplay = document.getElementById("fileDisplay");
+ if (fileDisplay != null) {
+ copyToClipBoard(fileDisplay.innerHTML);
+ } else {
+ console.log("error file not found");
+ }
+
+}
+
+function copyToClipBoard(html) {
+ // Create an iframe (isolated container) for the HTML
+ var container = document.createElement("div");
+ container.innerHTML = html;
+
+ // Hide element
+ container.style.position = "fixed";
+ container.style.pointerEvents = "none";
+ container.style.opacity = 0;
+
+ // Detect all style sheets of the page
+ var activeSheets = Array.prototype.slice
+ .call(document.styleSheets)
+ .filter(function (sheet) {
+ return !sheet.disabled;
+ });
+
+ // Mount the iframe to the DOM to make `contentWindow` available
+ document.body.appendChild(container);
+
+ // Copy to clipboard
+ window.getSelection().removeAllRanges();
+
+ var range = document.createRange();
+ range.selectNode(container);
+ window.getSelection().addRange(range);
+
+ document.execCommand("copy");
+ for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = true;
+ document.execCommand("copy");
+ for (var i = 0; i < activeSheets.length; i++)
+ activeSheets[i].disabled = false;
+
+ // Remove the iframe
+ document.body.removeChild(container);
+}
+
+function formEvts(storageName) {
+ //add event listener to submitContainer
+ document.getElementById("submitContainer").addEventListener("click", (e) => {
+ if (e.target && e.target.tagName === "INPUT") {
+ switch (e.target.value) {
+ case "Edit":
+ loadSpecificTemplate(storageName);
+ break;
+ case "Copy":
+ copyFileToClipboard();
+ e.target.className = e.target.className.replace(" w3-grey", " w3-flat-carrot");
+ e.target.style.pointerEvents = "none";
+ const timeoutCopy = setTimeout(() => {
+ e.target.className = e.target.className.replace(" w3-flat-carrot"," w3-grey");
+ e.target.style.pointerEvents = "auto";
+ }, 250);
+ break;
+ case "Delete":
+ let previousFile = getPreviousFile(storageName);
+ clearFileData(storageName);
+ document.getElementById("mainForm").innerHTML = "";
+ if (previousFile) {
+ loadFileDiv(previousFile.fileName, previousFile.template);
+ } else {
+ document.getElementById("mainForm").innerHTML = mainFormPlaceholder("No file yet");
+ }
+
+ break;
+ default:
+ e.preventDefault;
+ }
+ }
+ });
+}
+
+function loadSpecificTemplate(storageName) {
+ storeData(
+ "userInputForce",
+ retrieveData(storageName.split("_m21_")[0], storageName.split("_m21_")[1])
+ );
+ //reset sidebar to clear events
+ let sidebarDiv = document.getElementById("sidebar");
+ sidebarDiv.replaceWith(sidebarDiv.cloneNode(true));
+ loadTemplate(storageName.split("_m21_")[1]);
+}
+
+function getPreviousFile(storageName) {
+
+ let orgFileName = storageName.split("_m21_")[0];
+ let tF = JSON.parse(retrieveData("templateFiles"));
+ let i = 0;
+ let previousFile;
+
+ for (let obj of tF) {
+ if (obj.fileName == orgFileName) {
+ previousFile = tF[i-1];
+ if (previousFile === undefined) {
+ //get the next one if there is no previous one
+ previousFile = tF[i+1];
+ }
+ break;
+ }
+ i++;
+ }
+
+ return (previousFile != undefined) ? previousFile : false;
+}
+
+function clearAllFiles() {
+ let tF = JSON.parse(retrieveData("templateFiles"));
+ if (tF == null || tF.length == 0) {
+ modalNotifier("there are no saved texts yet");
+ return;
+ }
+ for (let storageName of tF) {
+ clearFileData(storageName.fileName);
+ }
+}
+
+export { buildFile, loadFileDivCallBack };
diff --git a/js/9.2/form.js b/js/9.9.6/form.js
similarity index 92%
rename from js/9.2/form.js
rename to js/9.9.6/form.js
index 6aca279..09b9b80 100644
--- a/js/9.2/form.js
+++ b/js/9.9.6/form.js
@@ -1,296 +1,290 @@
-//class Form {
-// constructor () {
-// this.buildForm = buildForm;
-// this.retrieveForm = retrieveForm;
-// }
-//
-//
-//
-//}
-
-import { storeData, createStorageObj } from "./storage.js";
-import parseInput from "./parseTemplate.js";
-import transformTemplateObject from "./buildForm.js";
-import { showSidebar, handleOnBlur } from "./evts.js";
-import parseFormOnSubmit, { parseTextMarkups } from "./parseForm.js";
-
-function buildForm(templateInput, loadOnly = false) {
- var wordArray = [];
-
- //display set Form button
- document.getElementById("setFormButton").style.display = "block";
-
- //check for presets in "-form.txt" file; indicated by !JSON_placeholder
- if (templateInput.indexOf("!JSON_placeholder:") !== -1) {
- let jsonPlaceholder = templateInput.split("!JSON_placeholder:")[1];
- templateInput = templateInput.split("!JSON_placeholder:")[0];
- storeData("templatePreset", jsonPlaceholder);
- }
- //start building wordArray by splitting input by line win/unix and define eol char for recreating templateInput
- let eol;
- if (templateInput.indexOf("\r\n") !== -1) {
- eol = false;
- var wordArrayByLine = templateInput.split("\r\n");
- } else {
- eol = true;
- var wordArrayByLine = templateInput.split("\n");
- }
- //finish building wordArray by Looping through lines and spliting it into one array of words
- //also create temporary templateInput to exclude comments
- let templateInputArr = [];
- for (let wordArrayByLineLine of wordArrayByLine) {
- //ignore "#" comment lines
- if (wordArrayByLineLine.substring(0, 1) == "#") {
- continue;
- }
-
- //add words ob lines to wordArray
- wordArray = wordArray.concat(wordArrayByLineLine.split(" "));
- //add line to temp templatearray
- templateInputArr.push(wordArrayByLineLine);
- }
-
- //create templateInput without comments
- templateInput = templateInputArr.join(eol ? "\n" : "\r\n");
-
- //parse text markups like !l !n in templateInput
- templateInput = parseTextMarkups(templateInput);
-
- //set objects array for parseInput Function
- var objects = [];
- //loop through words, parse it individually and add it to objects array
-
-
- for (let i = 0; i < wordArray.length; i++) {
- parseInput(wordArray, objects, i);
- //console.log(wordArray[i]);
- }
-
- //set individual positionens of objects in string and add it to objects
- setStringPos(objects, templateInput);
-
- //save objects array and template file string for web.js in session storage
- window.sessionStorage.setItem("templateObjects", JSON.stringify(objects));
- window.sessionStorage.setItem("fullString", templateInput);
-
- //sort objects array by words prio
- objects = prioritizeArray(objects);
-
- //remove non display objects and safe it to session storage
- let objectsPurified = purifyObjects(objects);
- window.sessionStorage.setItem(
- "templateObjectsPurified",
- JSON.stringify(objectsPurified)
- );
-
- //reset page and event listeners
- let mainFormDiv = document.getElementById("mainForm");
- let outputDiv = document.getElementById("output");
- let submitContainerDiv = document.getElementById("submitContainer");
- let sidebarDiv = document.getElementById("sidebar");
- //sidebarDiv.replaceWith(sidebarDiv.cloneNode(true));
-
- mainFormDiv.innerHTML = "";
- mainFormDiv.replaceWith(mainFormDiv.cloneNode(true));
- outputDiv.innerHTML = "";
- outputDiv.replaceWith(outputDiv.cloneNode(true));
- submitContainerDiv.innerHTML = "";
- submitContainerDiv.replaceWith(submitContainerDiv.cloneNode(true));
- sidebarDiv.innerHTML = "";
-
- //finally build html code for Form and siddebar and add it to dom if needed
- if (loadOnly) {return};
-
- transformTemplateObject(objectsPurified);
- //add events
- formEvts();
-}
-
-function prioritizeArray(objects) {
- let prioArray = [];
- let objects_sorted = [];
-
- for (let valPreSorted of objects) {
- prioArray.push(valPreSorted.prio);
- }
- prioArray.sort(function (a, b) {
- return a - b;
- });
- //console.log(prioArray);
- for (let valSorted of prioArray) {
- for (let obj of objects) {
- if (valSorted === obj.prio) {
- objects_sorted.push(obj);
- if (obj.prio !== 0) {
- break;
- }
- }
- }
- }
- return objects_sorted;
-}
-
-function purifyObjects(objects) {
- let objectsPurified = [];
- let objectsPrePurified = [];
- for (let objPrePurified of objects) {
- if (!objectsPrePurified.includes(objPrePurified.word)) {
- objectsPurified.push(objPrePurified);
- }
- objectsPrePurified.push(objPrePurified.word);
- }
- return objectsPurified;
-}
-
-function setStringPos(objects, fullStringMaster) {
- let stringCursor = 0;
- let startPos = 0;
- let endPos = 0;
- let fullString = "";
- for (let obj of objects) {
- fullString = fullStringMaster.substring(stringCursor);
- if (fullString.indexOf("%" + obj.word) !== -1) {
- startPos = 0;
- endPos = 0;
- startPos = fullString.indexOf("%" + obj.word) + stringCursor;
- let objPrioLength = 1;
- if (obj.prio > 9) {
- objPrioLength = 2;
- }
- if (obj.prio == 0) {
- objPrioLength = 0;
- }
-
- switch (obj.type) {
- case "simpleInput":
- endPos = startPos + 2 + obj.word.length + objPrioLength;
- break;
- case "genderSpecific":
- let gSC = 0;
- if (typeof obj.m !== "undefined") {
- gSC = gSC + obj.m.length + 3;
- }
- if (typeof obj.w !== "undefined") {
- gSC = gSC + obj.w.length + 3;
- }
- if (typeof obj.d !== "undefined") {
- gSC = gSC + obj.d.length + 3;
- }
- endPos = startPos + 2 + gSC + objPrioLength + obj.word.length + 1;
- break;
- case "list":
- let gSC1 = 0;
- for (
- let objListItem = 0;
- objListItem < obj.listCount + 1;
- objListItem++
- ) {
- if (typeof obj[objListItem] !== "undefined") {
- gSC1 = gSC1 + obj[objListItem].length + 3;
- }
- }
- endPos = startPos + 2 + gSC1 + objPrioLength + obj.word.length + 1;
- break;
- case "conList":
- let gSC2 = 0;
- for (
- let objListItem = 0;
- objListItem < obj.listCount + 1;
- objListItem++
- ) {
- if (typeof obj[objListItem] !== "undefined") {
- gSC2 = gSC2 + obj[objListItem].length + obj["clType-"+obj[objListItem]].length + 4;
- if (obj["clType-"+obj[objListItem]] == "cl-simpleInput") {
- gSC2 = gSC2 - obj["clType-"+obj[objListItem]].length;
- }
- }
- }
- endPos = startPos + 2 + gSC2 + objPrioLength + obj.word.length + 1;
- break;
- default:
- endPos =
- startPos +
- 2 +
- obj.word.length +
- 1 +
- obj.type.length +
- objPrioLength;
- break;
- }
- obj.spos = startPos;
- obj.epos = endPos;
- stringCursor = endPos;
- }
- }
-}
-
-function formEvts() {
- //add event for main copy button
- document.getElementById("submitContainer").addEventListener("click", (e) => {
- if (e.target && e.target.tagName === "INPUT") {
- switch (e.target.value) {
- case "Copy":
- createStorageObj();
- parseFormOnSubmit();
- e.target.className = e.target.className.replace(" w3-grey", " w3-flat-carrot");
- e.target.style.pointerEvents = "none";
- const timeoutCopy = setTimeout(() => {
- e.target.className = e.target.className.replace(" w3-flat-carrot"," w3-grey");
- e.target.style.pointerEvents = "auto";
- }, 250);
- break;
- case "Save":
- createStorageObj();
- e.target.className = e.target.className.replace(" w3-grey", " w3-flat-nephritis");
- e.target.style.pointerEvents = "none";
- const timeoutSave = setTimeout(() => {
- e.target.className = e.target.className.replace(" w3-flat-nephritis"," w3-grey");
- e.target.style.pointerEvents = "auto";
- }, 250);
- break;
- default:
- e.preventDefault;
- }
- }
- });
-
- //add sidebar events
- document.getElementById("sidebar").addEventListener("click", (e) => {
- if (e.target) {
- if (e.target.id == "sb-submit") {
- if (screen.width < 993) {
- showSidebar();
- }
- parseFormOnSubmit();
- focusOnField("output");
- }
- if (e.target.id == "sb-item") {
- setTimeout(() => {
- focusOnField(e.target.dataset.item);
- }, 100);
- }
- }
- });
-
- //add handle on blur event listener
- document.getElementById("mainForm").addEventListener("click", (e) => {
- if (e.target && e.target.matches("div.w3-section")) {
- e.preventDefault;
- handleOnBlur(e.target);
- }
- });
-}
-
-function focusOnField(id) {
- let targetElement = document.getElementById(id);
- if (targetElement == null) return;
-
- document.activeElement.blur();
- targetElement.focus();
- setTimeout(function () {
- let offset = targetElement.offsetTop - 100;
- window.scrollTo(0, offset);
- }, 100);
-}
-
-export default buildForm;
+
+import { storeData, createStorageObj } from "./storage.js";
+import parseInput from "./parseTemplate.js";
+import transformTemplateObject from "./buildForm.js";
+import { showSidebar, handleOnBlur, modalNotifier } from "./evts.js";
+import parseFormOnSubmit, { parseTextMarkups } from "./parseForm.js";
+
+function buildForm(templateInput, loadOnly = false) {
+ var wordArray = [];
+
+ //display set Form button
+ document.getElementById("setFormButton").style.display = "block";
+
+ //check for presets in "-form.txt" file; indicated by !JSON_placeholder
+ if (templateInput.indexOf("!JSON_placeholder:") !== -1) {
+ let jsonPlaceholder = templateInput.split("!JSON_placeholder:")[1];
+ templateInput = templateInput.split("!JSON_placeholder:")[0];
+ storeData("templatePreset", jsonPlaceholder);
+ }
+ //start building wordArray by splitting input by line win/unix and define eol char for recreating templateInput
+ let eol;
+ if (templateInput.indexOf("\r\n") !== -1) {
+ eol = false;
+ var wordArrayByLine = templateInput.split("\r\n");
+ } else {
+ eol = true;
+ var wordArrayByLine = templateInput.split("\n");
+ }
+ //finish building wordArray by Looping through lines and spliting it into one array of words
+ //also create temporary templateInput to exclude comments
+ let templateInputArr = [];
+ for (let wordArrayByLineLine of wordArrayByLine) {
+ //ignore "#" comment lines
+ if (wordArrayByLineLine.substring(0, 1) == "#") {
+ continue;
+ }
+
+ //add words ob lines to wordArray
+ wordArray = wordArray.concat(wordArrayByLineLine.split(" "));
+ //add line to temp templatearray
+ templateInputArr.push(wordArrayByLineLine);
+ }
+
+ //create templateInput without comments
+ templateInput = templateInputArr.join(eol ? "\n" : "\r\n");
+
+ //parse text markups like !l !n in templateInput
+ templateInput = parseTextMarkups(templateInput);
+
+ //set objects array for parseInput Function
+ var objects = [];
+ //loop through words, parse it individually and add it to objects array
+
+
+ for (let i = 0; i < wordArray.length; i++) {
+ parseInput(wordArray, objects, i);
+ //console.log(wordArray[i]);
+ }
+
+ //set individual positionens of objects in string and add it to objects
+ setStringPos(objects, templateInput);
+
+ //save objects array and template file string for web.js in session storage
+ window.sessionStorage.setItem("templateObjects", JSON.stringify(objects));
+ window.sessionStorage.setItem("fullString", templateInput);
+
+ //sort objects array by words prio
+ objects = prioritizeArray(objects);
+
+ //remove non display objects and safe it to session storage
+ let objectsPurified = purifyObjects(objects);
+ window.sessionStorage.setItem(
+ "templateObjectsPurified",
+ JSON.stringify(objectsPurified)
+ );
+
+ //reset page and event listeners
+ let mainFormDiv = document.getElementById("mainForm");
+ let outputDiv = document.getElementById("output");
+ let submitContainerDiv = document.getElementById("submitContainer");
+ let sidebarDiv = document.getElementById("sidebar");
+ //sidebarDiv.replaceWith(sidebarDiv.cloneNode(true));
+
+ mainFormDiv.innerHTML = "";
+ mainFormDiv.replaceWith(mainFormDiv.cloneNode(true));
+ outputDiv.innerHTML = "";
+ outputDiv.replaceWith(outputDiv.cloneNode(true));
+ submitContainerDiv.innerHTML = "";
+ submitContainerDiv.replaceWith(submitContainerDiv.cloneNode(true));
+ sidebarDiv.innerHTML = "";
+
+ //finally build html code for Form and siddebar and add it to dom if needed
+ if (loadOnly) {return};
+
+ transformTemplateObject(objectsPurified);
+ //add events
+ formEvts();
+}
+
+function prioritizeArray(objects) {
+ let prioArray = [];
+ let objects_sorted = [];
+
+ for (let valPreSorted of objects) {
+ prioArray.push(valPreSorted.prio);
+ }
+ prioArray.sort(function (a, b) {
+ return a - b;
+ });
+ //console.log(prioArray);
+ for (let valSorted of prioArray) {
+ for (let obj of objects) {
+ if (valSorted === obj.prio) {
+ objects_sorted.push(obj);
+ if (obj.prio !== 0) {
+ break;
+ }
+ }
+ }
+ }
+ return objects_sorted;
+}
+
+function purifyObjects(objects) {
+ let objectsPurified = [];
+ let objectsPrePurified = [];
+ for (let objPrePurified of objects) {
+ if (!objectsPrePurified.includes(objPrePurified.word)) {
+ objectsPurified.push(objPrePurified);
+ }
+ objectsPrePurified.push(objPrePurified.word);
+ }
+ return objectsPurified;
+}
+
+function setStringPos(objects, fullStringMaster) {
+ let stringCursor = 0;
+ let startPos = 0;
+ let endPos = 0;
+ let fullString = "";
+ for (let obj of objects) {
+ fullString = fullStringMaster.substring(stringCursor);
+ if (fullString.indexOf("%" + obj.word) !== -1) {
+ startPos = 0;
+ endPos = 0;
+ startPos = fullString.indexOf("%" + obj.word) + stringCursor;
+ let objPrioLength = 1;
+ if (obj.prio > 9) {
+ objPrioLength = 2;
+ }
+ if (obj.prio == 0) {
+ objPrioLength = 0;
+ }
+
+ switch (obj.type) {
+ case "simpleInput":
+ endPos = startPos + 2 + obj.word.length + objPrioLength;
+ break;
+ case "genderSpecific":
+ let gSC = 0;
+ if (typeof obj.m !== "undefined") {
+ gSC = gSC + obj.m.length + 3;
+ }
+ if (typeof obj.w !== "undefined") {
+ gSC = gSC + obj.w.length + 3;
+ }
+ if (typeof obj.d !== "undefined") {
+ gSC = gSC + obj.d.length + 3;
+ }
+ endPos = startPos + 2 + gSC + objPrioLength + obj.word.length + 1;
+ break;
+ case "list":
+ let gSC1 = 0;
+ for (
+ let objListItem = 0;
+ objListItem < obj.listCount + 1;
+ objListItem++
+ ) {
+ if (typeof obj[objListItem] !== "undefined") {
+ gSC1 = gSC1 + obj[objListItem].length + 3;
+ }
+ }
+ endPos = startPos + 2 + gSC1 + objPrioLength + obj.word.length + 1;
+ break;
+ case "conList":
+ let gSC2 = 0;
+ for (
+ let objListItem = 0;
+ objListItem < obj.listCount + 1;
+ objListItem++
+ ) {
+ if (typeof obj[objListItem] !== "undefined") {
+ gSC2 = gSC2 + obj[objListItem].length + obj["clType-"+obj[objListItem]].length + 4;
+ if (obj["clType-"+obj[objListItem]] == "cl-simpleInput") {
+ gSC2 = gSC2 - obj["clType-"+obj[objListItem]].length;
+ }
+ }
+ }
+ endPos = startPos + 2 + gSC2 + objPrioLength + obj.word.length + 1;
+ break;
+ default:
+ endPos =
+ startPos +
+ 2 +
+ obj.word.length +
+ 1 +
+ obj.type.length +
+ objPrioLength;
+ break;
+ }
+ obj.spos = startPos;
+ obj.epos = endPos;
+ stringCursor = endPos;
+ }
+ }
+}
+
+function formEvts() {
+ //add event for main copy button
+ document.getElementById("submitContainer").addEventListener("click", (e) => {
+ if (e.target && e.target.tagName === "INPUT") {
+ switch (e.target.value) {
+ case "Copy":
+ createStorageObj();
+ parseFormOnSubmit();
+ e.target.className = e.target.className.replace(" w3-grey", " w3-flat-carrot");
+ e.target.style.pointerEvents = "none";
+ const timeoutCopy = setTimeout(() => {
+ e.target.className = e.target.className.replace(" w3-flat-carrot"," w3-grey");
+ e.target.style.pointerEvents = "auto";
+ }, 250);
+ break;
+ case "Save":
+ createStorageObj();
+ e.target.className = e.target.className.replace(" w3-grey", " w3-flat-nephritis");
+ e.target.style.pointerEvents = "none";
+ modalNotifier(activeState.fileName + " saved", 2);
+ const timeoutSave = setTimeout(() => {
+ e.target.className = e.target.className.replace(" w3-flat-nephritis"," w3-grey");
+ e.target.style.pointerEvents = "auto";
+ }, 250);
+ break;
+ default:
+ e.preventDefault;
+ }
+ }
+ });
+
+ //add sidebar events
+ document.getElementById("sidebar").addEventListener("click", (e) => {
+ if (e.target) {
+ if (e.target.id == "sb-submit") {
+ if (screen.width < 993) {
+ showSidebar();
+ }
+ parseFormOnSubmit();
+ focusOnField("output");
+ }
+ if (e.target.id == "sb-item") {
+ setTimeout(() => {
+ focusOnField(e.target.dataset.item);
+ }, 100);
+ }
+ }
+ });
+
+ //add handle on blur event listener to each form object
+ let mainForm = document.getElementById("mainFormObj");
+ for (let formElement of mainForm.children) {
+ let id = formElement.firstChild.lastChild.id;
+ document.getElementById(id).addEventListener("blur", (e) => {
+ e.preventDefault;
+ handleOnBlur(e.target);
+ });
+ }
+}
+
+function focusOnField(id) {
+ let targetElement = document.getElementById(id);
+ if (targetElement == null) return;
+
+ document.activeElement.blur();
+ targetElement.focus();
+ setTimeout(function () {
+ let offset = targetElement.offsetTop - 100;
+ window.scrollTo(0, offset);
+ }, 100);
+}
+
+export default buildForm;
diff --git a/js/9.2/identify.js b/js/9.9.6/identify.js
similarity index 96%
rename from js/9.2/identify.js
rename to js/9.9.6/identify.js
index 6a40e5c..55d4687 100644
--- a/js/9.2/identify.js
+++ b/js/9.9.6/identify.js
@@ -1,247 +1,247 @@
-const getBrowserFingerprint = ({ hardwareOnly = false, enableWebgl = false, debug = false } = {}) => {
- const devicePixelRatio = +parseInt(window.devicePixelRatio);
-
- const {
- appName,
- appCodeName,
- appVersion,
- cookieEnabled,
- deviceMemory,
- doNotTrack,
- hardwareConcurrency,
- language,
- languages,
- maxTouchPoints,
- platform,
- product,
- productSub,
- userAgent,
- vendor,
- vendorSub,
- } = window.navigator;
-
- const { width, height, colorDepth, pixelDepth } = window.screen;
- const timezoneOffset = new Date().getTimezoneOffset();
- const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
- const touchSupport = 'ontouchstart' in window;
-
- const canvas = getCanvasID(debug);
- const webgl = enableWebgl ? getWebglID(debug) : undefined; // undefined will remove this from the stringify down here
- const webglInfo = enableWebgl ? getWebglInfo(debug) : undefined; // undefined will remove this from the stringify down here
-
- const data = hardwareOnly
- ? JSON.stringify({
- canvas,
- colorDepth,
- deviceMemory,
- devicePixelRatio,
- hardwareConcurrency,
- height,
- maxTouchPoints,
- pixelDepth,
- platform,
- touchSupport,
- webgl,
- webglInfo,
- width,
- })
- : JSON.stringify({
- appCodeName,
- appName,
- appVersion,
- canvas,
- colorDepth,
- cookieEnabled,
- deviceMemory,
- devicePixelRatio,
- doNotTrack,
- hardwareConcurrency,
- height,
- language,
- languages,
- maxTouchPoints,
- pixelDepth,
- platform,
- product,
- productSub,
- timezone,
- timezoneOffset,
- touchSupport,
- userAgent,
- vendor,
- vendorSub,
- webgl,
- webglInfo,
- width,
- });
-
- const datastring = JSON.stringify(data, null, 4);
-
- if (debug) console.log('fingerprint data', datastring);
-
- const result = murmurhash3_32_gc(datastring);
- return result;
-};
-
-export const getCanvasID = (debug) => {
- try {
- const canvas = document.createElement('canvas');
- const ctx = canvas.getContext('2d');
- const text = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~1!2@3#4$5%6^7&8*9(0)-_=+[{]}|;:',<.>/?";
- ctx.textBaseline = 'top';
- ctx.font = "14px 'Arial'";
- ctx.textBaseline = 'alphabetic';
- ctx.fillStyle = '#f60';
- ctx.fillRect(125, 1, 62, 20);
- ctx.fillStyle = '#069';
- ctx.fillText(text, 2, 15);
- ctx.fillStyle = 'rgba(102, 204, 0, 0.7)';
- ctx.fillText(text, 4, 17);
-
- const result = canvas.toDataURL();
-
- if (debug) {
- document.body.appendChild(canvas);
- } else {
- ctx.clearRect(0, 0, canvas.width, canvas.height);
- }
-
- return murmurhash3_32_gc(result);
- } catch {
- return null;
- }
-};
-
-export const getWebglID = (debug) => {
- try {
- const canvas = document.createElement('canvas');
- const ctx = canvas.getContext('webgl');
- canvas.width = 256;
- canvas.height = 128;
-
- const f =
- 'attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate=attrVertex+uniformOffset;gl_Position=vec4(attrVertex,0,1);}';
- const g = 'precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor=vec4(varyinTexCoordinate,0,1);}';
- const h = ctx.createBuffer();
-
- ctx.bindBuffer(ctx.ARRAY_BUFFER, h);
-
- const i = new Float32Array([-0.2, -0.9, 0, 0.4, -0.26, 0, 0, 0.7321, 0]);
-
- ctx.bufferData(ctx.ARRAY_BUFFER, i, ctx.STATIC_DRAW), (h.itemSize = 3), (h.numItems = 3);
-
- const j = ctx.createProgram();
- const k = ctx.createShader(ctx.VERTEX_SHADER);
-
- ctx.shaderSource(k, f);
- ctx.compileShader(k);
-
- const l = ctx.createShader(ctx.FRAGMENT_SHADER);
-
- ctx.shaderSource(l, g);
- ctx.compileShader(l);
- ctx.attachShader(j, k);
- ctx.attachShader(j, l);
- ctx.linkProgram(j);
- ctx.useProgram(j);
-
- j.vertexPosAttrib = ctx.getAttribLocation(j, 'attrVertex');
- j.offsetUniform = ctx.getUniformLocation(j, 'uniformOffset');
-
- ctx.enableVertexAttribArray(j.vertexPosArray);
- ctx.vertexAttribPointer(j.vertexPosAttrib, h.itemSize, ctx.FLOAT, !1, 0, 0);
- ctx.uniform2f(j.offsetUniform, 1, 1);
- ctx.drawArrays(ctx.TRIANGLE_STRIP, 0, h.numItems);
-
- const n = new Uint8Array(canvas.width * canvas.height * 4);
- ctx.readPixels(0, 0, canvas.width, canvas.height, ctx.RGBA, ctx.UNSIGNED_BYTE, n);
-
- const result = JSON.stringify(n).replace(/,?"[0-9]+":/g, '');
-
- if (debug) {
- document.body.appendChild(canvas);
- } else {
- ctx.clear(ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT | ctx.STENCIL_BUFFER_BIT);
- }
-
- return murmurhash3_32_gc(result);
- } catch {
- return null;
- }
-};
-
-export const getWebglInfo = () => {
- try {
- const ctx = document.createElement('canvas').getContext('webgl');
-
- const result = {
- VERSION: ctx.getParameter(ctx.VERSION),
- SHADING_LANGUAGE_VERSION: ctx.getParameter(ctx.SHADING_LANGUAGE_VERSION),
- VENDOR: ctx.getParameter(ctx.VENDOR),
- SUPORTED_EXTENSIONS: ctx.getSupportedExtensions(),
- };
-
- return result;
- } catch {
- return null;
- }
-};
-
-export const murmurhash3_32_gc = (key) => {
- const remainder = key.length & 3; // key.length % 4
- const bytes = key.length - remainder;
- const c1 = 0xcc9e2d51;
- const c2 = 0x1b873593;
-
- let h1, h1b, k1;
-
- for (let i = 0; i < bytes; i++) {
- k1 = (key.charCodeAt(i) & 0xff) | ((key.charCodeAt(++i) & 0xff) << 8) | ((key.charCodeAt(++i) & 0xff) << 16) | ((key.charCodeAt(++i) & 0xff) << 24);
- ++i;
-
- k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;
- k1 = (k1 << 15) | (k1 >>> 17);
- k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;
-
- h1 ^= k1;
- h1 = (h1 << 13) | (h1 >>> 19);
- h1b = ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & 0xffffffff;
- h1 = (h1b & 0xffff) + 0x6b64 + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16);
- }
-
- const i = bytes - 1;
-
- k1 = 0;
-
- switch (remainder) {
- case 3: {
- k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;
- break;
- }
- case 2: {
- k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;
- break;
- }
- case 1: {
- k1 ^= key.charCodeAt(i) & 0xff;
- break;
- }
- }
-
- k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;
- k1 = (k1 << 15) | (k1 >>> 17);
- k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;
- h1 ^= k1;
-
- h1 ^= key.length;
-
- h1 ^= h1 >>> 16;
- h1 = ((h1 & 0xffff) * 0x85ebca6b + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;
- h1 ^= h1 >>> 13;
- h1 = ((h1 & 0xffff) * 0xc2b2ae35 + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) & 0xffffffff;
- h1 ^= h1 >>> 16;
-
- return h1 >>> 0;
-};
-
-export default getBrowserFingerprint;
+const getBrowserFingerprint = ({ hardwareOnly = false, enableWebgl = false, debug = false } = {}) => {
+ const devicePixelRatio = +parseInt(window.devicePixelRatio);
+
+ const {
+ appName,
+ appCodeName,
+ appVersion,
+ cookieEnabled,
+ deviceMemory,
+ doNotTrack,
+ hardwareConcurrency,
+ language,
+ languages,
+ maxTouchPoints,
+ platform,
+ product,
+ productSub,
+ userAgent,
+ vendor,
+ vendorSub,
+ } = window.navigator;
+
+ const { width, height, colorDepth, pixelDepth } = window.screen;
+ const timezoneOffset = new Date().getTimezoneOffset();
+ const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
+ const touchSupport = 'ontouchstart' in window;
+
+ const canvas = getCanvasID(debug);
+ const webgl = enableWebgl ? getWebglID(debug) : undefined; // undefined will remove this from the stringify down here
+ const webglInfo = enableWebgl ? getWebglInfo(debug) : undefined; // undefined will remove this from the stringify down here
+
+ const data = hardwareOnly
+ ? JSON.stringify({
+ canvas,
+ colorDepth,
+ deviceMemory,
+ devicePixelRatio,
+ hardwareConcurrency,
+ height,
+ maxTouchPoints,
+ pixelDepth,
+ platform,
+ touchSupport,
+ webgl,
+ webglInfo,
+ width,
+ })
+ : JSON.stringify({
+ appCodeName,
+ appName,
+ appVersion,
+ canvas,
+ colorDepth,
+ cookieEnabled,
+ deviceMemory,
+ devicePixelRatio,
+ doNotTrack,
+ hardwareConcurrency,
+ height,
+ language,
+ languages,
+ maxTouchPoints,
+ pixelDepth,
+ platform,
+ product,
+ productSub,
+ timezone,
+ timezoneOffset,
+ touchSupport,
+ userAgent,
+ vendor,
+ vendorSub,
+ webgl,
+ webglInfo,
+ width,
+ });
+
+ const datastring = JSON.stringify(data, null, 4);
+
+ if (debug) console.log('fingerprint data', datastring);
+
+ const result = murmurhash3_32_gc(datastring);
+ return result;
+};
+
+export const getCanvasID = (debug) => {
+ try {
+ const canvas = document.createElement('canvas');
+ const ctx = canvas.getContext('2d');
+ const text = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~1!2@3#4$5%6^7&8*9(0)-_=+[{]}|;:',<.>/?";
+ ctx.textBaseline = 'top';
+ ctx.font = "14px 'Arial'";
+ ctx.textBaseline = 'alphabetic';
+ ctx.fillStyle = '#f60';
+ ctx.fillRect(125, 1, 62, 20);
+ ctx.fillStyle = '#069';
+ ctx.fillText(text, 2, 15);
+ ctx.fillStyle = 'rgba(102, 204, 0, 0.7)';
+ ctx.fillText(text, 4, 17);
+
+ const result = canvas.toDataURL();
+
+ if (debug) {
+ document.body.appendChild(canvas);
+ } else {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ }
+
+ return murmurhash3_32_gc(result);
+ } catch {
+ return null;
+ }
+};
+
+export const getWebglID = (debug) => {
+ try {
+ const canvas = document.createElement('canvas');
+ const ctx = canvas.getContext('webgl');
+ canvas.width = 256;
+ canvas.height = 128;
+
+ const f =
+ 'attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate=attrVertex+uniformOffset;gl_Position=vec4(attrVertex,0,1);}';
+ const g = 'precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor=vec4(varyinTexCoordinate,0,1);}';
+ const h = ctx.createBuffer();
+
+ ctx.bindBuffer(ctx.ARRAY_BUFFER, h);
+
+ const i = new Float32Array([-0.2, -0.9, 0, 0.4, -0.26, 0, 0, 0.7321, 0]);
+
+ ctx.bufferData(ctx.ARRAY_BUFFER, i, ctx.STATIC_DRAW), (h.itemSize = 3), (h.numItems = 3);
+
+ const j = ctx.createProgram();
+ const k = ctx.createShader(ctx.VERTEX_SHADER);
+
+ ctx.shaderSource(k, f);
+ ctx.compileShader(k);
+
+ const l = ctx.createShader(ctx.FRAGMENT_SHADER);
+
+ ctx.shaderSource(l, g);
+ ctx.compileShader(l);
+ ctx.attachShader(j, k);
+ ctx.attachShader(j, l);
+ ctx.linkProgram(j);
+ ctx.useProgram(j);
+
+ j.vertexPosAttrib = ctx.getAttribLocation(j, 'attrVertex');
+ j.offsetUniform = ctx.getUniformLocation(j, 'uniformOffset');
+
+ ctx.enableVertexAttribArray(j.vertexPosArray);
+ ctx.vertexAttribPointer(j.vertexPosAttrib, h.itemSize, ctx.FLOAT, !1, 0, 0);
+ ctx.uniform2f(j.offsetUniform, 1, 1);
+ ctx.drawArrays(ctx.TRIANGLE_STRIP, 0, h.numItems);
+
+ const n = new Uint8Array(canvas.width * canvas.height * 4);
+ ctx.readPixels(0, 0, canvas.width, canvas.height, ctx.RGBA, ctx.UNSIGNED_BYTE, n);
+
+ const result = JSON.stringify(n).replace(/,?"[0-9]+":/g, '');
+
+ if (debug) {
+ document.body.appendChild(canvas);
+ } else {
+ ctx.clear(ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT | ctx.STENCIL_BUFFER_BIT);
+ }
+
+ return murmurhash3_32_gc(result);
+ } catch {
+ return null;
+ }
+};
+
+export const getWebglInfo = () => {
+ try {
+ const ctx = document.createElement('canvas').getContext('webgl');
+
+ const result = {
+ VERSION: ctx.getParameter(ctx.VERSION),
+ SHADING_LANGUAGE_VERSION: ctx.getParameter(ctx.SHADING_LANGUAGE_VERSION),
+ VENDOR: ctx.getParameter(ctx.VENDOR),
+ SUPORTED_EXTENSIONS: ctx.getSupportedExtensions(),
+ };
+
+ return result;
+ } catch {
+ return null;
+ }
+};
+
+export const murmurhash3_32_gc = (key) => {
+ const remainder = key.length & 3; // key.length % 4
+ const bytes = key.length - remainder;
+ const c1 = 0xcc9e2d51;
+ const c2 = 0x1b873593;
+
+ let h1, h1b, k1;
+
+ for (let i = 0; i < bytes; i++) {
+ k1 = (key.charCodeAt(i) & 0xff) | ((key.charCodeAt(++i) & 0xff) << 8) | ((key.charCodeAt(++i) & 0xff) << 16) | ((key.charCodeAt(++i) & 0xff) << 24);
+ ++i;
+
+ k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;
+ k1 = (k1 << 15) | (k1 >>> 17);
+ k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;
+
+ h1 ^= k1;
+ h1 = (h1 << 13) | (h1 >>> 19);
+ h1b = ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & 0xffffffff;
+ h1 = (h1b & 0xffff) + 0x6b64 + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16);
+ }
+
+ const i = bytes - 1;
+
+ k1 = 0;
+
+ switch (remainder) {
+ case 3: {
+ k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;
+ break;
+ }
+ case 2: {
+ k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;
+ break;
+ }
+ case 1: {
+ k1 ^= key.charCodeAt(i) & 0xff;
+ break;
+ }
+ }
+
+ k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;
+ k1 = (k1 << 15) | (k1 >>> 17);
+ k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;
+ h1 ^= k1;
+
+ h1 ^= key.length;
+
+ h1 ^= h1 >>> 16;
+ h1 = ((h1 & 0xffff) * 0x85ebca6b + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;
+ h1 ^= h1 >>> 13;
+ h1 = ((h1 & 0xffff) * 0xc2b2ae35 + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) & 0xffffffff;
+ h1 ^= h1 >>> 16;
+
+ return h1 >>> 0;
+};
+
+export default getBrowserFingerprint;
diff --git a/js/9.2/init.js b/js/9.9.6/init.js
similarity index 89%
rename from js/9.2/init.js
rename to js/9.9.6/init.js
index f3fcbd7..ec470e3 100644
--- a/js/9.2/init.js
+++ b/js/9.9.6/init.js
@@ -1,151 +1,160 @@
-import { hideMenus, showMenu, showSidebar, showTextBlocks, clickSetForm, clickImportFiles } from "./evts.js";
-import { buildFile } from "./files.js";
-import setPassword, { passwordHash } from "./scripts.js";
-import { getUsrId } from "./scripts.js";
-import parseFormOnSubmit from "./parseForm.js";
-import { createStorageObj } from "./storage.js";
-import XORCipher from "./xorc.js";
-import sha256 from "./sha256.min.js";
-import { loadNavBar, initTextBlocks } from "./web.js";
-
-
-window.activeState = {
- userId: getUsrId(),
- activePage: "landing",
- loadedTemplate: "",
- fileName: "",
- lastElement: "",
- serverFilesTs: "",
- templates: [],
- templateFieldTypes: [
- "simpleInput",
- "longText",
- "hiddenField",
- "current_time",
- "current_date",
- "markup",
- ],
- markups: [
- "title",
- "link",
- "italic",
- "green_highlighted",
- "highlighted",
- ]
-};
-
-
-function init() {
-
- //check if user is logged in
- let verfiedStatus = window.sessionStorage.getItem(sha256("verified"));
- if (verfiedStatus != null) {
- //user logged in
-
- //write verifiedStatus content into passwordHash for decode check later
- passwordHash.set(XORCipher.decode(sha256("passwordHash"), verfiedStatus));
- document.getElementById("login").style.display = "none";
-
- } else {
- document.getElementById("login").style.display = "block";
- }
-
- //load NavigationBar with templates according to server
- loadNavBar();
-
- //init Textblocks field with entries according to server
- initTextBlocks();
-
- //add event listeners to document and window
- eventListeners();
-
- //print current version to footer
- printVersion();
-
- //adjust title for mobile use
- if (screen.width < 993) {
- document.getElementById("siteTitle").innerHTML = "TG";
- }
-
-
-
-}
-
-function eventListeners() {
-
- //add hideMenu to Body
- document
- .getElementsByClassName("w3-main")[0]
- .addEventListener("click", hideMenus);
-
-//add set Password to loginForm
-document
- .getElementById("submitPassword")
- .addEventListener("click", setPassword);
-//add toggle Navigation Menu
-document
- .getElementById("toggleNavigationMenu")
- .addEventListener("click", showMenu);
-//add loadTemplateBtn event showMenu
-document
- .getElementById("loadTemplateBtn")
- .addEventListener("click", showMenu);
-//add toggle sideBar Menu
-document
- .getElementById("toggleSidebarMenu")
- .addEventListener("click", showSidebar);
-//add toggle files Menu and sidebar button
-document
- .getElementById("toggleFilesMenuSB")
- .addEventListener("click", buildFile);
-document
- .getElementById("toggleFilesMenu")
- .addEventListener("click", buildFile);
-//add load template sidebar entry
-document
- .getElementById("loadTemplateBtn")
- .addEventListener("click", showMenu);
-//add toggle textBLocks Menu
-document
- .getElementById("toggleTestBlocksMenu")
- .addEventListener("click", showTextBlocks);
-
-//add setFormBtn for use in form
-document
- .getElementById("setFormBtn")
- .addEventListener("click", (e) => clickSetForm(e));
-
-//add saveFiles to server listener on launch page
-document
- .getElementById("importFilesSB")
- .addEventListener("click", () => clickImportFiles());
-
-//add key listener for ctrl s in form mode
-window.addEventListener("keydown", (e) => {
-
- if (e.ctrlKey && e.key == "s") {
- if (activeState.activePage == "form");
- createStorageObj();
- parseFormOnSubmit();
- e.preventDefault();
- }
-})
-}
-
-function printVersion() {
- const scripts = document.getElementsByTagName("script");
- const versionSpan = document.getElementById("currentVersion").lastChild;
-
- for (var i=0;i clickSetForm(e));
+
+//add saveFiles to server listener on launch page
+document
+ .getElementById("importFilesSB")
+ .addEventListener("click", () => clickImportFiles());
+
+//add key listener for ctrl s in form mode
+window.addEventListener("keydown", (e) => {
+
+ if (e.ctrlKey && e.key == "s") {
+ if (activeState.activePage == "form");
+ createStorageObj();
+ parseFormOnSubmit();
+ e.preventDefault();
+ }
+})
+}
+
+function printVersion() {
+ const scripts = document.getElementsByTagName("script");
+ const versionSpan = document.getElementById("currentVersion").lastChild;
+
+ for (var i=0;i init());
-
-
-
+import init from "./init.js";
+
+
+document.addEventListener("DOMContentLoaded", () => init());
+
+
+
diff --git a/js/9.2/parseForm.js b/js/9.9.6/parseForm.js
similarity index 63%
rename from js/9.2/parseForm.js
rename to js/9.9.6/parseForm.js
index 69df15f..746049a 100644
--- a/js/9.2/parseForm.js
+++ b/js/9.9.6/parseForm.js
@@ -1,362 +1,441 @@
-import { storeData, clearData, retrieveData } from "./storage.js";
-
-function parseFormOnSubmit(returnJSON = false, parseOnly = false) {
- //event.preventDefault;
-
- let dataArray = [];
-
- if (parseOnly) {
- let lT = activeState.loadedTemplate;
- dataArray = retrieveData("userInputForce", lT);
- if (dataArray != "") {
- try {
- dataArray = JSON.parse(dataArray);
- } catch (e) {
- alert("Decryption failed; are you authenticated?");
- window.location.reload();
- return;
- }
- }
- if (dataArray == null) {
- let wrapper = document.createElement("div");
- wrapper.innerHTML = mainFormPlaceholder();
- let div = wrapper.firstChild;
- return div;
- }
-
- if (dataArray.length <= 0) {
- let wrapper = document.createElement("div");
- wrapper.innerHTML = mainFormPlaceholder();
- let div = wrapper.firstChild;
- return div;
- }
-
- } else {
- let x = document.getElementById("mainFormObj");
-
- if (x != null) {
- for (let i = 0; i < x.length; i++) {
- dataArray.push({
- value: x.elements[i].value,
- name: x.elements[i].name,
- });
- }
- }
-
- //set filename to active state according to userFileName field from loadTemplate
- let userFileNameField = document.getElementById("userFileName");
- let userFileName = userFileNameField.value;
- let userFileNamePH = userFileNameField.getAttribute("placeholder");
- if (userFileName.length != 0) {
- activeState.fileName = userFileName;
- } else if (userFileNamePH != null) {
- activeState.fileName = userFileNamePH;
- }
- }
-
-
- //get original objects from sessionstorage gen from loadTemplate
- let objects = JSON.parse(window.sessionStorage.getItem("templateObjects"));
-
- //get the complete unparsed template string from sessionstorage from loadTemplate
- let fullString = window.sessionStorage.getItem("fullString");
-
- let b = "";
-
- if (objects == null) {
- return;
- }
-
-
- //iterate through templateObjects and look for according formdata
- for (let obj of objects) {
- for (let data of dataArray) {
- //convert conList Master name to default name as set flag for appending connected list fields cl-name
- let conListFlag = false;
- if (data.name.split("-")[0] == "clM") {
- if (data.name.substring(4) === obj.word.replace(/ /g, "_") ) {
- conListFlag = true;
- data.name = data.name.substring(4);
- if (data.value == "!none") {
- obj.result = "";
- continue;
- }
- if (data.value == "!selected") {
- data.value = obj[0];
- obj.result = "";
- }
- }
- }
- if (obj.word.replace(/ /g, "_") === data.name) {
- let value = parseDataForResult(obj, data.value);
- obj.result = value;
-
- }
- if (conListFlag) {
- if (obj.type == "conList") {
-
- //check for button if only one item exists and search conlist item
- if (obj.listCount == 0) {
- for (let d of dataArray) {
- if (d.name.split(":!")[1] !== undefined) d.placeholder = "!"+d.name.split(":!")[1];
- d.name = d.name.split(":!")[0];
- if ("cl-"+obj[0].replace(/ /g, "_") == d.name && d.value != "") {
- //console.log(d, obj[0], data);
- if (data.value.replace(/ /g, "_") == d.name.substring(3)) {
- if (d.hasOwnProperty("placeholder")) d.value = d.placeholder + "\n" + d.value;
- let value = parseDataForResult(obj, d.value);
- obj.result = obj.result + "\n" + value;
- }
- }
- }
- } else {
- //loop through dataArray and look for coresponding conlist items
- for (let i = 0; i <= obj.listCount; i++) {
- for (let d of dataArray) {
- if (d.name.split(":!")[1] !== undefined) d.placeholder = "!"+d.name.split(":!")[1];
- d.name = d.name.split(":!")[0];
- if ("cl-"+obj[i].replace(/ /g, "_") == d.name && d.value != "") {
- if (data.value.replace(/ /g, "_") == d.name.substring(3)) {
- if (d.hasOwnProperty("placeholder")) d.value = d.placeholder + "\n" + d.value;
- let value = parseDataForResult(obj, d.value);
- obj.result = obj.result + "\n" + value;
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- //console.log(this, dataArray);
-
- b = fullString.substring(0, objects[0].spos);
- for (let i = 0; i < objects.length; i++) {
- let j = i + 1;
- if (objects[j] === undefined) {
- b +=
- objects[i].result +
- fullString.substring(objects[i].epos, fullString.length);
- } else {
- b +=
- objects[i].result +
- fullString.substring(objects[i].epos, objects[j].spos);
- }
- }
-
- let bHtml = b.replace(/(?:\r\n|\r|\n)/g, " ");
- bHtml = bHtml.replace(/!l /g, " • ");
- bHtml = bHtml.replace(/!ls /g, " ○ ");
- bHtml = bHtml.replace(/ /g, " ");
-
- bHtml =
- "" +
- bHtml +
- "
";
-
- let div = document.createElement("div");
- div.classList.add("w3-code", "notranslate", "w3-border-white");
- div.id = "fileDisplay";
- div.innerHTML = bHtml;
-
- if (parseOnly) {
- return div;
- }
-
- let p = document.createElement("p");
- p.innerHTML = "Copied to Clipboard:";
- document.getElementById("output").innerHTML = "";
- document.getElementById("output").appendChild(p);
- document.getElementById("output").appendChild(div);
-
- storeData("userInput", JSON.stringify(dataArray));
- clearData("userInput");
-
- if (returnJSON) {
- return dataArray;
- } else {
- copyToClipBoard(bHtml);
- }
- }
-
- function parseDataForResult(obj, value) {
- //handle placeholders like title, link, italic
- if (obj.hasOwnProperty("placeholder") && value !== "") {
- //console.log(obj.placeholder);
- //check for markups
- if (activeState.markups.includes(obj.placeholder)) {
- value = parseMarkupmarkups(value, obj.placeholder);
- } else {
- value = obj.placeholder + "\n" + value;
- }
- }
-
-
- //Plugin TextBlock Insertion according to file _textblocks.txt
- value = parseTextBlocks(value);
-
-
- //handle placeholders like !l or !n and set it to final interpreted string for object
- value = parseTextMarkups(value);
-
- return value;
- }
-
- export function parseTextMarkups(data) {
- let dataArray = data.split("\n");
- let listFlag = false;
- let listSubFlag = false;
- let boldFlag = false;
- let listNumberFlag = false;
- let listNumberFlagNum = 1;
- for (let i = 0; i < dataArray.length; i++) {
- switch (dataArray[i]) {
- case "!l":
- listFlag = true;
- dataArray.splice(i, 1);
- i = i - 1;
- break;
- case "!ls":
- listSubFlag = true;
- dataArray.splice(i, 1);
- i = i - 1;
- break;
- case "!n":
- listNumberFlag = true;
- dataArray.splice(i, 1);
- i = i - 1;
- break;
- case "!b":
- boldFlag = true;
- dataArray.splice(i, 1);
- i = i - 1;
- break;
- case "!e":
- listFlag = false;
- listNumberFlag = false;
- dataArray.splice(i, 1);
- i = i - 1;
- break;
- case "!es":
- listSubFlag = false;
- dataArray.splice(i, 1);
- i = i - 1;
- break;
- default:
- if (boldFlag) {
- dataArray[i] = "" + dataArray[i] + " ";
- boldFlag = false;
- }
- if (listSubFlag) {
- dataArray[i] = " ○ " + dataArray[i];
- continue;
- }
- if (listFlag) {
- dataArray[i] = " • " + dataArray[i];
- }
- if (listNumberFlag) {
- dataArray[i] = " " + listNumberFlagNum + ". " + dataArray[i];
- listNumberFlagNum++;
- }
- }
- }
- return dataArray.join("\n");
- }
-
- function parseMarkupmarkups(value, markup) {
- switch (markup) {
- case "title":
- return "" + value + " ";
- break;
- case "italic":
- return "" + value + " ";
- break;
- }
- }
-
- function parseTextBlocks(data) {
- let textBlocks = loadTextBlocks();
- let textBlockIds = Object.keys(textBlocks);
- for (let i = 0; i < textBlockIds.length; i++) {
- let id = textBlockIds[i];
- if (data.indexOf("!" + id) !== -1) {
- //console.log("found: "+id);
- let sPos = data.indexOf("!" + id);
- let ePos = sPos + id.length + 1;
- data =
- data.substring(0, sPos) +
- textBlocks[id] +
- data.substring(ePos, data.length);
- }
- }
- return data;
- }
-
-
-function loadTextBlocks() {
- let textBlocks = document.getElementById("textBlocks").innerText;
- let textBlocksObject = {};
- if (textBlocks.indexOf("\r\n") !== -1) {
- var wordArrayByLine = textBlocks.split("\r\n");
- } else {
- var wordArrayByLine = textBlocks.split("\n");
- }
-
- for (let i = 0; i < wordArrayByLine.length; i++) {
- let textBlockId = wordArrayByLine[i].split(":")[0];
- let textBlockText = wordArrayByLine[i].substring(
- textBlockId.length + 2,
- wordArrayByLine[i].length
- );
- if (textBlockId.length < 1) {
- continue;
- }
- textBlocksObject[textBlockId.replace(/\s/g, "")] = textBlockText;
- }
- return textBlocksObject;
- }
-
- function copyToClipBoard(html) {
- // Create an iframe (isolated container) for the HTML
- var container = document.createElement("div");
- container.innerHTML = html;
-
- // Hide element
- container.style.position = "fixed";
- container.style.pointerEvents = "none";
- container.style.opacity = 0;
-
- // Detect all style sheets of the page
- var activeSheets = Array.prototype.slice
- .call(document.styleSheets)
- .filter(function (sheet) {
- return !sheet.disabled;
- });
-
- // Mount the iframe to the DOM to make `contentWindow` available
- document.body.appendChild(container);
-
- // Copy to clipboard
- window.getSelection().removeAllRanges();
-
- var range = document.createRange();
- range.selectNode(container);
- window.getSelection().addRange(range);
-
- document.execCommand("copy");
- for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = true;
- document.execCommand("copy");
- for (var i = 0; i < activeSheets.length; i++)
- activeSheets[i].disabled = false;
-
- // Remove the iframe
- document.body.removeChild(container);
- }
-
- function mainFormPlaceholder() {
- return "";
- }
-
+import { storeData, clearData, retrieveData } from "./storage.js";
+
+function parseFormOnSubmit(returnJSON = false, parseOnly = false) {
+ //event.preventDefault;
+
+ let dataArray = [];
+
+ if (parseOnly) {
+ let lT = activeState.loadedTemplate;
+ dataArray = retrieveData("userInputForce", lT);
+ if (dataArray != "") {
+ try {
+ dataArray = JSON.parse(dataArray);
+ } catch (e) {
+ return "";
+ }
+ }
+ if (dataArray == null) {
+ let wrapper = document.createElement("div");
+ wrapper.innerHTML = mainFormPlaceholder();
+ let div = wrapper.firstChild;
+ return div;
+ }
+
+ if (dataArray.length <= 0) {
+ let wrapper = document.createElement("div");
+ wrapper.innerHTML = mainFormPlaceholder();
+ let div = wrapper.firstChild;
+ return div;
+ }
+
+ } else {
+ let x = document.getElementById("mainFormObj");
+
+ if (x != null) {
+ for (let i = 0; i < x.length; i++) {
+ dataArray.push({
+ value: x.elements[i].value,
+ name: x.elements[i].name,
+ });
+ }
+ }
+
+ //set filename to active state according to userFileName field from loadTemplate
+ let userFileNameField = document.getElementById("userFileName");
+ let userFileName = userFileNameField.value;
+ let userFileNamePH = userFileNameField.getAttribute("placeholder");
+ if (userFileName.length != 0) {
+ activeState.fileName = userFileName;
+ } else if (userFileNamePH != null) {
+ activeState.fileName = userFileNamePH;
+ }
+ }
+
+
+ //get original objects from sessionstorage gen from loadTemplate
+ let objects = JSON.parse(window.sessionStorage.getItem("templateObjects"));
+
+ //get the complete unparsed template string from sessionstorage from loadTemplate
+ let fullString = window.sessionStorage.getItem("fullString");
+
+ //define output buffer
+ let b = "";
+
+ if (objects == null) {
+ return;
+ }
+
+
+ //iterate through templateObjects and look for according formdata
+ for (let obj of objects) {
+ //compaire each obj with elements from mainFormObj
+ for (let data of dataArray) {
+
+ //convert conList Master name to default name as set flag for appending connected list fields cl-name
+ let conListFlag = false;
+ //if obj is the connected list main selector
+ if (data.name.split("-")[0] == "clM") {
+ //if connected list main matches current object
+ if (data.name.substring(4) === obj.word.replace(/ /g, "_") ) {
+ //set flag for next iteration of loop
+ conListFlag = true;
+ data.name = data.name.substring(4);
+
+ //selection is not added to buffer
+ if (data.value == "!none") {
+ obj.result = "";
+ continue;
+ }
+ if (data.value == "!selected") {
+ data.value = obj[0];
+ obj.result = "";
+ }
+ }
+ }
+
+ //if field matches current object
+ if (obj.word.replace(/ /g, "_") === data.name) {
+ let value = parseDataForResult(obj, data.value);
+ obj.result = value;
+
+ }
+
+ //handle conlist elements for parsing each element
+ if (conListFlag && obj.type == "conList") {
+ let value = parseConListForResult(obj, data, dataArray);
+ obj.result = value;
+ }
+ }
+ }
+
+ //console.log(this, dataArray);
+
+ b = fullString.substring(0, objects[0].spos);
+ for (let i = 0; i < objects.length; i++) {
+ let j = i + 1;
+ if (objects[j] === undefined) {
+ b +=
+ objects[i].result +
+ fullString.substring(objects[i].epos, fullString.length);
+ } else {
+ b +=
+ objects[i].result +
+ fullString.substring(objects[i].epos, objects[j].spos);
+ }
+ }
+
+ let bHtml = b.replace(/(?:\r\n|\r|\n)/g, " ");
+ bHtml = bHtml.replace(/!l /g, " • ");
+ bHtml = bHtml.replace(/!ls /g, " ○ ");
+ bHtml = bHtml.replace(/ /g, " ");
+
+ bHtml =
+ "" +
+ bHtml +
+ "
";
+
+ let div = document.createElement("div");
+ div.classList.add("w3-code", "notranslate", "w3-border-white");
+ div.id = "fileDisplay";
+ div.innerHTML = bHtml;
+
+ if (parseOnly) {
+ return div;
+ }
+
+ let p = document.createElement("p");
+ p.innerHTML = "Copied to Clipboard:";
+ document.getElementById("output").innerHTML = "";
+ document.getElementById("output").appendChild(p);
+ document.getElementById("output").appendChild(div);
+
+ storeData("userInput", JSON.stringify(dataArray));
+ clearData("userInput");
+
+ if (returnJSON) {
+ return dataArray;
+ } else {
+ copyToClipBoard(bHtml);
+ }
+ }
+
+ function parseDataForResult(obj, value) {
+ //handle placeholders like title, link, italic
+ if (obj.hasOwnProperty("placeholder") && value !== "") {
+ //console.log(obj.placeholder);
+ //check for markups
+ if (activeState.markups.includes(obj.placeholder)) {
+ value = parseMarkupmarkups(value, obj.placeholder);
+ } else {
+ value = obj.placeholder + "\n" + value;
+ }
+ }
+
+ //Plugin TextBlock Insertion according to file _textblocks.txt
+ value = parseTextBlocks(value);
+
+
+ //handle placeholders like !l or !n and set it to final interpreted string for object
+ value = parseTextMarkups(value);
+
+ //parse global linebreak after marked text was already fixed
+ value = parseGlobalLineBreak(value);
+
+ return value;
+ }
+
+ function parseConListForResult(obj, data, dataArray) {
+ //check for button if only one item exists and search conlist item
+ if (obj.listCount == 0) {
+ for (let d of dataArray) {
+ if (d.name.split(":!")[1] !== undefined) d.placeholder = "!"+d.name.split(":!")[1];
+ d.name = d.name.split(":!")[0];
+ if ("cl-"+obj[0].replace(/ /g, "_") == d.name && d.value != "") {
+ //console.log(d, obj[0], data);
+ if (data.value.replace(/ /g, "_") == d.name.substring(3)) {
+ if (d.hasOwnProperty("placeholder")) d.value = d.placeholder + "\n" + d.value;
+ let value = parseDataForResult(obj, d.value);
+ return obj.result + "\n" + value;
+ }
+ }
+ }
+ } else {
+ //loop through dataArray and look for coresponding conlist items
+ for (let i = 0; i <= obj.listCount; i++) {
+ for (let d of dataArray) {
+ if (d.name.split(":!")[1] !== undefined) d.placeholder = "!"+d.name.split(":!")[1];
+ d.name = d.name.split(":!")[0];
+ if ("cl-"+obj[i].replace(/ /g, "_") == d.name && d.value != "") {
+ if (data.value.replace(/ /g, "_") == d.name.substring(3)) {
+ if (d.hasOwnProperty("placeholder")) d.value = d.placeholder + "\n" + d.value;
+ let value = parseDataForResult(obj, d.value);
+ return obj.result + "\n" + value;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ export function parseTextMarkups(data) {
+ let dataArray = data.split("\n");
+ let listFlag = false;
+ let listSubFlag = false;
+ let boldFlag = false;
+ let listNumberFlag = false;
+ let listNumberFlagNum = 1;
+ for (let i = 0; i < dataArray.length; i++) {
+ if (dataArray[i] == "") continue;
+ switch (dataArray[i]) {
+ case "!l":
+ listFlag = true;
+ dataArray.splice(i, 1);
+ i = i - 1;
+ break;
+ case "!ls":
+ listSubFlag = true;
+ dataArray.splice(i, 1);
+ i = i - 1;
+ break;
+ case "!n":
+ listNumberFlag = true;
+ dataArray.splice(i, 1);
+ i = i - 1;
+ break;
+ case "!b":
+ boldFlag = true;
+ dataArray.splice(i, 1);
+ i = i - 1;
+ break;
+ case "!e":
+ listFlag = false;
+ listNumberFlag = false;
+ dataArray.splice(i, 1);
+ i = i - 1;
+ break;
+ case "!es":
+ listSubFlag = false;
+ dataArray.splice(i, 1);
+ i = i - 1;
+ break;
+ default:
+
+ if (boldFlag) {
+ dataArray[i] = "" + dataArray[i] + " ";
+ boldFlag = false;
+ continue;
+ }
+
+ //check if list indicator has been set and adjust userInput accordingly
+ let listIndicator = "";
+
+ if (listNumberFlag) {
+ listIndicator = " " + listNumberFlagNum + ". ";
+ listNumberFlagNum++;
+ }
+
+ if (listSubFlag && listIndicator == "") listIndicator = " ○ ";
+
+ if (listFlag && listIndicator == "") listIndicator = " • ";
+
+ //handle global linebreak and fit according to indicator according to list indicator
+
+ if (listIndicator != "") dataArray[i] = parseLineBreak(listIndicator + dataArray[i], listIndicator.length);
+
+ }
+ }
+ return dataArray.join("\n");
+ }
+
+ function parseMarkupmarkups(value, markup) {
+ switch (markup) {
+ case "title":
+ return "" + value + " ";
+ break;
+ case "italic":
+ return "" + value + " ";
+ break;
+ }
+ }
+
+ function parseTextBlocks(data) {
+ let textBlocks = loadTextBlocks();
+ let textBlockIds = Object.keys(textBlocks);
+ for (let i = 0; i < textBlockIds.length; i++) {
+ let id = textBlockIds[i];
+ if (data.indexOf("!" + id) !== -1) {
+ //console.log("found: "+id);
+ let sPos = data.indexOf("!" + id);
+ let ePos = sPos + id.length + 1;
+ data =
+ data.substring(0, sPos) +
+ textBlocks[id] +
+ data.substring(ePos, data.length);
+ }
+ }
+ return data;
+ }
+
+ function parseGlobalLineBreak(data) {
+ //parse each line of input with parseLineBreak return condensed string with newlines
+ let parsedData = '';
+ for (let line of data.split('\n')) {
+ let parsedLine = parseLineBreak(line, 0, activeState.lineBreak);
+ if (parsedData != '') {
+ parsedData = parsedData + '\n' + parsedLine;
+ } else {
+ parsedData = parsedLine;
+ }
+ }
+ return parsedData
+ }
+
+ function parseLineBreak(line, intendation = 0, lineBreak = activeState.lineBreak - 5) {
+ //add 5 chars buffer to fix list intendation issue
+ //each input field gets parsed line by line twice once for list inputs and a second time for each input
+ let lines;
+
+ if (line.length > lineBreak) {
+ //create linebreak in between second to last word
+ let correctedLineBreak;
+ let newLineStart;
+ let cLBt = lineBreak-(intendation*2)
+ //find last space before linebreak
+ correctedLineBreak = line.substring(0, cLBt).lastIndexOf(" ");
+ //and fix the next lines start
+ newLineStart = correctedLineBreak+1;
+ //add to parsed output
+ lines = line.substring(0, correctedLineBreak);
+ //delete first parsed output from inputstring
+ line = line.substring(newLineStart);
+
+ let intendationSpaces = '';
+ //check if an intendation is given if so convert it to correct spaces
+ if (intendation != 0) intendationSpaces = ' '.repeat(intendation+1);
+
+ //start loop to parse rest of the string
+ while(line.length > lineBreak) {
+ let cLBt = lineBreak-(intendation*2)
+ correctedLineBreak = line.substring(0, cLBt).lastIndexOf(" ");
+ newLineStart = correctedLineBreak+1;
+ //add to output with intendation if given
+ lines += "\n" + intendationSpaces + line.substring(0, correctedLineBreak);
+ //delete from input
+ line = line.substring(newLineStart);
+ }
+ //process rest of the string with correct intendation
+ lines += "\n" + intendationSpaces + line;
+ } else {
+ //if string is within lineBreak just forward input to output
+ lines = line;
+ }
+ return lines;
+ }
+
+
+function loadTextBlocks() {
+ let textBlocks = document.getElementById("textBlocks").innerText;
+ let textBlocksObject = {};
+ if (textBlocks.indexOf("\r\n") !== -1) {
+ var wordArrayByLine = textBlocks.split("\r\n");
+ } else {
+ var wordArrayByLine = textBlocks.split("\n");
+ }
+
+ for (let i = 0; i < wordArrayByLine.length; i++) {
+ let textBlockId = wordArrayByLine[i].split(":")[0];
+ let textBlockText = wordArrayByLine[i].substring(
+ textBlockId.length + 2,
+ wordArrayByLine[i].length
+ );
+ if (textBlockId.length < 1) {
+ continue;
+ }
+ textBlocksObject[textBlockId.replace(/\s/g, "")] = textBlockText;
+ }
+ return textBlocksObject;
+ }
+
+ function copyToClipBoard(html) {
+ // Create an iframe (isolated container) for the HTML
+ var container = document.createElement("div");
+ container.innerHTML = html;
+
+ // Hide element
+ container.style.position = "fixed";
+ container.style.pointerEvents = "none";
+ container.style.opacity = 0;
+
+ // Detect all style sheets of the page
+ var activeSheets = Array.prototype.slice
+ .call(document.styleSheets)
+ .filter(function (sheet) {
+ return !sheet.disabled;
+ });
+
+ // Mount the iframe to the DOM to make `contentWindow` available
+ document.body.appendChild(container);
+
+ // Copy to clipboard
+ window.getSelection().removeAllRanges();
+
+ var range = document.createRange();
+ range.selectNode(container);
+ window.getSelection().addRange(range);
+
+ document.execCommand("copy");
+ for (var i = 0; i < activeSheets.length; i++) activeSheets[i].disabled = true;
+ document.execCommand("copy");
+ for (var i = 0; i < activeSheets.length; i++)
+ activeSheets[i].disabled = false;
+
+ // Remove the iframe
+ document.body.removeChild(container);
+ }
+
+ function mainFormPlaceholder() {
+ return "";
+ }
+
export default parseFormOnSubmit;
\ No newline at end of file
diff --git a/js/9.2/parseTemplate.js b/js/9.9.6/parseTemplate.js
similarity index 92%
rename from js/9.2/parseTemplate.js
rename to js/9.9.6/parseTemplate.js
index aff41f4..9e88d67 100644
--- a/js/9.2/parseTemplate.js
+++ b/js/9.9.6/parseTemplate.js
@@ -1,374 +1,388 @@
-function parseInput(wordArray, objects, i) {
- let word = wordArray[i];
-
- if (word.substring(0, 1) == "%") {
- //check if regular use of % in text 20% an ignoreCase
- if (word.substring(0, 2) !== "% ") {
- //found simple input %word / excluding %m:
- if (word.substring(2, 3) !== ":") {
- //init Word Object
- var wordObj = {};
-
- let w = word.substring(1);
- //for loop to escape spaces in simple input
- for (let j = i + 1; j < wordArray.length; j++) {
- w = w + " " + wordArray[j];
- //invoke look for gender specific template
- i = findGenderSpecificInput(wordArray, wordObj, j);
- //invoke look for list template
- i = findListInput(wordArray, wordObj, j);
- //invoke connected fields
- i = findConnectedListInput(wordArray, wordObj, j);
- //find end of template string and format it for future handling¨
- if (w.indexOf("%") !== -1) {
- //found % sign
- if (w.indexOf("%") !== w.length - 1) {
- //% is not last char of string
- word = "%" + w;
- } else {
- //% is last
- //no prio has been set
- word = w.slice(0, -1);
- }
- break;
- }
- }
-
- if (word.indexOf("\n") !== -1) {
- if (word.substring(word.indexOf("\n"), 2).indexOf("%") !== -1) {
- //alert("attention newlineChar in: "+ word.substring(word.indexOf("\n"),2));
- }
- }
- //parse priority
- if (word.substring(1).indexOf("%") === -1) {
- //object if no prio was set
- wordObj.word = word;
- wordObj.arrayPos = objects.length;
- wordObj.prio = 0;
- } else {
- //handle edgecase if punctuation mark is directly after prio
- let postMarker = word.substring(1).indexOf("%") + 2;
- let postMarkerEnd = word.length;
- let isPriority = true;
- let i = 0;
- //console.log(word + " * " + word.substring(postMarkerEnd-2, postMarkerEnd) + " - " + postMarker + ":" + postMarkerEnd + " - " + word.length);
- while (
- !isCharNumber(word.substring(postMarkerEnd - 1, postMarkerEnd))
- ) {
- postMarkerEnd = postMarkerEnd - 1;
- //if no priority has been set; set flag
- //console.log(word.substring(postMarkerEnd-1, postMarkerEnd));
-
- if (postMarkerEnd < 1) {
- isPriority = false;
- break;
- }
-
- i++;
- }
-
- if (isPriority) {
- //console.log(word + " prio: "+isPriority);
- //object if prio has been defined
- wordObj.word = word.substring(1, postMarker - 1);
- wordObj.arrayPos = objects.length;
- wordObj.prio = parseInt(
- word.substring(postMarker, postMarkerEnd),
- 10
- );
- if (isNaN(wordObj.prio)) {
- alert(
- "error in template: %" +
- wordObj.word +
- "% there must always a space after the priority number"
- );
- wordObj.prio = 0;
- }
- } else {
- //object if no prio has been defined
- wordObj.word = word.substring(1, postMarker - 1);
- wordObj.arrayPos = objects.length;
- wordObj.prio = 0;
- }
- }
- //check if genderSpecific or list has been found and if so reformat word
- //console.log(wordObj);
- switch (wordObj.type) {
- case "genderSpecific":
- if (word.substring(0, 1) === "%") {
- wordObj.word = word.split("=")[0].substring(1);
- } else {
- wordObj.word = word.split("=")[0];
- }
- break;
- case "list":
- if (word.substring(0, 1) === "%") {
- wordObj.word = word.split("=")[0].substring(1);
- } else {
- wordObj.word = word.split("=")[0];
- }
- break;
- case "conList":
- if (word.substring(0, 1) === "%") {
- wordObj.word = word.split("=")[0].substring(1);
- } else {
- wordObj.word = word.split("=")[0];
- }
- //check if format has been given or markup
- for (let i = 0; i <= wordObj.listCount; i++) {
- let params = wordObj[i].split(":");
- if (params[1] !== undefined) {
- wordObj[i] = params[0];
- wordObj["clType-"+wordObj[i]] = (params[2] !== undefined) ? params[1]+":"+params[2]: params[1];
- } else {
- wordObj["clType-"+wordObj[i]] = "cl-simpleInput";
- }
- }
- break;
- default:
- wordObj.type = "simpleInput";
- //check if customTemplate was used set type and format word
- if (word.indexOf("=") !== -1) {
- parseCustomTemplates(wordObj);
- }
- break;
- }
-
- objects.push(wordObj);
- }
- }
- }
-}
-
-function findGenderSpecificInput(wordArray, wordObj, i) {
- let word = wordArray[i];
- if (word.indexOf("=m:") !== -1) {
- wordObj.type = "genderSpecific";
- let mw = word.substring(word.indexOf("=m:") + 3);
- for (let j = i + 1; j < wordArray.length; j++) {
- mw = mw + " " + wordArray[j];
- i = j;
- if (mw.indexOf(";") !== -1) {
- wordObj.m = mw.slice(0, mw.indexOf(";"));
- //adding length word + 3 = m: ;
- i = parseGenderTemplate(wordArray, wordObj, i);
- break;
- }
- }
- }
-
- if (word.indexOf("=w:") !== -1) {
- let ww = word.substring(word.indexOf("=w:") + 3);
- for (let j = i + 1; j < wordArray.length; j++) {
- ww = ww + " " + wordArray[j];
- i = j;
- if (ww.indexOf(";") !== -1) {
- wordObj.w = ww.slice(0, ww.indexOf(";"));
- i = parseGenderTemplate(wordArray, wordObj, i);
- break;
- }
- }
- }
-
- if (word.indexOf("=d:") !== -1) {
- let dw = word.substring(word.indexOf("=d:") + 3);
- for (let j = i + 1; j < wordArray.length; j++) {
- dw = dw + " " + wordArray[j];
- i = j;
- if (dw.indexOf(";") !== -1) {
- wordObj.d = dw.slice(0, dw.indexOf(";"));
- i = parseGenderTemplate(wordArray, wordObj, i);
- break;
- }
- }
- }
- return i;
-}
-
-function parseGenderTemplate(wordArray, wordObj, i) {
- let word = wordArray[i];
- if (word.indexOf(";m:") !== -1) {
- let mw = word.substring(word.indexOf(";m:") + 3);
- for (let j = i + 1; j < wordArray.length; j++) {
- mw = mw + " " + wordArray[j];
- i = j;
- if (mw.indexOf(";") !== -1) {
- wordObj.m = mw.slice(0, mw.indexOf(";"));
- i = parseGenderTemplate(wordArray, wordObj, i);
- break;
- }
- }
- }
- if (word.indexOf(";w:") !== -1) {
- let ww = word.substring(word.indexOf(";w:") + 3);
- for (let j = i + 1; j < wordArray.length; j++) {
- ww = ww + " " + wordArray[j];
- i = j;
- if (ww.indexOf(";") !== -1) {
- wordObj.w = ww.slice(0, ww.indexOf(";"));
- i = parseGenderTemplate(wordArray, wordObj, i);
- break;
- }
- }
- }
- if (word.indexOf(";d:") !== -1) {
- let dw = word.substring(word.indexOf(";d:") + 3);
- for (let j = i + 1; j < wordArray.length; j++) {
- dw = dw + " " + wordArray[j];
- i = j;
- if (dw.indexOf(";") !== -1) {
- wordObj.d = dw.slice(0, dw.indexOf(";"));
- i = parseGenderTemplate(wordArray, wordObj, i);
- break;
- }
- }
- }
- return i;
-}
-
-function findListInput(wordArray, wordObj, i) {
- let word = wordArray[i];
- if (word.indexOf("=l:") !== -1) {
- wordObj.type = "list";
- wordObj.listCount = 0;
- let lw = word.substring(word.indexOf("=l:") + 3);
- //escape if there is no space in listitem
- if (lw.indexOf(";") !== -1) {
- wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
- //adding length word + 3 = m: ;
- i = parseListTemplate(wordArray, wordObj, i);
- return i;
- }
- for (let j = i + 1; j < wordArray.length; j++) {
- lw = lw + " " + wordArray[j];
- i = j;
- if (lw.indexOf(";") !== -1) {
- wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
- //adding length word + 3 = m: ;
- i = parseListTemplate(wordArray, wordObj, i);
- break;
- }
- }
- }
- return i;
-}
-
-function parseListTemplate(wordArray, wordObj, i) {
- let word = wordArray[i];
- if (word.indexOf(";l:") !== -1) {
- let lw = word.substring(word.indexOf(";l:") + 3);
- //escape if there is no space in listitem
- if (lw.indexOf(";") !== -1) {
- wordObj.listCount++;
- wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
- //shorten wordArray and hand it to parseListTemplate: firstItem;l:secondItem;l: to ;l:secondItem;l:third Item
- wordArray[i] = wordArray[i]
- .substring(1)
- .substring(wordArray[i].indexOf(";") + 1);
- //advance wordArray i if third Item has a space in it and no ; is found to avoid endless loop
- if (wordArray[i].substring(1).indexOf(";") === -1) {
- i++;
- }
- //console.log(wordArray[i].substring(1));
- i = parseListTemplate(wordArray, wordObj, i);
- return i;
- }
- for (let j = i + 1; j < wordArray.length; j++) {
- lw = lw + " " + wordArray[j];
- i = j;
- if (lw.indexOf(";") !== -1) {
- wordObj.listCount++;
- wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
- i = parseListTemplate(wordArray, wordObj, i);
- break;
- }
- }
- }
- return i;
-}
-
-function findConnectedListInput(wordArray, wordObj, i) {
- let word = wordArray[i];
- if (word.indexOf("=h:") !== -1) {
- wordObj.type = "conList";
- wordObj.listCount = 0;
- let lw = word.substring(word.indexOf("=h:") + 3);
- //escape if there is no space in listitem
- if (lw.indexOf(";") !== -1) {
- wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
- //adding length word + 3 = m: ;
- i = parseConnectedListTemplate(wordArray, wordObj, i);
- return i;
- }
- for (let j = i + 1; j < wordArray.length; j++) {
- lw = lw + " " + wordArray[j];
- i = j;
- if (lw.indexOf(";") !== -1) {
- wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
- //adding length word + 3 = m: ;
- i = parseConnectedListTemplate(wordArray, wordObj, i);
- break;
- }
- }
- }
- return i;
-}
-
-
-function parseConnectedListTemplate(wordArray, wordObj, i) {
- let word = wordArray[i];
- if (word.indexOf(";h:") !== -1) {
- let lw = word.substring(word.indexOf(";h:") + 3);
- //escape if there is no space in listitem
- if (lw.indexOf(";") !== -1) {
- wordObj.listCount++;
- wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
- //shorten wordArray and hand it to parseListTemplate: firstItem;l:secondItem;l: to ;l:secondItem;l:third Item
- wordArray[i] = wordArray[i]
- .substring(1)
- .substring(wordArray[i].indexOf(";") + 1);
- //advance wordArray i if third Item has a space in it and no ; is found to avoid endless loop
- if (wordArray[i].substring(1).indexOf(";") === -1) {
- i++;
- }
- //console.log(wordArray[i].substring(1));
- i = parseConnectedListTemplate(wordArray, wordObj, i);
- return i;
- }
- for (let j = i + 1; j < wordArray.length; j++) {
- lw = lw + " " + wordArray[j];
- i = j;
- if (lw.indexOf(";") !== -1) {
- wordObj.listCount++;
- wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
- i = parseConnectedListTemplate(wordArray, wordObj, i);
- break;
- }
- }
- }
- return i;
-}
-
-function parseCustomTemplates(wordObj) {
- let word = wordObj.word;
- for (let i = 0; i < activeState.templateFieldTypes.length; i++) {
- if (word.indexOf("=" + activeState.templateFieldTypes[i]) !== -1) {
- wordObj.word = word.split("=")[0];
- wordObj.type = word.split("=")[1];
-
- if (wordObj.type.indexOf(":") !== -1) {
- let ltPlaceholder = wordObj.type.split(":")[1];
- if (ltPlaceholder !== "undefined") {
- wordObj.placeholder = ltPlaceholder;
- //wordObj.type = wordObj.type.split(":")[0]; - dont do this
- }
- }
- }
- }
-}
-
-function isCharNumber(c) {
- return c >= "0" && c <= "9";
-}
-
-export default parseInput;
+function parseInput(wordArray, objects, i) {
+ let word = wordArray[i];
+
+ if (word.substring(0, 1) == "%") {
+ //check if regular use of % in text 20% an ignoreCase
+ if (word.substring(0, 2) !== "% ") {
+ //found simple input %word / excluding %m:
+ if (word.substring(2, 3) !== ":") {
+ //init Word Object
+ var wordObj = {};
+
+
+ let w = word.substring(1);
+
+ //bugfix if the title of an input has no space in it ex: %test=l:first word;l:second word;%1
+ let oneWordFlag = false;
+ if (word.substring(0, 1) == "%" && word.indexOf('=') != -1) {
+ oneWordFlag = true;
+ }
+
+ //for loop to escape spaces in simple input
+ for (let j = i+1; j < wordArray.length; j++) {
+ //if title has no space then go back one word to include "=" ex:
+ if (oneWordFlag) {
+ j = i;
+ oneWordFlag = false;
+ } else {
+ w = w + " " + wordArray[j];
+ }
+ //invoke look for gender specific template
+ i = findGenderSpecificInput(wordArray, wordObj, j);
+ //invoke look for list template
+ i = findListInput(wordArray, wordObj, j);
+ //invoke connected fields
+ i = findConnectedListInput(wordArray, wordObj, j);
+ //find end of template string and format it for future handling¨
+ if (w.indexOf("%") !== -1) {
+ //found % sign
+ if (w.indexOf("%") !== w.length - 1) {
+ //% is not last char of string
+ word = "%" + w;
+ } else {
+ //% is last
+ //no prio has been set
+ word = w.slice(0, -1);
+ }
+ break;
+ }
+ }
+
+ if (word.indexOf("\n") !== -1) {
+ if (word.substring(word.indexOf("\n"), 2).indexOf("%") !== -1) {
+ //alert("attention newlineChar in: "+ word.substring(word.indexOf("\n"),2));
+ }
+ }
+ //parse priority
+ if (word.substring(1).indexOf("%") === -1) {
+ //object if no prio was set
+ wordObj.word = word;
+ wordObj.arrayPos = objects.length;
+ wordObj.prio = 0;
+ } else {
+ //handle edgecase if punctuation mark is directly after prio
+ let postMarker = word.substring(1).indexOf("%") + 2;
+ let postMarkerEnd = word.length;
+ let isPriority = true;
+ let i = 0;
+ //console.log(word + " * " + word.substring(postMarkerEnd-2, postMarkerEnd) + " - " + postMarker + ":" + postMarkerEnd + " - " + word.length);
+ while (
+ !isCharNumber(word.substring(postMarkerEnd - 1, postMarkerEnd))
+ ) {
+ postMarkerEnd = postMarkerEnd - 1;
+ //if no priority has been set; set flag
+ //console.log(word.substring(postMarkerEnd-1, postMarkerEnd));
+
+ if (postMarkerEnd < 1) {
+ isPriority = false;
+ break;
+ }
+
+ i++;
+ }
+
+ if (isPriority) {
+ //console.log(word + " prio: "+isPriority);
+ //object if prio has been defined
+ wordObj.word = word.substring(1, postMarker - 1);
+ wordObj.arrayPos = objects.length;
+ wordObj.prio = parseInt(
+ word.substring(postMarker, postMarkerEnd),
+ 10
+ );
+ if (isNaN(wordObj.prio)) {
+ alert(
+ "error in template: %" +
+ wordObj.word +
+ "% there must always a space after the priority number"
+ );
+ wordObj.prio = 0;
+ }
+ } else {
+ //object if no prio has been defined
+ wordObj.word = word.substring(1, postMarker - 1);
+ wordObj.arrayPos = objects.length;
+ wordObj.prio = 0;
+ }
+ }
+ //check if genderSpecific or list has been found and if so reformat word
+ //console.log(wordObj);
+ switch (wordObj.type) {
+ case "genderSpecific":
+ if (word.substring(0, 1) === "%") {
+ wordObj.word = word.split("=")[0].substring(1);
+ } else {
+ wordObj.word = word.split("=")[0];
+ }
+ break;
+ case "list":
+ if (word.substring(0, 1) === "%") {
+ wordObj.word = word.split("=")[0].substring(1);
+ } else {
+ wordObj.word = word.split("=")[0];
+ }
+ break;
+ case "conList":
+ if (word.substring(0, 1) === "%") {
+ wordObj.word = word.split("=")[0].substring(1);
+ } else {
+ wordObj.word = word.split("=")[0];
+ }
+ //check if format has been given or markup
+ for (let i = 0; i <= wordObj.listCount; i++) {
+ let params = wordObj[i].split(":");
+ if (params[1] !== undefined) {
+ wordObj[i] = params[0];
+ wordObj["clType-"+wordObj[i]] = (params[2] !== undefined) ? params[1]+":"+params[2]: params[1];
+ } else {
+ wordObj["clType-"+wordObj[i]] = "cl-simpleInput";
+ }
+ }
+ break;
+ default:
+ wordObj.type = "simpleInput";
+ //check if customTemplate was used set type and format word
+ if (word.indexOf("=") !== -1) {
+ parseCustomTemplates(wordObj);
+ }
+ break;
+ }
+
+ objects.push(wordObj);
+ }
+ }
+ }
+}
+
+function findGenderSpecificInput(wordArray, wordObj, i) {
+ let word = wordArray[i];
+ if (word.indexOf("=m:") !== -1) {
+ wordObj.type = "genderSpecific";
+ let mw = word.substring(word.indexOf("=m:") + 3);
+ for (let j = i + 1; j < wordArray.length; j++) {
+ mw = mw + " " + wordArray[j];
+ i = j;
+ if (mw.indexOf(";") !== -1) {
+ wordObj.m = mw.slice(0, mw.indexOf(";"));
+ //adding length word + 3 = m: ;
+ i = parseGenderTemplate(wordArray, wordObj, i);
+ break;
+ }
+ }
+ }
+
+ if (word.indexOf("=w:") !== -1) {
+ let ww = word.substring(word.indexOf("=w:") + 3);
+ for (let j = i + 1; j < wordArray.length; j++) {
+ ww = ww + " " + wordArray[j];
+ i = j;
+ if (ww.indexOf(";") !== -1) {
+ wordObj.w = ww.slice(0, ww.indexOf(";"));
+ i = parseGenderTemplate(wordArray, wordObj, i);
+ break;
+ }
+ }
+ }
+
+ if (word.indexOf("=d:") !== -1) {
+ let dw = word.substring(word.indexOf("=d:") + 3);
+ for (let j = i + 1; j < wordArray.length; j++) {
+ dw = dw + " " + wordArray[j];
+ i = j;
+ if (dw.indexOf(";") !== -1) {
+ wordObj.d = dw.slice(0, dw.indexOf(";"));
+ i = parseGenderTemplate(wordArray, wordObj, i);
+ break;
+ }
+ }
+ }
+ return i;
+}
+
+function parseGenderTemplate(wordArray, wordObj, i) {
+ let word = wordArray[i];
+ if (word.indexOf(";m:") !== -1) {
+ let mw = word.substring(word.indexOf(";m:") + 3);
+ for (let j = i + 1; j < wordArray.length; j++) {
+ mw = mw + " " + wordArray[j];
+ i = j;
+ if (mw.indexOf(";") !== -1) {
+ wordObj.m = mw.slice(0, mw.indexOf(";"));
+ i = parseGenderTemplate(wordArray, wordObj, i);
+ break;
+ }
+ }
+ }
+ if (word.indexOf(";w:") !== -1) {
+ let ww = word.substring(word.indexOf(";w:") + 3);
+ for (let j = i + 1; j < wordArray.length; j++) {
+ ww = ww + " " + wordArray[j];
+ i = j;
+ if (ww.indexOf(";") !== -1) {
+ wordObj.w = ww.slice(0, ww.indexOf(";"));
+ i = parseGenderTemplate(wordArray, wordObj, i);
+ break;
+ }
+ }
+ }
+ if (word.indexOf(";d:") !== -1) {
+ let dw = word.substring(word.indexOf(";d:") + 3);
+ for (let j = i + 1; j < wordArray.length; j++) {
+ dw = dw + " " + wordArray[j];
+ i = j;
+ if (dw.indexOf(";") !== -1) {
+ wordObj.d = dw.slice(0, dw.indexOf(";"));
+ i = parseGenderTemplate(wordArray, wordObj, i);
+ break;
+ }
+ }
+ }
+ return i;
+}
+
+function findListInput(wordArray, wordObj, i) {
+ let word = wordArray[i];
+ if (word.indexOf("=l:") !== -1) {
+ wordObj.type = "list";
+ wordObj.listCount = 0;
+ let lw = word.substring(word.indexOf("=l:") + 3);
+ //escape if there is no space in listitem
+ if (lw.indexOf(";") !== -1) {
+ wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
+ //adding length word + 3 = m: ;
+ i = parseListTemplate(wordArray, wordObj, i);
+ return i;
+ }
+ for (let j = i + 1; j < wordArray.length; j++) {
+ lw = lw + " " + wordArray[j];
+ i = j;
+ if (lw.indexOf(";") !== -1) {
+ wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
+ //adding length word + 3 = m: ;
+ i = parseListTemplate(wordArray, wordObj, i);
+ break;
+ }
+ }
+ }
+ return i;
+}
+
+function parseListTemplate(wordArray, wordObj, i) {
+ let word = wordArray[i];
+ if (word.indexOf(";l:") !== -1) {
+ let lw = word.substring(word.indexOf(";l:") + 3);
+ //escape if there is no space in listitem
+ if (lw.indexOf(";") !== -1) {
+ wordObj.listCount++;
+ wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
+ //shorten wordArray and hand it to parseListTemplate: firstItem;l:secondItem;l: to ;l:secondItem;l:third Item
+ wordArray[i] = wordArray[i]
+ .substring(1)
+ .substring(wordArray[i].indexOf(";") + 1);
+ //advance wordArray i if third Item has a space in it and no ; is found to avoid endless loop
+ if (wordArray[i].substring(1).indexOf(";") === -1) {
+ i++;
+ }
+ //console.log(wordArray[i].substring(1));
+ i = parseListTemplate(wordArray, wordObj, i);
+ return i;
+ }
+ for (let j = i + 1; j < wordArray.length; j++) {
+ lw = lw + " " + wordArray[j];
+ i = j;
+ if (lw.indexOf(";") !== -1) {
+ wordObj.listCount++;
+ wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
+ i = parseListTemplate(wordArray, wordObj, i);
+ break;
+ }
+ }
+ }
+ return i;
+}
+
+function findConnectedListInput(wordArray, wordObj, i) {
+ let word = wordArray[i];
+ if (word.indexOf("=h:") !== -1) {
+ wordObj.type = "conList";
+ wordObj.listCount = 0;
+ let lw = word.substring(word.indexOf("=h:") + 3);
+ //escape if there is no space in listitem
+ if (lw.indexOf(";") !== -1) {
+ wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
+ //adding length word + 3 = m: ;
+ i = parseConnectedListTemplate(wordArray, wordObj, i);
+ return i;
+ }
+ for (let j = i + 1; j < wordArray.length; j++) {
+ lw = lw + " " + wordArray[j];
+ i = j;
+ if (lw.indexOf(";") !== -1) {
+ wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
+ //adding length word + 3 = m: ;
+ i = parseConnectedListTemplate(wordArray, wordObj, i);
+ break;
+ }
+ }
+ }
+ return i;
+}
+
+
+function parseConnectedListTemplate(wordArray, wordObj, i) {
+ let word = wordArray[i];
+ if (word.indexOf(";h:") !== -1) {
+ let lw = word.substring(word.indexOf(";h:") + 3);
+ //escape if there is no space in listitem
+ if (lw.indexOf(";") !== -1) {
+ wordObj.listCount++;
+ wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
+ //shorten wordArray and hand it to parseListTemplate: firstItem;l:secondItem;l: to ;l:secondItem;l:third Item
+ wordArray[i] = wordArray[i]
+ .substring(1)
+ .substring(wordArray[i].indexOf(";") + 1);
+ //advance wordArray i if third Item has a space in it and no ; is found to avoid endless loop
+ if (wordArray[i].substring(1).indexOf(";") === -1) {
+ i++;
+ }
+ //console.log(wordArray[i].substring(1));
+ i = parseConnectedListTemplate(wordArray, wordObj, i);
+ return i;
+ }
+ for (let j = i + 1; j < wordArray.length; j++) {
+ lw = lw + " " + wordArray[j];
+ i = j;
+ if (lw.indexOf(";") !== -1) {
+ wordObj.listCount++;
+ wordObj[wordObj.listCount] = lw.slice(0, lw.indexOf(";"));
+ i = parseConnectedListTemplate(wordArray, wordObj, i);
+ break;
+ }
+ }
+ }
+ return i;
+}
+
+function parseCustomTemplates(wordObj) {
+ let word = wordObj.word;
+ for (let i = 0; i < activeState.templateFieldTypes.length; i++) {
+ if (word.indexOf("=" + activeState.templateFieldTypes[i]) !== -1) {
+ wordObj.word = word.split("=")[0];
+ wordObj.type = word.split("=")[1];
+
+ if (wordObj.type.indexOf(":") !== -1) {
+ let ltPlaceholder = wordObj.type.split(":")[1];
+ if (ltPlaceholder !== "undefined") {
+ wordObj.placeholder = ltPlaceholder;
+ //wordObj.type = wordObj.type.split(":")[0]; - dont do this
+ }
+ }
+ }
+ }
+}
+
+function isCharNumber(c) {
+ return c >= "0" && c <= "9";
+}
+
+export default parseInput;
diff --git a/js/9.9.6/scripts.js b/js/9.9.6/scripts.js
new file mode 100644
index 0000000..fc6406e
--- /dev/null
+++ b/js/9.9.6/scripts.js
@@ -0,0 +1,167 @@
+import { retrieveData } from "./storage.js";
+import sha256 from "./sha256.min.js";
+import XORCipher from "./xorc.js";
+import getBrowserFingerprint from "./identify.js"
+
+export const passwordHash = {
+ name: "anae3Iegbai1ahLu",
+ fp: getBrowserFingerprint( { hardwareOnly: true } ),
+ toString: () => {
+ let data;
+ try {
+ data = window.sessionStorage.getItem(sha256(passwordHash.name));
+ } catch (e) {
+ return "none";
+ }
+ if (data === null) return "none";
+ return XORCipher.decode(passwordHash.name, data);
+ },
+ getId: () => {
+ return passwordHash.fp;
+ },
+ set: (pw) => {
+ window.sessionStorage.setItem(sha256(passwordHash.name), XORCipher.encode(passwordHash.name, pw));
+ }
+}
+
+//export const passwordHash = {
+// toString: () => {
+// let fp = getBrowserFingerprint( { hardwareOnly: true } );
+// let data;
+// try {
+// data = window.sessionStorage.getItem(sha256(fp));
+// } catch (e) {
+// return "none";
+// }
+// if (data === null) return "none";
+// return XORCipher.decode(fp, data);
+// },
+//
+// set: (pw) => {
+// let fp = getBrowserFingerprint( { hardwareOnly: true } );
+// window.sessionStorage.setItem(sha256(fp), XORCipher.encode(fp, pw));
+// }
+//}
+
+
+
+function setPassword() {
+ let x = document.getElementById("loginForm");
+ let pw = x.elements[0].value;
+
+ if (pw != "" || pw !== "undefined") {
+ let pwOld = pw;
+ passwordHash.set(sha256(pw));
+ let templateFiles = retrieveData("templateFiles");
+ if (templateFiles != "") {
+ try {
+ JSON.parse(templateFiles);
+ } catch (e) {
+ document.getElementById("wrongPWAlert").style.display = "block";
+ const alertTimeout = setTimeout(() => {
+ document.getElementById("wrongPWAlert").style.display = "none";
+ }, 5000);
+ passwordHash.set(pwOld);
+ x.elements[0].value = "";
+ return;
+ }
+ }
+ //user logged in
+
+ document.getElementById("login").style.display = "none";
+ window.sessionStorage.setItem(sha256("verified"), XORCipher.encode(sha256("passwordHash"), passwordHash));
+ setCookie(sha256("verified"), XORCipher.encode(sha256("passwordHash"), passwordHash), 10)
+ }
+}
+
+export function getUsrId() {
+ const fingerprint = getBrowserFingerprint( { hardwareOnly: true } );
+ return cyrb53(fingerprint + passwordHash);
+}
+
+export function sessionVerification() {
+
+ //check if cookie exists
+ if (getCookie(sha256("verified")) != null) {
+ passwordHash.set(XORCipher.decode(sha256("passwordHash"), getCookie(sha256("verified"))));
+ window.sessionStorage.setItem(sha256("verified"), XORCipher.encode(sha256("passwordHash"), passwordHash));
+ }
+
+ let verfiedStatus = window.sessionStorage.getItem(sha256("verified"));
+ let data;
+ try {
+ data = window.sessionStorage.getItem(sha256(passwordHash.name));
+ } catch (e) {
+ verfiedStatus = null;
+ }
+ if (data === null) verfiedStatus = null;
+
+ //if (verfiedStatus != data) verfiedStatus = null
+ let vsString;
+ let pnString;
+ try {
+ vsString = XORCipher.decode(sha256("passwordHash"), verfiedStatus);
+ pnString = XORCipher.decode(passwordHash.name, data);
+ if (vsString != pnString) verfiedStatus = null;
+ } catch (e) {
+ verfiedStatus = null;
+ }
+
+ let tF = retrieveData("templateFiles");
+ try {
+ tF = JSON.parse(tF);
+ } catch(e) {
+ //verfiedStatus = null;
+ }
+
+ return (verfiedStatus == null) ? false : true;
+
+}
+
+const cyrb53 = (str, seed = 21) => {
+ let h1 = 0xdeadbeef ^ seed,
+ h2 = 0x41c6ce57 ^ seed;
+ for (let i = 0, ch; i < str.length; i++) {
+ ch = str.charCodeAt(i);
+ h1 = Math.imul(h1 ^ ch, 2654435761);
+ h2 = Math.imul(h2 ^ ch, 1597334677);
+ }
+
+ h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
+ h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
+
+ return 4294967296 * (2097151 & h2) + (h1 >>> 0);
+};
+
+function setCookie(cname, cvalue, exdays) {
+ const d = new Date();
+ d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
+ let expires = "expires="+d.toUTCString();
+ document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
+}
+
+export function getCookie(cname) {
+ let name = cname + "=";
+ let ca = document.cookie.split(';');
+ for(let i = 0; i < ca.length; i++) {
+ let c = ca[i];
+ while (c.charAt(0) == ' ') {
+ c = c.substring(1);
+ }
+ if (c.indexOf(name) == 0) {
+ return c.substring(name.length, c.length);
+ }
+ }
+ return null;
+}
+
+export function logout() {
+ let id = sha256("verified");
+ window.sessionStorage.setItem(id, "");
+ document.cookie = id + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
+ sessionVerification();
+ document.getElementById("passwordField").value = "";
+ document.getElementById("login").style.display = "block";
+}
+
+export default setPassword;
diff --git a/js/9.2/sha256.min.js b/js/9.9.6/sha256.min.js
similarity index 97%
rename from js/9.2/sha256.min.js
rename to js/9.9.6/sha256.min.js
index cd18935..4aa510b 100644
--- a/js/9.2/sha256.min.js
+++ b/js/9.9.6/sha256.min.js
@@ -1,3 +1,3 @@
-var sha256=function a(b){function c(a,b){return a>>>b|a<<32-b}for(var d,e,f=Math.pow,g=f(2,32),h="length",i="",j=[],k=8*b[h],l=a.h=a.h||[],m=a.k=a.k||[],n=m[h],o={},p=2;64>n;p++)if(!o[p]){for(d=0;313>d;d+=p)o[d]=p;l[n]=f(p,.5)*g|0,m[n++]=f(p,1/3)*g|0}for(b+="\x80";b[h]%64-56;)b+="\x00";for(d=0;d>8)return;j[d>>2]|=e<<(3-d)%4*8}for(j[j[h]]=k/g|0,j[j[h]]=k,e=0;ed;d++){var s=q[d-15],t=q[d-2],u=l[0],v=l[4],w=l[7]+(c(v,6)^c(v,11)^c(v,25))+(v&l[5]^~v&l[6])+m[d]+(q[d]=16>d?q[d]:q[d-16]+(c(s,7)^c(s,18)^s>>>3)+q[d-7]+(c(t,17)^c(t,19)^t>>>10)|0),x=(c(u,2)^c(u,13)^c(u,22))+(u&l[1]^u&l[2]^l[1]&l[2]);l=[w+x|0].concat(l),l[4]=l[4]+w|0}for(d=0;8>d;d++)l[d]=l[d]+r[d]|0}for(d=0;8>d;d++)for(e=3;e+1;e--){var y=l[d]>>8*e&255;i+=(16>y?0:"")+y.toString(16)}return i};
-
+var sha256=function a(b){function c(a,b){return a>>>b|a<<32-b}for(var d,e,f=Math.pow,g=f(2,32),h="length",i="",j=[],k=8*b[h],l=a.h=a.h||[],m=a.k=a.k||[],n=m[h],o={},p=2;64>n;p++)if(!o[p]){for(d=0;313>d;d+=p)o[d]=p;l[n]=f(p,.5)*g|0,m[n++]=f(p,1/3)*g|0}for(b+="\x80";b[h]%64-56;)b+="\x00";for(d=0;d>8)return;j[d>>2]|=e<<(3-d)%4*8}for(j[j[h]]=k/g|0,j[j[h]]=k,e=0;ed;d++){var s=q[d-15],t=q[d-2],u=l[0],v=l[4],w=l[7]+(c(v,6)^c(v,11)^c(v,25))+(v&l[5]^~v&l[6])+m[d]+(q[d]=16>d?q[d]:q[d-16]+(c(s,7)^c(s,18)^s>>>3)+q[d-7]+(c(t,17)^c(t,19)^t>>>10)|0),x=(c(u,2)^c(u,13)^c(u,22))+(u&l[1]^u&l[2]^l[1]&l[2]);l=[w+x|0].concat(l),l[4]=l[4]+w|0}for(d=0;8>d;d++)l[d]=l[d]+r[d]|0}for(d=0;8>d;d++)for(e=3;e+1;e--){var y=l[d]>>8*e&255;i+=(16>y?0:"")+y.toString(16)}return i};
+
export default sha256;
\ No newline at end of file
diff --git a/js/9.2/storage.js b/js/9.9.6/storage.js
similarity index 84%
rename from js/9.2/storage.js
rename to js/9.9.6/storage.js
index 66beb40..d6c5760 100644
--- a/js/9.2/storage.js
+++ b/js/9.9.6/storage.js
@@ -1,223 +1,225 @@
-import XORCipher from "./xorc.js";
-import sha256 from "./sha256.min.js";
-import { getUsrId, passwordHash } from "./scripts.js";
-
-
-function createStorageObj() {
- let x = document.getElementById("mainFormObj");
- let dataArray = [];
- if (x == null) {
- return;
- }
- for (let i = 0; i < x.length; i++) {
- dataArray.push({
- value: x.elements[i].value,
- name: x.elements[i].name,
- });
- }
-
- //console.log(this, dataArray);
-
- let userFileNameField = document.getElementById("userFileName");
- let userFileName = userFileNameField.value;
- let userFileNamePH = userFileNameField.getAttribute("placeholder");
- if (userFileName.length != 0) {
- activeState.fileName = userFileName;
- //clear old data as file switches to new filename
- if (userFileNamePH.length != 0) {
- clearData(userFileNamePH);
- popFromTemplateFiles(userFileNamePH);
- }
- } else if (userFileNamePH.length != 0) {
- activeState.fileName = userFileNamePH;
- }
-
- storeData("userInput", JSON.stringify(dataArray));
-
-}
-
-function storeData(name, data) {
- //setCookie(name, btoa(data), 7);
- if (name == "userInput") {
- name = getFileName();
- }
- if (name == "userInputForce") {
- name = "userInput";
- }
- let lT = activeState.loadedTemplate;
- let key = sha256(name + "-" + lT);
- if (name == "templateFiles") {
- key = sha256(name + "-");
- }
- window.localStorage.setItem(key, obfuscate(data));
-}
-
-function retrieveData(type, template = "none") {
- if (type == "userInput") {
- let tF = JSON.parse(retrieveData("templateFiles"));
- if (tF == null) {
- return "";
- } else {
- type = tF[tF.length - 1].fileName;
- }
- }
- if (type == "userInputForce") {
- type = "userInput";
- }
- let cdata;
- if (template == "none") {
- let lT = activeState.loadedTemplate;
- let key = sha256(type + "-" + lT);
- if (type == "templateFiles") {
- key = sha256(type + "-");
- }
- cdata = window.localStorage.getItem(key);
- } else {
- let key = sha256(type + "-" + template);
- cdata = window.localStorage.getItem(key);
- }
- if (cdata != null) {
- return obfuscate(cdata, false);
- } else {
- return "[]";
- }
-}
-
-function clearData(type, template = "none") {
- let lT;
- let key;
- if (template == "none") {
- lT = activeState.loadedTemplate;
- key = sha256(type + "-" + lT);
- if (type == "templateFiles") {
- key = sha256(type + "-");
- }
- } else {
- lT = template;
- key = sha256(type + "-" + template);
- }
- window.localStorage.removeItem(key);
-}
-
-function getFileName() {
- let currentFileName = activeState.fileName;
- if (currentFileName == "none" || currentFileName == "") {
- let date = new Date();
- let current_hour = date.getHours();
- current_hour = current_hour <= 9 ? "0" + current_hour : current_hour;
- let current_minute = date.getMinutes();
- current_minute =
- current_minute <= 9 ? "0" + current_minute : current_minute;
- let current_month = date.getMonth() + 1;
- current_month = current_month <= 9 ? "0" + current_month : current_month;
- let current_year = date.getDate();
- current_year = current_year <= 9 ? "0" + current_year : current_year;
-
- let current_time = current_hour + ":" + current_minute;
- let current_date = current_year + "." + current_month;
- currentFileName = current_time + "_" + current_date;
- //console.log(currentFileName);
- }
-
- let lT = activeState.loadedTemplate;
- let tF = retrieveData("templateFiles");
- if (tF != "") {
- try {
- tF = JSON.parse(tF);
- } catch (e) {
- alert("Decryption failed; are you authenticated?");
- window.location.reload();
- return;
- }
- }
- if (tF != null) {
- for (let tFi of tF) {
- if (tFi.fileName == currentFileName) {return currentFileName};
- }
- tF.push({ fileName: currentFileName, template: lT });
- } else {
- tF = [{ fileName: currentFileName, template: lT }];
- }
- storeData("templateFiles", JSON.stringify(tF));
- activeState.fileName = currentFileName;
- return currentFileName;
-}
-
-function obfuscate(data, mode = true) {
- if (mode) {
- return XORCipher.encode(sha256(passwordHash), data);
- } else {
- return XORCipher.decode(sha256(passwordHash), data);
- }
-}
-
-function popFromTemplateFiles(fileName) {
- let tF = JSON.parse(retrieveData("templateFiles"));
- let newArray = [];
- for (let obj of tF) {
- if (obj.fileName != fileName) {
- newArray.push(obj);
- }
- }
- storeData("templateFiles", JSON.stringify(newArray));
-}
-
-function createBookShelf() {
- let tF = JSON.parse(retrieveData("templateFiles"));
- let bookShelf = {};
- let date = new Date();
- let current_hour = date.getHours();
- current_hour = current_hour <= 9 ? "0" + current_hour : current_hour;
- let current_minute = date.getMinutes();
- current_minute =
- current_minute <= 9 ? "0" + current_minute : current_minute;
- let current_month = date.getMonth() + 1;
- current_month = current_month <= 9 ? "0" + current_month : current_month;
- let current_year = date.getDate();
- current_year = current_year <= 9 ? "0" + current_year : current_year;
-
- let current_time = current_hour + ":" + current_minute;
- let current_date = current_year + "." + current_month;
- let saveFileName = current_time + "_" + current_date;
-
- if (tF != null) {
- bookShelf[0] = {name: "hash", data: getUsrId(), ts: saveFileName};
- let i = 1;
- for (let tFi of tF) {
- let data = retrieveData(tFi.fileName, tFi.template);
- bookShelf[i] = {};
- bookShelf[i].name = tFi.fileName + "-" + tFi.template;
- bookShelf[i].data = obfuscate(data);
- i++;
- }
- }
- return bookShelf;
-}
-
-function importBookShelf() {
-
- localStorage.clear()
- var xhttp = new XMLHttpRequest();
- xhttp.onreadystatechange = function () {
- if (this.readyState == 4 && this.status == 200) {
- if (this.responseText == "none") {
- console.log("no files saved on server");
- } else {
- let respText = decodeURIComponent(this.responseText);
- let mainArray = JSON.parse(respText);
- let templateFilesArray = [];
- for (let file of mainArray) {
- if (file.name == "hash") continue;
- window.localStorage.setItem(sha256(file.name), file.data);
- templateFilesArray.push({ fileName: file.name.split("-")[0], template: file.name.split("-")[1] });
- }
- window.localStorage.setItem(sha256("templateFiles-"), obfuscate(JSON.stringify(templateFilesArray)));
- }
- }
- };
- xhttp.open("GET", "php/?getStoredFiles="+getUsrId(), true);
- xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
- xhttp.send();
-}
-
-export { createStorageObj, storeData, retrieveData, clearData, getFileName, createBookShelf, importBookShelf};
+import XORCipher from "./xorc.js";
+import sha256 from "./sha256.min.js";
+import { getUsrId, passwordHash } from "./scripts.js";
+
+
+function createStorageObj() {
+ let x = document.getElementById("mainFormObj");
+ let dataArray = [];
+ if (x == null) {
+ return;
+ }
+ for (let i = 0; i < x.length; i++) {
+ dataArray.push({
+ value: x.elements[i].value,
+ name: x.elements[i].name,
+ });
+ }
+
+ //console.log(this, dataArray);
+
+ let userFileNameField = document.getElementById("userFileName");
+ let userFileName = userFileNameField.value;
+ let userFileNamePH = userFileNameField.getAttribute("placeholder");
+ if (userFileName.length != 0) {
+ activeState.fileName = userFileName.replace;
+ //clear old data as file switches to new filename
+ if (userFileNamePH.length != 0) {
+ clearData(userFileNamePH);
+ popFromTemplateFiles(userFileNamePH);
+ }
+ } else if (userFileNamePH.length != 0) {
+ activeState.fileName = userFileNamePH;
+ }
+
+ storeData("userInput", JSON.stringify(dataArray));
+
+}
+
+function storeData(name, data) {
+ //setCookie(name, btoa(data), 7);
+ if (name == "userInput") {
+ name = getFileName();
+ }
+ if (name == "userInputForce") {
+ name = "userInput";
+ }
+ let lT = activeState.loadedTemplate;
+ let key = sha256(name + "_m21_" + lT);
+ if (name == "templateFiles") {
+ key = sha256(name + "_m21_");
+ }
+ window.localStorage.setItem(key, obfuscate(data));
+}
+
+function retrieveData(type, template = "none") {
+ if (type == "userInput") {
+ let tF = JSON.parse(retrieveData("templateFiles"));
+ if (tF == null) {
+ return "";
+ } else {
+ type = tF[tF.length - 1].fileName;
+ }
+ }
+ if (type == "userInputForce") {
+ type = "userInput";
+ }
+ let cdata;
+ if (template == "none") {
+ let lT = activeState.loadedTemplate;
+ let key = sha256(type + "_m21_" + lT);
+ if (type == "templateFiles") {
+ key = sha256(type + "_m21_");
+ }
+ cdata = window.localStorage.getItem(key);
+ } else {
+ let key = sha256(type + "_m21_" + template);
+ cdata = window.localStorage.getItem(key);
+ }
+ if (cdata != null) {
+ return obfuscate(cdata, false);
+ } else {
+ return "[]";
+ }
+}
+
+function clearData(type, template = "none") {
+ let lT;
+ let key;
+ if (template == "none") {
+ lT = activeState.loadedTemplate;
+ key = sha256(type + "_m21_" + lT);
+ if (type == "templateFiles") {
+ key = sha256(type + "_m21_");
+ }
+ } else {
+ lT = template;
+ key = sha256(type + "_m21_" + template);
+ }
+ window.localStorage.removeItem(key);
+}
+
+function getFileName() {
+ let currentFileName = activeState.fileName;
+ let lT = activeState.loadedTemplate;
+ if (currentFileName == "none" || currentFileName == "") {
+ let date = new Date();
+ let current_hour = date.getHours();
+ current_hour = current_hour <= 9 ? "0" + current_hour : current_hour;
+ let current_minute = date.getMinutes();
+ current_minute =
+ current_minute <= 9 ? "0" + current_minute : current_minute;
+ let current_month = date.getMonth() + 1;
+ current_month = current_month <= 9 ? "0" + current_month : current_month;
+ let current_year = date.getDate();
+ current_year = current_year <= 9 ? "0" + current_year : current_year;
+
+ let current_time = current_hour + ":" + current_minute;
+ let current_date = current_year + "." + current_month;
+ currentFileName = current_time + "_" + current_date + " " + lT;
+ //console.log(currentFileName);
+ }
+
+ let tF = null;
+ try {
+ tF = JSON.parse(retrieveData("templateFiles"));
+ } catch(e) {
+ tF = null;
+ }
+
+ if (tF != null) {
+ for (let tFi of tF) {
+ if (tFi.fileName == currentFileName) {return currentFileName};
+ }
+ tF.push({ fileName: currentFileName, template: lT });
+ } else {
+ tF = [{ fileName: currentFileName, template: lT }];
+ }
+ storeData("templateFiles", JSON.stringify(tF));
+ activeState.fileName = currentFileName;
+ return currentFileName;
+}
+
+function obfuscate(data, mode = true) {
+ if (mode) {
+ return XORCipher.encode(sha256(passwordHash), data);
+ } else {
+ return XORCipher.decode(sha256(passwordHash), data);
+ }
+}
+
+function popFromTemplateFiles(fileName) {
+ let tF = JSON.parse(retrieveData("templateFiles"));
+ let newArray = [];
+ for (let obj of tF) {
+ if (obj.fileName != fileName) {
+ newArray.push(obj);
+ }
+ }
+ storeData("templateFiles", JSON.stringify(newArray));
+}
+
+function createBookShelf() {
+ let tF = JSON.parse(retrieveData("templateFiles"));
+ let bookShelf = {};
+ let date = new Date();
+ let current_hour = date.getHours();
+ current_hour = current_hour <= 9 ? "0" + current_hour : current_hour;
+ let current_minute = date.getMinutes();
+ current_minute =
+ current_minute <= 9 ? "0" + current_minute : current_minute;
+ let current_month = date.getMonth() + 1;
+ current_month = current_month <= 9 ? "0" + current_month : current_month;
+ let current_year = date.getDate();
+ current_year = current_year <= 9 ? "0" + current_year : current_year;
+
+ let current_time = current_hour + ":" + current_minute;
+ let current_date = current_year + "." + current_month;
+ let saveFileName = current_time + "_" + current_date;
+
+ if (tF != null) {
+ bookShelf[0] = {name: "hash", data: getUsrId(), ts: saveFileName};
+ let i = 1;
+ for (let tFi of tF) {
+ let data = retrieveData(tFi.fileName, tFi.template);
+ bookShelf[i] = {};
+ bookShelf[i].name = tFi.fileName + "_m21_" + tFi.template;
+ if (activeState.localOnly) {
+ bookShelf[i].data = data;
+ } else {
+ bookShelf[i].data = obfuscate(data);
+ }
+
+ i++;
+ }
+ }
+ return bookShelf;
+}
+
+function importBookShelf() {
+
+ localStorage.clear()
+ var xhttp = new XMLHttpRequest();
+ xhttp.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status == 200) {
+ if (this.responseText == "none") {
+ console.log("no files saved on server");
+ } else {
+ let respText = decodeURIComponent(this.responseText);
+ let mainArray = JSON.parse(respText);
+ let templateFilesArray = [];
+ for (let file of mainArray) {
+ if (file.name == "hash") continue;
+ window.localStorage.setItem(sha256(file.name), file.data);
+ templateFilesArray.push({ fileName: file.name.split("_m21_")[0], template: file.name.split("_m21_")[1] });
+ }
+ window.localStorage.setItem(sha256("templateFiles-"), obfuscate(JSON.stringify(templateFilesArray)));
+ }
+ }
+ };
+ xhttp.open("GET", "php/?getStoredFiles="+getUsrId(), true);
+ xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
+ xhttp.send();
+}
+
+export { createStorageObj, storeData, retrieveData, clearData, getFileName, createBookShelf, importBookShelf};
diff --git a/js/9.2/web.js b/js/9.9.6/web.js
similarity index 88%
rename from js/9.2/web.js
rename to js/9.9.6/web.js
index 91aaa1e..1abe774 100644
--- a/js/9.2/web.js
+++ b/js/9.9.6/web.js
@@ -1,279 +1,307 @@
-import buildForm from "./form.js";
-import { loadFileDivCallBack } from "./files.js";
-import { retrieveData, clearData, getFileName, importBookShelf } from "./storage.js";
-import { insertTextBlocks } from "./evts.js";
-import { createTemplate, createTemplateCallBack} from "./createTemplate.js";
-import { getUsrId } from "./scripts.js";
-
-function loadTemplate(template, newFlag = false, loadOnly = false) {
- document.getElementById("siteTitle").innerHTML = template.replace(/_/g, " ");
- activeState.loadedTemplate = template;
-
- if (newFlag) {
- activeState.fileName = "none";
- } else {
- activeState.fileName = getFileName();
- }
-
- document.getElementById("navMob").className = document
- .getElementById("navMob")
- .className.replace(" w3-show", "");
- if (screen.width < 993) {
- let sidebar = document.getElementById("sidebar");
- sidebar.style.display = "none";
- document.getElementById("siteTitle").innerHTML = "TG";
- }
- var xhttp = new XMLHttpRequest();
- xhttp.onreadystatechange = function () {
- if (this.readyState == 4 && this.status == 200) {
- let respText = decodeURIComponent(this.responseText);
- if (loadOnly == "createTemplate") {
- createTemplateCallBack(template, respText.split("!JSON_placeholder:")[0]);
- return;
- }
- buildForm(respText, loadOnly);
- if (loadOnly) {
- loadFileDivCallBack();
- return;
- }
-
- //retrieve previos userData / or preset data if newFile is called
- let cdata;
- if (newFlag) {
- cdata = retrieveData("templatePreset", template);
- } else {
- cdata = retrieveData("userInputForce");
- }
- if (cdata != "") {
- retrieveForm(JSON.parse(cdata));
- }
-
- //select first object and focus on it
- let obj = JSON.parse(
- window.sessionStorage.getItem("templateObjectsPurified")
- );
- let firstElement = document.getElementById(obj[0].word.replace(/ /g, "_"));
- if (firstElement != null) firstElement.focus();
-
- }
- };
- xhttp.open("GET", "php/?template=" + template, true);
- xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
- xhttp.send();
-}
-
-function loadNewTemplate(template) {
- //set current page value in activeState object
- activeState.activePage = "template";
-
- let sidebarDiv = document.getElementById("sidebar");
- sidebarDiv.replaceWith(sidebarDiv.cloneNode(true));
-
- clearData("userInput", template);
- loadTemplate(template, true);
-}
-
-function loadNavBar() {
- var xhttp = new XMLHttpRequest();
- xhttp.onreadystatechange = function () {
- if (this.readyState == 4 && this.status == 200) {
- let res = JSON.parse(this.responseText);
- let divMob = document.getElementById("navMob");
- for (let x in res) {
- let aMob = document.createElement("a");
-
- aMob.setAttribute("href", "#");
- aMob.setAttribute("data-template", res[x][1]);
- aMob.classList.add("w3-bar-item", "w3-button", "w3-padding-large");
- aMob.innerHTML = res[x][0];
-
- divMob.appendChild(aMob);
-
- activeState.templates.push(res[x][1]);
- }
- let createEntry = document.createElement("a");
- createEntry.setAttribute("href", "#");
- createEntry.setAttribute("data-template", "createNew");
- createEntry.classList.add("w3-bar-item", "w3-button", "w3-padding-large");
- createEntry.innerHTML = "Manage templates";
-
- divMob.appendChild(createEntry);
- divMob.addEventListener("click", (e) => {
- if (e.target && e.target.matches("a.w3-bar-item")) {
- let template = e.target.dataset.template;
- if (template == "createNew") {
- createTemplate();
- return;
- }
- loadNewTemplate(template);
- }
- });
- }
- };
- xhttp.open("GET", "php/?templates", true);
- xhttp.send();
-}
-function initTextBlocks() {
- var xhttp = new XMLHttpRequest();
- xhttp.onreadystatechange = function () {
- if (this.readyState == 4 && this.status == 200) {
- let res = JSON.parse(this.responseText);
- const textBlocksHolder = document.getElementById("textBlocks");
- const divReg = document.getElementById("navTb");
- for (let x in res) {
- let aReg = document.createElement("a");
- aReg.setAttribute("href", "#");
- aReg.classList.add("w3-bar-item", "w3-hide-small", "w3-padding-small");
- let textBlockText = res[x][1];
- if (res[x][1].length > 80) {
- textBlockText = res[x][1].substr(0, 80) + "...";
- }
- aReg.innerHTML = "" + res[x][0] + ": " + textBlockText;
- divReg.appendChild(aReg);
-
- const text = document.createTextNode(
- res[x][0] + ": " + res[x][1] + "\n"
- );
- textBlocksHolder.appendChild(text);
- }
- divReg.addEventListener("click", (e) => {
- if (e.target && e.target.matches("a.w3-bar-item")) {
- insertTextBlocks(e.target);
- }
- });
- }
- };
- xhttp.open("GET", "php/?textBlocks", true);
- xhttp.send();
-}
-
-function setTemplatePreset(template, formData) {
- //console.log(template +" : "+ formData);
- var xhttp = new XMLHttpRequest();
- xhttp.open("POST", "php/?setForm");
- xhttp.setRequestHeader("Accept", "application/json");
- xhttp.setRequestHeader("Content-Type", "application/json");
- xhttp.onreadystatechange = function () {
- if (this.readyState == 4 && this.status == 200) {
- //console.log(this.responseText);
- }
- };
- let data = {
- template: template,
- data: formData,
- };
-
- xhttp.send(JSON.stringify(data));
-}
-
-function setNewTemplate(fileName, data) {
- let obj = {
- fileName: fileName,
- data: data,
- };
- //console.log(template +" : "+ formData);
- var xhttp = new XMLHttpRequest();
- xhttp.open("POST", "php/?setTemplate");
- xhttp.setRequestHeader("Accept", "application/json");
- xhttp.setRequestHeader("Content-Type", "application/json");
- xhttp.onreadystatechange = function () {
- if (this.readyState == 4 && this.status == 200) {
- //console.log(this.responseText);
- }
- };
-
- xhttp.send(JSON.stringify(obj));
-}
-
-function storeFilesToServer(data) {
- //console.log(template +" : "+ formData);
- var xhttp = new XMLHttpRequest();
- xhttp.onreadystatechange = function () {
- if (this.readyState == 4 && this.status == 200) {
- if (this.responseText == "success") {
- console.log("files saved");
- }
- }
- };
- xhttp.open("POST", "php/?storeFiles", true);
- xhttp.setRequestHeader("Accept", "application/json");
- xhttp.setRequestHeader("Content-Type", "application/json");
- xhttp.send(JSON.stringify(data));
-}
-
-function checkForStoredDataOnServer() {
- var xhttp = new XMLHttpRequest();
- xhttp.onreadystatechange = function () {
- if (this.readyState == 4 && this.status == 200) {
- if (this.responseText == "none") {
- } else {
- activeState.serverFilesTs = this.responseText;
- let btn = document.getElementById("importModalBtn");
- btn.style.display = "";
- }
- }
- };
- xhttp.open("GET", "php/?storedFiles="+getUsrId(), true);
- xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
- xhttp.send();
-}
-
-function delStoredDataOnServer() {
- var xhttp = new XMLHttpRequest();
- xhttp.onreadystatechange = function () {
- if (this.readyState == 4 && this.status == 200) {
- if (this.responseText == "none") {
- let btn = document.getElementById("importModalBtn");
- btn.style.display = "none";
- }
- }
- };
- xhttp.open("GET", "php/?storedFiles="+getUsrId()+"&del", true);
- xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
- xhttp.send();
-}
-
-
-function retrieveForm(arr) {
- for (let i = 0; i < arr.length; i++) {
- let e = document.getElementById(arr[i].name);
- if (e === null) {
- e = document.getElementById(arr[i].name.split("cl-")[1]);
- if (e === null) continue;
- }
-
- if (e.name.substr(0, 4) == "clM-") continue;
-
- switch (e.nodeName) {
- case "TEXTAREA":
- e.innerHTML = arr[i].value;
- break;
- case "INPUT":
- e.value = arr[i].value;
- break;
- case "SELECT":
- for (let j = 0; j < e.options.length; j++) {
- if (e.options[j].value == arr[i].value) {
- // Item is found. Set its property and exit
- e.options[j].selected = true;
- break;
- }
- }
- break;
- default:
- e.innerHTML = arr[i].value;
- break;
- }
- }
-}
-export {
- loadTemplate,
- loadNavBar,
- initTextBlocks,
- loadNewTemplate,
- setTemplatePreset,
- setNewTemplate,
- storeFilesToServer,
- checkForStoredDataOnServer,
- delStoredDataOnServer
-};
+import buildForm from "./form.js";
+import { loadFileDivCallBack } from "./files.js";
+import { retrieveData, clearData, getFileName, importBookShelf } from "./storage.js";
+import { insertTextBlocks, modalNotifier } from "./evts.js";
+import { createTemplate, createTemplateCallBack} from "./createTemplate.js";
+import { getUsrId, sessionVerification } from "./scripts.js";
+
+function loadTemplate(template, newFlag = false, loadOnly = false) {
+ document.getElementById("siteTitle").innerHTML = template.replace(/_/g, " ");
+ activeState.loadedTemplate = template;
+
+ if (newFlag) {
+ activeState.fileName = "none";
+ } else {
+ activeState.fileName = getFileName();
+ }
+
+ document.getElementById("navMob").className = document
+ .getElementById("navMob")
+ .className.replace(" w3-show", "");
+ if (screen.width < 993) {
+ let sidebar = document.getElementById("sidebar");
+ sidebar.style.display = "none";
+ document.getElementById("siteTitle").innerHTML = "TG";
+ }
+ var xhttp = new XMLHttpRequest();
+ xhttp.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status == 200) {
+ let respText = decodeURIComponent(this.responseText);
+ if (loadOnly == "createTemplate") {
+ createTemplateCallBack(template, respText.split("!JSON_placeholder:")[0]);
+ return;
+ }
+ buildForm(respText, loadOnly);
+ if (loadOnly) {
+ loadFileDivCallBack();
+ return;
+ }
+
+ //retrieve previos userData / or preset data if newFile is called
+ let cdata;
+ if (newFlag) {
+ cdata = retrieveData("templatePreset", template);
+ } else {
+ cdata = retrieveData("userInputForce");
+ }
+ if (cdata != "") {
+ let res = "";
+ try {
+ res = JSON.parse(cdata);
+ } catch (e) {
+ console.log("error", cdata);
+ return;
+ }
+ retrieveForm(res);
+ }
+
+ //select first object and focus on it
+ let obj = JSON.parse(
+ window.sessionStorage.getItem("templateObjectsPurified")
+ );
+ let firstElement = document.getElementById(obj[0].word.replace(/ /g, "_"));
+ if (firstElement != null) firstElement.focus();
+
+ }
+ };
+ xhttp.open("GET", "php/?template=" + template, true);
+ xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
+ xhttp.send();
+}
+
+function loadNewTemplate(template) {
+
+ //sessionVerfication check
+ if (!sessionVerification()) {
+ modalNotifier("Error: Session is not authenticated...", 0);
+ }
+
+ //set current page value in activeState object
+ activeState.activePage = "template";
+
+ let sidebarDiv = document.getElementById("sidebar");
+ sidebarDiv.replaceWith(sidebarDiv.cloneNode(true));
+
+ clearData("userInput", template);
+ loadTemplate(template, true);
+}
+
+function loadNavBar() {
+ var xhttp = new XMLHttpRequest();
+ xhttp.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status == 200) {
+ let res = "";
+ try {
+ res = JSON.parse(this.responseText);
+ } catch (e) {
+ console.log("error", this.responseText);
+ return;
+ }
+
+ let divMob = document.getElementById("navMob");
+ for (let x in res) {
+ let aMob = document.createElement("a");
+
+ aMob.setAttribute("href", "#");
+ aMob.setAttribute("data-template", res[x][1]);
+ aMob.classList.add("w3-bar-item", "w3-button", "w3-padding-large");
+ aMob.innerHTML = res[x][0];
+
+ divMob.appendChild(aMob);
+
+ activeState.templates.push(res[x][1]);
+ }
+ let createEntry = document.createElement("a");
+ createEntry.setAttribute("href", "#");
+ createEntry.setAttribute("data-template", "createNew");
+ createEntry.classList.add("w3-bar-item", "w3-button", "w3-padding-large");
+ createEntry.innerHTML = "Manage templates";
+
+ divMob.appendChild(createEntry);
+ divMob.addEventListener("click", (e) => {
+ if (e.target && e.target.matches("a.w3-bar-item")) {
+ let template = e.target.dataset.template;
+ if (template == "createNew") {
+ createTemplate();
+ return;
+ }
+ loadNewTemplate(template);
+ }
+ });
+ }
+ };
+ xhttp.open("GET", "php/?templates", true);
+ xhttp.send();
+}
+function initTextBlocks() {
+ var xhttp = new XMLHttpRequest();
+ xhttp.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status == 200) {
+ let res = "";
+ try {
+ res = JSON.parse(this.responseText);
+ } catch (e) {
+ console.log("error", this.responseText)
+ return;
+ }
+ const textBlocksHolder = document.getElementById("textBlocks");
+ const divReg = document.getElementById("navTb");
+ for (let x in res) {
+ if (res[x][1].length < 1) continue;
+
+ let aReg = document.createElement("a");
+ aReg.setAttribute("href", "#");
+ aReg.classList.add("w3-bar-item", "w3-hide-small", "w3-padding-small");
+ let textBlockText = res[x][1];
+ if (res[x][1].length > 80) {
+ textBlockText = res[x][1].substr(0, 80) + "...";
+ }
+ aReg.innerHTML = "" + res[x][0] + ": " + textBlockText;
+ divReg.appendChild(aReg);
+
+ const text = document.createTextNode(
+ res[x][0] + ": " + res[x][1] + "\n"
+ );
+ textBlocksHolder.appendChild(text);
+ }
+ divReg.addEventListener("click", (e) => {
+ if (e.target && e.target.matches("a.w3-bar-item")) {
+ insertTextBlocks(e.target);
+ }
+ });
+ }
+ };
+ xhttp.open("GET", "php/?textBlocks", true);
+ xhttp.send();
+}
+
+function setTemplatePreset(template, formData) {
+ //console.log(template +" : "+ formData);
+ var xhttp = new XMLHttpRequest();
+ xhttp.open("POST", "php/?setForm");
+ xhttp.setRequestHeader("Accept", "application/json");
+ xhttp.setRequestHeader("Content-Type", "application/json");
+ xhttp.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status == 200) {
+ //console.log(this.responseText);
+ }
+ };
+ let data = {
+ template: template,
+ data: formData,
+ };
+
+ xhttp.send(JSON.stringify(data));
+}
+
+function setNewTemplate(fileName, data) {
+ let obj = {
+ fileName: fileName,
+ data: data,
+ };
+ //console.log(template +" : "+ formData);
+ var xhttp = new XMLHttpRequest();
+ xhttp.open("POST", "php/?setTemplate");
+ xhttp.setRequestHeader("Accept", "application/json");
+ xhttp.setRequestHeader("Content-Type", "application/json");
+ xhttp.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status == 200) {
+ //console.log(this.responseText);
+ }
+ };
+
+ xhttp.send(JSON.stringify(obj));
+}
+
+function storeFilesToServer(data) {
+ //console.log(template +" : "+ formData);
+ var xhttp = new XMLHttpRequest();
+ xhttp.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status == 200) {
+ if (this.responseText == "success") {
+ console.log("files saved");
+ }
+ }
+ };
+ xhttp.open("POST", "php/?storeFiles", true);
+ xhttp.setRequestHeader("Accept", "application/json");
+ xhttp.setRequestHeader("Content-Type", "application/json");
+ xhttp.send(JSON.stringify(data));
+}
+
+function checkForStoredDataOnServer() {
+ var xhttp = new XMLHttpRequest();
+ xhttp.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status == 200) {
+ if (this.responseText == "none") {
+ } else {
+ activeState.serverFilesTs = this.responseText;
+ let btn = document.getElementById("importModalBtn");
+ btn.style.display = "";
+ }
+ }
+ };
+ xhttp.open("GET", "php/?storedFiles="+getUsrId(), true);
+ xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
+ xhttp.send();
+}
+
+function delStoredDataOnServer() {
+ var xhttp = new XMLHttpRequest();
+ xhttp.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status == 200) {
+ if (this.responseText == "none") {
+ let btn = document.getElementById("importModalBtn");
+ btn.style.display = "none";
+ }
+ }
+ };
+ xhttp.open("GET", "php/?storedFiles="+getUsrId()+"&del", true);
+ xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
+ xhttp.send();
+}
+
+
+function retrieveForm(arr) {
+ for (let i = 0; i < arr.length; i++) {
+ let e = document.getElementById(arr[i].name);
+ if (e === null) {
+ e = document.getElementById(arr[i].name.split("cl-")[1]);
+ if (e === null) continue;
+ }
+
+ if (e.name.substr(0, 4) == "clM-") continue;
+
+ switch (e.nodeName) {
+ case "TEXTAREA":
+ e.innerHTML = arr[i].value;
+ break;
+ case "INPUT":
+ e.value = arr[i].value;
+ break;
+ case "SELECT":
+ for (let j = 0; j < e.options.length; j++) {
+ if (e.options[j].value == arr[i].value) {
+ // Item is found. Set its property and exit
+ e.options[j].selected = true;
+ break;
+ }
+ }
+ break;
+ default:
+ e.innerHTML = arr[i].value;
+ break;
+ }
+ }
+}
+export {
+ loadTemplate,
+ loadNavBar,
+ initTextBlocks,
+ loadNewTemplate,
+ setTemplatePreset,
+ setNewTemplate,
+ storeFilesToServer,
+ checkForStoredDataOnServer,
+ delStoredDataOnServer
+};
diff --git a/js/9.2/xorc.js b/js/9.9.6/xorc.js
similarity index 95%
rename from js/9.2/xorc.js
rename to js/9.9.6/xorc.js
index 2bdff45..5e17850 100644
--- a/js/9.2/xorc.js
+++ b/js/9.9.6/xorc.js
@@ -1,187 +1,187 @@
-
-var XORCipher = {
- encode: function (key, data, seed) {
- data = xor_encrypt(key, data, seed);
- return b64_encode(data);
- },
- decode: function (key, data) {
- data = b64_decode(data);
- return xor_decrypt(key, data);
- },
- seed: function (n) {
- return randString(n);
- },
-};
-
-function stringToUtf8ByteArray(str) {
- var out = [],
- p = 0;
- for (var i = 0; i < str.length; i++) {
- var c = str.charCodeAt(i);
- if (c < 128) {
- out[p++] = c;
- } else if (c < 2048) {
- out[p++] = (c >> 6) | 192;
- out[p++] = (c & 63) | 128;
- } else if (
- (c & 0xfc00) == 0xd800 &&
- i + 1 < str.length &&
- (str.charCodeAt(i + 1) & 0xfc00) == 0xdc00
- ) {
- // Surrogate Pair
- c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);
- out[p++] = (c >> 18) | 240;
- out[p++] = ((c >> 12) & 63) | 128;
- out[p++] = ((c >> 6) & 63) | 128;
- out[p++] = (c & 63) | 128;
- } else {
- out[p++] = (c >> 12) | 224;
- out[p++] = ((c >> 6) & 63) | 128;
- out[p++] = (c & 63) | 128;
- }
- }
- return out;
-}
-
-function utf8ByteArrayToString(bytes) {
- // array of bytes
- var out = [],
- pos = 0,
- c = 0;
- while (pos < bytes.length) {
- var c1 = bytes[pos++];
- if (c1 < 128) {
- out[c++] = String.fromCharCode(c1);
- } else if (c1 > 191 && c1 < 224) {
- var c2 = bytes[pos++];
- out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
- } else if (c1 > 239 && c1 < 365) {
- // Surrogate Pair
- var c2 = bytes[pos++];
- var c3 = bytes[pos++];
- var c4 = bytes[pos++];
- var u =
- (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -
- 0x10000;
- out[c++] = String.fromCharCode(0xd800 + (u >> 10));
- out[c++] = String.fromCharCode(0xdc00 + (u & 1023));
- } else {
- var c2 = bytes[pos++];
- var c3 = bytes[pos++];
- out[c++] = String.fromCharCode(
- ((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)
- );
- }
- }
- return out.join("");
-}
-
-var b64_table =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
-
-function b64_encode(data) {
- var o1,
- o2,
- o3,
- h1,
- h2,
- h3,
- h4,
- bits,
- r,
- i = 0,
- enc = "";
- if (!data) {
- return data;
- }
- do {
- o1 = data[i++];
- o2 = data[i++];
- o3 = data[i++];
- bits = (o1 << 16) | (o2 << 8) | o3;
- h1 = (bits >> 18) & 0x3f;
- h2 = (bits >> 12) & 0x3f;
- h3 = (bits >> 6) & 0x3f;
- h4 = bits & 0x3f;
- enc +=
- b64_table.charAt(h1) +
- b64_table.charAt(h2) +
- b64_table.charAt(h3) +
- b64_table.charAt(h4);
- } while (i < data.length);
- r = data.length % 3;
- return (r ? enc.slice(0, r - 3) : enc) + "===".slice(r || 3);
-}
-
-function b64_decode(data) {
- var o1,
- o2,
- o3,
- h1,
- h2,
- h3,
- h4,
- bits,
- i = 0,
- result = [];
- if (!data) {
- return data;
- }
- data += "";
- do {
- h1 = b64_table.indexOf(data.charAt(i++));
- h2 = b64_table.indexOf(data.charAt(i++));
- h3 = b64_table.indexOf(data.charAt(i++));
- h4 = b64_table.indexOf(data.charAt(i++));
- bits = (h1 << 18) | (h2 << 12) | (h3 << 6) | h4;
- o1 = (bits >> 16) & 0xff;
- o2 = (bits >> 8) & 0xff;
- o3 = bits & 0xff;
- result.push(o1);
- if (h3 !== 64) {
- result.push(o2);
- if (h4 !== 64) {
- result.push(o3);
- }
- }
- } while (i < data.length);
- return result;
-}
-
-function rand(min, max) {
- return Math.floor(Math.random() * (max - min + 1)) + min;
-}
-
-function randString(n) {
- var r = "";
- for (var i = 0; i < n; i++) r += String.fromCharCode(rand(1, 65535));
-
- return r;
-}
-
-function xor_encrypt(key, data, seed) {
- if (typeof seed == "undefined") seed = randString(32);
-
- var d = stringToUtf8ByteArray(seed + String.fromCharCode(0) + data),
- k = stringToUtf8ByteArray(key),
- r = [];
-
- for (var i = 0; i < d.length; i++)
- r[i] = r[i - 1] ^ d[i] ^ k[Math.floor(i % k.length)];
-
- return r;
-}
-
-function xor_decrypt(key, data) {
- var d = data,
- k = stringToUtf8ByteArray(key),
- r = [];
-
- for (var i = 0; i < d.length; i++)
- r[i] = d[i - 1] ^ d[i] ^ k[Math.floor(i % k.length)];
-
- r.splice(0, r.indexOf(0) + 1);
- return utf8ByteArrayToString(r);
-}
-
+
+var XORCipher = {
+ encode: function (key, data, seed) {
+ data = xor_encrypt(key, data, seed);
+ return b64_encode(data);
+ },
+ decode: function (key, data) {
+ data = b64_decode(data);
+ return xor_decrypt(key, data);
+ },
+ seed: function (n) {
+ return randString(n);
+ },
+};
+
+function stringToUtf8ByteArray(str) {
+ var out = [],
+ p = 0;
+ for (var i = 0; i < str.length; i++) {
+ var c = str.charCodeAt(i);
+ if (c < 128) {
+ out[p++] = c;
+ } else if (c < 2048) {
+ out[p++] = (c >> 6) | 192;
+ out[p++] = (c & 63) | 128;
+ } else if (
+ (c & 0xfc00) == 0xd800 &&
+ i + 1 < str.length &&
+ (str.charCodeAt(i + 1) & 0xfc00) == 0xdc00
+ ) {
+ // Surrogate Pair
+ c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);
+ out[p++] = (c >> 18) | 240;
+ out[p++] = ((c >> 12) & 63) | 128;
+ out[p++] = ((c >> 6) & 63) | 128;
+ out[p++] = (c & 63) | 128;
+ } else {
+ out[p++] = (c >> 12) | 224;
+ out[p++] = ((c >> 6) & 63) | 128;
+ out[p++] = (c & 63) | 128;
+ }
+ }
+ return out;
+}
+
+function utf8ByteArrayToString(bytes) {
+ // array of bytes
+ var out = [],
+ pos = 0,
+ c = 0;
+ while (pos < bytes.length) {
+ var c1 = bytes[pos++];
+ if (c1 < 128) {
+ out[c++] = String.fromCharCode(c1);
+ } else if (c1 > 191 && c1 < 224) {
+ var c2 = bytes[pos++];
+ out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
+ } else if (c1 > 239 && c1 < 365) {
+ // Surrogate Pair
+ var c2 = bytes[pos++];
+ var c3 = bytes[pos++];
+ var c4 = bytes[pos++];
+ var u =
+ (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -
+ 0x10000;
+ out[c++] = String.fromCharCode(0xd800 + (u >> 10));
+ out[c++] = String.fromCharCode(0xdc00 + (u & 1023));
+ } else {
+ var c2 = bytes[pos++];
+ var c3 = bytes[pos++];
+ out[c++] = String.fromCharCode(
+ ((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)
+ );
+ }
+ }
+ return out.join("");
+}
+
+var b64_table =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+
+function b64_encode(data) {
+ var o1,
+ o2,
+ o3,
+ h1,
+ h2,
+ h3,
+ h4,
+ bits,
+ r,
+ i = 0,
+ enc = "";
+ if (!data) {
+ return data;
+ }
+ do {
+ o1 = data[i++];
+ o2 = data[i++];
+ o3 = data[i++];
+ bits = (o1 << 16) | (o2 << 8) | o3;
+ h1 = (bits >> 18) & 0x3f;
+ h2 = (bits >> 12) & 0x3f;
+ h3 = (bits >> 6) & 0x3f;
+ h4 = bits & 0x3f;
+ enc +=
+ b64_table.charAt(h1) +
+ b64_table.charAt(h2) +
+ b64_table.charAt(h3) +
+ b64_table.charAt(h4);
+ } while (i < data.length);
+ r = data.length % 3;
+ return (r ? enc.slice(0, r - 3) : enc) + "===".slice(r || 3);
+}
+
+function b64_decode(data) {
+ var o1,
+ o2,
+ o3,
+ h1,
+ h2,
+ h3,
+ h4,
+ bits,
+ i = 0,
+ result = [];
+ if (!data) {
+ return data;
+ }
+ data += "";
+ do {
+ h1 = b64_table.indexOf(data.charAt(i++));
+ h2 = b64_table.indexOf(data.charAt(i++));
+ h3 = b64_table.indexOf(data.charAt(i++));
+ h4 = b64_table.indexOf(data.charAt(i++));
+ bits = (h1 << 18) | (h2 << 12) | (h3 << 6) | h4;
+ o1 = (bits >> 16) & 0xff;
+ o2 = (bits >> 8) & 0xff;
+ o3 = bits & 0xff;
+ result.push(o1);
+ if (h3 !== 64) {
+ result.push(o2);
+ if (h4 !== 64) {
+ result.push(o3);
+ }
+ }
+ } while (i < data.length);
+ return result;
+}
+
+function rand(min, max) {
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+}
+
+function randString(n) {
+ var r = "";
+ for (var i = 0; i < n; i++) r += String.fromCharCode(rand(1, 65535));
+
+ return r;
+}
+
+function xor_encrypt(key, data, seed) {
+ if (typeof seed == "undefined") seed = randString(32);
+
+ var d = stringToUtf8ByteArray(seed + String.fromCharCode(0) + data),
+ k = stringToUtf8ByteArray(key),
+ r = [];
+
+ for (var i = 0; i < d.length; i++)
+ r[i] = r[i - 1] ^ d[i] ^ k[Math.floor(i % k.length)];
+
+ return r;
+}
+
+function xor_decrypt(key, data) {
+ var d = data,
+ k = stringToUtf8ByteArray(key),
+ r = [];
+
+ for (var i = 0; i < d.length; i++)
+ r[i] = d[i - 1] ^ d[i] ^ k[Math.floor(i % k.length)];
+
+ r.splice(0, r.indexOf(0) + 1);
+ return utf8ByteArrayToString(r);
+}
+
export default XORCipher;
\ No newline at end of file