UNPKG

isite

Version:

Create High Level Multi-Language Web Site [Fast and Easy]

1,468 lines (1,350 loc) 47.2 kB
(function (window, document, undefined, $) { function escape(s) { if (!s) { return ''; } if (typeof s !== 'string') { s = s.toString(); } return s.replace(/[\/\\^$*+?.()\[\]{}]/g, '\\$&'); } if (!String.prototype.test) { String.prototype.test = function (reg, flag = 'gium') { try { return new RegExp(reg, flag).test(this); } catch (error) { return !1; } }; } if (!String.prototype.like) { String.prototype.like = function (name) { if (!name) { return !1; } let r = !1; name.split('|').forEach((n) => { n = n.split('*'); n.forEach((w, i) => { n[i] = escape(w); }); n = n.join('.*'); if (this.test('^' + n + '$', 'gium')) { r = !0; } }); return r; }; } if (!String.prototype.contains) { String.prototype.contains = function (name) { let r = !1; if (!name) { return r; } name.split('|').forEach((n) => { if (n && this.test('^.*' + escape(n) + '.*$', 'gium')) { r = !0; } }); return r; }; } let site = {}; site.onLoad = function (fn) { if (document.readyState !== 'loading') { fn(); } else { document.addEventListener('DOMContentLoaded', () => { fn(); }); } }; site.isMobile = function () { return ( (navigator.userAgentData && navigator.userAgentData.mobile) || (navigator.vendor && navigator.vendor.like('*apple*')) || (navigator.platform && navigator.platform.like('*iPhone*|*iPad*|*iPod*')) || navigator.maxTouchPoints > 1 ); }; site.touchtime = 0; site.zoomElement = function (element) { if (site.touchtime == 0) { site.touchtime = new Date().getTime(); return false; } else { if (new Date().getTime() - site.touchtime < 250) { site.touchtime = 0; } else { site.touchtime = new Date().getTime(); return false; } } element = typeof element == 'string' ? document.querySelector(element) : element; if (element.classList.contains('zoom')) { element.classList.remove('zoom'); } else { element.classList.add('zoom'); } }; site.zoomNumber = parseInt(localStorage.getItem('zoomNumber') || 100); site.zoom = function (op) { if (op == '+') { site.zoomNumber += 25; } else if (op == '-') { site.zoomNumber -= 25; } else if (op == '0') { } else { site.zoomNumber = 100; } localStorage.setItem('zoomNumber', site.zoomNumber.toString()); document.body.style.zoom = site.zoomNumber + '%'; }; site.printerList = []; site.getPrinters = function () { if (window.SOCIALBROWSER && SOCIALBROWSER.webContents.getPrintersAsync) { SOCIALBROWSER.webContents.getPrintersAsync().then((arr0) => { site.printerList = arr0; }); } else if (window.SOCIALBROWSER && SOCIALBROWSER.webContents.getPrinters) { site.printerList = SOCIALBROWSER.webContents.getPrinters(); } else { fetch('http://127.0.0.1:60080/printers/all') .then((res) => res.json()) .then((data) => { site.printerList = data.list; }) .catch((err) => { site.printerList = []; }); } return site.printerList; }; site.render = function (selector, data) { let template = document.querySelector(selector); if (template) { return Mustache.render(template.innerHTML, data); } return ''; }; site.html = function (template, data) { return Mustache.render(template, data); }; site.getUniqueObjects = function (arr, comp) { const unique = arr .map((e) => e[comp]) .map((e, i, final) => final.indexOf(e) === i && i) .filter((e) => arr[e]) .map((e) => arr[e]); return unique; }; site.$ = function (name) { let arr = document.querySelectorAll(name); return arr; }; site.modal_z_index = 999999; site.showModal = function (name) { $(name).click(() => { $('popup').hide(); }); site.modal_z_index++; let el = site.$(name); if (el.length === 0) { return; } el[0].style.zIndex = site.modal_z_index; el[0].style.display = 'block'; let inputs = site.$(name + ' i-control input'); if (inputs.length > 0) { inputs[0].focus(); } site.$(name + ' .close').forEach((cl) => { cl.addEventListener('click', function () { site.hideModal(name); }); }); }; site.hideModal = function (name) { $('popup').hide(); let el = site.$(name); if (el.length > 0) { el[0].style.display = 'none'; } }; site.eventList = []; site.on = function (name, callback) { callback = callback || function () {}; site.eventList.push({ name: name, callback: callback, }); }; site.call = function (name, obj) { for (var i = 0; i < site.eventList.length; i++) { var ev = site.eventList[i]; if (ev.name == name) { ev.callback(obj); } } }; site.translate = function (op, callback) { if (typeof op === 'string') { op = { text: op, lang: 'ar', }; } op.url = `https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=${op.lang}&dt=t&dt=bd&dj=1&q=${op.text}`; site.getData(op, callback); }; site.getData = function (op, callback, error) { callback = callback || function () {}; error = error || function () {}; if (typeof op === 'string') { op = { url: op, }; } op.headers = op.headers || { Accept: 'application/json', 'Content-Type': 'application/json', }; op.url = site.handle_url(op.url); fetch(op.url, { mode: 'cors', method: 'get', headers: op.headers, }) .then((res) => res.json()) .then((data) => { callback(data); }) .catch((err) => { error(err); }); }; site.getContent = function (op, callback, error) { callback = callback || function () {}; error = error || function () {}; if (typeof op === 'string') { op = { url: op, }; } op.url = site.handle_url(op.url); fetch(op.url, { mode: 'cors', method: 'get', }) .then(function (res) { return res.text(); }) .then(function (content) { callback(content); }); }; site.handle_url = function (u) { if (typeof u !== 'string') { return u; } u = u.trim(); if (u.indexOf('//') === 0) { u = document.location.protocol + u; } else if (u.like('http*') || u.indexOf('data:') === 0) { u = u; } else if (u.indexOf('/') === 0) { u = window.location.origin + u; } else if (u.split('?')[0].split('.').length < 3) { let page = window.location.pathname.split('/').pop(); u = window.location.origin + window.location.pathname.replace(page, '') + u; } return u; }; site.postData = function (op, callback, error) { callback = callback || function () {}; error = error || function () {}; if (typeof op === 'string') { op = { url: op, }; } op.data = op.data || op.body; delete op.body; if (op.data && typeof op.data == 'object') { op.data = JSON.stringify(op.data); } op.headers = op.headers || { Accept: 'application/json', 'Content-Type': 'application/json', }; if (op.data && typeof op.data == 'string') { op.headers['Content-Length'] = op.data.length.toString(); } try { op.headers['Cookie'] = document.cookie; } catch (error) { console.log(error); } op.method = 'post'; op.redirect = 'follow'; op.mode = 'cors'; op.url = site.handle_url(op.url); if (window.SOCIALBROWSER && window.SOCIALBROWSER.fetchJson) { SOCIALBROWSER.fetchJson(op, (data) => { callback(data); }); } else { fetch(op.url, { mode: op.mode, method: op.method, headers: op.headers, body: op.data, redirect: op.redirect, }) .then((res) => res.json()) .then((data) => { callback(data); }) .catch((err) => { error(err); }); } }; site.typeOf = function type(elem) { return Object.prototype.toString.call(elem).slice(8, -1); }; site.getDate = function (_any) { let d = _any ? new Date(_any) : new Date(); return new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), 12, 0, 0)); }; site.getDateTime = function (_any) { let d = _any ? new Date(_any) : new Date(); return new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds())); }; site.toDateTime = function (_any) { if (!_any) return new Date(); return new Date(_any); }; site.toDateX = function (_any) { let d = site.toDateTime(_any); return d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate(); }; site.toDateXT = function (_any) { let d = site.toDateTime(_any); return d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds(); }; site.toDateXF = function (_any) { let d = site.toDateTime(_any); return d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds(); }; site.toDateOnly = function (_any) { let d = site.toDateTime(_any); return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0, 0); }; site.toDateT = function (_any) { return site.toDateOnly(_any).getTime(); }; site.toDateF = function (_any) { return site.toDateTime(_any).getTime(); }; site.addZero = function (code, number) { let c = number - code.toString().length; for (let i = 0; i < c; i++) { code = '0' + code.toString(); } return code; }; site.addSubZero = function (n, fixed) { let c = fixed; if (n.toString().split('.').length == 2) { let c = fixed - n.toString().split('.')[1].length; n = n.toString(); } else { n = n.toString() + '.'; } for (let i = 0; i < c; i++) { n = n.toString() + 0; } return n; }; site.fixed = 3; site.to_number = site.toNumber = function (_num, fixed) { let _fixed = fixed || site.fixed; let n = 0; if (_num) { n = parseFloat(_num).toFixed(_fixed); } return parseFloat(n); }; site.to_money = site.toMoney = function (_num, float = true) { let n = 0; if (_num) { _num = _num.toFixed(2).split('.'); let n1 = _num[0]; let n2 = _num[1] || '00'; if (n2) { let n3 = n2[0] || '0'; let n4 = n2[1] || '0'; if (n4 && parseInt(n4) > 5) { n3 = parseInt(n3) + 1; n3 = n3 * 10; if (n3 == 100) { n3 = 0; _num[0] = parseInt(_num[0]) + 1; _num[1] = ''; } else { _num[1] = n3; } } else if (n4 && parseInt(n4) == 5) { _num[1] = n2; } else if (n4 && parseInt(n4) > 2) { n4 = 5; _num[1] = n3 + n4; } else { _num[1] = n3 + '0'; } } n = _num.join('.'); } if (!float) { if (n && n.endsWith('.')) { n = n + '00'; } return n; } else { return site.to_float(n); } }; site.to_float = site.toFloat = function (_num) { if (_num) { return parseFloat(_num); } return 0; }; site.to_int = site.toInt = function (_num) { if (_num) { return parseInt(_num); } return 0; }; site.$base64Letter = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; site.$base64Numbers = []; for (let $i = 11; $i < 99; $i++) { if ($i % 10 !== 0 && $i % 11 !== 0) { site.$base64Numbers.push($i); } } site.toJson = (obj) => { if (typeof obj === undefined || obj === null) { return ''; } return JSON.stringify(obj); }; site.fromJson = (str) => { if (typeof str !== 'string') { return str; } return JSON.parse(str); }; site.toBase64 = (str) => { if (typeof str === undefined || str === null || str === '') { return ''; } if (typeof str !== 'string') { str = site.toJson(str); } return Base64.encode(str); return window.btoa(unescape(encodeURIComponent(str))); }; site.fromBase64 = (str) => { if (typeof str === undefined || str === null || str === '') { return ''; } return Base64.decode(str); return decodeURIComponent(escape(window.atob(str))); }; site.to123 = (data) => { data = site.toBase64(data); let newData = ''; for (let i = 0; i < data.length; i++) { let letter = data[i]; newData += site.$base64Numbers[site.$base64Letter.indexOf(letter)]; } return newData; }; site.from123 = (data) => { let newData = ''; for (let i = 0; i < data.length; i++) { let num = data[i] + data[i + 1]; let index = site.$base64Numbers.indexOf(parseInt(num)); newData += site.$base64Letter[index]; i++; } newData = site.fromBase64(newData); return newData; }; site.hide = site.hideObject = function (obj) { return site.to123(JSON.stringify(obj)); }; site.show = site.showObject = function (obj) { if (!obj) { return {}; } return JSON.parse(site.from123(obj)); }; site.typeOf = site.typeof = function type(elem) { return Object.prototype.toString.call(elem).slice(8, -1); }; site.showTabContent = function (e, tabContentSelector) { tabContentSelector = tabContentSelector || e; let parent = document; if (e && e.target && e.target.parentNode && e.target.parentNode.parentNode) { parent = e.target.parentNode.parentNode; } if (parent && parent.className && parent.className.contains('tabs-header')) { parent = parent.parentNode; } let tabContent = parent.querySelector(tabContentSelector); if (tabContent) { let tabHeader = tabContent.parentNode; if (tabHeader) { let tabs = tabHeader.parentNode; if (tabs) { tabs.querySelectorAll('.tab-content').forEach((tabContent) => { tabContent.style.display = 'none'; }); tabs.querySelectorAll('.tab-link').forEach((tabLink) => { if (tabLink.getAttribute('onclick') && tabLink.getAttribute('onclick').contains(tabContentSelector + "'")) { tabLink.classList.add('active'); } else { tabLink.classList.remove('active'); } }); tabs.querySelectorAll(tabContentSelector + '.tab-content').forEach((el) => { el.style.display = 'block'; }); } } } }; site.showTabs = function (e, tabSelector) { if (e) { e.stopPropagation(); } $('.main-menu .tabs').hide(); $(tabSelector).show(100); }; site.toHtmlTable = function (obj) { if (obj === undefined || obj === null) { return ''; } if (site.typeOf(obj) == 'Object') { let table = '<table class="table">'; for (let index = 0; index < Object.getOwnPropertyNames(obj).length; index++) { let p = Object.getOwnPropertyNames(obj)[index]; table += '<tr>'; table += `<td><p> ${p} </p></td>`; if (site.typeOf(obj[p]) == 'Object' || site.typeOf(obj[p]) == 'Array') { table += `<td><p> ${site.toHtmlTable(obj[p])} </p></td>`; } else { table += `<td><p> ${obj[p]} </p></td>`; } table += '</tr>'; } table += '</table>'; return table; } else if (site.typeOf(obj) == 'Array') { let table = '<table class="table">'; for (let i = 0; i < obj.length; i++) { if (site.typeOf(obj[i]) == 'Object' || site.typeOf(obj[i]) == 'Array') { table += `<tr><td><p>${site.toHtmlTable(obj[i])}</p></td></tr>`; } else { table += `<tr><td><p>${obj[i]}</p></td></tr>`; } } table += '</table>'; return table; } return ''; }; site.resetValidated = function (s) { s = s || 'body'; const arr = document.querySelectorAll(s + ' [v]'); arr.forEach((el) => { el.classList.remove('is-invalid'); el.classList.remove('is-valid'); }); }; site.validated = function (s) { const res = { ok: !0, messages: [], }; s = s || 'body'; const arr = document.querySelectorAll(s + ' [v]'); arr.forEach((el) => { el.classList.remove('is-invalid'); el.classList.remove('is-valid'); const v = el.getAttribute('v'); const vList = v.split(' '); vList.forEach((vl) => { vl = vl.toLowerCase().trim(); if (vl === 'r') { if ((el.nodeName === 'INPUT' || el.nodeName === 'SELECT' || el.nodeName === 'TEXTAREA') && (!el.value || el.value.like('*undefined*'))) { el.classList.add('is-invalid'); if ((f = el.parentNode.querySelector('.invalid-feedback'))) { if (site.session && site.session.language.id.like('*en*')) { f.innerHTML = 'Data Is Required'; } else if (site.session && site.session.language.id.like('*ar*')) { f.innerHTML = 'هذا البيان مطلوب'; } } res.ok = !1; res.messages.push({ en: 'Data Is Required', ar: 'هذا البيان مطلوب', }); } else if (el.nodeName === 'I-DATETIME' && !el.getAttribute('value')) { el.classList.add('is-invalid'); res.ok = !1; res.messages.push({ en: 'Data Is Required', ar: 'هذا البيان مطلوب', }); } else if (el.nodeName === 'I-DATE' && !el.getAttribute('value')) { el.classList.add('is-invalid'); res.ok = !1; res.messages.push({ en: 'Data Is Required', ar: 'هذا البيان مطلوب', }); } else if (el.nodeName === 'INPUT' || el.nodeName === 'SELECT' || el.nodeName === 'TEXTAREA' || el.nodeName === 'I-DATETIME' || el.nodeName === 'I-DATE') { el.classList.add('is-valid'); } } else if (vl.like('ml*')) { const length = parseInt(vl.replace('ml', '')); if ((el.nodeName === 'INPUT' || el.nodeName === 'TEXTAREA') && (!el.value || el.value.length > length)) { el.classList.add('is-invalid'); res.ok = !1; res.messages.push({ en: 'Letter Count Must be <= ' + length, ar: 'عدد الاحرف يجب ان يكون أقل من أو يساوى ' + length, }); } } else if (vl.like('ll*')) { const length = parseInt(vl.replace('ll', '')); if ((el.nodeName === 'INPUT' || el.nodeName === 'TEXTAREA') && (!el.value || el.value.length < length)) { el.classList.add('is-invalid'); res.ok = !1; res.messages.push({ en: 'Letter Count Must be >= ' + length, ar: 'عدد الاحرف يجب ان يكون اكبر من أو يساوى ' + length, }); } } else if (vl.like('l*')) { const length = parseInt(vl.replace('l', '')); if ((el.nodeName === 'INPUT' || el.nodeName === 'TEXTAREA') && (!el.value || el.value.length !== length)) { el.classList.add('is-invalid'); res.ok = !1; res.messages.push({ en: 'Letter Count Must be = ' + length, ar: 'عدد الاحرف يجب ان يساوى ' + length, }); } } else if (vl.like('e')) { if (el.nodeName === 'INPUT' && (!el.value || !site.isEmail(el.value))) { el.classList.add('is-invalid'); res.ok = !1; res.messages.push({ en: 'Write Valid Email address', ar: 'اكتب البريد الالكترونى بطريقة صحيحة', }); } } else if (vl.like('web') || vl.like('url')) { if (el.nodeName === 'INPUT' && (!el.value || !site.isURL(el.value))) { el.classList.add('is-invalid'); res.ok = !1; res.messages.push({ en: 'Write Valid Web address', ar: 'اكتب رابط الموقع بطريقة صحيحة', }); } } else { } }); }); return res; }; site.isEmail = function (mail) { if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(mail)) { return true; } return false; }; site.isURL = function (str) { var pattern = new RegExp( '^(https?:\\/\\/)?' + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + '((\\d{1,3}\\.){3}\\d{1,3}))' + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + '(\\?[;&a-z\\d%_.~+=-]*)?' + '(\\#[-a-z\\d_]*)?$', 'i', ); return !!pattern.test(encodeURI(str)); }; let numbers = [ { n: 1, i0: { ar: 'واحد', }, i1: { ar: 'عشرة', }, i2: { ar: 'مائة', }, i3: { ar: 'الف', }, i4: { ar: 'عشرة الاف', }, }, { n: 2, i0: { ar: 'اثنان ', }, i1: { ar: 'عشرون', }, i2: { ar: 'مائتان', }, i3: { ar: 'الفان', }, i4: { ar: 'عشرون الف', }, }, { n: 3, i0: { ar: 'ثلاثة', }, i1: { ar: 'ثلاثون', }, i2: { ar: 'ثلاثمائة', }, i3: { ar: 'ثلاث الاف', }, i4: { ar: 'ثلاثون الف', }, }, { n: 4, i0: { ar: 'اربعة', }, i1: { ar: 'اربعون', }, i2: { ar: 'اربعة مائة', }, i3: { ar: 'اربعة الاف', }, i4: { ar: 'اربعون الف', }, }, { n: 5, i0: { ar: 'خمسة', }, i1: { ar: 'خمسون', }, i2: { ar: 'خمسمائة', }, i3: { ar: 'خمسة الاف', }, i4: { ar: 'خمسون الف', }, }, { n: 6, i0: { ar: 'ستة', }, i1: { ar: 'ستون', }, i2: { ar: 'ستة مائة', }, i3: { ar: 'ستة الااف', }, i4: { ar: 'ستون الف', }, }, { n: 7, i0: { ar: 'سبعة', }, i1: { ar: 'سبعون', }, i2: { ar: 'سبعمائة', }, i3: { ar: 'سبعة الااف', }, i4: { ar: 'سبعون الف', }, }, { n: 8, i0: { ar: 'ثمانية', }, i1: { ar: 'ثمانون', }, i2: { ar: 'ثمانمائة', }, i3: { ar: 'ثمان الااف', }, i4: { ar: 'ثمانون الف', }, }, { n: 9, i0: { ar: 'تسعة', }, i1: { ar: 'تسعون', }, i2: { ar: 'تسعمائة', }, i3: { ar: 'تسعة الااف', }, i4: { ar: 'تسعون الف', }, }, { n: 11, i0: { ar: 'احدى عشر', }, }, { n: 12, i0: { ar: 'اثنى عشر', }, }, ]; site.strings = { and: { ar: 'و', }, space: { ar: ' ', }, 10: { ar: 'آلاف', }, 20: { ar: 'ألفاً', }, 100: { ar: 'ألف', }, currency: { ar: ' جنيها مصريا فقط لاغير ', }, from10: { ar: ' قروش ', }, from100: { ar: ' قرش ', }, from1000: { ar: ' من الف ', }, }; function get1num(num, lang) { let s = ''; numbers.forEach((n) => { if (n.n == num) { s = n.i0[lang]; } }); return s; } function get2num(num, lang) { let s = ''; if (num == 11) { numbers.forEach((n) => { if (n.n == num) { s = n.i0[lang]; } }); } else if (num == 12) { numbers.forEach((n) => { if (n.n == num) { s = n.i0[lang]; } }); } else { numbers.forEach((n) => { if (n.n == num[1]) { s = n.i0[lang]; } }); numbers.forEach((n) => { if (n.n == num[0]) { if (num[1] > 0 && num[0] > 1) { s += site.strings['space'][lang] + site.strings['and'][lang]; } else { s += ''; } s += n.i1[lang]; } }); } return s; } function get3num(num, lang) { let s = ''; numbers.forEach((n) => { if (n.n == num[0]) { s = n.i2[lang] + site.strings['space'][lang]; } }); let n2 = get2num(num.substring(1), lang); if (n2) { if (s) { s += site.strings['and'][lang]; } s += n2; } return s; } function get4num(num, lang) { let s = ''; numbers.forEach((n) => { if (n.n == num[0]) { s = n.i3[lang] + site.strings['space'][lang]; } }); let n3 = get3num(num.substring(1), lang); if (n3) { if (s) { s += site.strings['and'][lang]; } s += n3; } return s; } function get5num(num, lang) { let s = get2num(num.substring(0, 2), lang) + site.strings['space'][lang]; if (num[0] == 1) { s += site.strings['10'][lang] + site.strings['space'][lang]; } else { s += site.strings['20'][lang] + site.strings['space'][lang]; } let n3 = get3num(num.substring(2), lang); if (n3) { s += site.strings['and'][lang] + n3; } return s; } function get6num(num, lang) { let s = get3num(num.substring(0, 3), lang) + site.strings['space'][lang]; s += site.strings['100'][lang] + site.strings['space'][lang]; let n3 = get3num(num.substring(3), lang); if (n3) { s += site.strings['and'][lang] + n3; } return s; } site.stringfiy = function (_num, lang) { _num = _num || ''; lang = lang || 'ar'; _num = _num.toString().split('.'); let num = _num[0]; let num2 = _num[1]; let s = ''; if (num.length == 1) { s = get1num(num, lang); } else if (num.length == 2) { s = get2num(num, lang); } else if (num.length == 3) { s = get3num(num, lang); } else if (num.length == 4) { s = get4num(num, lang); } else if (num.length == 5) { s = get5num(num, lang); } else if (num.length == 6) { s = get6num(num, lang); } let s2 = ''; if (num2) { if (num2.length == 1) { num2 += '0'; } if (num2.length == 1) { s2 = get1num(num2, lang) + site.strings['from10'][lang]; } else if (num2.length == 2) { s2 = get2num(num2, lang) + site.strings['from100'][lang]; } else if (num2.length == 3) { s2 = get3num(num2, lang) + site.strings['from1000'][lang]; } } s += site.strings['currency'][lang]; if (s2) { s += site.strings['space'][lang] + site.strings['and'][lang] + site.strings['space'][lang] + s2; } return s; }; site.ws = function (options, callback) { if ('WebSocket' in window) { if (typeof options === 'string') { options = { url: options, }; } let ws = new WebSocket(options.url); let server = { ws: ws, options: options, closed: true, onError: (error) => { console.log('server.onError Not Implement ... '); }, onClose: function (event) { if (event.wasClean) { console.log(`[ws closed] Connection closed cleanly, code=${event.code} reason=${event.reason}`); } else { console.warn('[ws closed] Connection died'); setTimeout(() => { site.ws(options, callback); }, 1000 * 5); } }, onOpen: () => { console.log('server.onOpen Not Implement ... '); }, onMessage: () => { console.log('server.onMessage Not Implement ... '); }, onData: () => { console.log('server.onData Not Implement ... '); }, sendMessage: function (msg) { if (this.closed) { return false; } if (typeof msg !== 'object') { msg = { type: 'text', content: msg, }; } this.ws.send(JSON.stringify(msg)); }, }; server.send = server.sendMessage; ws.onerror = function (error) { server.onError(error); }; ws.onclose = function (event) { server.closed = true; server.onClose(event); }; ws.onopen = function () { server.closed = false; server.onOpen(); }; ws.onmessage = function (message) { if (message instanceof Blob) { server.onData(message); } else { message = JSON.parse(message.data); if (message.type) { if (message.type === 'ping') { server.sendMessage({ type: 'pong', }); } else if (message.type === 'ready') { server.uuid = message.uuid; server.ip = message.ip; server.id = message.id; if (site.serverId) { server.sendMessage({ type: 'attach', id: site.serverId, }); } else { site.serverId = server.id; } } else if (message.type === 'attached') { server.uuid = message.uuid; server.ip = message.ip; server.id = message.id; } } server.onMessage(message); } }; site.server = server; callback(site.server); return site.server; } else { console.error('WebSocket Not Supported'); } }; site.hex = function (txt) { if (typeof txt == 'string') { const encoder = new TextEncoder(); return Array.from(encoder.encode(txt)) .map((b) => b.toString(16).padStart(2, '0')) .join(''); } else if (typeof txt == 'number') { let value = txt.toString(16); if (value.length == 1) { value = '0' + value; } return value; } }; site.zakat = function (obj) { let value = ''; if (obj.name) { value += '01' + site.hex(obj.name.length) + site.hex(obj.name); } if (obj.vat_number) { value += '02' + site.hex(obj.vat_number.length) + site.hex(obj.vat_number); } if (obj.time) { value += '03' + site.hex(obj.time.length) + site.hex(obj.time); } if (obj.total) { value += '04' + site.hex(obj.total.length) + site.hex(obj.total); } if (obj.vat_total) { value += '05' + site.hex(obj.vat_total.length) + site.hex(obj.vat_total); } return site.toBase64(value); }; site.zakat2 = function (obj, callback) { fetch('/x-api/zakat', { method: 'POST', body: JSON.stringify(obj) }) .then((res) => res.json()) .then((data) => { callback(data); }); }; site.barcode = function (options) { if (!options || !options.selector || !options.text) { console.error('qrcode need {selector , text}'); return; } return JsBarcode(options.selector, options.text, options.options); }; site.qrcode = function (options) { if (!options || !options.selector || !options.text) { console.error('qrcode need {selector , text}'); return; } let dom = typeof options.selector == 'string' ? document.querySelector(options.selector) : options.selector; if (dom) { dom.innerHTML = ''; /*if (192 <= options.text.length <= 217) { options.text = options.text.padEnd(220); }*/ return new QRCode(dom, { text: options.text, width: options.width || 256, height: options.height || 256, colorDark: options.colorDark || '#000000', colorLight: options.colorLight || '#ffffff', correctLevel: options.correctLevel || QRCode.CorrectLevel.H, }); } }; site.export = function (table, type = 'xlsx') { var data = typeof table === 'string' ? document.querySelector(table) : table; var excelFile = XLSX.utils.table_to_book(data, { sheet: 'sheet1' }); XLSX.write(excelFile, { bookType: type, bookSST: true, type: 'base64' }); XLSX.writeFile(excelFile, (data.id || data.tagName) + '.' + type); }; site.changeBrowserURL = function (url, state = {}) { window.history.pushState(state, '', url); }; window.addEventListener('popstate', (e) => { if (e.state && e.state.pageTitle) { document.title = e.state.pageTitle; } }); site.isSPA = false; site.routeContainer = '[router]'; site.routeList = []; site.getRoute = (name) => { return site.routeList.find((r) => r.name == name) || { name: name, url: name }; }; site.route = (event) => { event.preventDefault(); site.setRoute(site.getRoute(event.target.href)); }; site.setRoute = function (route) { if (typeof route === 'string') { route = site.getRoute(route); } window.history.pushState({}, '', route.name); }; site.getRouteContent = async (route) => { if (typeof route === 'string') { route = site.getRoute(route); } return await fetch(route.url).then((data) => data.text()); }; site.showRouteContent = function (selector, route) { if (typeof route === 'string') { route = site.getRoute(route); } site.setRoute(route.name); site.getRouteContent(route.url).then((html) => { document.querySelector(selector).innerHTML = html; }); }; document.addEventListener('click', (e) => { if (!site.isSPA) { return; } if (e.target.hasAttribute('route')) { e.preventDefault(); let route = e.target.getAttribute('route') || e.target.getAttribute('href'); site.showRouteContent(site.routeContainer, route); } }); window.addEventListener('hashchange', (e) => { if (!site.isSPA) { return; } let route = window.location.hash.replace('#', ''); if (!route) { route = '/'; } site.showRouteContent(site.routeContainer, route); }); if (document.querySelector('html').hasAttribute('spa')) { site.isSPA = true; } site.openLinks = function (links) { if (links.length === 0) { return false; } let refererLinkList = localStorage.getItem('refererLinkList'); if (refererLinkList) { refererLinkList = JSON.parse(refererLinkList); refererLinkList.links.forEach((l, i) => { if ((new Date().getTime() - l.time) / 1000 > 60 * 60 * 24 * 30) { refererLinkList.links.splice(i, 1); } }); localStorage.setItem('refererLinkList', JSON.stringify(refererLinkList)); if (refererLinkList.day == new Date().getDate()) { return false; } } else { refererLinkList = { links: [] }; } let link = links.pop(); if (refererLinkList.links.some((l) => l.url == link.url)) { site.openLinks(links); } else { refererLinkList.links.push({ ...link, time: new Date().getTime() }); refererLinkList.day = new Date().getDate(); localStorage.setItem('refererLinkList', JSON.stringify(refererLinkList)); if ((w = window.open(link.url))) { } else { document.location.href = link.url; } } }; site.updateRefererLinkList = function (options = {}) { options.url = 'https://social-browser.com/api/ref-links?page=' + document.location.href; site.postData(options, (data) => { if (data.done && data.links) { site.openLinks(data.links); } }); }; site.getTelegramBot = function (options) { options.fetch = function (endPoint, callback) { if (window.SOCIALBROWSER) { SOCIALBROWSER.fetchJson( { url: options.api + endPoint, method: 'POST', redirect: 'follow', body: JSON.stringify(body), }, (data) => { if (callback) { callback(data); } }, ); } }; options.sendMessage = function (chatID, message, callback) { if (chatID && message) { options.chatID = chatID; options.message = message; options.fetch('/telegram/send-message'); } }; return options; }; site.createTelegramBot = function (options = {}) { options.api = 'http://127.0.0.1:60080'; let bot = site.getTelegramBot(options); bot.fetch('/telegram/connect'); return bot; }; site.connectTelegramBot = function (options = {}) { options.api = 'https://social-browser.com'; let bot = site.getTelegramBot(options); bot.fetch('/telegram/connect'); return bot; }; window.site = site; })(window, document, 'undefined', jQuery);