115 lines
2.9 KiB
JavaScript
115 lines
2.9 KiB
JavaScript
|
|
/**
|
||
|
|
* amberstone
|
||
|
|
* @author arcturus (contact@sharlayan.net / https://info.drk.st/about)
|
||
|
|
* @version 1.1.3
|
||
|
|
*/
|
||
|
|
|
||
|
|
function pad(num, len = 2) {
|
||
|
|
return num.toFixed(0).padStart(len, '0');
|
||
|
|
}
|
||
|
|
|
||
|
|
function serializeForm(form) {
|
||
|
|
var formData = new FormData(form);
|
||
|
|
var params = new URLSearchParams();
|
||
|
|
|
||
|
|
formData.forEach(function (value, key) {
|
||
|
|
params.append(key, value);
|
||
|
|
});
|
||
|
|
|
||
|
|
return params.toString();
|
||
|
|
}
|
||
|
|
|
||
|
|
function createHtmlFromJson(jsonData) {
|
||
|
|
function createElementRecursive(data) {
|
||
|
|
if (typeof data !== 'object' || data === null) {
|
||
|
|
return document.createTextNode(String(data));
|
||
|
|
}
|
||
|
|
|
||
|
|
const element = createElement(data.type || 'div', data);
|
||
|
|
|
||
|
|
if (data.children) {
|
||
|
|
if (Array.isArray(data.children)) {
|
||
|
|
data.children.forEach(child => {
|
||
|
|
element.appendChild(createElementRecursive(child));
|
||
|
|
});
|
||
|
|
} else {
|
||
|
|
element.appendChild(createElementRecursive(data.children));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return element;
|
||
|
|
}
|
||
|
|
|
||
|
|
return createElementRecursive(jsonData);
|
||
|
|
}
|
||
|
|
|
||
|
|
function createElement(type, data) {
|
||
|
|
const elem = document.createElement(type);
|
||
|
|
if (typeof data === 'object') {
|
||
|
|
if (data.hasOwnProperty('classList')) {
|
||
|
|
if (Array.isArray(data.classList)) {
|
||
|
|
for (const cl of data.classList) {
|
||
|
|
elem.classList.add(cl);
|
||
|
|
}
|
||
|
|
} else if (typeof data.classList === 'string') {
|
||
|
|
elem.classList.add(data.classList);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (data.hasOwnProperty('css')) {
|
||
|
|
if (typeof data.css === 'object') {
|
||
|
|
for (const css in data.css) {
|
||
|
|
elem.style.setProperty(css, data.css[css]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (data.hasOwnProperty('textContent')) {
|
||
|
|
elem.textContent = data.textContent;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (data.hasOwnProperty('innerHTML')) {
|
||
|
|
elem.innerHTML = data.innerHTML;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (data.hasOwnProperty('attributes')) {
|
||
|
|
if (typeof data.attributes === 'object') {
|
||
|
|
for (const attr in data.attributes) {
|
||
|
|
elem.setAttribute(attr, data.attributes[attr]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} else if (Array.isArray(data) && data.length > 0) {
|
||
|
|
for (const cl of data) {
|
||
|
|
elem.classList.add(cl);
|
||
|
|
}
|
||
|
|
} else if (typeof data === 'string') {
|
||
|
|
elem.classList.add(data);
|
||
|
|
}
|
||
|
|
return elem;
|
||
|
|
}
|
||
|
|
|
||
|
|
function sendRequest(url, data, type, callback, useUrlEncoded = true) {
|
||
|
|
var xhr = new XMLHttpRequest();
|
||
|
|
xhr.open(type, url, true);
|
||
|
|
|
||
|
|
if (useUrlEncoded) {
|
||
|
|
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||
|
|
data = new URLSearchParams(data).toString();
|
||
|
|
} else {
|
||
|
|
xhr.setRequestHeader('Content-Type', 'application/json');
|
||
|
|
data = JSON.stringify(data);
|
||
|
|
}
|
||
|
|
|
||
|
|
xhr.onreadystatechange = function () {
|
||
|
|
if (xhr.readyState === 4) {
|
||
|
|
if (xhr.status >= 200 && xhr.status < 300) {
|
||
|
|
callback(null, xhr.responseText);
|
||
|
|
} else {
|
||
|
|
callback(xhr.statusText, null);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
};
|
||
|
|
xhr.send(type === 'POST' ? data : null);
|
||
|
|
}
|