/* * @author Robert Strutts * @copyright 2019 * @license MIT * AJAX */ tts.grab_form = function (form_id) { try { let myForm = document.getElementById(form_id); let arr = {}; for (var i = 0; i < myForm.elements.length; i++) { let id = myForm.elements[i].id; let value = myForm.elements[i].value; let node = myForm.elements[i].nodeName; if ((node == "INPUT" || node == "TEXTAREA" || node == "SELECT") && (typeof id !== "undefined" && id !== "")) { arr[id] = value; } } return arr; } catch (e) { tts.logger(e); return false; } }; function json_parse(json) { try { var obj = JSON.parse(json); var unfetched = obj.unfetched; if (typeof unfetched !== "undefined") { console.warn(`You have some unFetched JSON Vars: ${unfetched}`); } var err = obj.error; if (typeof err === "undefined") { return obj; } else if (err !== null) { throw err; } } catch (e) { return e; } } tts.send_json = function (php_script, args) { let myPromise = new Promise(function (myResolve, myReject) { if (args === false) { let nodata = "No Data from Form!"; throw nodata; } var xmlhttp = new XMLHttpRequest(); // new HttpRequest instance xmlhttp.open("POST", php_script); xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); xmlhttp.onreadystatechange = function () { if (this.readyState == 4) { if (this.status == 200) { myResolve(json_parse(this.response)); } else { myReject(json_parse(this.response)); } } }; xmlhttp.send(JSON.stringify(args)); }); return myPromise; }; tts.Post = function (url, data) { return new Promise((resolve, reject) => { var request = new XMLHttpRequest(); request.open("POST", url, true); request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); request.onload = function (d) { resolve(d.currentTarget.responseText); }; try { request.send(data); } catch (err) { reject(err); } }); }; function doProgress(eventName, evt) { if (eventName !== false && evt.lengthComputable) { var percentComplete = (evt.loaded / evt.total) * 100; var pc = Math.round(percentComplete); var event = new CustomEvent(eventName, {detail: {progress: pc}}); var el = document.getElementsByTagName('body')[0]; el.dispatchEvent(event); } } function setHTML(elementID, html) { try { return document.getElementById(elementID).innerHTML = html; } catch (e) { tts.logger("ID of " + elementID + " not found...!", "warn"); } } tts.lastAjax = false; /* So you can use the xmlHttp Request later on... if not cached... */ let ajaxCallback = function (url, resolve, reject, options) { var doCache = tts.getValue(options.useCache, false), eventName = tts.getValue(options.eventName, false); var elementID = tts.getValue(options.elementID, false), ts = tts.getValue(options.ts, ""); if (doCache) { var myCache = new tts.store(); if (myCache) { let stored_data = myCache.get(url + ts); /* timestamp cache buster */ let done = tts.getValue(stored_data, false); if (!tts.isEmpty(done)) { tts.logger('Used cache, on ' + url + ' !'); tts.lastAjax = false; doProgress(eventName, {lengthComputable: true, loaded: 100, total: 100}); if (elementID) { setHTML(elementID, stored_data); } return resolve(stored_data); } else { tts.logger('Adding to cache, for ' + url + ' !'); } } else { tts.logger('No Cache Engine enabled, for ' + url + ' !'); } } else { tts.logger('No Caching, for ' + url); } var xmlHttp = new XMLHttpRequest(); tts.lastAjax = xmlHttp; xmlHttp.upload.addEventListener("progress", function (evt) { doProgress(eventName, evt); }); xmlHttp.addEventListener("progress", function (evt) { doProgress(eventName, evt); }); xmlHttp.onreadystatechange = function () { var result; if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { switch (options.dataType) { case 'xml': result = xmlHttp.responseXML; break; case 'json': result = JSON.parse(xmlHttp.responseText); break; default: result = xmlHttp.responseText; break; } if (myCache && doCache) { myCache.set(url + ts, result); } if (elementID) { setHTML(elementID, result); } resolve(result); } else if (reject) { reject('Ajax error: ' + xmlHttp.status + ' url: ' + url); } } }; xmlHttp.open(options.method || 'GET', url, true); if (options.headers) { for (var key in options.headers) { xmlHttp.setRequestHeader(key, options.headers[key]); } } xmlHttp.send(options.data || ''); }; tts.ajax = function (url, options) { if (typeof options === "undefined") { options = {}; } return new Promise(function (resolve, reject) { ajaxCallback(url, resolve, reject, options); }); }; /* * End of AJAX */