Bugfixes and feature improvements new ver 9.9.3
fixed bug with sidebar click event not being cleared after accessing files and then pressing edit some cosmetic changes animations reimplemented bookshelfexport in localonly mode added logout functionality
This commit is contained in:
parent
e257c55ca7
commit
92bbebd2a1
21
index.html
21
index.html
@ -16,7 +16,7 @@
|
||||
<link rel="stylesheet" href="css/font-awesome/css/all.min.css" />
|
||||
<link rel="stylesheet" href="css/styles.css" />
|
||||
|
||||
<script type="module" src="js/9.9.2/main.js"></script>
|
||||
<script type="module" src="js/9.9.3/main.js"></script>
|
||||
|
||||
|
||||
<body>
|
||||
@ -40,10 +40,9 @@
|
||||
>
|
||||
Show saved documents
|
||||
</li>
|
||||
<!-- hidden since the data should only be stored on local machine -->
|
||||
<li
|
||||
class="w3-bar-item w3-padding-large w3-button"
|
||||
style="display: none; border-bottom: 2px solid rgb(221, 221, 221)"
|
||||
style="border-bottom: 2px solid rgb(221, 221, 221)"
|
||||
id="importFilesSB"
|
||||
>
|
||||
Manage backup files
|
||||
@ -88,7 +87,13 @@
|
||||
id="toggleFilesMenu"
|
||||
><i class="fa fa-file"></i
|
||||
></a>
|
||||
|
||||
<a
|
||||
class="w3-button w3-right w3-padding-large w3-hover-grey w3-large w3-flat-wet-aspalt"
|
||||
href="javascript:void(0);"
|
||||
title="Logout"
|
||||
id="logout"
|
||||
><i class="fa fa-sign-out-alt"></i
|
||||
></a>
|
||||
<a
|
||||
href="."
|
||||
id="siteTitle"
|
||||
@ -258,8 +263,8 @@
|
||||
</div>
|
||||
|
||||
|
||||
<div id="login" style="display: none" class="w3-modal w3-card-4">
|
||||
<div class="w3-modal-content w3-margin-top">
|
||||
<div id="login" style="display: none" class="w3-modal">
|
||||
<div class="w3-card-4 w3-modal-content w3-margin-top w3-animate-opacity" style="max-width:600px">
|
||||
<div class="w3-container w3-padding-32 w3-flat-clouds">
|
||||
<form method="post" action="javascript:void(0)" id="loginForm">
|
||||
<h1>Welcome to <img src="logo.png" alt="logo" height="40px"></h1>
|
||||
@ -305,8 +310,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="modalNotifier" style="display: none" class="w3-modal w3-card-4">
|
||||
<div class="w3-modal-content w3-margin-top">
|
||||
<div id="modalNotifier" style="display: none" class="w3-modal">
|
||||
<div class="w3-card-4 w3-modal-content w3-margin-top w3-animate-opacity" style="max-width:600px">
|
||||
<span
|
||||
onclick="this.parentElement.parentElement.style.display='none'"
|
||||
class="w3-button w3-display-topright w3-flat-clouds"
|
||||
|
||||
399
js/9.9.3/buildForm.js
Normal file
399
js/9.9.3/buildForm.js
Normal file
@ -0,0 +1,399 @@
|
||||
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", "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.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;
|
||||
200
js/9.9.3/createTemplate.js
Normal file
200
js/9.9.3/createTemplate.js
Normal file
@ -0,0 +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";
|
||||
|
||||
|
||||
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};
|
||||
220
js/9.9.3/evts.js
Normal file
220
js/9.9.3/evts.js
Normal file
@ -0,0 +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() {
|
||||
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(
|
||||
"<div class='w3-container'> \
|
||||
Would you like to import the backup created on: "+activeState.serverFilesTs.replace("_", " - ")+ "<br><br> \
|
||||
<button class='w3-button w3-border w3-flat-wet-asphalt' >Yes</button> \
|
||||
<button class='w3-button w3-border w3-flat-wet-asphalt' >Cancel</button></div>",
|
||||
0);
|
||||
break;
|
||||
case "Save":
|
||||
storeFilesToServer(createBookShelf());
|
||||
modal.replaceWith(modal.cloneNode(true));
|
||||
modalNotifier(
|
||||
"Files saved to server <br><br> would you like to <a href='/storage/" +
|
||||
getUsrId() +
|
||||
".txt' style='text-decoration: underline;' download>download</a> them?"
|
||||
,0);
|
||||
break;
|
||||
case "Delete":
|
||||
delStoredDataOnServer();
|
||||
break;
|
||||
|
||||
default:
|
||||
e.preventDefault;
|
||||
}
|
||||
}
|
||||
});
|
||||
modalNotifier(
|
||||
"Here you can manage if your files should be saved on the server \
|
||||
<br> If there are stored files already on the server you can inport them \
|
||||
It will overwrite any saved documents <br><br> \
|
||||
<div class='w3-container'> \
|
||||
<button style='display: none;' id='importModalBtn' class='w3-button w3-border w3-flat-wet-asphalt' >Import</button> \
|
||||
<button class='w3-button w3-border w3-flat-wet-asphalt' >Save</button> \
|
||||
<button class='w3-button w3-border w3-flat-pomegranate' >Delete</button></div>",
|
||||
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 \
|
||||
<br><br> \
|
||||
<div class='w3-container'> \
|
||||
<button class='w3-button w3-border w3-flat-wet-asphalt' >Export</button></div>"
|
||||
,0);
|
||||
|
||||
}
|
||||
|
||||
export {
|
||||
hideMenus,
|
||||
showMenu,
|
||||
showSidebar,
|
||||
showTextBlocks,
|
||||
insertTextBlocks,
|
||||
handleOnBlur,
|
||||
clickClearForm,
|
||||
modalNotifier,
|
||||
clickSetForm,
|
||||
clickImportFiles
|
||||
};
|
||||
322
js/9.9.3/files.js
Normal file
322
js/9.9.3/files.js
Normal file
@ -0,0 +1,322 @@
|
||||
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) {
|
||||
//console.log("none yet");
|
||||
modalNotifier("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 + "_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;
|
||||
|
||||
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 = 15;
|
||||
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, "_");
|
||||
|
||||
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.innerHTML = tF.length - sidebarItemsAmount + " files not shown";
|
||||
sidebarList.appendChild(sidebarListItem);
|
||||
return sidebarList;
|
||||
}
|
||||
sidebarListItem.innerHTML = obj.fileName.replace(/_/g, " ");
|
||||
sidebarListItem.setAttribute("data-file", obj.fileName);
|
||||
sidebarListItem.setAttribute("data-template", obj.template);
|
||||
sidebarList.appendChild(sidebarListItem);
|
||||
c++;
|
||||
}
|
||||
return sidebarList;
|
||||
}
|
||||
|
||||
function mainFormPlaceholder(msg = "Select a file") {
|
||||
return "<div class='w3-row-padding w3-padding-24 w3-container w3-flat-clouds'><div class='w3-code notranslate w3-border-white' style='font-family: Arial, Helvetica, sans-serif;'><p>" + msg + "</p><br><br><br><br><br><br><br><br><br><br><br></div></div>";
|
||||
}
|
||||
|
||||
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];
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return (previousFile != undefined) ? previousFile : false;
|
||||
}
|
||||
|
||||
export { buildFile, loadFileDivCallBack };
|
||||
290
js/9.9.3/form.js
Normal file
290
js/9.9.3/form.js
Normal file
@ -0,0 +1,290 @@
|
||||
|
||||
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;
|
||||
247
js/9.9.3/identify.js
Normal file
247
js/9.9.3/identify.js
Normal file
@ -0,0 +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;
|
||||
160
js/9.9.3/init.js
Normal file
160
js/9.9.3/init.js
Normal file
@ -0,0 +1,160 @@
|
||||
import { hideMenus, showMenu, showSidebar, showTextBlocks, clickSetForm, clickImportFiles } from "./evts.js";
|
||||
import { buildFile } from "./files.js";
|
||||
import setPassword, { passwordHash, sessionVerification } from "./scripts.js";
|
||||
import { getUsrId, logout } 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: "",
|
||||
lineBreak: 100,
|
||||
localOnly: true,
|
||||
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
|
||||
sessionVerification();
|
||||
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();
|
||||
|
||||
//add sign out
|
||||
document
|
||||
.getElementById("logout")
|
||||
.addEventListener("click", logout);
|
||||
|
||||
|
||||
//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<scripts.length;i++) {
|
||||
if (scripts[i].src) {
|
||||
let source = scripts[i].src;
|
||||
// js/version/main.js
|
||||
let pathVersion = source.split("/");
|
||||
pathVersion = pathVersion[pathVersion.length-2];
|
||||
//add it to document footer currentVersion
|
||||
versionSpan.textContent = "version: " + pathVersion;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default init;
|
||||
7
js/9.9.3/main.js
Normal file
7
js/9.9.3/main.js
Normal file
@ -0,0 +1,7 @@
|
||||
import init from "./init.js";
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", () => init());
|
||||
|
||||
|
||||
|
||||
441
js/9.9.3/parseForm.js
Normal file
441
js/9.9.3/parseForm.js
Normal file
@ -0,0 +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) {
|
||||
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, "<br>");
|
||||
bHtml = bHtml.replace(/!l /g, " • ");
|
||||
bHtml = bHtml.replace(/!ls /g, " ○ ");
|
||||
bHtml = bHtml.replace(/ /g, " ");
|
||||
|
||||
bHtml =
|
||||
"<div style='font-family: Arial, Helvetica, sans-serif;'>" +
|
||||
bHtml +
|
||||
"</div>";
|
||||
|
||||
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] = "<b>" + dataArray[i] + "</b>";
|
||||
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 "<b>" + value + "</b>";
|
||||
break;
|
||||
case "italic":
|
||||
return "<i>" + value + "</i>";
|
||||
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 "<div class='w3-row-padding w3-padding-24 w3-container w3-flat-clouds'><div class='w3-code notranslate w3-border-white' style='font-family: Arial, Helvetica, sans-serif;'><p>Select a file</p><br><br><br><br><br><br><br><br><br><br><br></div></div>";
|
||||
}
|
||||
|
||||
export default parseFormOnSubmit;
|
||||
388
js/9.9.3/parseTemplate.js
Normal file
388
js/9.9.3/parseTemplate.js
Normal file
@ -0,0 +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);
|
||||
|
||||
//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;
|
||||
168
js/9.9.3/scripts.js
Normal file
168
js/9.9.3/scripts.js
Normal file
@ -0,0 +1,168 @@
|
||||
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, "");
|
||||
window.sessionStorage.setItem(sha256(passwordHash.name), "");
|
||||
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;
|
||||
3
js/9.9.3/sha256.min.js
vendored
Normal file
3
js/9.9.3/sha256.min.js
vendored
Normal file
@ -0,0 +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<b[h];d++){if(e=b.charCodeAt(d),e>>8)return;j[d>>2]|=e<<(3-d)%4*8}for(j[j[h]]=k/g|0,j[j[h]]=k,e=0;e<j[h];){var q=j.slice(e,e+=16),r=l;for(l=l.slice(0,8),d=0;64>d;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;
|
||||
225
js/9.9.3/storage.js
Normal file
225
js/9.9.3/storage.js
Normal file
@ -0,0 +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.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};
|
||||
307
js/9.9.3/web.js
Normal file
307
js/9.9.3/web.js
Normal file
@ -0,0 +1,307 @@
|
||||
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 = "<b>" + res[x][0] + ":</b> " + 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
|
||||
};
|
||||
187
js/9.9.3/xorc.js
Normal file
187
js/9.9.3/xorc.js
Normal file
@ -0,0 +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);
|
||||
}
|
||||
|
||||
export default XORCipher;
|
||||
Loading…
Reference in New Issue
Block a user