{"id":3545,"date":"2026-07-26T18:52:20","date_gmt":"2026-07-26T18:52:20","guid":{"rendered":"https:\/\/rokhamhub.com\/calculate-project-cost\/"},"modified":"2026-07-26T18:52:20","modified_gmt":"2026-07-26T18:52:20","slug":"calculate-project-cost","status":"publish","type":"page","link":"https:\/\/rokhamhub.com\/en\/calculate-project-cost\/","title":{"rendered":"Estimate Your Project Cost"},"content":{"rendered":"<style>\n.rpc{direction:rtl;max-width:1080px;margin:0 auto;padding:24px 14px 70px;color:#1c1710;font-family:inherit}\n.rpc *{box-sizing:border-box}\n.rpc .rpc-hero{background:linear-gradient(135deg,#221c14,#33291b);border-radius:16px;padding:30px 24px;text-align:center;margin-bottom:22px}\n.rpc .rpc-hero h1{color:#e8c97a;font-size:28px;margin:0 0 10px}\n.rpc .rpc-hero p{color:#f0e6d2;font-size:14.5px;line-height:1.85;margin:0}\n.rpc .rpc-card{background:#fff;border:1px solid #e6d9bd;border-radius:14px;padding:18px;margin-bottom:16px;box-shadow:0 2px 12px rgba(0,0,0,.05)}\n.rpc label{display:flex;flex-direction:column;font-size:12.5px;font-weight:600;color:#5a4a28;gap:6px}\n.rpc .req{color:#c0392b}\n.rpc input,.rpc select{font:inherit;font-size:14.5px;font-weight:500;color:#1c1710;padding:9px 11px;border:1px solid #d9c99f;border-radius:9px;background:#fffdf8;width:100%}\n.rpc input:focus,.rpc select:focus{outline:none;border-color:#c9a227;box-shadow:0 0 0 3px rgba(201,162,39,.15)}\n.rpc input.rpc-inval,.rpc select.rpc-inval{border-color:#c0392b;background:#fdf0ef}\n.rpc .rpc-grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px}\n.rpc-line{background:#fff;border:1px solid #e6d9bd;border-radius:14px;padding:16px;margin-bottom:14px;box-shadow:0 2px 12px rgba(0,0,0,.05);position:relative}\n.rpc-lhead{display:flex;align-items:center;gap:8px;margin-bottom:12px}\n.rpc-lnum{background:#c9a227;color:#fff;width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;flex:0 0 auto}\n.rpc-ltitle{font-weight:700;color:#887239;font-size:16px}\n.rpc-del{margin-inline-start:auto;background:#fbeaea;color:#b3261e;border:1px solid #e9c7c4;border-radius:8px;padding:6px 11px;font-size:12.5px;font-weight:600;cursor:pointer}\n.rpc-combo{position:relative;margin-bottom:12px}\n.rpc-drop{position:absolute;top:calc(100% + 4px);inset-inline-start:0;inset-inline-end:0;background:#fff;border:1px solid #d9c99f;border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,.14);max-height:300px;overflow:auto;z-index:40;display:none}\n.rpc-drop.open{display:block}\n.rpc-opt{padding:10px 12px;cursor:pointer;font-size:14px;border-bottom:1px solid #f2ead6;display:flex;justify-content:space-between;gap:10px}\n.rpc-opt:last-child{border-bottom:none}\n.rpc-opt:hover{background:#faf4e2}\n.rpc-opt .op-mat{color:#9a8352;font-size:12px}.rpc-opt .op-price{color:#887239;font-weight:700;white-space:nowrap}\n.rpc-opt-new{color:#1a7f37;font-weight:700}\n.rpc-count{font-size:12px;color:#9a8352;padding:6px 4px 0}\n.rpc-fields{display:grid;grid-template-columns:repeat(4,1fr);gap:11px;margin-bottom:11px}\n.rpc-ro{background:#f6f1e4!important;color:#5a4a28!important}\n.rpc-svc{background:#f7f3ea;border:1px dashed #c9a227;border-radius:8px;padding:11px 12px;margin-bottom:11px}\n.rpc-svc .lbl{font-size:14px;font-weight:700;color:#141414;margin-bottom:8px;display:block}\n.rpc-svc .opts{display:flex;gap:22px;flex-wrap:wrap;align-items:center}\n.rpc-svc .opt{flex-direction:row;align-items:center;gap:7px;font-weight:600;color:#3a2f18;font-size:14px;cursor:pointer;margin:0}\n.rpc-svc .opt input{width:auto;accent-color:#c9a227}\n.rpc-svc .f-instype{margin-inline-start:auto;flex-direction:row;align-items:center;gap:8px}\n.rpc-svc .f-instype select{min-width:150px}\n.rpc-note-inst{margin-top:9px;background:#fdf6e3;border:1px solid #c9a227;border-radius:8px;padding:8px 11px;font-size:12.5px;color:#8a6d1f;line-height:1.7}\n.rpc-minnote{font-size:11.5px;color:#9a8352;margin-top:-4px;margin-bottom:11px}\n.rpc-lout{display:flex;justify-content:space-between;flex-wrap:wrap;gap:10px;margin-top:4px;padding-top:12px;border-top:1px solid #eee}\n.rpc-lout .m{color:#6b5a30;font-size:13.5px}.rpc-lout .m b{color:#3a2f18}\n.rpc-lout .t{color:#1c1710;font-weight:800;font-size:16px}\n.rpc-lout .t small{font-weight:600;color:#9a8352;font-size:11.5px;display:block;margin-top:2px}\n.rpc-add{background:#fff;border:2px dashed #c9a227;color:#887239;font-weight:700;border-radius:12px;padding:13px 18px;cursor:pointer;font-size:15px;width:100%}\n.rpc-add:hover{background:#faf4e2}\n.rpc-actions-row{margin-bottom:16px}\n.rpc-summary .rpc-sumline{display:flex;justify-content:space-between;align-items:center;font-size:15px;font-weight:700;color:#5a4a28;padding:4px 0}\n.rpc-summary .rpc-grandline{font-size:19px;font-weight:800;color:#1c1710}\n.rpc-summary .rpc-grandline b{color:#887239;font-size:23px}\n.rpc-note{color:#8a7a52;font-size:12.5px;margin-top:10px;line-height:1.7}\n.rpc-btns{display:flex;gap:12px;margin-top:16px;flex-wrap:wrap}\n.rpc-btns button{flex:1;min-width:150px;border:none;border-radius:11px;padding:14px;font-size:15.5px;font-weight:700;cursor:pointer}\n.rpc-pdf{background:linear-gradient(135deg,#c9a227,#a8841c);color:#fff}.rpc-print{background:#221c14;color:#e8c97a}\n.rpc-btns button:hover{filter:brightness(1.07)}\n.rpc-msg{margin-top:10px;font-size:13.5px;font-weight:600;min-height:18px}.rpc-msg.err{color:#c0392b}.rpc-msg.ok{color:#1a7f37}\n@media(max-width:680px){.rpc .rpc-grid3{grid-template-columns:1fr}.rpc-fields{grid-template-columns:1fr 1fr}.rpc .rpc-hero h1{font-size:23px}.rpc-svc .f-instype{margin-inline-start:0;width:100%}}\n.rpc-doc-wrap{position:fixed;inset:0;background:rgba(20,15,8,.72);z-index:99999;display:none;overflow:auto;padding:64px 12px 26px}\n.rpc-doc-wrap.open{display:block}\n.rpc-doc-bar{position:fixed;top:0;inset-inline-start:0;inset-inline-end:0;background:#201a12;display:flex;gap:10px;justify-content:center;padding:10px;z-index:100000}\n.rpc-doc-bar button{border:none;border-radius:9px;padding:9px 16px;font-weight:700;font-size:14px;cursor:pointer}\n.rpc-doc-pdf{background:linear-gradient(135deg,#c9a227,#a8841c);color:#fff}.rpc-doc-prn{background:#3a2f1c;color:#e8c97a}.rpc-doc-close{background:#fff;color:#3a2f18}\n.rpc-doc{background:#fff;max-width:820px;margin:0 auto;color:#1c1710;direction:rtl;box-shadow:0 10px 40px rgba(0,0,0,.4)}\n.rpc-doc,.rpc-doc *{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}\n.rpc-dh{background:linear-gradient(135deg,#201a12,#33291b);padding:20px 26px;display:flex;align-items:center;justify-content:space-between;gap:16px}\n.rpc-brand{display:flex;align-items:center;gap:14px}.rpc-mono{flex:0 0 auto}\n.rpc-wm-en{font-family:Georgia,'Times New Roman',serif;font-size:31px;font-weight:800;letter-spacing:1.5px;line-height:1}\n.rpc-wm-en .cr{color:#f6f0e2}.rpc-wm-en .gd{color:#e8c97a}\n.rpc-wm-ar{color:#e8c97a;font-size:15px;font-weight:700;margin-top:4px}\n.rpc-slogan{color:#d9c8a0;font-size:12px;margin-top:3px}\n.rpc-dh .rpc-dh-r{text-align:end;color:#efe4cf;font-size:11.5px;line-height:1.75}.rpc-dh .rpc-dh-r b{color:#e8c97a}\n.rpc-dband{height:5px;background:linear-gradient(90deg,#e8c97a,#c9a227,#a8841c)}\n.rpc-dbody{padding:24px 30px}\n.rpc-dtitle{display:flex;justify-content:space-between;align-items:flex-end;flex-wrap:wrap;gap:10px;border-bottom:2px solid #c9a227;padding-bottom:12px;margin-bottom:16px}\n.rpc-dtitle h2{margin:0;color:#887239;font-size:22px}\n.rpc-dmeta{font-size:12.5px;color:#5a4a28;text-align:end;line-height:1.85}\n.rpc-dcust{font-size:13.5px;color:#3a2f18;margin-bottom:14px;line-height:1.95}.rpc-dcust b{color:#887239}\ntable.rpc-dt{width:100%;border-collapse:collapse;font-size:11px}\ntable.rpc-dt th{background:#221c14;color:#e8c97a;padding:8px 4px;text-align:center;font-weight:700}\ntable.rpc-dt td{border:1px solid #e6d9bd;padding:7px 4px;text-align:center;color:#241d10;vertical-align:top}\ntable.rpc-dt td.nm{text-align:start;font-weight:600}\ntable.rpc-dt td.nm small{display:block;font-weight:400;color:#8a7a52;font-size:10px;margin-top:2px}\ntable.rpc-dt tr:nth-child(even) td{background:#faf6ec}\n.rpc-dtot{margin-top:16px;margin-inline-start:auto;width:min(380px,100%)}\n.rpc-dtot .row{display:flex;justify-content:space-between;padding:7px 10px;font-size:13px;color:#3a2f18}\n.rpc-dtot .row.g{background:#221c14;color:#e8c97a;font-weight:800;font-size:16px;border-radius:8px}\n.rpc-dterms{margin-top:18px;font-size:11.5px;color:#7a6a44;line-height:1.9;border-top:1px dashed #d9c99f;padding-top:12px}\n.rpc-dsign{display:flex;justify-content:space-between;gap:20px;margin-top:24px;font-size:12.5px;color:#3a2f18}\n.rpc-dsign .ln{margin-top:36px;border-top:1px solid #8a7a52;padding-top:5px;min-width:160px;text-align:center}\n.rpc-dfoot{background:#201a12;color:#cdbf9f;font-size:11.5px;text-align:center;padding:12px;line-height:1.85}.rpc-dfoot b{color:#e8c97a}\n@media print{\n\t@page{size:A4;margin:8mm}\n\tbody.rpc-printing>*{display:none!important}\n\tbody.rpc-printing>.rpc-doc-wrap{display:block!important;position:static!important;inset:auto!important;background:#fff!important;padding:0!important;overflow:visible!important}\n\tbody.rpc-printing .rpc-doc-bar{display:none!important}\n\tbody.rpc-printing .rpc-doc{box-shadow:none!important;max-width:100%!important;margin:0!important}\n\ttable.rpc-dt tr{page-break-inside:avoid}\n\t.rpc-dtot,.rpc-dterms,.rpc-dsign,.rpc-dfoot{page-break-inside:avoid}\n}\n<\/style>\t\t<div class=\"rpc\" data-rest=\"https:\/\/rokhamhub.com\/en\/wp-json\/rhx\/v1\/project-catalog\" data-save=\"https:\/\/rokhamhub.com\/en\/wp-json\/rhx\/v1\/save-quote\" data-nonce=\"38c0c3b281\">\n\t\t\t<div class=\"rpc-hero\"><h1>\u0627\u062d\u0633\u0628 \u062a\u0643\u0644\u0641\u0629 \u0645\u0634\u0631\u0648\u0639\u0643<\/h1>\n\t\t\t\t<p>\u0627\u062e\u062a\u0631 \u0627\u0644\u0623\u0635\u0646\u0627\u0641 (\u0623\u062d\u062c\u0627\u0631 \u0637\u0628\u064a\u0639\u064a\u0629 \u0623\u0648 \u0631\u062e\u0627\u0645 \u0635\u0646\u0627\u0639\u064a)\u060c \u062a\u064f\u0645\u0644\u0623 \u0628\u064a\u0627\u0646\u0627\u062a\u0647\u0627 \u0648\u0633\u0639\u0631\u0647\u0627 \u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627 \u0628\u0646\u0641\u0633 \u0645\u0639\u0627\u062f\u0644\u0629 \u00ab\u0627\u0644\u0645\u0642\u0627\u0633\u0627\u062a \u0627\u0644\u062e\u0627\u0635\u0629\u00bb (\u062a\u0648\u0631\u064a\u062f \u0623\u0648 \u062a\u0648\u0631\u064a\u062f \u0648\u062a\u0631\u0643\u064a\u0628)\u060c \u0648\u0623\u0636\u0650\u0641 \u0623\u0643\u062b\u0631 \u0645\u0646 \u0635\u0646\u0641\u060c \u062b\u0645 \u0627\u062d\u0641\u0638 \u0627\u0644\u0639\u0631\u0636 PDF \u0623\u0648 \u0627\u0637\u0628\u0639\u0647.<\/p><\/div>\n\t\t\t<div class=\"rpc-card rpc-cust\"><div class=\"rpc-grid3\">\n\t\t\t\t<label>\u0627\u0633\u0645 \u0627\u0644\u0639\u0645\u064a\u0644 <span class=\"req\">*<\/span><input type=\"text\" id=\"rpc-client\" required placeholder=\"\u0627\u062f\u062e\u0644 \u0627\u0633\u0645 \u0627\u0644\u0639\u0645\u064a\u0644\"><\/label>\n\t\t\t\t<label>\u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 <span class=\"req\">*<\/span><input type=\"text\" id=\"rpc-clientph\" required placeholder=\"\u0631\u0642\u0645 \u0627\u0644\u062a\u0648\u0627\u0635\u0644\"><\/label>\n\t\t\t\t<label>\u0627\u0633\u0645 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \/ \u0627\u0644\u0645\u0648\u0642\u0639 <span class=\"req\">*<\/span><input type=\"text\" id=\"rpc-project\" required placeholder=\"\u0627\u0633\u0645 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u0623\u0648 \u0627\u0644\u0639\u0646\u0648\u0627\u0646\"><\/label>\n\t\t\t<\/div><\/div>\n\t\t\t<div id=\"rpc-lines\"><\/div>\n\t\t\t<div class=\"rpc-actions-row\"><button type=\"button\" class=\"rpc-add\" id=\"rpc-add\">\uff0b \u0623\u0636\u0641 \u0635\u0646\u0641\u064b\u0627 \u0622\u062e\u0631<\/button><\/div>\n\t\t\t<div class=\"rpc-card rpc-summary\">\n\t\t\t\t<div class=\"rpc-sumline rpc-grandline\"><span>\u0627\u0644\u0625\u062c\u0645\u0627\u0644\u064a \u0627\u0644\u062a\u0642\u062f\u064a\u0631\u064a<\/span><b id=\"rpc-grand\">\u2014<\/b><\/div>\n\t\t\t\t<div class=\"rpc-note\">* \u0627\u0644\u0642\u064a\u0645\u0629 \u062a\u0642\u062f\u064a\u0631\u064a\u0629 \u0628\u0646\u0641\u0633 \u0645\u0639\u0627\u062f\u0644\u0629 \u0627\u0644\u0645\u0642\u0627\u0633\u0627\u062a \u0627\u0644\u062e\u0627\u0635\u0629. <b>\u0627\u0644\u0623\u0633\u0639\u0627\u0631 \u063a\u064a\u0631 \u0634\u0627\u0645\u0644\u0629 \u062a\u0643\u0644\u0641\u0629 \u0627\u0644\u0634\u062d\u0646<\/b> (\u064a\u064f\u062d\u062f\u062f \u062d\u0633\u0628 \u0627\u0644\u0645\u0648\u0642\u0639). \u0639\u0646\u062f \u0627\u062e\u062a\u064a\u0627\u0631 \u00ab\u062a\u0648\u0631\u064a\u062f \u0648\u062a\u0631\u0643\u064a\u0628\u00bb \u062a\u0634\u0645\u0644 \u0627\u0644\u0642\u064a\u0645\u0629 \u0627\u0644\u062a\u0631\u0643\u064a\u0628 \u0648\u0627\u0644\u062a\u0634\u0637\u064a\u0628. \u0627\u0644\u0639\u0631\u0636 \u0635\u0627\u0644\u062d 14 \u064a\u0648\u0645\u064b\u0627.<\/div>\n\t\t\t\t<div class=\"rpc-btns\"><button type=\"button\" class=\"rpc-pdf\" id=\"rpc-pdf\">\ud83d\udcbe \u062d\u0641\u0638 \u0643\u0640 PDF<\/button><button type=\"button\" class=\"rpc-print\" id=\"rpc-print\">\ud83d\udda8\ufe0f \u0637\u0628\u0627\u0639\u0629<\/button><\/div>\n\t\t\t\t<div class=\"rpc-msg\" id=\"rpc-msg\"><\/div>\n\t\t\t<\/div>\n\t\t\t<div class=\"rpc-doc-wrap\" id=\"rpc-doc-wrap\" aria-hidden=\"true\">\n\t\t\t\t<div class=\"rpc-doc-bar\"><button type=\"button\" class=\"rpc-doc-pdf\" id=\"rpc-doc-pdf\">\ud83d\udcbe \u062a\u062d\u0645\u064a\u0644 PDF<\/button><button type=\"button\" class=\"rpc-doc-prn\" id=\"rpc-doc-prn\">\ud83d\udda8\ufe0f \u0637\u0628\u0627\u0639\u0629<\/button><button type=\"button\" class=\"rpc-doc-close\" id=\"rpc-doc-close\">\u2715 \u0625\u063a\u0644\u0627\u0642<\/button><\/div>\n\t\t\t\t<div class=\"rpc-doc\" id=\"rpc-doc\"><\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\t\t<script>(function(){\n\tvar root=document.querySelector('.rpc'); if(!root) return;\n\tvar REST=root.getAttribute('data-rest'), SAVE=root.getAttribute('data-save'), NONCE=root.getAttribute('data-nonce'), CUR='\u062c.\u0645';\n\tvar CATALOG=[], seq=0, box=root.querySelector('#rpc-lines');\n\tvar INSTYPES=['\u0627\u062e\u062a\u0631 \u0646\u0648\u0639 \u0627\u0644\u062a\u0631\u0643\u064a\u0628','\u0627\u0631\u0636\u064a\u0627\u062a','\u0627\u0631\u0636\u064a\u0627\u062a \u0648 \u062c\u0644\u0649','\u062d\u0648\u0627\u0626\u0637 \u0645\u0627\u062f\u0629','\u062d\u0648\u0627\u0626\u0637 \u0633\u0642\u064a\u0629'];\n\tvar DESCS=['\u0627\u062e\u062a\u0631 \u0648\u0635\u0641 \u0627\u0644\u0645\u0646\u062a\u062c','\u0637\u0627\u0648\u0644\u0629','\u0634\u0631\u064a\u062d\u0629','\u062a\u0631\u0627\u0628\u064a\u0639','\u0623\u062e\u0631\u0649'];\n\tvar FINISHES=['\u0627\u062e\u062a\u0631 \u0646\u0648\u0639 \u0627\u0644\u062a\u0634\u0637\u064a\u0628','\u0627\u0646\u062a\u064a\u0643','\u0628\u0631\u0627\u0634\u062f','\u0628\u0648\u0634 \u0647\u0627\u0645\u0631','\u0631\u0645\u0627\u0644\u0629','\u063a\u0634\u064a\u0645','\u0644\u0627\u0645\u0639','\u0645\u062d\u0631\u0648\u0642','\u0645\u0637\u0631\u0642','\u0645\u0639\u0627\u0644\u062c \u0625\u064a\u0628\u0648\u0643\u0633\u064a','\u0645\u0639\u0627\u0644\u062c \u0631\u064a\u0632\u0646','\u0645\u0648\u0632\u0627\u064a\u0643','\u0647\u0648\u0646\u062f','\u0648\u0634 \u062c\u0628\u0644'];\n\tvar docWrap=root.querySelector('#rpc-doc-wrap'), docEl=root.querySelector('#rpc-doc');\n\tvar fmt=function(n){return Math.round(n).toLocaleString('en');};\n\tvar num=function(v){v=parseFloat(String(v==null?'':v).replace(\/[^0-9.]\/g,''));return isNaN(v)?0:v;};\n\tvar esc=function(s){return String(s==null?'':s).replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;').replace(\/\"\/g,'\"');};\n\tvar opts=function(arr,sel){return arr.map(function(o){return '<option'+(o===sel?' selected':'')+'>'+esc(o)+'<\/option>';}).join('');};\n\n\t\/\/ EXACT port of the Special-Order form's curFromBase() \u2014 per-product rates\n\tfunction unitPrice(base, r, desc, install, instype){\n\t\tr=r||{}; var I=r.inst||{}, F=r.fin||{};\n\t\tvar nn=function(v){v=parseFloat(v);return isNaN(v)?0:v;};\n\t\tif(install){\n\t\t\tvar it=instype||'\u0627\u0631\u0636\u064a\u0627\u062a', inst=0, fin=0;\n\t\t\tif(it==='\u0627\u0631\u0636\u064a\u0627\u062a'){inst=nn(I.floor);fin=nn(F.floor);}\n\t\t\telse if(it==='\u0627\u0631\u0636\u064a\u0627\u062a \u0648 \u062c\u0644\u0649'){inst=nn(I.floor);fin=nn(F.floorPolish);}\n\t\t\telse if(it==='\u062f\u0631\u062c'){inst=nn(I.stairs);fin=nn(F.stairs);}\n\t\t\telse if(it==='\u062d\u0648\u0627\u0626\u0637 \u0645\u0627\u062f\u0629'){inst=nn(I.wallMat);fin=nn(F.wall);}\n\t\t\telse if(it==='\u062d\u0648\u0627\u0626\u0637 \u0633\u0642\u064a\u0629'){inst=nn(I.wallWet);fin=nn(F.wall);}\n\t\t\telse if(it==='\u0645\u064a\u0643\u0627\u0646\u064a\u0643\u064a'){inst=nn(I.mech);}\n\t\t\telse if(it==='\u0646\u0635 \u0645\u064a\u0643\u0627\u0646\u064a\u0643\u064a'){inst=nn(I.semi);}\n\t\t\tvar subTI=base*(1+nn(r.waste)\/100)+nn(r.transport)+nn(r.cutting)+inst+fin;\n\t\t\treturn subTI*(1+nn(r.tiMargin)\/100);\n\t\t}\n\t\tif(desc==='\u062a\u0631\u0627\u0628\u064a\u0639'||desc==='\u0623\u062e\u0631\u0649'||desc==='\u0627\u062e\u0631\u0649'||desc==='\u0627\u062e\u0631\u064a'){\n\t\t\tvar sub=base*(1+nn(r.waste)\/100)+nn(r.transport)+nn(r.cutting);\n\t\t\treturn sub*(1+nn(r.margin)\/100);\n\t\t}\n\t\treturn base;\n\t}\n\n\tfetch(REST,{credentials:'same-origin'}).then(function(r){return r.json();})\n\t\t.then(function(d){ if(d&&d.products){CATALOG=d.products;} else if(Array.isArray(d)){CATALOG=d;} })\n\t\t.catch(function(){CATALOG=[];}).then(function(){addLine();});\n\n\troot.querySelector('#rpc-add').addEventListener('click',function(){addLine();});\n\troot.querySelector('#rpc-pdf').addEventListener('click',function(){act('pdf');});\n\troot.querySelector('#rpc-print').addEventListener('click',function(){act('print');});\n\tdocWrap.querySelector('#rpc-doc-pdf').addEventListener('click',doPDF);\n\tdocWrap.querySelector('#rpc-doc-prn').addEventListener('click',doPrint);\n\tdocWrap.querySelector('#rpc-doc-close').addEventListener('click',closeDoc);\n\tdocument.body.appendChild(docWrap); \/\/ direct body child: enables clean print isolation (display:none siblings)\n\t['#rpc-client','#rpc-clientph','#rpc-project'].forEach(function(s){root.querySelector(s).addEventListener('input',function(){this.classList.remove('rpc-inval');});});\n\tdocument.addEventListener('click',function(e){ if(!e.target.closest('.rpc-combo')) root.querySelectorAll('.rpc-drop.open').forEach(function(d){d.classList.remove('open');}); });\n\n\tfunction addLine(){\n\t\tseq++;\n\t\tvar el=document.createElement('div'); el.className='rpc-line'; el.dataset.unit='m2'; el.dataset.price='0';\n\t\tel.innerHTML=''\n\t\t+'<div class=\"rpc-lhead\"><span class=\"rpc-lnum\">1<\/span><span class=\"rpc-ltitle\">\u0628\u0646\u062f \u0631\u0642\u0645 1<\/span><button type=\"button\" class=\"rpc-del\">\ud83d\uddd1 \u062d\u0630\u0641<\/button><\/div>'\n\t\t+'<div class=\"rpc-combo\"><label>\u0627\u0633\u0645 \u0627\u0644\u0635\u0646\u0641<input type=\"text\" class=\"rpc-name\" autocomplete=\"off\" placeholder=\"\u0627\u0643\u062a\u0628 \u0644\u0644\u0628\u062d\u062b \u0623\u0648 \u0627\u062e\u062a\u0631 \u0635\u0646\u0641\u064b\u0627\u2026 \u0623\u0648 \u0623\u0636\u0641 \u0635\u0646\u0641\u064b\u0627 \u062c\u062f\u064a\u062f\u064b\u0627\"><\/label><div class=\"rpc-drop\"><\/div><\/div>'\n\t\t+'<div class=\"rpc-fields\">'\n\t\t\t+'<label>\u0643\u0648\u062f \u0627\u0644\u0645\u0648\u0631\u062f<input type=\"text\" class=\"rpc-supcode rpc-ro\" readonly placeholder=\"\u2014\"><\/label>'\n\t\t\t+'<label>\u0643\u0648\u062f \u0627\u0644\u0635\u0646\u0641<input type=\"text\" class=\"rpc-sku rpc-ro\" readonly placeholder=\"\u2014\"><\/label>'\n\t\t\t+'<label>\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u062e\u0627\u0645\u0629<input type=\"text\" class=\"rpc-mat rpc-ro\" readonly placeholder=\"\u2014\"><\/label>'\n\t\t\t+'<label>\u0627\u0644\u0645\u0646\u0634\u0623<input type=\"text\" class=\"rpc-origin rpc-ro\" readonly placeholder=\"\u2014\"><\/label>'\n\t\t+'<\/div>'\n\t\t+'<div class=\"rpc-fields\">'\n\t\t\t+'<label>\u0627\u0644\u062a\u0635\u0646\u064a\u0641<input type=\"text\" class=\"rpc-cat rpc-ro\" readonly placeholder=\"\u2014\"><\/label>'\n\t\t\t+'<div class=\"rpc-thick-wrap\"><label>\u0627\u0644\u062b\u062e\u0627\u0646\u0629 (\u0633\u0645)<input type=\"text\" class=\"rpc-thick rpc-ro\" readonly placeholder=\"\u2014\"><\/label><\/div>'\n\t\t\t+'<label>\u0627\u0644\u062a\u0634\u0637\u064a\u0628 *<select class=\"rpc-finish\">'+opts(FINISHES)+'<\/select><\/label>'\n\t\t\t+'<label>\u0648\u0635\u0641 \u0627\u0644\u0645\u0646\u062a\u062c *<select class=\"rpc-desc\">'+opts(DESCS)+'<\/select><\/label>'\n\t\t+'<\/div>'\n\t\t+'<div class=\"rpc-svc\"><span class=\"lbl\">\u0646\u0648\u0639 \u0627\u0644\u062e\u062f\u0645\u0629 \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629 *<\/span><div class=\"opts\">'\n\t\t\t+'<label class=\"opt\"><input type=\"radio\" name=\"svc'+seq+'\" class=\"rpc-sup\" value=\"supply\" checked> \u062a\u0648\u0631\u064a\u062f \u0641\u0642\u0637<\/label>'\n\t\t\t+'<label class=\"opt\"><input type=\"radio\" name=\"svc'+seq+'\" class=\"rpc-ins\" value=\"install\"> \u062a\u0648\u0631\u064a\u062f \u0648\u062a\u0631\u0643\u064a\u0628<\/label>'\n\t\t\t+'<label class=\"opt f-instype\" style=\"display:none\">\u0646\u0648\u0639 \u0627\u0644\u062a\u0631\u0643\u064a\u0628<select class=\"rpc-instype\">'+opts(INSTYPES)+'<option disabled>\u0645\u064a\u0643\u0627\u0646\u064a\u0643\u064a (\u0642\u0631\u064a\u0628\u0627\u064b)<\/option><option disabled>\u0646\u0635 \u0645\u064a\u0643\u0627\u0646\u064a\u0643\u064a (\u0642\u0631\u064a\u0628\u0627\u064b)<\/option><\/select><\/label>'\n\t\t\t+'<\/div><div class=\"rpc-note-inst\" style=\"display:none\"><b>\u062a\u0646\u0628\u064a\u0647:<\/b> \u0627\u0644\u0642\u064a\u0645\u0629 \u0634\u0627\u0645\u0644\u0629 \u0627\u0644\u062a\u0631\u0643\u064a\u0628 \u0648\u0627\u0644\u062a\u0634\u0637\u064a\u0628 \u062d\u0633\u0628 \u0627\u0644\u0646\u0648\u0639\u060c \u0648\u0642\u062f \u064a\u062e\u062a\u0644\u0641 \u0627\u0644\u0633\u0639\u0631 \u0627\u0644\u0646\u0647\u0627\u0626\u064a \u0628\u0639\u062f \u0627\u0644\u0645\u0639\u0627\u064a\u0646\u0629 \u0627\u0644\u0641\u0639\u0644\u064a\u0629.<\/div><\/div>'\n\t\t+'<div class=\"rpc-fields\">'\n\t\t\t+'<label>\u0627\u0644\u0633\u0639\u0631 \u0628\u0627\u0644\u0645\u062a\u0631 (\u0627\u0644\u0623\u0633\u0627\u0633\u064a)<input type=\"text\" class=\"rpc-base rpc-ro\" readonly placeholder=\"\u2014\"><\/label>'\n\t\t\t+'<label class=\"f-len\">\u0627\u0644\u0637\u0648\u0644 (\u0645)<input type=\"number\" class=\"rpc-len\" min=\"0\" step=\"0.01\" placeholder=\"0\"><\/label>'\n\t\t\t+'<label class=\"f-wid\">\u0627\u0644\u0639\u0631\u0636 (\u0645)<input type=\"number\" class=\"rpc-wid\" min=\"0\" step=\"0.01\" placeholder=\"0\"><\/label>'\n\t\t\t+'<label class=\"f-qty\">\u0643\u0645\u064a\u0629 \u0627\u0644\u0625\u0645\u062a\u0627\u0631 \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629 (\u0645\u00b2)<input type=\"number\" class=\"rpc-qty\" min=\"0\" step=\"0.01\" placeholder=\"0\"><\/label>'\n\t\t\t+'<label>\u0633\u0639\u0631 \u0627\u0644\u0645\u062a\u0631 \u0627\u0644\u062d\u0627\u0644\u064a<input type=\"text\" class=\"rpc-price rpc-ro\" readonly placeholder=\"\u2014\"><\/label>'\n\t\t+'<\/div>'\n\t\t+'<div class=\"rpc-minnote\" style=\"display:none\"><\/div>'\n\t\t+'<div class=\"rpc-lout\"><span class=\"m\">\u0627\u0644\u0645\u0628\u0644\u063a (\u062a\u0648\u0631\u064a\u062f): <b class=\"rpc-amount\">\u2014<\/b><\/span>'\n\t\t\t+'<span class=\"t\">\u0627\u0644\u0642\u064a\u0645\u0629: <b class=\"rpc-ltot\">\u2014<\/b><small class=\"rpc-lnote\"><\/small><\/span><\/div>';\n\t\tbox.appendChild(el); wire(el); renumber(); recalc();\n\t}\n\n\tfunction wire(el){\n\t\tvar name=el.querySelector('.rpc-name'), drop=el.querySelector('.rpc-drop');\n\t\tfunction build(q){\n\t\t\tq=(q||'').trim(); var list=CATALOG;\n\t\t\tif(q){ var qq=q.toLowerCase(); list=CATALOG.filter(function(p){return p.name.toLowerCase().indexOf(qq)>=0;}); }\n\t\t\tvar html='<div class=\"rpc-count\">'+list.length+' \u0635\u0646\u0641'+(q?' \u0645\u0637\u0627\u0628\u0642':' \u0645\u062a\u0627\u062d (\u0623\u062d\u062c\u0627\u0631 \u0637\u0628\u064a\u0639\u064a\u0629 + \u0631\u062e\u0627\u0645 \u0635\u0646\u0627\u0639\u064a)')+'<\/div>';\n\t\t\thtml+=list.map(function(p){ return '<div class=\"rpc-opt\" data-id=\"'+p.id+'\"><span>'+esc(p.name)+(p.material?' <span class=\"op-mat\">('+esc(p.material)+')<\/span>':'')+'<\/span><span class=\"op-price\">'+(p.on_request?'\u062d\u0633\u0628 \u0627\u0644\u0637\u0644\u0628':(fmt(p.price)+' '+CUR+'\/'+esc(p.unit_label)))+'<\/span><\/div>'; }).join('');\n\t\t\tif(q && !CATALOG.some(function(p){return p.name.toLowerCase()===q.toLowerCase();})) html+='<div class=\"rpc-opt rpc-opt-new\" data-new=\"1\">\uff0b \u0625\u0636\u0627\u0641\u0629 \u00ab'+esc(q)+'\u00bb \u0643\u0635\u0646\u0641 \u062c\u062f\u064a\u062f<\/div>';\n\t\t\tdrop.innerHTML=html; drop.classList.add('open');\n\t\t}\n\t\tname.addEventListener('focus',function(){build(name.value);});\n\t\tname.addEventListener('input',function(){build(name.value);});\n\t\tdrop.addEventListener('click',function(e){\n\t\t\tvar o=e.target.closest('.rpc-opt'); if(!o) return;\n\t\t\tif(o.dataset.new){ setCustom(el,name.value.trim()); }\n\t\t\telse if(o.dataset.id){ var p=CATALOG.find(function(x){return String(x.id)===o.dataset.id;}); if(p) setProduct(el,p); }\n\t\t\tdrop.classList.remove('open');\n\t\t});\n\t\tel.querySelector('.rpc-del').addEventListener('click',function(){ el.remove(); renumber(); recalc(); });\n\t\tbindInputs(el);\n\t\tel.querySelectorAll('.rpc-sup,.rpc-ins').forEach(function(r){ r.addEventListener('change',function(){\n\t\t\tvar ins=el.querySelector('.rpc-ins').checked;\n\t\t\tel.querySelector('.f-instype').style.display=ins?'flex':'none';\n\t\t\tel.querySelector('.rpc-note-inst').style.display=ins?'block':'none';\n\t\t\trecalc();\n\t\t}); });\n\t}\n\tfunction bindInputs(el){\n\t\tel.querySelectorAll('.rpc-len,.rpc-wid,.rpc-qty,.rpc-instype,.rpc-thick,.rpc-finish').forEach(function(i){ i.oninput=function(){recalc();}; i.onchange=function(){recalc();}; });\n\t\tvar dsel=el.querySelector('.rpc-desc');\n\t\tdsel.onchange=function(){ descDims(el); recalc(); };\n\t}\n\t\/\/ \u062a\u0631\u0627\u0628\u064a\u0639\/\u0623\u062e\u0631\u0649 \u2192 clear dims so the client types the tile size; back to \u0637\u0627\u0648\u0644\u0629\/\u0634\u0631\u064a\u062d\u0629 \u2192 restore product ref dims\n\tfunction descDims(el){\n\t\tvar v=el.querySelector('.rpc-desc').value;\n\t\tvar tiles=(v==='\u062a\u0631\u0627\u0628\u064a\u0639'||v==='\u0623\u062e\u0631\u0649'||v==='\u0627\u062e\u0631\u0649'||v==='\u0627\u062e\u0631\u064a');\n\t\tvar len=el.querySelector('.rpc-len'), wid=el.querySelector('.rpc-wid');\n\t\tvar rl=num(el.dataset.reflen), rw=num(el.dataset.refwid);\n\t\tif(tiles){\n\t\t\tif(num(len.value)===rl && num(wid.value)===rw){ len.value=''; wid.value=''; }\n\t\t\tlen.placeholder='\u0645\u0642\u0627\u0633 \u0627\u0644\u062a\u0631\u0627\u0628\u064a\u0639\u0629 (\u0645)'; wid.placeholder='\u0645\u0642\u0627\u0633 \u0627\u0644\u062a\u0631\u0627\u0628\u064a\u0639\u0629 (\u0645)';\n\t\t} else {\n\t\t\tif(!len.value && rl>0) len.value=rl;\n\t\t\tif(!wid.value && rw>0) wid.value=rw;\n\t\t\tlen.placeholder='0'; wid.placeholder='0';\n\t\t}\n\t}\n\n\t\/\/ render an auto field: read-only if 0\/1 value, dropdown of the product's own values if >1\n\tfunction renderPick(wrap,label,cls,values){\n\t\tvalues=(values||[]).filter(Boolean);\n\t\tif(values.length>1){ wrap.innerHTML='<label>'+label+'<select class=\"'+cls+'\">'+opts(values,values[0])+'<\/select><\/label>'; }\n\t\telse { wrap.innerHTML='<label>'+label+'<input type=\"text\" class=\"'+cls+' rpc-ro\" readonly value=\"'+esc(values[0]||'')+'\" placeholder=\"\u2014\"><\/label>'; }\n\t}\n\n\tfunction setProduct(el,p){\n\t\tel.dataset.unit=p.unit; el.dataset.price=p.price; el.dataset.onreq=p.on_request?'1':'0';\n\t\tel.dataset.rates=JSON.stringify(p.rates||{});\n\t\tvar b=el.querySelector('.rpc-base'); b.type='text'; b.readOnly=true; b.classList.add('rpc-ro'); b.oninput=null;\n\t\tb.value=p.on_request?'\u064a\u064f\u062d\u062f\u062f \u062d\u0633\u0628 \u0627\u0644\u0637\u0644\u0628':(fmt(p.price)+' '+CUR+' \/ \u0645\u00b2');\n\t\tel.querySelector('.rpc-name').value=p.name;\n\t\tel.querySelector('.rpc-supcode').value=p.sup_code||'\u2014';\n\t\tel.querySelector('.rpc-sku').value=p.sku||'\u2014';\n\t\tel.querySelector('.rpc-mat').value=p.material||'\u2014';\n\t\tel.querySelector('.rpc-cat').value=p.category||'\u2014';\n\t\tel.querySelector('.rpc-origin').value=p.origin||'\u2014';\n\t\trenderPick(el.querySelector('.rpc-thick-wrap'),'\u0627\u0644\u062b\u062e\u0627\u0646\u0629 (\u0633\u0645)','rpc-thick',p.thickness);\n\t\t\/\/ \u0627\u0644\u062a\u0634\u0637\u064a\u0628: open select \u2014 never auto-select; the customer chooses\n\t\tel.querySelector('.rpc-finish').value=FINISHES[0];\n\t\t\/\/ \u0648\u0635\u0641 \u0627\u0644\u0645\u0646\u062a\u062c: open select \u2014 no auto preselect, the customer chooses\n\t\tel.querySelector('.rpc-desc').value=DESCS[0];\n\t\tel.dataset.reflen=p.ref_len||''; el.dataset.refwid=p.ref_wid||'';\n\t\tif(p.ref_len) el.querySelector('.rpc-len').value=p.ref_len;\n\t\tif(p.ref_wid) el.querySelector('.rpc-wid').value=p.ref_wid;\n\t\tbindInputs(el); unitFields(el); descDims(el); recalc();\n\t}\n\tfunction setCustom(el,nm){\n\t\tel.dataset.unit='m2'; el.dataset.price='0'; el.dataset.onreq='1';\n\t\tel.dataset.rates='{}'; el.dataset.reflen=''; el.dataset.refwid='';\n\t\tvar b=el.querySelector('.rpc-base'); b.type='number'; b.readOnly=false; b.classList.remove('rpc-ro'); b.value='';\n\t\tb.placeholder='\u0623\u062f\u062e\u0644 \u0627\u0644\u0633\u0639\u0631 \u0627\u0644\u0623\u0633\u0627\u0633\u064a (\u062c.\u0645\/\u0645\u00b2)';\n\t\tb.oninput=function(){ el.dataset.price=String(num(b.value)); el.dataset.onreq=num(b.value)>0?'0':'1'; recalc(); };\n\t\tel.querySelector('.rpc-name').value=nm;\n\t\t['.rpc-supcode','.rpc-sku','.rpc-mat','.rpc-cat','.rpc-origin'].forEach(function(s){el.querySelector(s).value='';});\n\t\trenderPick(el.querySelector('.rpc-thick-wrap'),'\u0627\u0644\u062b\u062e\u0627\u0646\u0629 (\u0633\u0645)','rpc-thick',[]);\n\t\tel.querySelector('.rpc-finish').value=FINISHES[0];\n\t\tel.querySelector('.rpc-desc').value=DESCS[0];\n\t\tbindInputs(el); unitFields(el); recalc();\n\t}\n\tfunction unitFields(el){\n\t\tvar u=el.dataset.unit, showLen=(u==='m2'||u==='ml'||u==='m3'), showWid=(u==='m2'||u==='m3');\n\t\tel.querySelector('.f-len').style.display=showLen?'flex':'none';\n\t\tel.querySelector('.f-wid').style.display=showWid?'flex':'none';\n\t}\n\n\tfunction readLine(el){\n\t\tvar base=num(el.dataset.price), onreq=(el.dataset.onreq==='1'||base<=0);\n\t\tvar rates={}; try{ rates=JSON.parse(el.dataset.rates||'{}'); }catch(e){}\n\t\tvar len=num(el.querySelector('.rpc-len').value), wid=num(el.querySelector('.rpc-wid').value), qty=num(el.querySelector('.rpc-qty').value);\n\t\tvar install=el.querySelector('.rpc-ins').checked;\n\t\tvar instype=el.querySelector('.rpc-instype').value;\n\t\tvar desc=el.querySelector('.rpc-desc').value;\n\t\tvar minorder=len*wid;\n\t\tvar needType = install && (!instype || instype.indexOf('\u0627\u062e\u062a\u0631')>=0);\n\t\tvar price = onreq ? 0 : unitPrice(base, rates, desc, install, instype);\n\t\tvar amount = Math.round(price*qty);\n\t\tvar tw=el.querySelector('.rpc-thick'), fw=el.querySelector('.rpc-finish');\n\t\tvar finish=fw?fw.value:''; if(finish&&finish.indexOf('\u0627\u062e\u062a\u0631')>=0) finish=''; var needFin=!finish; var needDesc=(!desc||desc.indexOf('\u0627\u062e\u062a\u0631')>=0);\n\t\treturn { name:el.querySelector('.rpc-name').value.trim(), supcode:el.querySelector('.rpc-supcode').value, sku:el.querySelector('.rpc-sku').value,\n\t\t\tmaterial:el.querySelector('.rpc-mat').value, category:el.querySelector('.rpc-cat').value, origin:el.querySelector('.rpc-origin').value,\n\t\t\tthickness:tw?tw.value:'', finish:finish, desc:desc,\n\t\t\tbase:base, onreq:onreq, len:len, wid:wid, qty:qty, minorder:minorder,\n\t\t\tinstall:install, instype:instype, needType:needType, needFin:needFin, needDesc:needDesc, price:price, amount:amount };\n\t}\n\n\tfunction recalc(){\n\t\tvar grand=0, priced=false;\n\t\tbox.querySelectorAll('.rpc-line').forEach(function(el){\n\t\t\tvar d=readLine(el);\n\t\t\tvar mn=el.querySelector('.rpc-minnote');\n\t\t\tif(d.minorder>0){ mn.style.display='block'; mn.textContent='\u0627\u0644\u062d\u062f \u0627\u0644\u0623\u062f\u0646\u0649 \u0644\u0644\u0637\u0644\u0628: '+d.minorder.toFixed(2)+' \u0645\u00b2 (\u0645\u0633\u0627\u062d\u0629 \u0627\u0644\u0648\u062d\u062f\u0629)'; } else { mn.style.display='none'; }\n\t\t\tel.querySelector('.rpc-price').value = d.onreq ? '\u064a\u064f\u062d\u062f\u062f \u062d\u0633\u0628 \u0627\u0644\u0637\u0644\u0628' : (d.needType ? '\u0627\u062e\u062a\u0631 \u0646\u0648\u0639 \u0627\u0644\u062a\u0631\u0643\u064a\u0628 \u0623\u0648\u0644\u0627\u064b' : ((d.needFin||d.needDesc) ? '\u0627\u062e\u062a\u0631 \u0627\u0644\u062a\u0634\u0637\u064a\u0628 \u0648\u0648\u0635\u0641 \u0627\u0644\u0645\u0646\u062a\u062c \u0623\u0648\u0644\u0627\u064b' : (fmt(d.price)+' '+CUR+' \/ '+ (el.dataset.unit==='m2'?'\u0645\u00b2':'\u0648\u062d\u062f\u0629'))));\n\t\t\tvar ok=(!d.onreq && d.qty>0 && !d.needType && !d.needFin && !d.needDesc); var _fs=el.querySelector('.rpc-finish'), _ds=el.querySelector('.rpc-desc'); if(_fs) _fs.classList.toggle('rpc-inval',!!d.needFin); if(_ds) _ds.classList.toggle('rpc-inval',!!d.needDesc);\n\t\t\tel.querySelector('.rpc-amount').textContent = ok ? (fmt(d.amount)+' '+CUR) : (d.onreq?'\u064a\u064f\u062d\u062f\u062f \u062d\u0633\u0628 \u0627\u0644\u0637\u0644\u0628':'\u2014');\n\t\t\tel.querySelector('.rpc-ltot').textContent = ok ? (fmt(d.amount)+' '+CUR) : (d.onreq?'\u064a\u064f\u062d\u062f\u062f \u062d\u0633\u0628 \u0627\u0644\u0637\u0644\u0628':(d.needType?'\u0627\u062e\u062a\u0631 \u0646\u0648\u0639 \u0627\u0644\u062a\u0631\u0643\u064a\u0628':((d.needFin||d.needDesc)?'\u0627\u062e\u062a\u0631 \u0627\u0644\u062a\u0634\u0637\u064a\u0628 \u0648\u0627\u0644\u0648\u0635\u0641':'\u2014')));\n\t\t\tel.querySelector('.rpc-lnote').textContent = ok ? ('\u063a\u064a\u0631 \u0634\u0627\u0645\u0644 \u0627\u0644\u0634\u062d\u0646'+(d.install?' (\u0634\u0627\u0645\u0644 \u0627\u0644\u062a\u0631\u0643\u064a\u0628 \u0648\u0627\u0644\u062a\u0634\u0637\u064a\u0628)':'')) : (d.needType?'\u062d\u062f\u0651\u062f \u0646\u0648\u0639 \u0627\u0644\u062a\u0631\u0643\u064a\u0628 \u0644\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0633\u0639\u0631':'');\n\t\t\tif(ok){ grand+=d.amount; priced=true; }\n\t\t});\n\t\troot.querySelector('#rpc-grand').textContent = priced ? (fmt(grand)+' '+CUR) : '\u064a\u064f\u062d\u062f\u062f \u062d\u0633\u0628 \u0627\u0644\u0637\u0644\u0628';\n\t}\n\tfunction renumber(){ var i=0; box.querySelectorAll('.rpc-line').forEach(function(el){ i++; el.querySelector('.rpc-lnum').textContent=i; el.querySelector('.rpc-ltitle').textContent='\u0628\u0646\u062f \u0631\u0642\u0645 '+i; }); }\n\n\tfunction validate(){\n\t\tvar msg=root.querySelector('#rpc-msg'); msg.className='rpc-msg err'; msg.textContent='';\n\t\tvar ok=true, first=null;\n\t\t['#rpc-client','#rpc-clientph','#rpc-project'].forEach(function(s){ var el=root.querySelector(s); if(!el.value.trim()){ el.classList.add('rpc-inval'); ok=false; if(!first)first=el; } else el.classList.remove('rpc-inval'); });\n\t\tvar named=[].slice.call(box.querySelectorAll('.rpc-line')).some(function(el){return el.querySelector('.rpc-name').value.trim();});\n\t\tif(!ok){ msg.textContent='\u0645\u0646 \u0641\u0636\u0644\u0643 \u0623\u0643\u0645\u0644 \u062d\u0642\u0648\u0644 \u0627\u0644\u0639\u0645\u064a\u0644 \u0627\u0644\u0625\u0644\u0632\u0627\u0645\u064a\u0629 (\u0627\u0644\u0627\u0633\u0645\u060c \u0627\u0644\u0647\u0627\u062a\u0641\u060c \u0627\u0644\u0645\u0634\u0631\u0648\u0639).'; if(first)first.focus(); return false; }\n\t\tif(!named){ msg.textContent='\u0623\u0636\u0641 \u0635\u0646\u0641\u064b\u0627 \u0648\u0627\u062d\u062f\u064b\u0627 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.'; return false; }\n\t\tvar badSel=null;\n\t\tbox.querySelectorAll('.rpc-line').forEach(function(el){ if(!el.querySelector('.rpc-name').value.trim()) return; var d=readLine(el); var fs=el.querySelector('.rpc-finish'), ds=el.querySelector('.rpc-desc'); if(fs) fs.classList.toggle('rpc-inval',!!d.needFin); if(ds) ds.classList.toggle('rpc-inval',!!d.needDesc); if(d.needFin&&!badSel) badSel=fs; if(d.needDesc&&!badSel) badSel=ds; });\n\t\tif(badSel){ msg.textContent='\u0645\u0646 \u0641\u0636\u0644\u0643 \u0627\u062e\u062a\u0631 \u0646\u0648\u0639 \u0627\u0644\u062a\u0634\u0637\u064a\u0628 \u0648\u0648\u0635\u0641 \u0627\u0644\u0645\u0646\u062a\u062c \u0644\u0643\u0644 \u0635\u0646\u0641.'; badSel.focus(); return false; }\n\t\treturn true;\n\t}\n\n\tvar lastSaved='';\n\tfunction collect(){\n\t\tvar items=[], grand=0;\n\t\tbox.querySelectorAll('.rpc-line').forEach(function(el){ var d=readLine(el); if(!d.name) return;\n\t\t\tvar ok=(!d.onreq && d.qty>0 && !d.needType && !d.needFin && !d.needDesc);\n\t\t\titems.push({name:d.name,supcode:d.supcode,sku:d.sku,material:d.material,category:d.category,origin:d.origin,thickness:d.thickness,finish:d.finish,desc:d.desc,base:d.base,price:ok?d.price:0,dim:(d.len||'\u061f')+'\u00d7'+(d.wid||'\u061f'),qty:d.qty,service:d.install?'\u062a\u0648\u0631\u064a\u062f \u0648\u062a\u0631\u0643\u064a\u0628':'\u062a\u0648\u0631\u064a\u062f \u0641\u0642\u0637',instype:(d.install&&!d.needType)?d.instype:'',amount:ok?d.amount:0});\n\t\t\tif(ok) grand+=d.amount;\n\t\t});\n\t\treturn {client:root.querySelector('#rpc-client').value.trim(),phone:root.querySelector('#rpc-clientph').value.trim(),project:root.querySelector('#rpc-project').value.trim(),items:items,grand:grand};\n\t}\n\tfunction saveQuote(data,cb){\n\t\tvar sig=JSON.stringify(data); if(sig===lastSaved){ cb&&cb(); return; }\n\t\tfetch(SAVE,{method:'POST',credentials:'same-origin',headers:{'Content-Type':'application\/json','X-WP-Nonce':NONCE},body:JSON.stringify({client:data.client,phone:data.phone,project:data.project,items:data.items,grand:data.grand,qno:window.__rpcQno||''})})\n\t\t\t.then(function(r){return r.json();}).then(function(res){ if(res&&res.ok){ lastSaved=sig; var m=root.querySelector('#rpc-msg'); m.className='rpc-msg ok'; m.textContent='\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0639\u0631\u0636 \u0641\u064a \u0644\u0648\u062d\u0629 \u0627\u0644\u0625\u062f\u0627\u0631\u0629 (\u0639\u0631\u0648\u0636 \u0627\u0644\u0623\u0633\u0639\u0627\u0631).'; } cb&&cb(); })\n\t\t\t.catch(function(){ cb&&cb(); });\n\t}\n\tfunction act(kind){ if(!validate()) return; var data=collect(); buildDoc(); saveQuote(data,function(){ openDoc(); if(kind==='pdf') doPDF(); else doPrint(); }); }\n\n\tfunction buildDoc(){\n\t\tvar rows='', grand=0, i=0, anyInstall=false;\n\t\tbox.querySelectorAll('.rpc-line').forEach(function(el){ var d=readLine(el); if(!d.name) return; i++;\n\t\t\tif(d.install) anyInstall=true;\n\t\t\tvar ok=(!d.onreq && d.qty>0 && !d.needType); if(ok) grand+=d.amount;\n\t\t\tvar thickTxt=d.thickness?(\/\u0633\u0645\/.test(d.thickness)?d.thickness:(d.thickness+' \u0633\u0645')):'';\n\t\t\tvar descTxt=(d.desc&&d.desc.indexOf('\u0627\u062e\u062a\u0631')<0)?d.desc:'';\n\t\t\tvar det=[d.supcode&&('\u0645\u0648\u0631\u062f:'+d.supcode),d.sku&&('\u0643\u0648\u062f:'+d.sku),d.material,d.category,d.origin,thickTxt,d.finish,descTxt,(!d.onreq&&('\u0623\u0633\u0627\u0633\u064a: '+fmt(d.base)+' '+CUR+'\/\u0645\u00b2'))].filter(Boolean).join(' \u2022 ');\n\t\t\tvar dimTxt=(d.len>0&&d.wid>0)?(d.len+'\u00d7'+d.wid+' \u0645'):'\u2014';\n\t\t\tvar instTxt=(d.instype&&d.instype.indexOf('\u0627\u062e\u062a\u0631')<0)?d.instype:'';\n\t\t\trows+='<tr><td>'+i+'<\/td><td class=\"nm\">'+esc(d.name)+(det?'<small>'+esc(det)+'<\/small>':'')+'<\/td>'\n\t\t\t\t+'<td>'+(ok?fmt(d.price):'\u062d\u0633\u0628 \u0627\u0644\u0637\u0644\u0628')+'<\/td><td>'+esc(dimTxt)+'<\/td><td>'+(d.qty?d.qty.toFixed(2)+' \u0645\u00b2':'\u2014')+'<\/td>'\n\t\t\t\t+'<td>'+(d.install?'\u062a\u0648\u0631\u064a\u062f \u0648\u062a\u0631\u0643\u064a\u0628'+(instTxt?'<small>'+esc(instTxt)+'<\/small>':''):'\u062a\u0648\u0631\u064a\u062f')+'<\/td><td>'+(ok?fmt(d.amount)+' '+CUR:'\u064a\u064f\u062d\u062f\u062f')+'<\/td><\/tr>';\n\t\t});\n\t\tif(!i) rows='<tr><td colspan=\"7\" style=\"padding:16px;color:#b3261e\">\u0644\u0645 \u062a\u064f\u0636\u0650\u0641 \u0623\u064a \u0623\u0635\u0646\u0627\u0641 \u0628\u0639\u062f.<\/td><\/tr>';\n\t\tvar now=new Date();\n\t\tvar dd=('0'+now.getDate()).slice(-2)+'\/'+('0'+(now.getMonth()+1)).slice(-2)+'\/'+now.getFullYear();\n\t\tvar qno='RH-'+now.getFullYear()+('0'+(now.getMonth()+1)).slice(-2)+('0'+now.getDate()).slice(-2)+'-'+Math.floor(1000+Math.random()*9000);\n\t\twindow.__rpcQno=qno;\n\t\tvar client=(root.querySelector('#rpc-client').value||'').trim(), clientph=(root.querySelector('#rpc-clientph').value||'').trim(), project=(root.querySelector('#rpc-project').value||'').trim();\n\t\tvar custHtml='<div class=\"rpc-dcust\">'+(client?'<b>\u0627\u0644\u0633\u0627\u062f\u0629 \/ <\/b>'+esc(client)+'<br>':'')+(project?'<b>\u0627\u0644\u0645\u0634\u0631\u0648\u0639 \/ \u0627\u0644\u0645\u0648\u0642\u0639: <\/b>'+esc(project)+'<br>':'')+(clientph?'<b>\u0647\u0627\u062a\u0641 \u0627\u0644\u062a\u0648\u0627\u0635\u0644: <\/b>'+esc(clientph):'')+'<\/div>';\n\t\tvar totRows='<div class=\"row\"><span>\u0627\u0644\u0625\u062c\u0645\u0627\u0644\u064a \u0627\u0644\u062a\u0642\u062f\u064a\u0631\u064a'+(anyInstall?' (\u0634\u0627\u0645\u0644 \u0627\u0644\u062a\u0631\u0643\u064a\u0628 \u0648\u0627\u0644\u062a\u0634\u0637\u064a\u0628)':' (\u062a\u0648\u0631\u064a\u062f)')+'<\/span><span>'+(grand>0?fmt(grand)+' '+CUR:'\u064a\u064f\u062d\u062f\u062f \u062d\u0633\u0628 \u0627\u0644\u0637\u0644\u0628')+'<\/span><\/div>'\n\t\t\t+'<div class=\"row\"><span>\u0627\u0644\u0634\u062d\u0646 \u0648\u0627\u0644\u062a\u0648\u0635\u064a\u0644<\/span><span>\u063a\u064a\u0631 \u0634\u0627\u0645\u0644 \u2014 \u064a\u064f\u062d\u062f\u062f \u062d\u0633\u0628 \u0627\u0644\u0645\u0648\u0642\u0639<\/span><\/div>'\n\t\t\t+'<div class=\"row g\"><span>\u0627\u0644\u0625\u062c\u0645\u0627\u0644\u064a (\u063a\u064a\u0631 \u0634\u0627\u0645\u0644 \u0627\u0644\u0634\u062d\u0646)<\/span><span>'+(grand>0?fmt(grand)+' '+CUR:'\u2014')+'<\/span><\/div>';\n\t\tvar doc=''\n\t\t+'<div class=\"rpc-dh\"><div class=\"rpc-brand\">'\n\t\t\t+'<svg class=\"rpc-mono\" width=\"64\" height=\"64\" viewBox=\"0 0 100 100\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><circle cx=\"50\" cy=\"50\" r=\"46\" fill=\"none\" stroke=\"#c9a227\" stroke-width=\"3\"\/><circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"none\" stroke=\"#e8c97a\" stroke-width=\"1\" opacity=\"0.55\"\/><text x=\"50\" y=\"64\" font-size=\"38\" font-weight=\"bold\" text-anchor=\"middle\" font-family=\"Georgia, serif\" fill=\"#e8c97a\">RH<\/text><\/svg>'\n\t\t\t+'<div class=\"rpc-wm\"><div class=\"rpc-wm-en\"><span class=\"cr\">ROKHAM<\/span><span class=\"gd\">HUB<\/span><\/div><div class=\"rpc-slogan\">\u0628\u0648\u0627\u0628\u062a\u0643 \u0625\u0644\u0649 \u0639\u0627\u0644\u0645 \u0627\u0644\u0623\u062d\u062c\u0627\u0631 \u0627\u0644\u0645\u0635\u0631\u064a\u0629<\/div><\/div>'\n\t\t+'<\/div><div class=\"rpc-dh-r\">92 \u0623\u0628\u0631\u0627\u062c \u0627\u0644\u0623\u0645\u0644\u060c \u0623\u0648\u062a\u0648\u0633\u062a\u0631\u0627\u062f \u0627\u0644\u0645\u0639\u0627\u062f\u064a\u060c \u0627\u0644\u0642\u0627\u0647\u0631\u0629\u060c \u0645\u0635\u0631<br>\u0647\u0627\u062a\u0641\/\u0648\u0627\u062a\u0633\u0627\u0628: 01064646461 &nbsp;\u2022&nbsp; info@rokhamhub.com<br>rokhamhub.com<\/div><\/div><div class=\"rpc-dband\"><\/div>'\n\t\t+'<div class=\"rpc-dbody\"><div class=\"rpc-dtitle\"><h2>\u0639\u0631\u0636 \u0633\u0639\u0631 \u0645\u0628\u062f\u0626\u064a \u2014 Quotation<\/h2><div class=\"rpc-dmeta\">\u0631\u0642\u0645 \u0627\u0644\u0639\u0631\u0636: <b>'+qno+'<\/b><br>\u0627\u0644\u062a\u0627\u0631\u064a\u062e: '+dd+'<\/div><\/div>'\n\t\t\t+custHtml\n\t\t\t+'<table class=\"rpc-dt\"><thead><tr><th>#<\/th><th>\u0627\u0644\u0635\u0646\u0641 \u0648\u0627\u0644\u0645\u0648\u0627\u0635\u0641\u0627\u062a<\/th><th>\u0627\u0644\u0633\u0639\u0631\/\u0645\u00b2<\/th><th>\u0645\u0642\u0627\u0633 \u0627\u0644\u0648\u062d\u062f\u0629<\/th><th>\u0627\u0644\u0643\u0645\u064a\u0629<\/th><th>\u0646\u0648\u0639 \u0627\u0644\u062e\u062f\u0645\u0629<\/th><th>\u0627\u0644\u0645\u0628\u0644\u063a<\/th><\/tr><\/thead><tbody>'+rows+'<\/tbody><\/table>'\n\t\t\t+'<div class=\"rpc-dtot\">'+totRows+'<\/div>'\n\t\t\t+'<div class=\"rpc-dterms\"><b>\u0645\u0644\u0627\u062d\u0638\u0627\u062a \u0648\u0634\u0631\u0648\u0637:<\/b><br>\u2022 \u0627\u0644\u0623\u0633\u0639\u0627\u0631 \u0645\u062d\u0633\u0648\u0628\u0629 \u0628\u0645\u0639\u0627\u062f\u0644\u0629 \u0631\u062e\u0627\u0645 \u0647\u064e\u0628 \u0627\u0644\u0645\u0639\u062a\u0645\u062f\u0629\u060c \u0648\u0639\u0646\u062f \u00ab\u062a\u0648\u0631\u064a\u062f \u0648\u062a\u0631\u0643\u064a\u0628\u00bb \u062a\u0634\u0645\u0644 \u0627\u0644\u062a\u0631\u0643\u064a\u0628 \u0648\u0627\u0644\u062a\u0634\u0637\u064a\u0628 \u062d\u0633\u0628 \u0627\u0644\u0646\u0648\u0639.<br>\u2022 <b>\u0627\u0644\u0623\u0633\u0639\u0627\u0631 \u063a\u064a\u0631 \u0634\u0627\u0645\u0644\u0629 \u062a\u0643\u0644\u0641\u0629 \u0627\u0644\u0634\u062d\u0646<\/b> \u2014 \u0627\u0644\u0634\u062d\u0646 \u064a\u064f\u062d\u062f\u062f \u062d\u0633\u0628 \u0645\u0648\u0642\u0639 \u0627\u0644\u062a\u0633\u0644\u064a\u0645\u060c \u0648\u0642\u062f \u064a\u062e\u062a\u0644\u0641 \u0627\u0644\u0633\u0639\u0631 \u0627\u0644\u0646\u0647\u0627\u0626\u064a \u0628\u0639\u062f \u0627\u0644\u0645\u0639\u0627\u064a\u0646\u0629 \u0627\u0644\u0641\u0639\u0644\u064a\u0629.<br>\u2022 \u0627\u0644\u0639\u0631\u0636 \u0635\u0627\u0644\u062d 14 \u064a\u0648\u0645\u064b\u0627 \u0645\u0646 \u062a\u0627\u0631\u064a\u062e\u0647\u060c \u0648\u0647\u0648 \u0645\u0633\u062a\u0646\u062f \u0645\u0628\u062f\u0626\u064a \u063a\u064a\u0631 \u0645\u064f\u0644\u0632\u0650\u0645 \u0648\u0644\u0627 \u064a\u064f\u0639\u062f \u0641\u0627\u062a\u0648\u0631\u0629 \u0636\u0631\u064a\u0628\u064a\u0629.<\/div>'\n\t\t\t+'<div class=\"rpc-dsign\"><div class=\"ln\">\u062a\u0648\u0642\u064a\u0639 \u0627\u0644\u0639\u0645\u064a\u0644<\/div><div class=\"ln\">\u0639\u0646 \u0631\u062e\u0627\u0645 \u0647\u064e\u0628<\/div><\/div><\/div>'\n\t\t+'<div class=\"rpc-dfoot\">\u0631\u062e\u0627\u0645 \u0647\u064e\u0628 &nbsp;|&nbsp; \u0633.\u062a <b>152928<\/b> &nbsp;\u2022&nbsp; \u0628.\u0636 <b>589-817-868<\/b> &nbsp;|&nbsp; \u0633\u0627\u0639\u0627\u062a \u0627\u0644\u0639\u0645\u0644: \u0627\u0644\u0633\u0628\u062a \u2013 \u0627\u0644\u062e\u0645\u064a\u0633 9\u0635 \u2013 5\u0645 &nbsp;|&nbsp; \u0634\u0643\u0631\u064b\u0627 \u0644\u062b\u0642\u062a\u0643\u0645 \u0628\u0646\u0627<\/div>';\n\t\tdocEl.innerHTML=doc;\n\t}\n\n\tfunction openDoc(){ docWrap.classList.add('open'); }\n\tfunction closeDoc(){ docWrap.classList.remove('open'); }\n\tfunction doPrint(){ docWrap.classList.add('open'); document.body.classList.add('rpc-printing'); var done=function(){ document.body.classList.remove('rpc-printing'); window.removeEventListener('afterprint',done); }; window.addEventListener('afterprint',done); setTimeout(function(){ window.print(); },150); }\n\tfunction loadLibs(cb){\n\t\tvar need=[];\n\t\tif(!window.html2canvas) need.push('https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2canvas\/1.4.1\/html2canvas.min.js');\n\t\tif(!(window.jspdf&&window.jspdf.jsPDF)) need.push('https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js');\n\t\tvar left=need.length; if(!left) return cb();\n\t\tvar failed=false;\n\t\tneed.forEach(function(src){\n\t\t\tvar s=document.createElement('script'); s.src=src;\n\t\t\ts.onload=function(){ if(--left===0 && !failed) cb(); };\n\t\t\ts.onerror=function(){ if(!failed){ failed=true; alert('\u062a\u0639\u0630\u0651\u0631 \u062a\u062d\u0645\u064a\u0644 \u0623\u062f\u0627\u0629 PDF. \u0633\u064a\u062a\u0645 \u0641\u062a\u062d \u0646\u0627\u0641\u0630\u0629 \u0627\u0644\u0637\u0628\u0627\u0639\u0629 \u2014 \u0627\u062e\u062a\u0631 \u0645\u0646\u0647\u0627 \u00ab\u062d\u0641\u0638 \u0643\u0640 PDF\u00bb.'); doPrint(); } };\n\t\t\tdocument.head.appendChild(s);\n\t\t});\n\t}\n\tfunction doPDF(){\n\t\tdocWrap.classList.add('open');\n\t\tloadLibs(function(){\n\t\t\t\/\/ manual pipeline: exact A4 content width (no container crop) + own page slicing\n\t\t\tvar MM=8; \/\/ page margin in mm\n\t\t\tvar CW=Math.floor((210-2*MM)*96\/25.4); \/\/ A4 content width in px\n\t\t\tvar holder=document.createElement('div');\n\t\t\tholder.style.cssText='position:absolute;left:-11000px;top:0;width:'+CW+'px;background:#ffffff;';\n\t\t\tvar clone=docEl.cloneNode(true);\n\t\t\tclone.style.width=CW+'px'; clone.style.maxWidth=CW+'px'; clone.style.boxShadow='none'; clone.style.margin='0';\n\t\t\tholder.appendChild(clone); document.body.appendChild(holder);\n\t\t\tvar H=Math.max(clone.scrollHeight||0, clone.offsetHeight||0, 900);\n\t\t\twindow.html2canvas(clone,{scale:2,useCORS:true,backgroundColor:'#ffffff',windowWidth:CW+60,windowHeight:H+500,scrollX:0,scrollY:0})\n\t\t\t.then(function(canvas){\n\t\t\t\tholder.remove();\n\t\t\t\tvar jsPDF=window.jspdf.jsPDF;\n\t\t\t\tvar pdf=new jsPDF({unit:'mm',format:'a4',orientation:'portrait'});\n\t\t\t\tvar pageWmm=210-2*MM, pageHmm=297-2*MM;\n\t\t\t\tvar pxPerMm=canvas.width\/pageWmm;\n\t\t\t\tvar pageHpx=Math.floor(pageHmm*pxPerMm);\n\t\t\t\tvar pages=Math.max(1, Math.ceil(canvas.height\/pageHpx));\n\t\t\t\tfor(var i=0;i<pages;i++){\n\t\t\t\t\tvar sliceH=Math.min(pageHpx, canvas.height - i*pageHpx);\n\t\t\t\t\tif(sliceH<=0) break;\n\t\t\t\t\tvar pc=document.createElement('canvas'); pc.width=canvas.width; pc.height=sliceH;\n\t\t\t\t\tvar pctx=pc.getContext('2d'); pctx.fillStyle='#ffffff'; pctx.fillRect(0,0,pc.width,pc.height);\n\t\t\t\t\tpctx.drawImage(canvas,0,i*pageHpx,canvas.width,sliceH,0,0,canvas.width,sliceH);\n\t\t\t\t\tif(i>0) pdf.addPage();\n\t\t\t\t\tpdf.addImage(pc.toDataURL('image\/jpeg',0.95),'JPEG',MM,MM,pageWmm,sliceH\/pxPerMm);\n\t\t\t\t}\n\t\t\t\tpdf.save('RokhamHub-Quotation.pdf');\n\t\t\t})\n\t\t\t.catch(function(){ holder.remove(); doPrint(); });\n\t\t});\n\t}\n})();<\/script>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3545","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/rokhamhub.com\/en\/wp-json\/wp\/v2\/pages\/3545","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rokhamhub.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rokhamhub.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rokhamhub.com\/en\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/rokhamhub.com\/en\/wp-json\/wp\/v2\/comments?post=3545"}],"version-history":[{"count":0,"href":"https:\/\/rokhamhub.com\/en\/wp-json\/wp\/v2\/pages\/3545\/revisions"}],"wp:attachment":[{"href":"https:\/\/rokhamhub.com\/en\/wp-json\/wp\/v2\/media?parent=3545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}