window.onload = app_main; var store = {}; function app_main() { app_loadall(() => { if (appInLocalhost() || 1) xaddhtml(document.body, h_page()); else xaddhtml(document.body, techworksTpl()); if (urlGet("edit")) { editorEdit(jasmineGetItem(urlGet("edit"))); } if (urlGet("show")) { cardShow(jasmineGetItem(urlGet("show"))); } if (urlGet("parser")) { vkparserShow(); } }); //document.body.style.background = "url(./img/back-pattern.png)"; } function app_loadall(onload) { jasmineAjax("./?api=app::client_loadall", {onjson: (vals) => { Object.assign(store, vals); clog("store:", store); onload(); }}); } function app_reloadall() { xtrigger("html"); } function appInLocalhost() { if (location.hostname === "acadi.site") return 0; return 1; } function app_sort_grid_items(items) { items.sort((a, w) => { return -(a.time - w.time); }); } function app_get_grid_items() { var items = store.items.filter(i => { return i.kind == "item" && (!itemNotpublic(i) || item_editable(i) || store.admin); }); app_sort_grid_items(items); return items; } function app_add_user_item() { var exist = app_find_user_item(); if (exist) editorEdit(exist); else app_additem(); } function app_additem(sessionid = 0) { if (!sessionid) sessionid = store.sessionid; editorEdit({kind: "item", id: jasmineNewId(), sessionid: sessionid, time: mtime()}); } function app_add_admin_item() { app_additem(1); } function app_remove_item(item) { jasmineRemoveItem(item, ev => location.reload()); } function app_find_user_item() { return store.items.find(i => i.sessionid == store.sessionid); } function item_editable(item) { return store.sessionid == item.sessionid; } function itemTime(time) { return item_ftime(time); } function item_ftime(time) { var date = new Date(parseInt(time)); var day = date.getDate(); var month = date.getMonth(); var year = date.getFullYear(); var hour = date.getHours(); var minute = date.getMinutes(); var months = ["Января", "Февраля", "Март", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"]; var monthName = months[month]; return day + " " + monthName + " " + year + " в " + hour + ":" + minute; } function itemTitle(item) { var value = item.value; if (value) { var title = (value + "").split(";", 2)[0]; /* var steps = (value + "").split(";", 2)[0]; for (var i = 0; i < steps.length; i++) { title += steps[i] + " "; if (title.length >= 155) break; } */ return itemEscape(title); } } function itemEscape(value) { return (value + '').replace(/[\\"']/g, '\\$&').replace(/[<>]/g, '_'); } function itemNotpublic(item) { return item.value[0] == "-" ? 1 : 0; } function appGetFotosOfDay() { var fotos = []; var baseitem = store.items.find(i => i.value == "-фото-дня-"); if (baseitem) { var fileitems = jasmineGetFiles(baseitem).slice(); fileitems.sort((a, w) => -a.weight + w.weight); xwalk(fileitems, i => fotos.push({url: jasmineItemPicture(i)})); //fix } if (!fotos.length) fotos.push({url: "./img/landing4.jpg"}); return fotos; } function appOpenFotosOfDay() { var baseitem = store.items.find(i => i.value == "-фото-дня-"); if (baseitem) cardShow(baseitem); } function cardView(item) { return xeval(`
@{markdown(item.value)}
@{xfor(jasmineGetFiles(item), (fitem) => \`
\`)}
`, {item: item}); } function cardShow(item) { cardClose(); xaddhtml(document.body, cardView(item)); } function cardClose() { xremovehtml(".card"); } function cardTouchStart(ev) { if (ev.touches.length != 1) return; ev.target.touchx = ev.touches[0].screenX; ev.target.touchy = ev.touches[0].screenY; } function cardTouchEnd(ev) { if (ev.changedTouches.length != 1) return; var dx = Math.abs(ev.changedTouches[0].screenX - ev.target.touchx); var dy = Math.abs(ev.changedTouches[0].screenY - ev.target.touchy); if (dx > 25 && dx / dy > 2) cardClose(); } function h_editor(item) { return xeval(` Редактор @{item.id}
@{h_multifile_input(item)}
Удалить
Укажите Телеграм или Телефон в описании ↑
Редактирование: 14 дней
Автоудаление: через 14 дней
`, {item: item}); } function editorEdit(item) { editorClose(); xaddhtml(document.body, h_editor(item)); } function editorClose() { xremovehtml(".editor"); } function editorRemove(item) { jasmineRemoveItem(item); editorClose(); app_reloadall(); } function editorUpdate(item) { if (!editorCheckNewItem(item)) return; if (item.id < 0) { jasmineAddItem(item, () => { jasmineShowLoader(); jasmineSaveAll(0, () => { editorClose(); app_reloadall(); }); }); } else if (item.id > 0) { jasmineSaveItem(item, () => { jasmineShowLoader(); jasmineSaveAll(0, () => { editorClose(); app_reloadall(); }); }); } } function editorCheckNewItem(item) { if (!item.value || item.value.length < 7) return alert("Укажите описание более подробно"); return true; } function h_grid(items) { return xeval(`
@{xfor(items, item2Tpl)}
`, {items: items}); } document.head.insertAdjacentHTML("beforeend", ` `); function item2Tpl(item) { return xeval(`
@{jasmineHasFiles(item) ? \` @{sliderView(jasmineGetFiles(item).slice(0, 20))} \`:\` \`}
@{jasmineHasFiles(item) > 1 ? \` @{xfor(jasmineGetFiles(item), (imgitem) => \` \`)} \`:""}
@{itemTitle(item)}
`, {item: item}); } function markdown(value) { value = value + ""; value = value.replace(new RegExp("\\s(https://\\S+)", "gm"), " $1"); //value = value.replace(new RegExp("^\\-\\s*(.*)", "gm"), "
  • $1
  • "); value = value.replace(new RegExp("^\\>(.*)", "gm"), "
    $1
    "); value = value.replace(new RegExp("[\\n\\r]", "g"), "
    "); return value; } function h_page() { return xeval(`
    @{topTpl()} @{h_grid(app_get_grid_items())} Вход @{store.admin ? \` А \`:""}
    `); } window.addEventListener("resize", windowSizeChanged); function windowSizeChanged() { var viewport = document.querySelector("meta[name=viewport]"); //viewport.setAttribute("content", "width=" + window.innerWidth + ", height=" + window.innerHeight + ", initial-scale=1.0, user-scalable=1"); if (window.visualViewport) { //location.hash = window.visualViewport.height; } } function sliderView(items) { return xeval(`
    @{xfor(items, (item, number) => \` @{number + 1}/@{len} \`)}
    `, {items: items, len: items.length}); } function slideMouseMove(scrolldiv, ev) { if (!ev.movementX && !ev.movementY) return; var mousex = ev.clientX; var box = event.currentTarget.getBoundingClientRect(); var itemsCount = scrolldiv.children.length; var scrollLength = scrolldiv.scrollWidth; var itemSize = scrollLength / itemsCount; var pos = (mousex - box.left) / box.width * scrollLength; pos = Math.floor(pos / itemSize) * itemSize; scrolldiv.scrollLeft = pos; } function techworksTpl() { return xeval(`
    Техобслуживание
    `); } function topTpl() { return xeval(`
    - Система местных объявлений ВЗ
    @{sliderView(appGetFotosOfDay())} Фото дня
    `, {}); } function h_auth_enter() { return xeval(` Вход
    `); } function auth_enter() { xaddhtml(document.body, h_auth_enter()); } function auth_enter_close() { xremovehtml(".auth-enter"); } function auth_enter_save(values) { jasmineAjax("./?api=app::client_auth_enter", {values: values, onload: (msg) => { if (msg) return alert(msg); location.reload(); }}); } function vkparser() { return xeval(` Парсер
    @{xfor(items, (item, i) => \`

    @{item.value}

    Author: @{item.authorName} @{item.authorUrl}

    @{item_ftime(item.time)} (@{item.time}), Id: @{item.postid}

    @{xfor(item.images, (img) => \` \`)}
    +
    \`)}
    `, {items: []}); } function vkparserShow() { vkparserClose(); xaddhtml(document.body, vkparser()); //vkparserUpdate({value: vkparserTestData()}); } function vkparserClose() { xremovehtml(".vkparser"); } function vkparserImportItem(items, index) { var parseditem = items[index]; var item = jasmineAddItem({ kind: "item", time: parseditem.time, value: parseditem.value + `\n;${parseditem.authorName} ${parseditem.authorUrl}`, }, null, false); if (parseditem.images.length) { xwalk(parseditem.images, im => { jasmineAddItem({ kind: "image", folderid: item.id, url: im, }, null, false); }); } jasmineShowLoader(); jasmineSaveAll(0, 0); xtrigger("html"); } function vkparserUpdate(form, values) { values.items = []; var content = values.value || vkparserTestData(); /* jasmineAjax("./?api=app::client_vkparser_geturlcontent", {values: {url: "https://vk.com/nsuhelp"}, onload: (response) => { clog(response); }}); */ if (content) { var main = document.createElement("template"); main.html = content; var items = main.content.querySelectorAll("._post"); xwalk(items, item => { var itemNode = item.querySelector(".wall_post_text"); var imageNodes = item.querySelectorAll(".PhotoPrimaryAttachment__imageElement, .MediaGrid__imageElement"); var timeNode = item.querySelector("time"); var authorNode = item.querySelector("a.PostHeaderSubtitle__item[href]"); if (itemNode) { var parsed = {}; parsed.postid = item.dataset.postId; parsed.value = itemNode.innerHTML; parsed.value = parsed.value.replace(new RegExp("
    ", "g"), "\n"); parsed.value = parsed.value.replace(new RegExp("<\\/?\\w+.*?>", "g"), ""); parsed.authorUrl = authorNode ? authorNode.getAttribute("href") : ""; parsed.authorName = authorNode ? authorNode.innerText : ""; // parsed.images = []; xwalk(imageNodes, imnode => parsed.images.push(imnode.src)); // if (parsed.authorName) { parsed.authorName = parsed.authorName.split(" "); parsed.authorName = parsed.authorName[0] + " " + parsed.authorName[1]; } // time if (timeNode) { var exacttime = timeNode.querySelector("[time]"); if (exacttime) { parsed.time = parseInt(exacttime.getAttribute("time")) * 1000; parsed.time -= 4 * 3600 * 1000; } else { var timestr = timeNode.textContent; var current = new Date(); var yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); timestr = timestr.replace("сегодня в", current.getDate() + " " + current.toLocaleString('en-US', {month: 'long'}) + " " + yesterday.getFullYear()); timestr = timestr.replace("вчера в", yesterday.getDate() + " " + yesterday.toLocaleString('en-US', {month: 'long'}) + " " + yesterday.getFullYear()); timestr = timestr.replace(" в ", " 2024 "); timestr = timestr.replace("фев", "february"); timestr = timestr.replace("мар", "march"); timestr = timestr.replace("апр", "april"); timestr = timestr.replace("мая", "may"); timestr = timestr.replace("июн", "june"); timestr = timestr.replace("июл", "july"); parsed.time = Date.parse(timestr); //var timezonefix = new Date().getTimezoneOffset() * 60 * 1000; //parsed.time -= timezonefix; //clog("#time:", timestr, "#", parsed.authorName); } } if (!parsed.time) parsed.time = mtime() - 2 * 3600 * 1000; // //clog(parsed.authorName, parsed.time, item_ftime(parsed.time), new Date().getTimezoneOffset()); values.items.push(parsed); } }); } xdraw(form); } function vkparserTestData() { return `