pages['100'] = {

}
pages['110'] = {
    init: function () {
        this.display.gallery();
        if(window.opener!=null && window.opener.page.imgSelecting)
            document.body.classList.add('imgSelecting');
    },
    display: {
        gallery: function () {
            gebid('galleryBox').innerHTML = '';

            for (const imId in pageData.imgsList) {
                const imLine = pageData.imgsList[imId];
                let im = getTemplate('imgBoxTemplate');

                im.querySelectorAll('[data-name]').forEach(function (el) {
                    let n = el.dataset.name;
                    let v = imLine[n];

                    if(el.tagName == 'IMG') el.src = img.url(v, 300,300);
                    else setHTMLValue(el, v);
                });
                gebid('galleryBox').prepend(im);

            }
        }
    },
    get: {
        search: function (f) {
            const p = formData(f);
            p.actionMethod = 'search';
            j.fpost('get', p, function () {
                page.display.gallery();
            });
        }
    },
    del: {
        img: function (el) {
            const b = el.closest('.imgBox');
            const imgId = b.dataset.value;
            if(confirm(jsTranslates.confirmImageDelete))j.fpost('del', {
                actionMethod: 'img',
                imgId: imgId
            }, function () {
                b.remove();
            });
        }
    },
    actions: {
        onSelectBtn: function (el) {
            window.opener.page.actions.onImgSelect(el.closest('.imgBox').dataset.value);
            window.close();
        },
        zoomImg: function (el) {
            const imgId = el.closest('.imgBox').dataset.value;
            modal('zoomImgModalTemplate', function () {
                gebid('zoomedImg').src = img.url(imgId, pageData.imgsList[imgId].width, pageData.imgsList[imgId].height);
            });
        }
    }
};
pages['111'] = {
    uploadImages: false,
    imgCounter: false,
    init: function () {
        this.imgCounter = 0;

    },
    actions: {
        imagesSelected: function (el) {
            if(isDefined(el.files[0])){
                gebid('loadingProgress').classList.add('active');
                const data = new FormData();
                for (const img of el.files) {
                    data.append(img.name, img);
                }
                j.files('set', data, function () {
                    gebid('loadingProgress').classList.remove('active');
                    // якщо іде процес вибору картинки, то після завантаження, повернутися на галерею
                    if(window.opener!=null && window.opener.page.imgSelecting) window.history.back();
                });
            }
        }
    }
}
pages['112'] = {

};

pages['120'] = {
    table: false,
    init: function () {
        this.display.staffGrid();

    },
    display: {
        staffGrid: function () {
            const data = pageData.users;

            for (const o of data) {
                    let body = getTemplate('userBoxTemplate');

                    body.querySelectorAll('[data-name]').forEach(function (el) {
                        let n = el.dataset.name;
                        let v = o[n];

                        if (n == 'login' && el.href) {
                            el.href += v;
                        } else setHTMLValue(el, v);
                    });
                    gebid('usersList').prepend(body);

                }
        }
    },
    get: {

    },
    set: {

    },
    actions: {

    }
}
pages['200'] = {
    table: false,
    init: function (resp) {
        datatable.preInit();
        this.display.ordersList(resp.orderList);
        this.get.syncOldOrders();
    },
    display: {
        ordersList: function (data) {
            if (page.table) {
                page.table.destroy();
                page.table = false;
            }
            if (data.length) {
                gebid('ordersHistoryTable').hidden = false;
                gebid('noHistoryFound').hidden = true;
                gebid('ordersTable').innerHTML = '';

                for (const o of data) {
                    let body = getTemplate('orderLineTemplate');
                    body.querySelector('tr').dataset.orderkey = o['orderKey'];

                    body.querySelectorAll('[data-name]').forEach(function (el) {
                        let n = el.dataset.name;
                        let v = o[n];

                        if (n == 'ttn' && v) el.href = getTrackLink(o.shippingMethodCode, v);
                        else if (el.tagName === "A" && el.classList.contains('mainLink')) el.href = "/orders/orderEdit?orderId=" + o.id;
                        else if (n === 'status') el.classList.add(o.cpDisplayClass);

                        if (n == 'paying') el.className =
                            v == 1 ? 'icon-checkmark-circle text-success' : v == 2 ? 'icon-circle text-muted' : 'icon-notification2 text-warning';
                        else if(n == 'printTTNButt') {if(!o.ttn) el.hidden = true;}
                        else if(n == 'shippingMethodImg') {el.src +=o.shippingMethodCode + '-icon.png';}
                        else if (n == 'tel') {
                            if(el.dataset.preHref) el.href = el.dataset.preHref + phoneCleaner(v, el.dataset.needplus);
                            else el.innerText = v;
                        }
                        else if (n == 'messengerId') {v = v? v : 1; el.querySelector('[data-msgid="'+v+'"]').hidden = false;}
                        else setHTMLValue(el, v);


                    });
                    gebid('ordersTable').prepend(body);

                }
                page.datatableInit();
            } else {
                gebid('ordersHistoryTable').hidden = true;
                gebid('noHistoryFound').hidden = false;
            }
        }
    },
    get: {
        ordersBySearch: function (form) {
            const params = form ? formData(form) : {};
            params.actionMethod = 'searchOrder';
            j.fpost('get', params,
                function (resp) {
                    page.display.ordersList(resp.orderList);
                    gebid('ordersTypeSelector').value = 'default';
                });
        },
        byOrdersSelector: function () {
            const mode = gebid('ordersTypeSelector').value;
            j.fpost('get', {
                    actionMethod: 'searchByOrdersSelector',
                    mode: mode
                },
                function (resp) {
                    page.display.ordersList(resp.orderList);
                });
        },
        syncOldOrders: function () {
            j.fpost('get', {
                    actionMethod: 'oldSiteOrders'
                },
                function (resp) {
                    if(resp.orderList) page.display.ordersList(resp.orderList);
                });

        }
    },
    set: {
        duplicateOrder: function (el) {
            const id = el.closest('tr').dataset.value;

            j.fpost('set',
                {
                    actionMethod: 'duplicateOrder',
                    origOrderId: id
                },
                function (resp) {
                    page.display.ordersList(resp.orderList);
                })
        },
        markRemoveOrder: function (el) {
            var par = el.closest('tr');
            const id = par.dataset.value;

            j.fpost('set',
                {
                    actionMethod: 'markRemoveOrder',
                    orderId: id
                },
                function () {
                    page.table.row(par).remove().draw();
                })
        },
        payChange: function (f) {
            // let data = formData(f);
            let data = {ids: f, payed: 1};
            j.fpost('set',
                {
                    actionMethod: 'setPayment',
                    data: data
                },
                function () {
                    document.querySelectorAll('tr.selected').forEach(function (v) {
                        v.querySelector('[data-name="paying"]').className = "icon-checkmark-circle text-success";
                    });
                    page.table.rows().deselect();
                });
        },
        cashPaymentToOrders: function (f) {
            const fdata = formData(f);
            fdata.payed = 1;
            j.fpost('set', {
                actionMethod: 'cashPaymentToOrders',
                data: fdata
            }, function (resp) {
                mainModal.modal('hide');
                document.querySelectorAll('tr.selected').forEach(function (v) {
                    v.querySelector('[data-name="paying"]').className = "icon-checkmark-circle text-success";
                });
                page.table.rows().deselect();
            })
        },
        newStatus: function (f, newStatusCode) {
            j.fpost('set',
                {
                    actionMethod: 'multipleChangeStatus',
                    ids: f,
                    orderStatusCode: newStatusCode
                },
                function (r,p) {
                    document.querySelectorAll('tr.selected').forEach(function (v) {
                        const s = pageData.orderStatuses[newStatusCode];
                        page.table.rows().deselect();
                        v.querySelector('[data-name="cpDisplayOrder"]').innerHTML = s.cpDisplayOrder;
                        v.querySelector('[data-name="status"]').innerHTML = s.capture;
                        v.querySelector('[data-name="status"]').className = "label "+s.cpDisplayClass;
                    });
                });
        },
        mergeOrders: function (f) {
            const data = formData(f);
            j.fpost('set', {
                ids: data.ids,
                mainId: data.mainId,
                actionMethod: 'mergeOrders'
            }, function () {
                document.querySelectorAll('tr.selected').forEach(function (v) {
                    if(v.dataset.value!=data.mainId){
                        const s = pageData.orderStatuses['merged'];
                        page.table.rows().deselect();
                        v.querySelector('[data-name="cpDisplayOrder"]').innerHTML = s.cpDisplayOrder;
                        v.querySelector('[data-name="status"]').innerHTML = s.capture;
                        v.querySelector('[data-name="status"]').className = "label "+s.cpDisplayClass;
                    }
                });
                mainModal.modal('hide');
            })
        }
    },
    actions: {
        multiple: {
            init: function (nextAction, addParams) {
                const idsArr = [];
                const keysArr = [];
                if(nextAction == 'markAsPayed') addParams = 0;
                document.querySelectorAll('tr.selected').forEach(function (v) {
                    idsArr[idsArr.length] = v.dataset.value;
                    keysArr[keysArr.length] = v.dataset.orderkey;
                    if(nextAction == 'markAsPayed') {
                        addParams += parseFloat(v.querySelector('[data-name="total"]').innerHTML);
                    }
                });
                if(nextAction == 'openInvoices')page.actions.multiple[nextAction](keysArr);
                else page.actions.multiple[nextAction](idsArr, addParams);
            },
            markAsPayed: async function (idsArr, sum) {
                // paymentModal(idsArr);
                // if (confirm(jsTranslates.payChange)) page.set.payChange(idsArr.join(', '));
                await modal('cashPayTransactionModal', function () {
                    mainModal[0].querySelector('[name="ids"]').value = idsArr.join(', ');
                    mainModal[0].querySelector('[name="amount"]').value = sum;
                });
            },
            toPack: function (idsArr, noConfirm) {
                // paymentModal(idsArr);
                if (noConfirm || confirm(jsTranslates.orderToPack)) page.set.newStatus(idsArr.join(', '), 'packing');
            },
            completeOrders: function (idsArr) {
                // paymentModal(idsArr);
                if (confirm(jsTranslates.orderToDone)) page.set.newStatus(idsArr.join(', '), 'done');
            },
            mergeOrders: function (idsArr) {
                modal('mergeOrdersModalTemplate', function (ids) {
                    const f = gebid('mergeOrdersForm');
                    const sel = f.querySelector('select');
                    let idsLine = '';
                    for (const k in ids) {
                        const o = ids[k];
                        sel.options[sel.options.length] = new Option(o, o);
                        idsLine += idsLine ? ',' + o : o;
                    }
                    f.querySelector('input').value = idsLine;
                },idsArr);
            },
            openInvoices: function (keysArr) {
                window.open("http://new.pcheloproduct.com/invoice?order='" + keysArr.join("','") +"'&stickerText");
            },
            openPackList: function (idsArr) {
                window.open("/store/storeGruz?ids='" + idsArr.join("','") +"'");
            },
            createNPScanSheet: function () {
                const ttns = [];
                document.querySelectorAll('tr.selected td[data-name="shippingMethodCode"][data-value="np"] a').forEach(function (v) {
                    if(v.innerText)ttns[ttns.length] = v.innerText;
                });
                console.log(ttns);
                j.fpost('set', {
                    actionMethod: 'createNPScanSheet',
                    ttns: ttns
                });
            },
            openTTNS: function () {
                document.querySelectorAll('tr.selected [data-name="printTTNButt"] i').forEach(ttnBtn => {
                    ttnBtn.click();
                });
            },
            copyPhones: function () {
                let t = '';
                document.querySelectorAll('tr.selected .mobileNumber').forEach(line => {
                    t += line.innerText + "\n";
                });
                Clipboard.copy(t);
                message('', 1);
            }
        },
        packing: function () {
            window.open('/packing/');
            /*if(confirm(jsTranslates.packingConfirmation)){
                document.querySelectorAll('td[data-name="orderStatusCode"][data-value="accept"]').forEach(td => {
                    td.click();
                })
                this.multiple.init('openInvoices');
                this.multiple.init('openPackList');
                this.multiple.init('toPack', true);
            }*/
        },
        statusSelectAll: function (el) {
            const stLine = el.closest('tr');
            let n = stLine.nextElementSibling;
            while (!n.classList.contains('group')){
                n.querySelector('td').click();
                n = n.nextElementSibling;
            }
        },
        printSicker: function (el) {
            event.preventDefault();
            event.stopImmediatePropagation();
            const line = el.closest('td');
            const shipMeth = line.dataset.value;
            const ttnNum = line.querySelector('a[data-name="ttn"]').innerText;
            let stickWin = false;

            if (shipMeth == 'np' && ttnNum) {
                stickWin = window.open('/sticker/np.sp?ttn=' + ttnNum);
            } else if (shipMeth == 'up' && ttnNum) {
                stickWin = window.open('https://ok.ukrposhta.ua/ua/lk/print/sticker/' + ttnNum);
            } else message(jsTranslates.noAvailStickPrint, "w");


            if(stickWin) {
                stickWin.document.body.setAttribute('onload', 'window.print();');
            }
        },
    },
    datatableInit: function () {
        page.table = $('#ordersHistoryTable').DataTable({
            columnDefs: [
                {
                    visible: false,
                    targets: 0
                },
                {
                    type: 'any-number',
                    targets: 5
                },
                {
                    orderable: false,
                    targets: [1, 4, 6, 8, 10, 11]
                },
                {
                    width: 16,
                    targets: [1, 8]
                }
            ],
            order: [[5, 'asc'], [9, 'asc'], [7, 'desc']],
            select: {
                style: 'multi+shift'
            },
            drawCallback: function (settings) {
                var api = this.api();
                var rows = api.rows({page: 'current'}).nodes();
                var last = null;
                var head = null;

                const statusOrdered = settings.aaSorting[0][0] === 5;

                api.column(0, {page: 'current'}).data().each(function (group, i) {
                    if (last !== group && statusOrdered) {
                        head = $(rows).eq(i).before(
                            '<tr class="table-light group"><td><i class="icon-checkmark3 cursor-pointer" onclick="page.actions.statusSelectAll(this);"></i></td>' +
                            '<td colspan="10" class="text-semibold">' + group + '</td>' +
                            '<td class="text-center">' +
                            '<span class="' + rows[i].querySelector('[data-name="status"]').className + ' rounded-pill">1</span>' +
                            '</td>' +
                            '</tr>'
                        );

                        last = group;
                    } else if (head) head[0].previousElementSibling.querySelector('.label').innerText++;
                });
            }
        });
    }
}
pages['201'] = {
    orderTotal: false,
    searchCityStr: '',
    searchWarehStr: '',
    warehouses: {},
    initedSelects: [],
    editingUpdator: false,
    init: function () {
        if (getUrlParameter('orderId')) {
            pageData.orderTotalWeight = 0;
            pageData.orderContent.forEach((a) => {
                pageData.orderTotalWeight += parseInt(a['totalWeight'])
            });
            pageData.orderTotal = pageData.orderDetail.total;
            pageData.orderTotalLeft = pageData.orderDetail.totalLeft;
            console.log(pageData.orderDetail.totalLeft);

            this.display.payMethods();
            this.display.currencyZones();
            this.display.statuses();

            this.display.feesList();
            this.display.orderInfo();
            this.display.preorderInfo();
            this.display.ordersHistory();

            this.display.shippingMethods();
            this.display.customerShippAddrList();
            this.display.shippInfo();

            this.display.orderProductList();
            this.display.orderProductList(true);

            this.display.managersList();
            this.display.topLineInfo();
            this.display.custMsg();

            this.display.wishlist();
            this.display.addProductsList();

            this.get.ttnInfo();

            if (pageData.locked) modal('orderLockedModalTemplate', function () {
                gebid('editingManagerName').innerHTML = pageData.managersList[pageData.orderDetail.updateUser].name;
            });
            else this.actions.editingInterval();
            gebid('orderId').innerText = '#' + pageData.orderDetail.orderId;

            this.actions.onFormChange();

        } else {
            modal('newOrderCreateModal', function () {
                gebid('newOrderPhone').focus({focusVisible: true});
            });
        }
    },
    display: {
        statuses: function () {
            const list = pageData.orderStatuses;
            let curGroup = 0, group;
            for (let k in list) {
                const lineData = list[k];
                let sel = gebid('statusesSelector');
                group = Math.floor(lineData['ord'] / 100);
                if (group - curGroup > 0) {
                    curGroup = group;
                    const optgr = document.createElement('optgroup');
                    optgr.label = '-----------';
                    sel.append(optgr);
                }
                sel.options[sel.options.length] = new Option(lineData['capture'], lineData['code']);
            }
        },
        currencyZones: function () {
            for (let k in pageData.currencyZoneIds) {
                const lineData = pageData.currencyZoneIds[k];
                let sel = gebid('currencyZones');
                sel.options[sel.options.length] = new Option(lineData['zoneCapture'], lineData['id']);
            }
        },

        orderInfo: function () {
            const info = pageData.orderDetail;

            if (info.orderStatusCode == 'preorder') document.body.classList.add('isPREORDER');
            info.shippingMethodCode = pageData.shipDetail.shippingMethodCode;
            document.querySelectorAll('.customerInfo [data-name],.customerInfo [name]').forEach(function (el) {
                let n = el.dataset.name || el.name;
                let v = info[n];

                if (n == 'totalLeft')
                    v = page.formatPrice(v);


                if (n == 'ttn' && el.tagName === 'BUTTON') {
                    if (v) {
                        el.classList.remove('disabled');
                    }
                } else if (n == 'tel' && el.href) {
                    el.href = el.dataset.preHref + phoneCleaner(v, el.dataset.needplus);
                } else if (n == 'customerId' && el.href) {
                    el.href = '/customers/customerEdit?cId=' + v;
                } else setHTMLValue(el, v);

            });

            if (pageData.canEditManager != 1) gebid('cartTbody').classList.add('cantEdit');
            else gebid('cartTbody').classList.remove('cantEdit');

            page.actions.selectInit('statusesSelector');

            this.paymentsList();
        },
        orderTotals: function () {
            gebid('totalCartSum').innerText = page.formatPrice(pageData.orderTotal);
            gebid('orderTotalWeight').innerText = parseInt(pageData.orderTotalWeight);
        },
        preorderInfo: function () {
            if (!pageData.preorderId) gebid('preorderList').hidden = true;
            else {
                gebid('preorderList').hidden = false;
                gebid('preorderId').innerText = pageData.preorderId;
                gebid('preorderLink').href += pageData.preorderId;
                gebid('totalPreorderSum').innerText = page.formatPrice(pageData.preOrderTotal);
            }
        },

        shippInfo: function () {
            const info = pageData.shipDetail;
            if (info) {
                const sCode = info.shippingMethodCode;
                gebid('isCourier').checked = info.courierChecked != 0;
                page.display.shippMethodDetails(sCode, false, info.shippRef);
                document.querySelectorAll('#shippInfo [name], #shippInfo [data-name]').forEach(function (el) {
                    let n = el.dataset.name || el.name;
                    let v = info[n];

                    if (n == 'payMethodId' && isDefined(info.payed) && info.payed != 0) el.disabled = true;
                    if (n == 'cityId') el.innerHTML = "<option value='" + v + "' selected>" + info.city + "</option>";
                    if (n == 'shippRef' && el.tagName == 'SELECT' && (sCode == 'np' || sCode == 'up')) {
                        console.log(info);
                        console.log(el);
                        // el.title = info.address;
                        el.value = info.shippRef;
                    }
                    /*if (n == 'ttn' && el.tagName === 'A') {
                        if (v) {
                            setTrackLink(el, info.shippingMethodCode, v);
                            el.classList.remove('disabled');
                        }
                    }*/ else
                        setHTMLValue(el, v);
                });
                if (gebid(sCode + 'Selector'))
                    page.actions.selectInit(sCode + 'Selector');

                page.display.countriesList(pageData.shipDetail.countryCode);
            } else {
                page.display.countriesList();
            }
        },
        shippMethodDetails: function (sCode, needInit, sRef) {
            const shBox = gebid('shMethDetailBlock');
            shBox.innerHTML = '';
            if (gebid('isCourier').checked) sCode = 'courier';

            if (getTemplate(sCode + 'ShBoxTemplate')) shBox.append(getTemplate(sCode + 'ShBoxTemplate'));
            else shBox.append(getTemplate('defaultShBoxTemplate'));

            if (pageData.warehouses[sCode]) page.display[sCode].warehList(pageData.warehouses[sCode], sRef);

            if (gebid(sCode + 'Selector') && needInit) page.actions.selectInit(sCode + 'Selector');
        },
        countriesList: function (countryISOCode) {
            if (!countryISOCode) countryISOCode = 'UA';
            const list = pageData.countryList;
            let cSel = gebid('selectCountry');
            for (let line of list) {
                let opt = document.createElement('option');
                opt.value = line.code;
                opt.innerText = line.common;
                opt.dataset.tokens = line.code + ' ' + line.nativeCommon + ' ' + line.common;
                opt.defaultSelected = line.code == countryISOCode ? 'selected' : false;
                cSel.appendChild(opt);
            }
            page.actions.selectInit('selectCountry');
            page.actions.selectInit('selectCity');
            page.actions.onCountrySelect(true);
        },
        citiesList: function (list) {
            let cSel = gebid('selectCity');
            cSel.innerHTML = '';
            for (let line of list) {
                let opt = document.createElement('option');
                opt.value = line.id;
                opt.innerHTML = line.cityFull;
                opt.dataset.tokens = line.cityFullClear + ' ' + line.cityEN;
                cSel.appendChild(opt);
            }
            page.actions.selectInit('selectCity');
        },

        customerShippAddrList: async function () {
            const list = pageData.customerShippAddr;
            console.log(list);
            let sel = gebid('custShippAddrSelect');
            sel.innerHTML = '';
            if (Object.keys(list).length) {
                for (let k in list) {
                    const lineData = list[k];
                    let title = `${lineData['surname']} ${lineData['name']}  ${lineData['city']}\n${lineData['address']}`;
                    const cur = pageData.shipDetail.id == k;
                    title = lineData.main ? "(основний) \n"+ title : title;
                    sel.options[sel.options.length] = await new Option(title, k, cur, cur);
                }
            }
            page.actions.selectInit('custShippAddrSelect');
        },
        shippingMethods: function () {
            const list = pageData.shippingMethods;

            let body = '';
            let wrap = '';
            gebid('shippingMethods').innerHTML = '';
            gebid('zoneSelectMsg').hidden = true;

            if (Object.keys(list).length) {
                gebid('shippingMethods').append(getTemplate('selectShippingOpt'));
                for (let k in list) {
                    const lineData = list[k];
                    let sel = gebid('shippingMethods');
                    sel.options[sel.options.length] = new Option(lineData['title'], lineData['code']);
                }
            } else gebid('shippingMethods').append(getTemplate('noShippingOpt'));

            const shBox = gebid('shMethDetailBlock');
            shBox.innerHTML = '';
        },
        np: {
            warehList: function (list, sRef) {
                const cSel = gebid('npSelector');
                cSel.innerHTML = '';
                if (list.length) for (let line of list) {
                    let opt = document.createElement('option');
                    opt.value = line.ref;
                    opt.innerText = line.description;
                    opt.dataset.tokens = toUrl(line.description);
                    opt.defaultSelected = line.ref == sRef ? 'true' : false;
                    cSel.appendChild(opt);
                }
                else gebid('npSelector').title = jsTranslates.noWarehousesOptTxt;
            },
            warehouseInfo: function (data) {

            }
        },
        up: {
            warehList: function (list, sRef) {
                const cSel = gebid('upSelector');
                cSel.innerHTML = '';
                if (list.length) for (let line of list) {
                    let opt = document.createElement('option');
                    opt.value = line.zip;
                    opt.innerText = line.zip + ' (' + line.city + ') - ' + line.address;
                    opt.dataset.tokens = line.city + ' ' + line.zip + ' ' + line.address;
                    opt.defaultSelected = line.zip == sRef ? 'true' : false;
                    cSel.appendChild(opt);
                }
                else gebid('upSelector').title = jsTranslates.noWarehousesOptTxt;
            },
            warehouseInfo: function (data) {

            }
        },

        payMethods: function () {
            const list = pageData.payMethods;
            gebid('payMethods').innerHTML = '';

            if (Object.keys(list).length) {
                gebid('payMethods').append(getTemplate('selectPaymentOpt'));
                for (let k in list) {
                    const lineData = list[k];
                    let sel = gebid('payMethods');
                    sel.options[sel.options.length] = new Option(lineData['name'], lineData['id']);
                }
            }
        },

        custMsg: function (copyAfter) {
            const ordInfo = pageData.orderDetail;
            ordInfo.total = pageData.orderTotalLeft;

            const msgBody = document.querySelector('#custMsgBox .msgBody');
            msgBody.innerHTML = '';
            if (ordInfo.orderStatusCode == 'payWaiting')
                msgBody.append(getTemplate('payWaitMsgTemplate'));
            else if (ordInfo.orderStatusCode == 'new')
                msgBody.append(getTemplate('newMsgTemplate'));
            else if (ordInfo.orderStatusCode == 'temp')
                msgBody.append(getTemplate('tempMsgTemplate'));
            else if (ordInfo.orderStatusCode == 'lostCart')
                msgBody.append(getTemplate('lostCartMsgTemplate'));
            else if (ordInfo.orderStatusCode == 'oneClick')
                msgBody.append(getTemplate('oneClickMsgTemplate'));
            else if (ordInfo.orderStatusCode == 'ready')
                msgBody.append(getTemplate('readyMsgTemplate'));
            else if (ordInfo.orderStatusCode == 'sms' || ordInfo.orderStatusCode == 'done')
                msgBody.append(getTemplate('doneMsgTemplate'));
            else if (ordInfo.orderStatusCode == 'verifying')
                msgBody.append(getTemplate('needVerifyMsgTemplate'));
            else if (ordInfo.payed != 0)
                msgBody.append(getTemplate('payedMsgTemplate'));
            else if (ordInfo.orderStatusCode == 'accept')
                msgBody.append(getTemplate('toPackTemplate'));
            else if (ordInfo.orderStatusCode == 'thinking')
                msgBody.append(getTemplate('thinkingMsgTemplate'));
            else if (ordInfo.orderStatusCode == 'cancel')
                msgBody.append(getTemplate('cancelMsgTemplate'));
            else if (ordInfo.payed == 0 && ordInfo.needWaitPay == 1)
                msgBody.append(getTemplate('needPayMsgTemplate'));
            else gebid('custMsgBox').hidden = true;

            if (msgBody.innerHTML) gebid('custMsgBox').hidden = false;

            msgBody.querySelectorAll('[data-name]').forEach(function (el) {
                let n = el.dataset.name;
                let v = ordInfo[n];

                if (n == 'trackLink') v = ordInfo.shippingMethodCode === el.dataset.shippcode;
                else if (n == 'totalLeft') v = page.formatPrice(v);
                setHTMLValue(el, v);

            });

            if (copyAfter || getUrlParameter('copyStatusMsg')) page.actions.clipboardBtn(false, 'customerMsg');
        },
        topLineInfo: function () {
            document.querySelectorAll('#topLineInfo [data-name]').forEach(function (el) {
                let n = el.dataset.name;
                let v = pageData.orderDetail[n];

                if (n == 'createUser' && !!v && v > 0) {
                    v = pageData.managersList[v].name;
                }
                setHTMLValue(el, v);

            });
        },
        orderProductList: function (isPreorder) {
            const list = isPreorder ? pageData.preorder : pageData.orderContent;
            const parTbl = gebid(isPreorder ? 'preorderTbody' : 'cartTbody');
            parTbl.innerHTML = '';
            let weight = 0;
            if (Object.keys(list).length) {
                for (let lineK in list) {
                    let lineData = list[lineK];
                    let clon = getTemplate('cartProdLineTemplate');

                    clon.querySelectorAll('[data-name]').forEach(function (el) {
                        const n = el.dataset.name;
                        let v = lineData[n];

                        if (n == 'totalBuyPrice') v = page.formatPrice(lineData.buyPrice * lineData.count);
                        if (n == 'buyPriceFull') v = page.formatPrice(lineData.buyPrice);
                        if (n == 'countWarn') {
                            v = lineData.stockCount <= 5;
                            if (v) message(lineData.name, 'w', jsTranslates.productCountWarn);
                        }
                        if (el.classList.contains('mainLink'))
                            el.href = '/products/productEdit?productId=' + v;
                        else setHTMLValue(el, v);
                    });

                    parTbl.appendChild(clon);
                }

                if (!isPreorder) {
                    page.display.orderTotals();
                }
            }
        },
        feesList: function () {
            const list = pageData.feesList;
            const parTbl = gebid('feesTbody');
            parTbl.innerHTML = '';
            if (Object.keys(list).length) {
                gebid('feesTbody').hidden = false;
                for (let lineK in list) {
                    let lineData = list[lineK];
                    let clon = getTemplate('feeOrderLineTemplate');

                    clon.querySelectorAll('[data-name]').forEach(function (el) {
                        let v = lineData[el.dataset.name];
                        setHTMLValue(el, v);
                    });

                    parTbl.appendChild(clon);
                }
            } else gebid('feesTbody').hidden = true;
        },
        wishlist: function () {
            const list = pageData.wishlist;
            const parTbl = gebid('wishlistTbody');
            parTbl.innerHTML = '';
            if (Object.keys(list).length) {
                gebid('wishlist').hidden = false;
                for (let lineK in list) {
                    let lineData = list[lineK];
                    let clon = getTemplate('wishlistLineTemplate');

                    clon.querySelectorAll('[data-name]').forEach(function (el) {
                        let v = lineData[el.dataset.name];
                        setHTMLValue(el, v);
                    });

                    parTbl.appendChild(clon);
                }
            }
        },
        paymentsList: function () {
            const parTbl = gebid('orderPaymentsList');
            parTbl.innerHTML = '';
            if (pageData.paymentsList.length) gebid('paymentsFieldset').hidden = false;
            pageData.paymentsList.forEach(line => {

                let clon = getTemplate('orderPaymentLineTemplate');

                clon.querySelectorAll('[data-name]').forEach(function (el) {
                    let v = line[el.dataset.name];
                    setHTMLValue(el, v);
                });

                parTbl.appendChild(clon);
            })
        },

        addProductsList: function () {
            const pSel = gebid('addToOrderList');
            pSel.innerHTML = '';
            for (const k in pageData.productList) {
                const v = pageData.productList[k];
                const c = v['ctPath'];

                let oGBox = pSel.querySelector('optgroup[data-category="' + c + '"]');
                if (!oGBox) {
                    const oG = document.createElement('optgroup');
                    oG.label = v['categoryName'];
                    oG.dataset.category = c;
                    pSel.append(oG);
                    oGBox = pSel.querySelector('optgroup[data-category="' + c + '"]');
                }
                oGBox.append(new Option(v['name'] + '\n' + jsTranslates.onStockTitle + v['count'], k));
            }
            page.actions.selectInit('addToOrderList');
        },

        managersList: function () {
            for (let k in pageData.managersList) {
                const lineData = pageData.managersList[k];
                let sel = gebid('managersList');
                sel.options[sel.options.length] = new Option(lineData['name'], lineData['id']);
            }
        },

        ordersHistory: function (histBoxId) {
            if (!histBoxId) histBoxId = 'historyList';
            const data = pageData.customerOrdersList;
            const mainB = gebid(histBoxId);
            mainB.innerHTML = '';
            mainB.appendChild(getTemplate('ordersHistoryPanel'));
            if (data.length) {
                mainB.querySelector('[data-role="ordersHistoryTable"]').hidden = false;
                mainB.querySelector('[data-role="noHistoryFound"]').hidden = true;
                mainB.querySelector('[data-role="ordersTable"]').innerHTML = '';

                for (const o of data) {
                    let body = getTemplate('orderLineTemplate');

                    body.querySelectorAll('[data-name]').forEach(function (el) {
                        let n = el.dataset.name;
                        let v = o[n];

                        if (n == 'ttn' && v) setTrackLink(el, o.shippingMethodCode, v);
                        else if (el.tagName === "A") el.href = "/orders/orderEdit?orderId=" + o.id;
                        else if (n === 'status') el.classList.add(o.cpDisplayClass);

                        if (n == 'paying') el.className =
                            v == 1 ? 'icon-checkmark-circle text-success' : v == 2 ? 'icon-circle text-muted' : 'icon-notification2 text-warning';
                        else setHTMLValue(el, v);


                    });
                    mainB.querySelector('[data-role="ordersTable"]').prepend(body);

                }
                page.actions.datatableInit(histBoxId);
            } else {
                mainB.querySelector('[data-role="ordersHistoryTable"]').hidden = true;
                mainB.querySelector('[data-role="noHistoryFound"]').hidden = false;
            }
        },

        packs: function () {
            for (let lineData of pageData.packs) {
                let sel = gebid('packsSelect');
                const label = `${lineData['capture']}кг (${lineData['length']}*${lineData['width']}*${lineData['height']})`;
                sel.options[sel.options.length] = new Option(label, lineData['id']);
            }
            page.actions.selectPackByWeight();
        },

        phonesHelper: function () {
            const list = pageData.tels;
            let sel = gebid('telsList');
            sel.innerHTML = '';
            for (let k in list) {
                const lineData = list[k];
                const opt = document.createElement('option');
                opt.value = lineData['tel'];
                opt.innerText = lineData['n'] + ' - ' + lineData['owner'];
                sel.append(opt);
            }
        },
        phonesModalHistory: function (fullTel) {
            if (document.querySelector('datalist option[value="' + fullTel + '"]')) {
                j.fpost('get', {
                    actionMethod: 'orderHistoryByNum',
                    num: fullTel
                }, function (resp) {
                    page.display.ordersHistory('modalHistoryList');
                    gebid('modalHistoryList').hidden = false;
                    gebid('clientNum').innerText = fullTel;

                });
            } else console.log('history empty');
        },

        ttnInfo: function () {
            if (pageData.ttnInfo) {
                const t = gebid('ttnInfoBox');
                t.hidden = false;
                if (!pageData.ttnInfo.RedeliverySum && pageData.shipDetail.payMethodId == 2) {
                    pageData.ttnInfo.RedeliverySum = parseFloat(pageData.orderTotalLeft);
                    pageData.ttnInfo.ExpressWaybillAmountToPay = pageData.ttnInfo.RedeliverySum + Math.round(pageData.ttnInfo.RedeliverySum * 0.02 + 20) + pageData.ttnInfo.DocumentCost;
                }

                t.querySelectorAll('[data-name]').forEach(function (el) {
                    let n = el.dataset.name;
                    let v = pageData.ttnInfo[n];

                    if (n === 'DatePayedKeeping' && el.tagName === 'P' && pageData.ttnInfo.ExpressWaybillAmountToPay) {
                        if (new Date() > new Date(v)) el.className = 'label bg-danger';
                        else if (new Date().setDate(new Date().getDate() + 1) > new Date(v)) el.className = 'label bg-warning';
                        else if (new Date().setDate(new Date().getDate() + 4) > new Date(v)) el.className = 'label bg-blue';
                    }
                    if (n == 'Commission') v = pageData.ttnInfo.RedeliverySum > 0 ? Math.round(pageData.ttnInfo.RedeliverySum * 0.02 + 20) : 0;
                    setHTMLValue(el, v);
                });
            }

        }
    },
    set: {
        editing: function () {
            j.fpost('set', {
                actionMethod: 'editing'
            }, function (resp) {
                if (resp.locked) modal('orderLockedModalTemplate');
            });
        },
        unlock: function () {
            j.fpost('set', {
                actionMethod: 'unlock'
            }, function (resp) {
                $('#mainModal').modal('hide');
                page.actions.editingInterval();
            });
        },
        payChange: function (f) {
            // let data = formData(f);
            let data = {ids: f, payed: gebid('isPayed').checked}
            j.fpost('set', {
                actionMethod: 'setPayment',
                data: data
            }, function (resp) {
                gebid('isPayed').checked = !!resp.payed;
                gebid('payMethods').disabled = !!resp.payed;
                pageData.orderDetail.payed = resp.payed;

                if (gebid('statusesSelector').value == 'payWaiting' && resp.payed) {
                    gebid('statusesSelector').value = 'accept';
                    pageData.orderDetail.orderStatusCode = 'accept';
                    page.actions.selectInit('statusesSelector');
                }
                page.display.custMsg(true);
            }, true);
        },
        orderStatus: function (val) {
            j.fpost('set', {
                actionMethod: 'orderStatus',
                orderStatusCode: val
            }, function () {
                if (val == 'preorder') document.body.classList.add('isPREORDER');
                else document.body.classList.remove('isPREORDER');
                pageData.orderDetail.orderStatusCode = val;
                page.display.orderInfo();
                page.display.custMsg(true);
            });

        },
        curZone: function (val) {
            j.fpost('set', {
                actionMethod: 'currZoneId',
                currZoneId: val
            }, function () {
                page.display.orderProductList();
                page.display.orderProductList(true);
            });

        },
        paymentMethod: function (val) {
            j.fpost('set', {
                actionMethod: 'paymentMethod',
                paymentMethodId: val
            }, function () {

            });

        },
        orderManager: function (managerId) {
            j.fpost('set', {
                actionMethod: 'managerId',
                managerId: managerId
            })
        },
        cart: {
            excludeProduct: function (el) {
                const prodLine = el.closest('li, tr');

                j.fpost('del', {
                        productId: prodLine.dataset.value,
                        actionMethod: 'fromOrder'
                    },
                    function (resp) {
                        prodLine.remove();
                        page.display.orderTotals();
                    });
            },
            countChange: function (el) {
                if (el.value < 1) {
                    el.value = el.dataset.oldvalue;
                    return false;
                } else {
                    const params = {
                        actionMethod: 'cartProdCount',
                        count: el.value,
                        prodId: el.closest('tr').dataset.value,
                    }
                    j.fpost('set', params, function (resp, param) {
                        const par = el.closest('tr');
                        par.querySelector('[data-name="totalBuyPrice"]').innerText =
                            page.formatPrice(el.nextElementSibling.value * param.count);
                        page.display.orderTotals();
                    })
                }
            },
            add: function (el) {
                const tr = el.closest('tr');
                const prodId = tr.querySelector('select').value;
                const count = 1;
                j.fpost('set', {
                    actionMethod: 'addToOrder',
                    productId: prodId,
                    count: count
                }, function (resp) {
                    gebid('addToOrdTr').hidden = true;
                    page.display.orderProductList();
                });
            },
            toPreorderlist: function (el) {
                j.fpost('set', {
                    actionMethod: 'toPreorder',
                    storeOutId: el.closest('td').dataset.value
                }, function (resp) {
                    gebid('preorderTbody').append(el.closest('tr'));

                    page.display.preorderInfo();
                    page.display.orderProductList();
                    page.display.orderProductList(true);
                });
            },
            toMainOrder: function (el) {
                j.fpost('set', {
                    actionMethod: 'toMainOrder',
                    storeOutId: el.closest('td').dataset.value
                }, function (resp) {
                    gebid('cartTbody').append(el.closest('tr'));

                    page.display.preorderInfo();
                    page.display.orderProductList();
                    page.display.orderProductList(true);
                });
            }
        },
        wish: {
            add: function (el) {
                j.fpost('set', {
                    actionMethod: 'toWishlist',
                    productId: el.closest('tr').dataset.value,
                    customerId: pageData.orderDetail.customerId,
                    storeOutId: el.closest('td').dataset.value
                }, function () {
                    el.closest('tr').remove();
                    page.display.preorderInfo();
                    page.display.wishlist();
                });

            },
            toOrder: function (el) {
                j.fpost('set', {
                    actionMethod: 'wishToOrder',
                    wishLineId: el.closest('td').dataset.value
                }, function () {
                    page.display.orderProductList();
                    el.closest('tr').remove();
                });
            },
            remove: function (el) {
                j.fpost('del', {
                    actionMethod: 'fromWishlist',
                    wishLineId: el.closest('td').dataset.value
                }, function () {
                    el.closest('tr').remove();
                });
            }
        },
        newShippInfo: async function (f) {
            const newData = formData(f);
            await j.fpost('set', {
                actionMethod: 'newShippInfo',
                data: newData
            }, function (resp) {
                if (resp.newCustomerShippingAddressId) {
                    document.forms.shippInfoForm.id.value = resp.newCustomerShippingAddressId;
                    pageData.shipDetail = resp.customerShippAddr[resp.newCustomerShippingAddressId];
                }
                gebid('shippInfo').classList.remove('panelChanged');
                page.display.customerShippAddrList();
            });
        },
        createTTNnp: function (f) {
            const ttnData = formData(f);
            ttnData.oldRef = pageData.orderDetail.ttnRef;
            j.fpost('set', {
                actionMethod: 'npTTN',
                ttnData: ttnData
            }, function (resp) {
                if (resp.createdTTN.success) {
                    const tData = resp.createdTTN;
                    $('#mainModal').modal('hide');
                    document.forms.mainInfoForm.ttn.value = tData.IntDocNumber;
                    document.forms.mainInfoForm.ttnRef.value = tData.Ref;
                    page.display.ttnInfo();
                }
            })
        },
        saveTTNNum: function () {
            if (gebid('ttnNum').reportValidity()) j.fpost('set', {
                actionMethod: 'saveTTNNum',
                ttnData: gebid('ttnNum').value,
                shippingMethodCode: pageData.shipDetail.shippingMethodCode
            }, function (resp) {
                gebid('saveTTNNum').hidden = true;
                gebid('trackTTN').hidden = false;
                gebid('trackTTN').classList.remove('disabled');
                page.display.ttnInfo();
            });
        },
        saveNotes: function () {
            j.fpost('set', {
                actionMethod: 'notes',
                adminNote: document.forms.notesForm.adminNote.value,
                comment: document.forms.notesForm.comment.value
            }, function () {
                document.forms.notesForm.closest('.panelChanged').classList.remove('panelChanged');
                gebid('saveNotesBtn').hidden = true;
            });
        },
        newOrder: function (f) {
            const p = formData(f);
            p.telType = !isDefined(pageData.tels[p.tel]) ? 'new' : pageData.tels[p.tel].owner;
            p.actionMethod = 'newOrder';
            j.fpost('set', p, function (resp) {
                goToLink('?orderId=' + resp.newOrderId);
            });
        },
        addFee: function (f) {
            const p = formData(f);
            p.actionMethod = 'addFee';
            j.fpost('set', p, function () {
                page.display.feesList();
            });
        }
    },
    del: {
        fee: function (feeId) {
            j.fpost('del', {
                    feeId: feeId,
                    actionMethod: 'fee'
                },
                function () {
                    page.display.feesList();
                });
        },
        transaction: function (el) {
            if (confirm("Ця дія відкріпить всі замовлення від поточної транзакції, ви з цим згодні?")) {
                const mLine = el.closest('tr');
                const paymId = mLine.dataset.value;
                j.fpost('del', {
                    actionMethod: 'payTransaction',
                    data: paymId
                }, function () {
                    page.init();
                })
            }
        }
    },
    get: {
        shippingMethods: async function (cityId) {
            cityId = page.countryCode == 'UA' && cityId ? cityId : null;
            await j.fpost('get', {
                    actionMethod: 'shippingMethods',
                    countryCode: page.countryCode,
                    cityId: cityId
                },
                function (resp) {
                    console.log(resp);
                    page.display.shippingMethods(resp.shippingMethods);
                }
            );
        },
        cityList: function (cityName) {
            j.fpost('get', {
                    actionMethod: 'cityList',
                    cityName: cityName
                },
                function (resp) {
                    page.display.citiesList(resp.cityList);
                });
        },
        warehList: function (str, shippMethCode) {
            j.fpost('get', {
                    actionMethod: 'warehList',
                    shippMethCode: shippMethCode,
                    searchStr: str,
                    cityId: gebid('selectCity').value
                },
                function (resp) {
                    pageData.warehouses[shippMethCode] = resp.list;
                    page.display[shippMethCode].warehList(resp.list);
                    page.actions.selectInit(shippMethCode + 'Selector');
                }, true);
        },
        searchTel: function (val) {
            if (val.length > 4 && val.substr(0, 5) != pageData.searchedTel) {
                pageData.searchedTel = val.substr(0, 5);
                j.fpost('get', {
                    actionMethod: 'searchTelNumber',
                    tel: pageData.searchedTel
                }, function (resp) {
                    page.display.phonesHelper();
                    page.display.phonesModalHistory(val);
                });
            } else page.display.phonesModalHistory(val);
        },
        ttnInfo: function () {
            if (pageData.shipDetail.shippingMethodCode === "np" && pageData.orderDetail.ttn)
                j.fpost('get', {
                    actionMethod: 'ttnInfo',
                    ttnNum: pageData.orderDetail.ttn
                }, function () {
                    page.display.ttnInfo();
                });
        }
    },
    actions: {
        editingInterval: function () {
            clearInterval(page.editingUpdator);
            page.editingUpdator = setInterval(function () {
                if (pageCode == 201) page.set.editing();
                else clearInterval(pages['201'].editingUpdator);
            }, 20000)
        },
        selectInit: function (selectId) {
            const sel = gebid(selectId);
            if (!page.initedSelects.includes(selectId)) {
                page.initedSelects.push(selectId);
                $(sel).selectpicker();
            } else $(sel).selectpicker('refresh');

            if (selectId == 'selectCity') {
                gebid('cityBox').querySelector('input')
                    .oninput = page.actions.onCityInput;
            } else if (selectId == 'npSelector' && pageData.warehouses.np && pageData.warehouses.np.length > 399) {
                sel.closest('div').querySelector('input')
                    .oninput = page.actions.onWarehouseInput;
            }
        },
        onWarehSelect: function (el) {
            const par = el.closest('div');
            par.closest('.bootSelectBox').querySelector('[name="address"][hidden]').value =
                el.selectedOptions[0].innerText;
        },
        onWarehouseInput: function (el) {
            // поки це реалізовано лише для нової пошти, якщо буде треба, то доробити на бекенді
            let wareh = el.target.value;
            let shippMethCode = gebid('shippingMethods').value;

            if (wareh.length > 2) {
                page.searchWarehStr = wareh;
                page.get.warehList(page.searchWarehStr, shippMethCode);
            }
        },
        onCountrySelect: function (onPageLoad) {
            const countryCode = gebid('selectCountry').value;
            page.countryCode = countryCode;
            if (countryCode != "UA") {
                gebid('zoneSelectMsg').hidden = true;
                gebid('cityBox').hidden = true;
                gebid('selectCity').required = false;
                if (onPageLoad !== true) page.get.shippingMethods(false);
            } else {
                page.actions.selectInit('selectCity');
                if (!gebid('selectCity').value) gebid('zoneSelectMsg').hidden = false;
                gebid('selectCity').required = true;
                gebid('cityBox').hidden = false;
            }
        },
        onCityInput: function (el) {
            let cityName = el.target.value;

            if (cityName.length > 2 && cityName.substr(0, 3) != page.searchCityStr) {
                page.searchCityStr = cityName.substr(0, 3);
                page.get.cityList(page.searchCityStr);
            }
        },
        onCitySelect: function (el) {
            page.get.shippingMethods(el.value);
            const par = el.closest('div');
            par.closest('.bootSelectBox').querySelector('[name="city"][hidden]').value =
                el.selectedOptions[0].innerText;
        },
        onShippAddrSelect: async function (val) {
            const newAddr = pageData.customerShippAddr[val];
            if (!pageData.shipDetail) pageData.shipDetail = {};

            for (const k in newAddr) {
                pageData.shipDetail[k] = newAddr[k];
            }
            page.countryCode = newAddr.countryCode;
            await page.get.shippingMethods(newAddr.cityId);
            page.display.shippInfo();
            page.actions.selectInit('selectCity');
            gebid('shippInfo').classList.add('panelChanged');
        },
        onShippAddrAdd: function () {
            // document.forms.shippInfoForm.reset();
            document.forms.shippInfoForm.id.value = 'new';
            gebid('shippingMethods').value = '';
            gebid('shMethDetailBlock').innerHTML = '';
            gebid('shippInfo').classList.add('panelChanged');
        },
        onFormChange: function () {
            document.querySelectorAll('.panel form').forEach(function (f) {
                f.addEventListener('change', function (ev) {
                    const ch = (ev.target.name == 'payMethodId' ? false : true);
                    if (ch) ev.target.closest('.panel').classList.add('panelChanged');
                });
            })

        },
        courierChange: function (isCourier) {
            if (isCourier) page.display.shippMethodDetails('courier');
            else page.display.shippMethodDetails(gebid('shippingMethods').value, true);
        },
        addToOrderBtn: function () {
            gebid('addToOrdTr').hidden = false;
            gebid('addToOrderList').value = '';
            setTimeout(function () {
                document.querySelector('#addToOrdTr  button').click();
            }, 100)

        },
        datatableInit: function (mainBId) {
            datatable.preInit();
            page.table = $('#' + mainBId + ' [data-role="ordersHistoryTable"]').DataTable({
                columnDefs: [
                    {
                        visible: false,
                        targets: 0
                    },
                    {
                        orderable: false,
                        targets: [1, 7]
                    },
                ],
                order: [/*[3, 'asc'], */[2, 'desc']],
                select: {
                    style: 'multi'
                },
                drawCallback: function (settings) {
                    var api = this.api();
                    var rows = api.rows({page: 'current'}).nodes();
                    var last = null;
                    var head = null;

                    const statusOrdered = settings.aaSorting[0][0] === 4;

                    api.column(0, {page: 'current'}).data().each(function (group, i) {
                        if (last !== group && statusOrdered) {
                            head = $(rows).eq(i).before(
                                '<tr class="table-light group"><td></td>' +
                                '<td colspan="5" class="text-semibold">' + group + '</td>' +
                                '<td class="text-center">' +
                                '<span class="' + rows[i].querySelector('[data-name="status"]').className + ' rounded-pill">1</span>' +
                                '</td>' +
                                '</tr>'
                            );

                            last = group;
                        } else if (head) head[0].previousElementSibling.querySelector('.label').innerText++;
                    });
                }
            });
        },
        openTtnModal: async function () {
            const shInfForm = gebid('shippInfoForm');
            if (shInfForm.reportValidity()) {
                await page.set.newShippInfo(shInfForm); // спочатку зберегти дані

                const shipMeth = gebid('shippingMethods').value;
                const shippDate = formData(shInfForm);
                const mainInfo = formData(gebid('mainInfoForm'));

                if (mainInfo.ttnRef && !confirm(jsTranslates.deleteTTNConfirm)) return false;
                if (shippDate.payMethodId != 2 && !mainInfo.payed && !confirm(jsTranslates.noPrepayment)) return false;


                if (shipMeth == 'np') {
                    modal('npCreateTtnTemplate', function () {
                        page.display.packs();
                        document.querySelectorAll('#npCreateTtn [name], #npCreateTtn [data-name]').forEach(function (el) {
                            let n = el.name || el.dataset.name;
                            let v = shippDate[n];

                            if (n == 'afterPaymentSum') v = shippDate.payMethodId == 2 ? pageData.orderTotalLeft : 0;
                            if (n == 'total') v = pageData.orderTotal;
                            if (n == 'afterPayment') v = shippDate.payMethodId == 2;
                            if (n == 'serviceType') v = shippDate.courierChecked ? 'WarehouseDoors' : 'WarehouseWarehouse';
                            if (v) setHTMLValue(el, v);
                        });
                    });
                } else if (shipMeth == 'up') {
                    let ttnBufer = formData(gebid('shippInfoForm'));
                    ttnBufer.fatherName = shippDate.payMethodId == 2 && !ttnBufer.fatherName ? '.' : ttnBufer.fatherName;
                    ttnBufer.comment = '#' + pageData.orderDetail.orderId;
                    ttnBufer.orderTotalWeight = parseInt(pageData.orderTotalWeight);
                    ttnBufer.orderTotal = pageData.orderTotal;
                    ttnBufer.postPay = shippDate.payMethodId == 2 ? pageData.orderTotalLeft : '';
                    console.log(ttnBufer);
                    Clipboard.copy(JSON.stringify(ttnBufer));
                    window.open('https://ok.ukrposhta.ua/ua/lk/standart');
                } else alert(jsTranslates.noTTNActions);
            }
        },
        printSicker: function () {
            const shipMeth = gebid('shippingMethods').value;
            const ttnNum = gebid('ttnNum').value;
            let stickWin = false;

            if (shipMeth == 'np' && ttnNum) {
                stickWin = window.open('/sticker/np.sp?ttn=' + ttnNum);
            } else if (shipMeth == 'up' && ttnNum) {
                stickWin = window.open('https://ok.ukrposhta.ua/ua/lk/print/sticker/' + ttnNum);
            } else message(jsTranslates.noAvailStickPrint, "w");

            if (stickWin) stickWin.print();
        },
        np: {
            addSeat: function () {
                const seats = gebid('npSeatsSelect');
                const opt = gebid('packsSelect').selectedOptions[0];
                const newSeat = opt.cloneNode(true);
                newSeat.onmousedown = page.actions.np.removeSeat;
                seats.append(newSeat);
                seats.options[seats.options.length - 1].selected = true;
                seats.size = seats.options.length;
                gebid('totalSeats').innerText = seats.options.length;
            },
            removeSeat: function (ev) {
                const seats = gebid('npSeatsSelect');
                ev.preventDefault();
                ev.stopImmediatePropagation();
                ev.target.remove();
                seats.size = seats.options.length;
                gebid('totalSeats').innerText = seats.options.length;
            }
        },
        payedChange: function (el) {
            // paymentModal(pageData.orderDetail.orderId);
            if (confirm(jsTranslates.payChange)) page.set.payChange(pageData.orderDetail.orderId);
            el.checked ^= 1;
        },
        newCustomerAddr: function () {

        },
        trackTTN: function () {
            const shMCode = gebid('shippingMethods').value;
            const v = gebid('ttnNum').value;
            let l;
            if (l = getTrackLink(shMCode, v)) window.open(l);
        },
        openInvoice: function (copyImg) {
            window.open("http://new.pcheloproduct.com/invoice?order='" + pageData.orderDetail.orderKey + "'" + (copyImg ? '&copyImg' : ''));
        },
        selectPackByWeight: function () {
            let p = 0, i = -1;
            do {
                i++;
                p = pageData.packs[i];
            } while (pageData.packs[i + 1] && p.weight < pageData.orderTotalWeight / 1000);
            gebid('packsSelect').value = p.id;
            page.actions.np.addSeat();
        },
        clipboardBtn: function (btn, clipParam) {
            const txt = document.querySelector('[data-clip="' + clipParam + '"]').innerText;
            if (!txt) return false;

            if (!btn) {
                btn = document.querySelector('[data-clip="' + clipParam + '"]').nextElementSibling;
            }
            btn.classList.toggle('icon-clipboard');
            btn.classList.toggle('icon-clipboard2');
            Clipboard.copy(txt);
            setTimeout(function (btn) {
                btn.classList.toggle('icon-clipboard2');
                btn.classList.toggle('icon-clipboard');
            }, 3000, btn);
        },
        setInvoice: function () {
            j.fpost('get', {
                actionMethod: 'invoiceLink'
            }, function (resp) {

            });
        }
    },
    formatPrice: function (decimal) {
        if (typeof decimal != 'number') decimal = parseFloat(decimal) ? parseFloat(decimal) : 0;
        return pageData.orderDetail.symbolBefore + decimal.toFixed(2) + pageData.orderDetail.symbolAfter;
    },
    onOpenSocket: function () {
        if (getUrlParameter('orderId'))
            if (pageData.orderDetail && pageData.orderDetail.orderId)
                ws.send({orderId: pageData.orderDetail.orderId}, 'lockOrder');
    },
    onLeavePage: function () {
        if (pageData.orderDetail && pageData.orderDetail.orderId)
            ws.send({orderId: pageData.orderDetail.orderId}, 'unlockOrder');
    },
    hotKeys: function (ev) {
        const k = ev.keyCode;
        if (ev.ctrlKey) {

            if ([68, 78, 77, 80, 81, 83].indexOf(k) + 1 > 0) {
                ev.preventDefault();
                ev.stopImmediatePropagation();
            }

            switch (k) {
                case 68: //d
                    page.actions.addToOrderBtn();
                    break;
                case 78: //n

                    break;
                case 77: //m
                    page.actions.clipboardBtn(false, 'customerMsg');
                    document.querySelector('[data-pre-href^="viber"]').click();
                    break;
                case 80: //p
                    page.actions.openInvoice();
                    break;
                case 81: //q
                    page.set.orderStatus('done');
                    page.actions.selectInit('statusesSelector');
                    break;
                case 83: //s
                    document.querySelector('button[data-id="statusesSelector"]').click();
                    break;

                default:
                    console.log(k + ' - кнопку не визначено для швидкого доступу');
                    break;

            }
        }

    }
}
pages['202'] = {
    table: false,
    init: function (resp) {
        datatable.preInit();
        this.display.productsList();
    },
    display: {
        productsList: function () {
            if (page.table) {
                page.table.destroy();
                page.table = false;
            }
            const data = pageData.productsList;
            gebid('productsTableBody').innerHTML = '';
            if (Object.keys(data).length) {
                gebid('productsTable').hidden = false;
                gebid('noFound').hidden = true;
                for (const k in data) {
                    const o = data[k];
                    let body = getTemplate('productLineTemplate');

                    body.querySelectorAll('[data-name]').forEach(function (el) {
                        let n = el.dataset.name;
                        let v = o[n];

                        if (el.tagName === "A") el.href = "/products/productEdit?productId=" + o.productId;
                        if (n == 'needCount') {
                            v = o.alertEndCount - o.stockCount - o.waiting;
                            v = v > 0 && o.status!="noProduction" ? v : 0;
                        }

                        if(el.tagName == 'IMG') el.src = img.url(v, 80,80);
                        else setHTMLValue(el, v);


                    });
                    gebid('productsTableBody').prepend(body);

                }
                page.datatableInit();
            }
            else {
                gebid('noFound').hidden = false;
                gebid('productsTable').hidden = true;
            }
        }
    },
    get: {
        listBySearch: function (f) {
            const data = formData(f);
            data.actionMethod = 'search';
            j.fpost('get', data, page.display.productsList)
        },
        bySelector: function (f) {
            j.fpost('get', {
                actionMethod: 'reInit'
            }, page.display.productsList)
        }
    },
    set: {
        endedCountRecalculate: function () {
            j.fpost('set', {
                actionMethod: 'endedCountRecalculate'
            }, false, false);

        }
    },
    actions: {
    },
    datatableInit: function () {
        page.table = $('#productsTable').DataTable({
            columnDefs: [
                {
                    orderable: false,
                    width: '20%',
                    targets: [1]
                },
                {
                    type: 'any-number',
                    targets: [4]
                },
            ],
            displayLength: 75
        });
    }
}
pages['203'] = {
    imgSelecting: false,
    init: function () {
        if (getUrlParameter('productId')) {
            document.body.classList.remove('addNewProduct'); //якщо десь ще залишився
            this.display.categoriesList();
            this.display.mainInfo();
            this.display.gallery();
            this.display.langList();
            this.display.newAttrSelector();
            this.display.translate(Object.keys(pageData.productTranslates)[0]);
            this.display.salesGraph();
            this.display.curAttrList();
            this.display.newRelAndVarList(true);
            this.display.variablesList();
            this.display.relatedList();
            this.display.keywords();
            this.display.productSuppList();
        } else {
            document.body.classList.add('addNewProduct');
            this.display.categoriesList();
            this.display.langList();
            $(".switch").bootstrapSwitch();
        }
    },
    display: {
        mainInfo: function () {
            const info = pageData.productInfo;
            document.querySelectorAll('.mainInfo [data-name], .mainInfo [name]').forEach(function (el) {
                let n = el.dataset.name || el.name;
                let v = info[n];
                setHTMLValue(el, v);
            });
            $(".switch").bootstrapSwitch();
        },
        gallery: function (data) {
            if (!isDefined(data)) data = pageData.productGallery;

            for (const o of data) {
                let gallBox = getTemplate('galleryImgBoxTemplate');

                gallBox.querySelectorAll('[data-name],[name]').forEach(function (el) {
                    let n = el.dataset.name || el.name;
                    let v = o[n];

                    if (el.tagName == 'IMG') el.src = img.url(v, 200, 200);
                    else setHTMLValue(el, v);
                });
                gebid('galleryBody').prepend(gallBox);

            }
        },
        translate: function (needLang) {
            const info = pageData.productTranslates[needLang];

            if (!isDefined(info)) {
                gebid('productCurTranslate').reset();
                return false;
            }
            document.querySelectorAll('#productTranslates [name]').forEach(function (el) {
                let n = el.dataset.name || el.name;
                let v = info[n];
                setHTMLValue(el, v);
            });
        },
        langList: function () {
            const sel = gebid('langSelector');
            sel.innerHTML = '';
            for (let k in pageData.languagesList) {
                const v = pageData.languagesList[k];
                sel.options[sel.options.length] = new Option(v, k);
            }
        },
        categoriesList: function () {
            const sel = gebid('categoriesList');
            sel.innerHTML = '';
            for (let k in pageData.categoriesList) {
                const v = pageData.categoriesList[k];
                sel.options[sel.options.length] = new Option(v, k);
            }
        },
        newAttrSelector: function () {
            const sel1 = gebid('attrSelector');
            const sel2 = gebid('variableAttrSelector');
            sel1.innerHTML = sel2.innerHTML = '';
            for (let k in pageData.productAttributes) {
                const v = pageData.productAttributes[k];
                if (!isDefined(pageData.productHasAttributes[v['code']])) {
                    sel1.options[sel1.options.length] = new Option(v['capture'] + " (" + v['unit'] + ")", v['code']);
                }
                sel2.options[sel2.options.length] = new Option(v['capture'] + " (" + v['unit'] + ")", v['code']);
            }
        },
        newRelAndVarList: function (firstInit) {
            const vSel = gebid('variableProductSelector');
            const rSel = gebid('relatedProductSelector');
            rSel.innerHTML = vSel.innerHTML = '';
            for (let k in pageData.productsList) {
                const v = pageData.productsList[k];
                const c = v['categoryId'];

                if (!isDefined(pageData.productVariations[k])) {
                    page.display.productSelector(vSel, k, c, v);
                }
                if (!isDefined(pageData.relatedProducts[k])) {
                    page.display.productSelector(rSel, k, c, v);
                }
            }
            if (firstInit) $('.productSimpleSelector').selectpicker();
            else $('.productSimpleSelector').selectpicker('refresh');
        },
        productSelector: function (DOMSelect, k, c, v) {
            let oGBox = DOMSelect.querySelector('optgroup[data-category="' + c + '"]');
            if (!oGBox) {
                const oG = document.createElement('optgroup');
                oG.label = v['categoryName'];
                oG.dataset.category = c;
                DOMSelect.append(oG);
                oGBox = DOMSelect.querySelector('optgroup[data-category="' + c + '"]');
            }
            oGBox.append(new Option(v['name'], k));
        },
        curAttrList: function () {
            const data = pageData.productHasAttributes;
            gebid('curAttrList').innerHTML = '';
            for (const k in data) {
                const o = data[k];
                let a = getTemplate('attrTrTemplate');

                a.querySelectorAll('[data-name],[name]').forEach(function (el) {
                    let n = el.dataset.name || el.name;
                    let v = o[n];

                    setHTMLValue(el, v);
                });
                gebid('curAttrList').prepend(a);

            }
        },
        variablesList: function () {
            const data = pageData.productVariations;
            gebid('variablesList').innerHTML = '';
            for (const k in data) {
                const o = data[k];
                let pr = getTemplate('variableTrTemplate');

                pr.querySelectorAll('[data-name],[name]').forEach(function (el) {
                    let n = el.dataset.name || el.name;
                    let v = o[n];

                    setHTMLValue(el, v);
                });
                gebid('variablesList').prepend(pr);

            }

        },
        relatedList: function () {
            const data = pageData.relatedProducts;
            gebid('relatedList').innerHTML = '';
            for (const k in data) {
                const o = data[k];
                let pr = getTemplate('relatedTrTemplate');

                pr.querySelectorAll('[data-name],[name]').forEach(function (el) {
                    let n = el.dataset.name || el.name;
                    let v = o[n];

                    setHTMLValue(el, v);
                });
                gebid('relatedList').prepend(pr);

            }

        },
        keywords: function () {
            $('#kwrdsSelector').selectpicker();
        },
        salesGraph: function () {
            const stats = pageData.monthlyProductSales;
            const axisLabels = [];
            const legend = [];
            const seriesData = [];
            let i = -1;

            for (const k in stats) {
                const stat = stats[k];

                let l = jsTranslates.monthNames[stat['m'] - 1];
                l += " " + stat['y'];
                if (!axisLabels.includes(l)) {
                    axisLabels.push(l);
                    i++;
                }
                if (!legend.includes(stat['name'])) {
                    legend.push(stat['name']);
                }

                const pIndx = legend.indexOf(stat['name'])
                if (!seriesData[pIndx])
                    seriesData[pIndx] = {
                        name: stat['name'],
                        type: 'line',
                        data: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
                        markLine: {
                            data: [{
                                type: 'average',
                                name: 'Average'
                            }]
                        }
                    }

                seriesData[pIndx].data[i] = parseFloat(stat['count']);
            }

            // console.log(axisLabels);
            console.log(seriesData);
            page.actions.initChart(axisLabels, seriesData, legend);
        },
        productSuppList: function () {
            const parTbl = gebid('prodSuppList');
            parTbl.innerHTML = '';
            pageData.productSuppList.forEach(s => {

                let clon = getTemplate('prodSuppLineTemplate');

                clon.querySelectorAll('[data-name]').forEach(function (el) {
                    let v = s[el.dataset.name];
                    setHTMLValue(el, v);
                });

                parTbl.appendChild(clon);
            })
        }
    },
    set: {
        imgId: function (imgId) {
            j.fpost('set', {
                actionMethod: 'addImg',
                imgId: imgId
            }, function (resp) {
                const data = [{
                    id: resp.gallId,
                    imgId: imgId
                }];
                page.display.gallery(data);
            });
        },
        mainInfo: function (f) {
            const data = formData(f);

            j.fpost('set', {
                actionMethod: 'mainInfo',
                data: data
            });
        },
        savePrice: function (f) {
            const data = formData(f);

            j.fpost('set', {
                actionMethod: 'savePrice',
                data: data
            });
        },
        mainImg: function (el) {
            const gId = el.closest('div').dataset.value;
            j.fpost('set', {
                actionMethod: 'mainImg',
                gId: gId
            })
        },
        saveTranslate: function (f) {
            const data = formData(f);
            data.langCode = gebid('langSelector').value;
            j.fpost('set', {
                actionMethod: 'saveTranslate',
                data: data
            }, function () {
                if (data.id == 'new')
                    document.forms.productCurTranslate.id.value = resp.newProductTranslateId;
            });
        },
        newProduct: function (mainInfo, translateInfo) {
            j.fpost('set', {
                actionMethod: 'newProduct',
                mainInfo: mainInfo,
                translateInfo: translateInfo
            }, function () {
                goToLink('?productId=' + resp.newProductId);
            })
        },
        newAttr: function (el) {
            const l = el.closest('tr');
            j.fpost('set', {
                actionMethod: 'addAttrToProduct',
                code: gebid('attrSelector').value,
                value: l.querySelector('input').value
            }, function () {
                page.display.curAttrList();
                page.display.newAttrSelector();
                el.closest('.panel-body').classList.remove('adding');
            })
        },
        changeAttr: function (el) {
            const l = el.closest('tr');
            j.fpost('set', {
                actionMethod: 'updateAttrValue',
                attrId: l.dataset.value,
                value: l.querySelector('input').value
            }, function () {
                /*page.display.curAttrList();
                page.display.newAttrSelector();*/
                l.classList.remove('changed');
            })
        },
        addVariation: function (el) {
            const l = el.closest('tr');
            j.fpost('set', {
                actionMethod: 'newVariationItem',
                productId: gebid('variableProductSelector').value,
                attrCode: gebid('variableAttrSelector').value
            }, function () {
                page.display.variablesList();
                page.display.newRelAndVarList();
                el.closest('.panel-body').classList.remove('adding');
            })
        },
        addRelated: function (el) {
            const l = el.closest('tr');
            j.fpost('set', {
                actionMethod: 'newRelatedItem',
                productId: gebid('relatedProductSelector').value
            }, function () {
                page.display.relatedList();
                page.display.newRelAndVarList();
                el.closest('.panel-body').classList.remove('adding');
            })
        }
    },
    del: {
        fromProductGallery: function (el) {
            const gId = el.closest('div').dataset.value;
            j.fpost('del', {
                actionMethod: 'fromProductGallery',
                gId: gId
            }, function () {
                el.closest('.galleryElement').remove();
                page.display.newAttrSelector();
            })
        },
        attr: function (el) {
            const attrId = el.closest('tr').dataset.value;
            j.fpost('del', {
                actionMethod: 'attrFromProduct',
                attrId: attrId
            }, function () {
                el.closest('tr').remove();
                page.display.newAttrSelector();
            })
        },
        variation: function (el) {
            const contId = el.closest('tr').dataset.value;
            j.fpost('del', {
                actionMethod: 'itemFromVariation',
                contentItemId: contId
            }, function () {
                el.closest('tr').remove();
                page.display.newAttrSelector();
            })
        },
        relation: function (el) {
            const productId = el.closest('tr').dataset.value;
            j.fpost('del', {
                actionMethod: 'relation',
                productId: productId
            }, function () {
                el.closest('tr').remove();
                page.display.newAttrSelector();
            })
        },
        curProduct: function () {
            if (confirm(jsTranslates.confirmProductDelete)) j.fpost('del',
                {actionMethod: 'curProduct'}, function () {
                    goToLink('/products/productList');
                })

        }
    },
    actions: {
        selectImg: function () {
            page.imgSelecting = true;
            const win = window.open("/images/gallery");
        },
        onImgSelect: function (newImgId) { // запускається з форми де вибирається картинка
            page.set.imgId(newImgId);
        },
        translateSelector: function (newLang) {
            page.display.translate(newLang);
        },
        addNewProduct: function () {
            const t = gebid('productCurTranslate').reportValidity();
            const p = gebid('priceInfo').reportValidity();
            const m = gebid('mainInfo').reportValidity();
            if (m && p && t) {
                const mainInfo = formData(gebid('mainInfo'));
                const priceInfo = formData(gebid('priceInfo'));
                Object.assign(mainInfo, mainInfo, priceInfo);
                const translateInfo = formData(gebid('productCurTranslate'));
                translateInfo.langCode = gebid('langSelector').value;

                page.set.newProduct(mainInfo, translateInfo);
            }
        },
        addLineBtn: function (el) {
            el.closest('.panel-body').classList.add('adding');
        },
        attrInput: function (el) {
            if (event.keyCode == 13) page.set.changeAttr(el);
            else el.closest('tr').classList.add('changed');
        },

        initChart: function (axisLabels, seriesData, legend) {

            stacked_lines_options = {
                grid: {
                    x: 40,
                    x2: 40,
                    y: 35,
                    y2: 25
                },
                tooltip: {
                    trigger: 'axis'
                },
                legend: {
                    data: legend
                },
                calculable: true,
                xAxis: [{
                    type: 'category',
                    boundaryGap: false,
                    data: axisLabels
                }],
                yAxis: [{
                    type: 'value',
                }],
                series: seriesData
            };

            require.config({
                paths: {
                    echarts: '/js/echarts'
                }
            });

            require(
                [
                    'echarts',
                    'echarts/theme/limitless',
                    'echarts/chart/bar',
                    'echarts/chart/line'
                ],

                function (ec, limitless) {
                    stacked_lines = ec.init(document.getElementById('stacked_lines'), limitless);
                    stacked_lines.setOption(stacked_lines_options);
                }
            );
        }
    },

    onresize: function () {
        setTimeout(function () {
            stacked_lines.resize();
        }, 200);

    }
}
pages['204'] = {
    table: false,
    init: function (resp) {
        datatable.preInit();
        this.display.clientsList();

    },
    display: {
        clientsList: function () {
            const data = pageData.customersList;
            if (page.table) {
                page.table.destroy();
                page.table = false;
            }
            if (data.length) {
                gebid('clientsTable').hidden = false;
                gebid('noClientsFound').hidden = true;
                gebid('clientsTableBody').innerHTML = '';

                for (const o of data) {
                    let body = getTemplate('clientLineTemplate');

                    body.querySelectorAll('[data-name]').forEach(function (el) {
                        let n = el.dataset.name;
                        let v = o[n];

                        if (el.classList.contains('mainLink'))
                            el.href = '/customers/customerEdit?cId=' + v;
                        else setHTMLValue(el, v);
                    });
                    gebid('clientsTableBody').prepend(body);

                }
                page.datatableInit();
            } else {
                gebid('clientsTable').hidden = true;
                gebid('noClientsFound').hidden = false;
            }
        }
    },
    get: {
        bySearch: function (form) {
            const params = form ? formData(form) : {};
            params.actionMethod = 'searchBySW';
            j.fpost('get', params,
                function (resp) {
                    page.display.clientsList(resp.orderList);
                    gebid('clientsGroupSelector').value = 'default';
                });
        },
        bySelector: function () {
            const mode = gebid('clientsGroupSelector').value;
            j.fpost('get', {
                    actionMethod: 'searchBySelector',
                    mode: mode
                },
                function (resp) {
                    page.display.clientsList(resp.orderList);
                });
        }
    },
    set: {

    },
    actions: {

    },
    datatableInit: function () {
        page.table = $('#clientsTable').DataTable(
            {
                columnDefs: [
                    {
                        orderable: false,
                        targets: [2,3,4,5]
                    },
                ]
            }
        );
    }
}
pages['205'] = {
    table: [],
    init: function () {
        if (getUrlParameter('cId')){
            this.display.currencyZones();
            this.display.messengers();
            this.display.mainInfo();
            this.display.ordersHistory();
            this.display.shAddrList();
            this.display.custPhones();
        }
    },
    display: {
        mainInfo: function () {
            const info = pageData.customerInfo;
            document.querySelectorAll('.mainInfo [data-name],.mainInfo [name]').forEach(function (el) {
                let n = el.dataset.name || el.name;
                let v = info[n];

                if (n == 'tel' && el.href) {
                    el.href = el.dataset.preHref + phoneCleaner(v, el.dataset.needplus);
                }
                else if (n == 'name'  && el.type!='text') {
                    v=v+'('+info['pass']+")";
                    setHTMLValue(el, v);
                }
                else setHTMLValue(el, v);

            });
        },
        ordersHistory: function (histBoxId) {
            if(!histBoxId) histBoxId = 'historyList';
            const data = pageData.customerOrdersList;
            const mainB = gebid(histBoxId);
            mainB.innerHTML='';
            mainB.appendChild(getTemplate('ordersHistoryPanel'));
            if (data.length) {
                mainB.querySelector('[data-role="ordersHistoryTable"]').hidden = false;
                mainB.querySelector('[data-role="noHistoryFound"]').hidden = true;
                mainB.querySelector('[data-role="ordersTable"]').innerHTML = '';

                for (const o of data) {
                    let body = getTemplate('orderLineTemplate');

                    body.querySelectorAll('[data-name]').forEach(function (el) {
                        let n = el.dataset.name;
                        let v = o[n];

                        if (n == 'ttn' && v) setTrackLink(el, o.shippingMethodCode, v);
                        else if (el.tagName === "A") el.href = "/orders/orderEdit?orderId=" + o.id;
                        else if (n === 'status') el.classList.add(o.cpDisplayClass);

                        if (n == 'paying') el.className =
                            v == 1 ? 'icon-checkmark-circle text-success' : v == 2 ? 'icon-circle text-muted' : 'icon-notification2 text-warning';
                        else setHTMLValue(el, v);


                    });
                    mainB.querySelector('[data-role="ordersTable"]').prepend(body);

                }
                page.actions.datatableInit(histBoxId);
            } else {
                mainB.querySelector('[data-role="ordersHistoryTable"]').hidden = true;
                mainB.querySelector('[data-role="noHistoryFound"]').hidden = false;
            }
        },
        shAddrList: function () {
            const data = pageData.customerShippAddr;
            if (Object.keys(data).length) {
                gebid('shAddrTable').hidden = false;
                gebid('noShAddrFound').hidden = true;
                gebid('shAddrBody').innerHTML = '';

                for (const k in data) {
                    const o = data[k];
                    let body = getTemplate('shAddrLineTemplate');

                    body.querySelectorAll('[data-name]').forEach(function (el) {
                        let n = el.dataset.name;
                        let v = o[n];

                        if (n == 'phone' && el.href) {
                            el.href +=  v;
                        } setHTMLValue(el, v);

                    });
                    gebid('shAddrBody').prepend(body);

                }
                page.table['shAddrTable'] = $('#shAddrTable').DataTable({
                    columnDefs: [
                        {
                            orderable: false,
                            targets: 0
                        }],
                    select: { style: 'multi+shift' }, order: [1, 'desc']});
            } else {
                gebid('shAddrTable').hidden = true;
                gebid('noShAddrFound').hidden = false;
            }
        },
        currencyZones: function () {
            for (let k in pageData.currencyZoneIds) {
                const lineData = pageData.currencyZoneIds[k];
                let sel = gebid('currencyZones');
                sel.options[sel.options.length] = new Option(lineData['zoneCapture'], lineData['id']);
            }
        },
        messengers: function () {
            for (let k in pageData.messengers) {
                const lineData = pageData.messengers[k];
                let sel = gebid('messengers');
                sel.options[sel.options.length] = new Option(lineData['name'], lineData['id']);
            }
        },

        custPhones: function () {
            for (let k in pageData.customerPhonesList) {
                const line = pageData.customerPhonesList[k];
                const v = line['phoneNumber'];
                let listBox = gebid('custPhonesList');

                const l = getTemplate('phoneInfosLineTemplate');
                l.querySelector('li').dataset.value = line.id;
                l.querySelectorAll('[data-name]').forEach(function (el) {
                    if (el.href) {
                        el.href = el.dataset.preHref + phoneCleaner(v);
                    }
                    else el.innerText = v;
                });

                listBox.appendChild(l);
            }
        },

        phonesHelper: function () {
            const list = pageData.tels;
            let sel = gebid('telsList');
            sel.innerHTML = '';
            for (let k in list) {
                const lineData = list[k];
                const opt = document.createElement('option');
                opt.value = lineData['tel'];
                opt.innerText = lineData['n'] + ' - ' + lineData['owner'];
                sel.append(opt);
            }
        },
        phonesModalHistory: function (fullTel) {
            if(document.querySelector('datalist option[value="'+fullTel+'"]')){
                j.fpost('get', {
                    actionMethod: 'orderHistoryByNum',
                    num: fullTel
                }, function (resp) {
                    page.display.ordersHistory('modalHistoryList');
                    gebid('modalHistoryList').hidden = false;
                    gebid('clientNum').innerText = fullTel;

                });
            }
            else console.log('history empty');
        },
    },
    set: {
        allData: function (f) {
            const data = formData(f);
            j.fpost('set', {
                actionMethod: 'saveCustomer',
                data: data
            }, function (resp) {

            });

        },
        mergeShAddr: function (f) {
            const data = formData(f);
            j.fpost('set', {
                ids: data.ids,
                mainId: data.mainId,
                actionMethod: 'mergeShAddr'
            }, function () {
                document.querySelectorAll('tr.selected').forEach(function (v) {
                    if(v.dataset.value!=data.mainId) v.hidden = true;
                    page.table.shAddrTable.rows().deselect();
                });
                mainModal.modal('hide');
            })
        },
        mergeCustomers: function (f) {
            const data = formData(f);
            j.fpost('set', {
                tel: data.tel,
                mainId: pageData.customerInfo.id,
                actionMethod: 'mergeCustomers'
            }, function () {
                mainModal.modal('hide');
            })
        },
        deleteCustPhone: function (el) {
            console.log(el.closest('li').dataset.value);
            j.fpost('del', {
                actionMethod: 'custPhone',
                lineId:el.closest('li').dataset.value
            }, function (resp) {
                el.closest('li').remove();
            });
        }
    },
    get: {
        searchTel: function (val) {
            if (val.length > 4 && val.substr(0, 5) != pageData.searchedTel) {
                pageData.searchedTel = val.substr(0, 5);
                j.fpost('get', {
                    actionMethod: 'searchTelNumber',
                    tel: pageData.searchedTel
                }, function (resp) {
                    page.display.phonesHelper();
                    page.display.phonesModalHistory(val);
                });
            }
            else page.display.phonesModalHistory(val);
        }
    },
    actions: {
        datatableInit: function (mainBId) {
            datatable.preInit();
            page.table[mainBId] = $('#'+mainBId+' [data-role="ordersHistoryTable"]').DataTable({
                columnDefs: [
                    {
                        visible: false,
                        targets: 0
                    },
                    {
                        orderable: false,
                        targets: [1, 7]
                    },
                ],
                order: [/*[3, 'asc'], */[2, 'desc']],
                select: {
                    style: 'multi'
                },
                drawCallback: function (settings) {
                    var api = this.api();
                    var rows = api.rows({page: 'current'}).nodes();
                    var last = null;
                    var head = null;

                    const statusOrdered = settings.aaSorting[0][0] === 4;

                    api.column(0, {page: 'current'}).data().each(function (group, i) {
                        if (last !== group && statusOrdered) {
                            head = $(rows).eq(i).before(
                                '<tr class="table-light group"><td></td>' +
                                '<td colspan="5" class="text-semibold">' + group + '</td>' +
                                '<td class="text-center">' +
                                '<span class="' + rows[i].querySelector('[data-name="status"]').className + ' rounded-pill">1</span>' +
                                '</td>' +
                                '</tr>'
                            );

                            last = group;
                        } else if (head) head[0].previousElementSibling.querySelector('.label').innerText++;
                    });
                }
            });
        },
        mergeShAddrBtn: function () {
            const idsArr = [];
            document.querySelectorAll('tr.selected').forEach(function (v) {
                idsArr[idsArr.length] = v.dataset.value;
            });
            modal('mergeShAddrModalTemplate', function (ids) {
                const f = gebid('mergeShAddrForm');
                const sel = f.querySelector('select');
                let idsLine = '';
                for (const k in ids) {
                    const o = ids[k];
                    sel.options[sel.options.length] = new Option(o, o);
                    idsLine += idsLine ? ',' + o : o;
                }
                f.querySelector('input').value = idsLine;
            },idsArr);
        }
    }
}

pages['206'] = {
    init: function () {
        this.display.mainInfo();
        this.display.salesGraph();
    },
    display: {
        mainInfo: function () {
            const o = pageData.mainInfo;
            const mainInfo = gebid('mainInfo');
            mainInfo.querySelectorAll('[data-name]').forEach(function (el) {
                let n = el.dataset.name;
                let v = o[n];

                setHTMLValue(el, v);

            });
        },
        salesGraph: function () {
            const stats = pageData.monthlyProductSales;
            const axisLabels = [];
            const legend = {
                data: [],
                selected: {}
            };
            const seriesData = [];
            let i = -1;

            for (const k in stats) {
                const stat = stats[k];

                let l = jsTranslates.monthNames[stat['m'] - 1];
                l += " " + stat['y'];
                if (!axisLabels.includes(l)) {
                    axisLabels.push(l);
                    i++;
                }
                if (!legend.data.includes(stat['name'])) {
                    legend.data.push(stat['name']);
                    legend.selected[stat['name']] = false;
                }

                const pIndx = legend.data.indexOf(stat['name'])
                if (!seriesData[pIndx])
                    seriesData[pIndx] = {
                        name: stat['name'],
                        type: 'line',
                        data: [0,0,0,0,0,0,0,0,0,0,0,0],
                        markLine: {
                            data: [{
                                type: 'average',
                                name: 'Average'
                            }]
                        }
                    }

                seriesData[pIndx].data[i] = parseFloat(stat['count']);
            }

            // console.log(axisLabels);
            console.log(seriesData);
            page.actions.initChart(axisLabels, seriesData, legend);
        }
    },
    actions: {
        initChart: function (axisLabels, seriesData, legend) {

            stacked_lines_options = {
                grid: {
                    x: 40,
                    x2: 40,
                    y: 400,
                    y2: 25
                },
                tooltip: {
                    trigger: 'axis'
                },
                legend: legend,
                calculable: true,
                xAxis: [{
                    type: 'category',
                    boundaryGap: false,
                    data: axisLabels
                }],
                yAxis: [{
                    type: 'value',
                }],
                series: seriesData
            };

            require.config({
                paths: {
                    echarts: '/js/echarts'
                }
            });

            require(
                [
                    'echarts',
                    'echarts/theme/limitless',
                    'echarts/chart/bar',
                    'echarts/chart/line'
                ],

                function (ec, limitless) {
                    stacked_lines = ec.init(document.getElementById('stacked_lines'), limitless);
                    stacked_lines.setOption(stacked_lines_options);
                }
            );
        }
    },
    onresize: function () {
        setTimeout(function () {
            stacked_lines.resize();
        }, 200);

    }

}
pages['207'] = {
    init (resp){
        this.display.reviewList(resp.reviewsList);
    },
    display: {
        reviewList(list) {
            for (const k in list) {
                const o = list[k];
                let body = getTemplate('simpleReviewTmplt');

                body.querySelectorAll('[data-name]').forEach(function (el) {
                    let n = el.dataset.name;
                    let v = o[n];

                    if (n == 'customerId') {
                        el.href = '/customers/customerEdit?cId=' + v;
                    }
                    else setHTMLValue(el, v);
                });

                const statusColor = this.getStatusColor(o.status);
                body.querySelector('tr').classList.add(statusColor);
                gebid('reviewTableList').prepend(body);

            }
        },
        getStatusColor (status){
            let statusColor = 'alpha-grey';
            switch (parseInt(status)) {
                case 1:
                    statusColor = 'alpha-blue';
                    break;
                case 2: statusColor = 'alpha-success';
                    break;
                case 3: statusColor = 'alpha-danger';
                    break;
                case 4: statusColor = 'alpha-brown';
                    break;
                default:
                    break;
            }

            return statusColor;
        }
    },
    changeStatus (sel){
        const tr = sel.closest('tr');
        const data = {
            actionMethod: 'reviewStatus',
            revId: tr.dataset.value,
            newStatus: sel.value
        }

        j.fpost('set', data, function () {
            tr.className = page.display.getStatusColor(data.newStatus);
        });
    }
}
pages['208'] = {
    init: function () {
        if (getUrlParameter('suppId')) {
            this.display.addProductsList();
            this.display.suppInfo();
            this.display.suppContent();

            if (getUrlParameter('mode') == 'printSticker') gebid('supplyList').classList.add('showPacksCount');
        }

        this.display.suppliesList();
    },
    display: {
        suppInfo: function () {
            const info = pageData.supplyDetail;
            document.querySelectorAll('.supplyInfo [data-name],.supplyInfo [name]').forEach(function (el) {
                let n = el.dataset.name || el.name;
                let v = info[n];

                if (n == 'ttn' && el.tagName === 'BUTTON') {
                    if (v) {
                        el.classList.remove('disabled');
                    }
                } else setHTMLValue(el, v);

            });
        },
        suppContent: function () {
            const list = pageData.suppContent;
            gebid('supplyList').hidden = false;
            const parTbl = gebid('supplyContentTbody');
            parTbl.innerHTML = '';

            let total = 0;
            if (Object.keys(list).length) {
                for (let lineK in list) {
                    let lineData = list[lineK];
                    let clon = getTemplate('supplyItemTemplate');

                    clon.querySelectorAll('[data-name]').forEach(function (el) {
                        let v = lineData[el.dataset.name];


                        if (el.classList.contains('mainLink'))
                            el.href = '/products/productEdit?productId=' + v;
                        else setHTMLValue(el, v);
                    });

                    parTbl.appendChild(clon);
                    total += parseFloat(lineData.totalPricePurchase);
                }
            }

            gebid('totalCartSum').innerText = total;

        },
        suppliesList: function () {
            const list = pageData.suppliesList;
            const parTbl = gebid('suppliesTbody');
            parTbl.innerHTML = '';

            let total = 0;

            for (let lineK in list) {
                let lineData = list[lineK];
                let clon = getTemplate('suppliesLineTemplate');

                clon.querySelectorAll('[data-name]').forEach(function (el) {
                    const n = el.dataset.name;
                    const v = lineData[n];

                    if (el.classList.contains('mainLink'))
                        el.href = window.location.pathname + '?suppId=' + v;
                    else if (n == 'ttn' && v) el.href = getTrackLink('np', v);

                    setHTMLValue(el, v);
                });

                parTbl.appendChild(clon);
            }

        },
        addProductsList: function () {
            const pSel = gebid('addToOrderList');
            pSel.innerHTML = '';
            for (const k in pageData.productList) {
                const v = pageData.productList[k];
                const c = v['categoryId'];

                let oGBox = pSel.querySelector('optgroup[data-category="' + c + '"]');
                if (!oGBox) {
                    const oG = document.createElement('optgroup');
                    oG.label = v['categoryName'];
                    oG.dataset.category = c;
                    pSel.append(oG);
                    oGBox = pSel.querySelector('optgroup[data-category="' + c + '"]');
                }
                oGBox.append(new Option(v['name'], k));
            }
            $('#addToOrderList').selectpicker();
        },
        printContent: function (pdata) {
            const templ = getTemplate('supplyStickerTemplate');
            document.body.innerHTML = '<div></div>';
            const letter = document.body.querySelector('div');
            document.body.className = 'printMode supplyStickerPrint';

            for (const k in pdata) {
                const info = pdata[k];
                let p = 0;

                while (info.packsCount > p) {
                    p++;
                    const sticker = templ.cloneNode(true);
                    sticker.querySelectorAll('[data-name]').forEach(function (el) {
                        let n = el.dataset.name;
                        let v = info[n];

                        if (n == 'page') v = p + '/' + info.packsCount;

                        if (n == 'barcode') el.setAttribute('jsbarcode-value', pageData.supplyDetail.suppId + '-' + info.id);
                        else setHTMLValue(el, v);
                    });
                    letter.appendChild(sticker);
                }
            }

            JsBarcode(".barcode").init();
        }
    },
    set: {
        addToSupply: function (el) {
            const tr = el.closest('tr');
            const prodId = tr.querySelector('select').value;
            // const count = tr.querySelector('input[name="count"]').value;
            // const mfgDate = tr.querySelector('input[name="mfgDate"]').value;
            j.fpost('set', {
                actionMethod: 'addToSupply',
                productId: prodId,
                // count: count,
                // mfgDate: mfgDate
            }, function (resp) {
                gebid('addToSupplTr').hidden = true;
                page.display.suppContent();
            });

        },
        allData: function (f) {
            const data = formData(f);
            j.fpost('set', {
                actionMethod: 'saveSupply',
                data: data
            }, function (resp) {
                if (data.id == 'new') goToLink('?suppId=' + resp.suppId);
            });

        },
        suppLineChange: function (target) {
            const data = {};
            console.log(target);
            data.id = target.closest('tr').dataset.value;
            data.key = target.dataset.name;
            data.value = target.value;
            console.log(data);
            if(isDefined(data.key)){
                if (data.key=='manufactureDate'&& (new Date(data.value)<new Date('01-01-2000') || new Date(data.value) > new Date())) {
                    target.closest('td').classList.add('bg-warning');
                    return false;
                }
                j.fpost('set', {
                    actionMethod: 'suppLineChange',
                    data: data
                }, function (resp) {
                    if(resp.error) target.closest('td').classList.add('bg-warning');
                    else target.closest('td').classList.remove('bg-warning');
                });
            }
        }
    },
    del: {
        suppLine: function (el) {
            j.fpost('del', {actionMethod: 'suppLine', id: el.closest('tr').dataset.value},
                function () {
                    el.closest('tr').remove();
                })
        }
    },
    actions: {
        addToOrderBtn: function () {
            gebid('addToSupplTr').hidden = false;
            setTimeout(function () {
                document.querySelector('#addToSupplTr  button').click();
            }, 100)
        },
        openSupplyInvoice: function () {

        },
        trackTTN: function () {
            const v = gebid('ttnNum').value;
            let l;
            if (l = getTrackLink('np', v)) window.open(l);
        },
        printBtn: function (el) {
            const c = gebid('supplyList');
            if (!c.classList.contains('showPacksCount'))
                window.open(window.location.href + '&mode=printSticker');
            else {
                const printJson = pageData.suppContent;
                document.querySelectorAll('#supplyContentTbody tr').forEach(function (el) {
                    printJson[el.dataset.value].packsCount = el.querySelector('input').value;
                });
                page.display.printContent(printJson);
            }
        }
    }
}
pages['209'] = {
    init (resp){
        this.display.reviewList(resp.reviewsList);
    },
    display: {
        reviewList(list) {
            for (const k in list) {
                const o = list[k];
                let body = getTemplate('simpleReviewTmplt');

                body.querySelectorAll('[data-name]').forEach(function (el) {
                    let n = el.dataset.name;
                    let v = o[n];

                    if (n == 'customerId') {
                        el.href = '/customers/customerEdit?cId=' + v;
                    }
                    else setHTMLValue(el, v);
                });

                const statusColor = this.getStatusColor(o.status);
                body.querySelector('tr').classList.add(statusColor);
                gebid('reviewTableList').prepend(body);

            }
        },
        getStatusColor (status){
            let statusColor = 'alpha-grey';
            switch (parseInt(status)) {
                case 1:
                    statusColor = 'alpha-blue';
                    break;
                case 2: statusColor = 'alpha-success';
                    break;
                case 3: statusColor = 'alpha-danger';
                    break;
                case 4: statusColor = 'alpha-brown';
                    break;
                default:
                    break;
            }

            return statusColor;
        }
    },
    changeStatus (sel){
        const tr = sel.closest('tr');
        const data = {
            actionMethod: 'reviewStatus',
            revId: tr.dataset.value,
            newStatus: sel.value
        }

        j.fpost('set', data, function () {
            tr.className = page.display.getStatusColor(data.newStatus);
        });
    }
}
pages['211'] = {
    table: false,
    init: function (resp) {
        const tbl = page.datatable.preInit();
        this.display.paymentsList(resp.paymentsList);

    },
    datatable: {
        preInit: function () {
            if (!$().DataTable) {
                console.warn('Warning - datatables.min.js is not loaded.');
                return false;
            }

            // Initialize
            $.extend($.fn.dataTable.defaults, {
                autoWidth: false,
                columnDefs: [
                    {
                        visible: false,
                        targets: 0
                    },
                    {
                        width: 40,
                        targets: [2]
                    }
                ],
                dom: '<"datatable-header"fl><"datatable-scroll-wrap"t><"datatable-footer"ip>',
                language: {
                    search: '<span>Filter:</span> _INPUT_',
                    searchPlaceholder: 'Type to filter...',
                    lengthMenu: '<span class="showCount">Show:</span> _MENU_',
                    paginate: {'next': '&rarr;', 'previous': '&larr;'}
                },
                lengthMenu: [25, 50, 75, 100],
                displayLength: 50,
                buttons: {},
                select: {
                    style: 'multi'
                }
            });
        },
        init: function () {
            page.table = $('#paymentsHistoryTable').DataTable({
                order: [[1, 'desc']],
                drawCallback: function (settings) {
                    var api = this.api();
                    var rows = api.rows({page: 'current'}).nodes();
                    var last = null;
                    var head = null;

                    const statusOrdered = settings.aaSorting[0][0] === 1;

                    api.column(0, {page: 'current'}).data().each(function (group, i) {
                        if (last !== group && statusOrdered) {
                            head = $(rows).eq(i).before(
                                '<tr class="table-light group">' +
                                '<td colspan="4" class="text-semibold">' + group + '</td>' +
                                '<td class="text-center">' +
                                '<span class="label label-primary rounded-pill text-right">1</span>' +
                                '</td>' +
                                '</tr>'
                            );

                            last = group;
                        } else if (head) head[0].previousElementSibling.querySelector('.label').innerText++;
                    });
                }
            });
        }
    },
    display: {
        paymentsList: function (data) {
            if (page.table) {
                page.table.destroy();
                page.table = false;
                gebid('paymentsTable').innerHTML = '';
            }
            if (data.length) {
                gebid('paymentsTable').hidden = false;
                gebid('noHistoryFound').hidden = true;

                for (const o of data) {
                    let body = getTemplate('paymentLineTemplate');

                    if (o.chanId == 1 ) {
                        body.querySelector('.cash').innerHTML = '';
                    }
                    body.querySelectorAll('[data-name]').forEach(function (el) {
                        let n = el.dataset.name;
                        let v = o[n];

                        if (n == 'ordId') {
                            if (v != null) {
                                const ords = String(v.split(',')).split('<br>');
                                v = '';
                                ords.forEach(id => {
                                    v += "<a href='/orders/orderEdit?orderId=" + id + "&copyStatusMsg'>" + id + "</a> <br>"
                                })
                                setHTMLValue(el, v);
                            }
                        } else setHTMLValue(el, v);
                    });
                    gebid('paymentsTable').prepend(body);

                }
                page.datatable.init();
            } else {
                gebid('paymentsTable').hidden = true;
                gebid('noHistoryFound').hidden = false;
            }
        }
    },
    updateData: function () {
        j.fpost('init', {mode: 'update'}, function (resp) {
            page.display.paymentsList(resp.paymentsList);
        });
    },
    actions: {
        selectPayedOrd: async function (el) {
            event.preventDefault();
            event.stopImmediatePropagation();

            const mLine = el.closest('tr');
            const paymId = mLine.dataset.value;
            const sum = mLine.querySelector('td[data-name="amount"]').innerText;

            await modal('cardPayTransactionModal', function () {
                mainModal[0].querySelector('[name="amount"]').value = sum;
                mainModal[0].querySelector('[name="tranNum"]').value = paymId;
                const ordsSelector = mainModal[0].querySelector('[name="ids"]');
                pageData.payWaitingOrders.forEach(line => {
                    let sel = parseFloat(line.total) == parseFloat(sum);
                    if (sel) ordsSelector.prepend(new Option(line.id + ' ' + line.n + ' (' + line.total + ')', line.id, sel, sel));
                    else ordsSelector[ordsSelector.length] = new Option(line.id + ' ' + line.n + ' (' + line.total + ')', line.id, sel, sel);
                });
            },);
        },
    },
    set: {
        cardPaymentToOrder: function (f) {
            const fdata = formData(f);
            fdata.payed = 1;
            fdata.ids = fdata.ids.join(',');
            j.fpost('set', {
                actionMethod: 'cardPaymentToOrder',
                data: fdata
            }, function (resp) {
                mainModal.modal('hide');

                let v = '';
                const ords = resp.ordId.split(',');
                ords.forEach(id => {
                    v += "<a href='/orders/orderEdit?orderId=" + id + "&copyStatusMsg'>" + id + "</a>"
                })

                document.querySelector('#paymentsHistoryTable tr[data-name="id"][data-value="' + resp.paymentId + '"] td[data-name="ordId"]').innerHTML = v;
            })
        }

    },
    del: {
        transaction: function (el) {
            if (confirm("Ця дія відкріпить всі замовлення від поточної транзакції, ви з цим згодні?")) {
                const mLine = el.closest('tr');
                const paymId = mLine.dataset.value;
                j.fpost('del', {
                    actionMethod: 'transaction',
                    data: paymId
                }, function (resp) {
                    page.updateData();
                })
            }
        }

    }
}
pages['212'] = {
    init: function () {
        this.display.list();
    },
    display:{
        list: function () {
            if (pageData.hasIds) gebid('linkHasIds').hidden = false;

            const data = pageData.packList;
            if (data.length) {
                gebid('packTable').hidden = false;
                gebid('noProductsFound').hidden = true;
                gebid('packProductList').innerHTML = '';

                for (const o of data) {
                    let body = getTemplate('packLineTemplate');

                    body.querySelectorAll('[data-name]').forEach(function (el) {
                        let n = el.dataset.name;
                        let v = o[n];

                        setHTMLValue(el, v);
                    });
                    gebid('packProductList').prepend(body);

                }
            } else {
                gebid('packTable').hidden = true;
                gebid('noProductsFound').hidden = false;
            }
        }
    }
};


pages['300'] = {
    selected:false,
    init: function () {
        page.tableInit();
        /*j.post(['init'], function (data) {
            debug.cnsl(data);
        }, {});*/
    },
    tableInit: function () {

        // Table setup
        // ------------------------------

        // Setting datatable defaults
        $.extend($.fn.dataTable.defaults, {
            // autoWidth: false,
            columnDefs: [{
                orderable: false,
                targets: [ -1 ]
            }],
            dom: '<"datatable-header"fBl><"datatable-scroll-wrap"t><"datatable-footer"ip>',
            language: {
                search: '<span>Filter:</span> _INPUT_'
                , lengthMenu: '<span>Show:</span> _MENU_'
                , paginate: {'first': 'First', 'last': 'Last', 'next': '&rarr;', 'previous': '&larr;'}
            }
        });

        /*var date = new Date();
        var dateString = date.getUTCFullYear() + "-" + (date.getUTCMonth() + 1) + "-" + date.getUTCDate();
        var fileName = title.add[title.add.length - 1][1] + '_' + dateString;*/


        // Column selectors
        var table_basic = $('.datatable-button-html5-columns').DataTable({
            // columnDefs: [],
            buttons: {
                buttons: [
                    {
                        extend: 'collection'
                        , text: '<i class="icon-cog7"></i> <span class="caret"></span>'
                        , className: 'btn bg-green btn-icon'
                        ,
                        buttons: [
                            {
                                text: 'Toggle first name',
                                action: function (e, dt, node, config) {
                                    dt.column(0).visible(!dt.column(0).visible());
                                }
                            },
                            {
                                text: 'Toggle status',
                                action: function (e, dt, node, config) {
                                    dt.column(-2).visible(!dt.column(-2).visible());
                                }
                            },
                            {
                                text: 'Selected only / All rows',
                                action: function () {
                                    alert("Selected only");

                                }
                            }
                        ]
                    },
                    {
                        extend: 'copyHtml5',
                        className: 'btn btn-default',
                        text: '<i class="icon-copy3 position-left"></i>Copy',
                        exportOptions: {
                            // columns: [0, ':visible']
                            columns: [':not(.sorting_disabled):visible']
                        }
                    },
                    {
                        extend: 'excelHtml5',
                        className: 'btn btn-default',
                        text: '<i class="icon-file-spreadsheet position-left"></i>Excel',
                        exportOptions: {
                            // columns: ':visible'
                            columns: [':not(.sorting_disabled):visible']
                        }
                    },
                    /*{
                        extend: 'pdfHtml5',
                        className: 'btn btn-default',
                        text: '<i class="icon-file-pdf position-left"></i>PDF',
                        filename: fileName,
                        title: title.add[title.add.length - 1][1] + ' ' + dateString,
                        exportOptions: {
                            // columns: ':visible'
                            // columns: [!-1, ':visible']
                            // columns: ['.sorting, .sorting_asc ,.sorting_desc']
                            columns: [':not(.sorting_disabled):visible']
                            // columns: [0, 1, 2, 5]
                        }
                    },
                    {
                        extend: 'print',
                        className: 'btn btn-default',
                        text: '<i class="icon-checkmark3 position-left"></i> Print selected <i class="icon-printer position-right">',
                        title: title.add[title.add.length - 1][1] + ' ' + dateString,
                        exportOptions: {
                            modifier: {
                                selected: true
                            },
                            columns: [':not(.sorting_disabled):visible']
                        }
                    },
                    {
                        extend: 'print',
                        className: 'btn btn-default',
                        text: 'Print <i class="icon-printer position-right">',
                        title: title.add[title.add.length - 1][1] + ' ' + dateString,
                        exportOptions: {
                            columns: [':not(.sorting_disabled):visible']
                        }
                    },*/
                    {
                        extend: 'colvis',
                        text: '<i class="icon-three-bars"></i> <span class="caret"></span>',
                        className: 'btn bg-blue btn-icon'
                    }
                ]
            }
            , fixedHeader: false
            , select: true
            , paging: true
        });


        /*
        FIX Header
         */

        // Toggle necessary body and navbar classes
        $('body').children('.navbar').first().removeClass('navbar-fixed-top');
        $('body').removeClass('navbar-top');

        // Remove offset from all
        // table_basic.fixedHeader.headerOffset(34);


        // External table additions
        // ------------------------------

        // Add placeholder to the datatable filter option
        $('.dataTables_filter input[type=search]').attr('placeholder', 'Type to filter...');


        // Enable Select2 select for the length option
        /*$('.dataTables_length select').select2({
            minimumResultsForSearch: Infinity,
            width: 'auto'
        });
*/
    }
}
