PageSourceSearch

https://lleo.me/js/main.js?1768954216

js lleo.me collected 2026-09-24 21:38:47 UTC 96,522 bytes, 2,296 lines download raw bytes

1
2var lovilka='';
3var alertmajax=0;
4var mojaxsalt='';
5
6// óäàëÿåì íåíóæíûå history çàêðûòûõ îêîí
7/*
8if(window.addEventListener && window.history) setInterval(function() {
9    if(Object.keys(mHelps).length) return;
10    var w=document.location.href.split('?')[1];
11    if(w && w.indexOf('win_')===0 && window.history.back) window.history.back();
12},10);
13*/
14
15if(user_opt('ani')) page_onstart.push("LOADS(www_css+'animate.css',function(){wintempl_cls=wintempl_cls.replace(/animated/g,'')},function(){useropt.ani=0});");
16else wintempl_cls=wintempl_cls.replace(/animated/g,'');
17
18if(user_opt('er')) window.onerror=function(e,url,n) { // ñòóêà÷ îá îøèáêàõ JS ó ïîëüçîâàòåëåé
19    console.log('LL_ERROR:'+e+"|"+n+"|"+url+'|'+lovilka+'|'+s);
20    return true;
21}
22
23var alertmajax=0; // if(admin) setTimeout('var alertmajax=1',4000);
24
25// îáðàùåíèÿ, êîòîðûå îáÿçàíû èäòè òîëüêî ÷åðåç ñåêðåòíûé xdomain
26var ifrnames=[
27    'editor.php:editform',
28    // 'editor.php:tags',
29    'editor.php:settings_win',
30    'editor.php:editform_new',
31    'editor.php:newform',
32    // 'editor.php:findreplace',
33    'editor.php:xclipboard',
34    'adminsite.php:edit',
35    // 'adminsite.php:new',
36    'login.php:getinfo' /*,'foto.php:album'*/
37];
38
39//function basename(path) { return path.replace(/^.*[\/\\]/g,''); }
40function c_save(n,v,d,p) {
41    // d=window.navigator.userAgent.indexOf('NokiaE90')<0?d:0; // çàåáàëà Íîêèÿ íå ïîíèìàòü êóêè äëÿ äîìåíà
42    if(v===false||v===null) return false; var N=new Date(); N.setTime(N.getTime()+(v==''?-1:3153600000000));
43    document.cookie=n+'='+encodeURIComponent(v)+';expires='+N.toGMTString()+';'
44    +'SameSite=Lax;'
45    +'path='+(p==undefined?'/':p)+';'+(d!==0?'domain=.'+MYHOST+';':'');
46}
47
48var zindexstart=100; // íà÷àëî îòñ÷åòà ñëîåâ äëÿ îêîí
49var activid=false; // id àêòèâíîãî îêíà
50var hid=1; // ñ÷åò÷èê îêîí
51var mHelps={}; // ìàññèâ äëÿ îêîí: id:[hotkey,zindex]
52var hotkey=[]; // [code,(ctrlKey,shiftKey,altKey,metaKey),func]
53var hotkey_def=[]; // õîòêåè ãëàâíîãî îêíà
54var nonav=0; // îòêëþ÷èòü íàâèãàöèþ è áóêâåííûå õîòêåè È ÑÈÑÒÅÌÓ ÎÏÅ×ÀÒÎÊ
55
56if(window.top===window && mnogouser) page_onstart.push("if(ux=='c' || 1) ifhelpc(xdom,'xdomain','xdomain');");
57
58if(admin) page_onstart.push("LOADS(www_js+'adm.js?rand='+Math.random(),function(){adm()})");
59
60//========================================================
61if(typeof(hotkey_default)!='function') hotkey_default=function(){
62    hotkey=[];
63
64    setkey('Escape','',function(e){ clean(isHelps())},true,1); // çàêðûòü ïîñëåäíåå îêíî
65    setkey('Enter','ctrl',function(e){if(!isHelps()) helper_go()},true,1); // åñëè íå îòêðûòî îêîí - îêíî ïðàâêè
66
67    if(adm) {
68	setkey('Digit1','ctrl',function(e){keyalert=(keyalert?0:1);talert('Key scan '+(keyalert?'ON':'off'),1000);},false); // âêëþ÷åíèå ñêàíêîäîâ
69	// setkey('x','alt',function(e){alert('Scroll W/H='+getScrollW()+'/'+getScrollH()+'\ndocument.compatMode='+document.compatMode+'\nwindow.opera'+window.opera+'\ngetWin W/H='+getWinW()+'/'+getWinH()+'\ngetWin W0/H0='+getWinW0()+'/'+getWinH0()+'\ngetDoc W/H='+getDocW()+'/'+getDocH());},false);
70	setkey('KeyE','',function(e){majax('editor.php',{a:'editform',num:num,comments:(dom('commpresent')?1:0)})},false); // ðåäàêòîð çàìåòêè
71	setkey('KeyN','',function(e){majax('editor.php',{a:'newform',hid:++hid})},false); // íîâàÿ çàìåòêà
72    }
73
74    setkey('KeyU','',function(e){majax('login.php',{a:'getinfo'})},true); // ëè÷íàÿ êàðòî÷êà
75};
76
77page_onstart.push("hotkey_default()");
78
79//========================================================
80
81keykeys={ctrl:8,shift:4,alt:2,meta:1};
82
83// setkey(
84// [0] 'key' or keys[]
85// [1] ,'ctrl shift alt meta' ÷åðåç ïðîåëû àáû êàê ëèøü áû áûëî
86// [2] ,function(){} - åñëè ôóíêöèè íåò (''), òî óäàëèòü
87// [3] ,o ×òî âåðíóòü return hotkey[i][3];
88// [4] ,nav Äîëæåí îòñóòñòâîâàòü åñëè íå íàâèãàöèîííîå èáî if(nonav && !hotkey[i][4]) return true; // íàâèãàöèÿ îòêëþ÷åíà äëÿ íàâèãàöèîííûõ
89// setkey('ArrowLeft','',function(e){})
90
91function setkey(k,v,f,o,nav) { nav=nav?1:0; if(typeof(k)!='object') k=[k];
92 for(var i=0;i<k.length;i++) {
93    setkey0(k[i],v,f,o,nav);
94    if(mHelps[activid]) mHelps[activid][0]=hotkey.slice(); else hotkey_def=hotkey.slice(); // è çàïîìíèòü â ìàññèâå
95 }
96}
97
98function setkey0(k,v,f,o,nav){ // ïîâåñèòü ôóíêöèþ íà íàæàòèå êëàâèøè
99    var e=0; for(var i in keykeys) if(v.indexOf(i)>=0) e+=keykeys[i]; // ñåòêà âñÿêèõ øèôòîâ-êîíòðîëîâ
100    for(var i in hotkey) if(hotkey[i][0]==k && hotkey[i][1]==e){ // åñëè óæå åñòü - èçìåíèòü
101	if(!f || f=='') delete hotkey[i]; else hotkey[i]=[k,e,f,o,nav];
102	return;
103    }
104    if(!f || f=='') return; // åñëè íåò, è íå çàäàíà ôóíêöèÿ, - ïðîñòî âûéòè
105    if(e) hotkey.push([k,e,f,o,nav]); else hotkey.unshift([k,e,f,o,nav]);
105 // èíà÷å - çàäàòü ñ êîíöà ñïèñêà èëè ñ íà÷àëà
106}
107
108function rel_redirect(id){ var e=dom(id); if(user_opt('n') && e && e.href && !isHelps()) {
109    if(id=='PrevLink'){ var b=document.body,i=curX-startX; if(i<0)i=-i; b.style.left=i+'px'; setOpacity(b,0.5); }
110    else if(id=='NextLink'){ var b=document.body,i=curX-startX; if(i<0)i=-i; b.style.right=i+'px'; setOpacity(b,0.5); }
111    document.location.href=e.href; }
112}
113
114
115///////// ÝÒÓ ÂÑÞ ÕÓÉÍÞ ÏÅÐÅÄÅËÀÒÜ ÁÛ
116function cphash(a) {
117    var b={}; for(var i in a) {
118    if(typeof(a[i])!='undefined'){
119    if(typeof(a[i])=='object' && typeof(a[i]['innerHTML'])!='string') b[i]=cphash(a[i]); else b[i]=a[i];}
120    }
121    b.push=a.push; b.unshift=a.unshift; // éîáàíûé ïàò÷!
122    return b;
123}
124
125function cpmas(a) { var b=[]; for(var i=0;i<a.length;i++){
126    if(typeof(a[i])!='undefined'){
127    if(typeof(a[i])=='object' && typeof(a[i]['innerHTML'])!='string') b[i]=cphash(a[i]); else b[i]=a[i];}
128} return b; }
129
130function isHelps(){ var max=0,id=false; for(var k in mHelps){ if(mHelps[k][1]>=max){max=mHelps[k][1];id=k;} } return id; }// íàéòè âåðõíåå îêíî èëè false
131
132var print_r_id=0;
133var print_rid={};
134
135function printr_f(ev,e,i){ ev.stopPropagation(); print_r(print_rid[i]);
136    if(e.className!='ll') { dom(e,"[Object]"); e.className='ll'; return; }
137    e.className=''; e.style.marginLeft='30px'; dom(e,print_r(print_rid[i],0,1)+'\n');
138}
139
140function print_r(a,n,skoka) {
141 if(skoka===0) return '@'; if(!skoka) skoka=10;
142    var s='',t='',v,tp,vl,vv; if(!n)n=0; for(j=0;j<n*10;j++) t+=' ';
143    if(typeof(a)!='object') return a;
144
145    for(var j in a){
146	if(typeof(j)=='undefined') { s='\nundefined'+s; continue; }
147	tp=typeof(a[j]); v=a[j];
148	try{ vv=''+v; } catch(x) { vv='(((Uncaught)))'; }
149
150	if(tp=='function') {
151	    // vl="<div style='color:orange;display:inline-table'>function</div>";
152	    var z=(print_r_id++); print_rid[z]=v;
153	    vl="<div style='color:orange;display:inline-table'>function(<div onclick=\"printr_f(event,this,'"+z+"')\" class='ll'>___</div>)</div>";
154	}
155	else if(tp=='number' || tp=='boolean') vl="<span style='color:lightgreen'>"+vv+'</span>';
156	else if(tp=='undefined') vl="<span style='color:#ccc'>"+tp+"</span>";
157	else if(tp=='string') vl="<div style='color:green;display:inline-table;'>"+vv+'</div>';
158	else if(tp=='object' && !v) vl="<span style='color:#ccc'>null</span>";
159	else if(tp=='object') {
160	    var z=(print_r_id++); print_rid[z]=v; // cphash(v); // {}; Object.assign(print_rid[z],v);
161	    vl = "<div onclick=\"printr_f(event,this,'"+z+"')\" class='ll'>"+vv+"</div>";
162	}
163	else vl='['+vv+"] <span style='color:green'>"+typeof(v)+'</span>';
164	s='\n'+t+j+' = '+vl+s;
165    }
166    return s;
167}
168
169
170
171function in_array(s,a){ for(var l in a) if(a[l]==s) return l; return false; }
172
173function newin(e) { return (e?e.classList.contains('newin'):e); }
174
175clean=function(id,animtrue,History) {
176    if(id===null||id===undefined) return;
177
178    if(typeof(id)=='object') {
179        if(typeof(id.id)!='undefined'&&id.id!='') id=id.id; // åñëè åñòü èìÿ, òî âçÿòü èìÿ
180        else { var t='tmp_'+(hid++); id.id=t; id=t; } // èíà÷å áëÿòü ïðèñâîèòü
181    }
182
183    var e=dom(id), nin=newin(e);
184
185    if(nin && !History && window.addEventListener && window.history.back) {
186	var w=document.location.href.split('?')[1];
187	if(w && w.indexOf('win_'+id)===0) {
188	    // âåðíóòü, íî òèõî
189	    window.removeEventListener('popstate', HistoryEvent);
190	    window.history.back();
191	    setTimeout(function(){ window.addEventListener('popstate', HistoryEvent, false);},50);
192       }
193    }
194
195    if(typeof(mHelps[id])!='undefined' && !nin) { // îêíî áûëî
196        delete(mHelps[id]); // óäàëèòü îêíî
197        mHelps_sort(top); // ïåðåñîðòèðîâàòü
198        if(!isHelps()) { hotkey=hotkey_def.slice(); nonav=0; } // âîññòàíîâèòü äåôàóëòû
199    }
200
201    if(e) {
202	var clen=function(){
203	    if(nin) dom.on( (e.previousSibling?e.previousSibling:document.body) );
204	    if(e && e.parentNode) e.parentNode.removeChild(e);
205		// e?.parentNode?.removeChild(e); СУЧИЙ ЕБАНЫЙ АЙПАД
206	};
207
208        if( nin || typeof(e.onanimationend)!='object' || in_array(id,['tenek','ajaxgif'])) clen(); // dom.off(id); setTimeout(clen,10);
209        else { // animate
210	    dom.off(e.querySelector('.winret'));
211	    anim(e,(nin ? 'slideOutRight' : 'zoomOut'),clen,animtrue); // .zoomInRight .rotateOutUpLeft
212	}
213    } else if(typeof(idrename)!='undefined'&&typeof(idrename[id])!='undefined') { clean(idrename[id]); }
214    dom.off('tip');
215};
216
217var JSload={};
218
219function mHelps_sort(top) { // ñîðòèðîâêà îêîí ïî ñëîÿì âîçðàñòàíèÿ ñ ïðåäëåæàùèì îêíîì òåíè
220    if(top=='salert') return;
221
222    var mam=[],k=zindexstart,id=0; for(var i in mHelps) mam.push([i,mHelps[i][1]]);
223    if(!mam.length){ // åñëè íåòó ðàñïàõíóòûõ îêîøåê
224	clean('tenek');
225	hotkey=hotkey_def.slice();
226	activid=false;
227	bukadump();
228	return;
229    }
230    mam.sort(function(i,j){return i[1]>j[1]?1:0});
231
232    for(var i=0;i<mam.length;i++){
233	id=mam[i][0];
234	if(id==top || !top && (i+1)==mam.length) continue;
235	mHelps[id][1]=k; dom(id).style.zIndex=k++;
236    } if(top) id=top;
237
238    if(!mHelps[id]) { clean('tenek'); return; }
239
240    if(typeof(document.body.style.pointerEvents)=='string') {
241	var T=dom('tenek'); if(!T) { newdiv('',{id:'tenek',cls:'tenek'}); T=dom('tenek'); }
242	T.style.zIndex=k++;
243    }
244
245    mHelps[id][1]=k; dom(id).style.zIndex=k;
246    hotkey=mHelps[id][0].slice();
247    activid=id;
248    bukadump();
249}
250
251function bukadump() { // îòëàäî÷íèê
252    if(!dom('bukadump')) return;
253    var s='<hr>';
254    s+='<br>activid='+activid;
255    s+='<p>hotkey='+print_r(hotkey,0,0).replace(/\n/g,'<br>').replace(/ /g,' ');
256    s+='<hr>';
257    dom('bukadump',dom.s('bukadump')+'<hr>'+s);
258}
259
260function inject(src){ loadScr(urlajax(src)); }
261
262function urlajax(s,dir) { return ( s.indexOf('://')<0 && s.substring(0,1) != '/' ? (dir?dir:www_ajax)+s : s ); }
263
264// óìíàÿ ïîäãðóçêà
265// ïåðâûé àðãóìåíò - èìÿ ôàéëû js èëè css èëè ìàññèâ ['1.js','2.js','1.css']
266// âòîðîé íåîáÿçàòåëüíûé àðãóìåíò - ôóíêöèÿ, çàïóñêàåìàÿ ïî îêîí÷àíèè óäà÷íîé çàãðóçêè ÂÑÅÕ ïåðå÷èñëåííûõ
267// òðåòèé íåîáÿçàòåëüíûé - ôóíêöèÿ ïðè îøèáêå êàæäîãî èç
268// ÷åòâåðòûé (sync) óñòàíàëèâàòü â true, åñëè âàæåí ïîðÿäîê çàãðóçêè
269// LOADS('1.js',function(){Óäà÷íî});
270// LOADS(['1.js','2.css'],function(){ SUCCESS!},function(){ERROR!},sync);
271// ñ îæèäàíèåì: await LOADS_promice(['1.js','2.css'],sync); // start end loaded
272const LOADES={};
273function LOADS(urls, onSuccess, onError, sync) {
274    if(typeof urls === 'string') urls = [urls];
275    urls = urls.filter(url => !LOADES[url]); // Îòôèëüòðóåì óæå çàãðóæåííûå
276    if(!urls.length) return onSuccess ? onSuccess() : true; // Åñëè íå÷åãî çàãðóæàòü, ñðàçó óñïåõ
277    const urls2 = [...urls];
278    urls.forEach(url => {
279        const attr = /\.css($|\?.+?$)/.test(url)
280            ? { elname:'link', href:url, type:'text/css', rel:'stylesheet', media:'screen'}
281            : { elname:'script', src:url, type:'text/javascript', defer: true};
282        const el = document.createElement(attr.elname);
283        for(const [a,b] of Object.entries(attr)) el.setAttribute(a,b);
284        if(sync) el.async = false; // Óïðàâëÿåì àñèíõðîííîñòüþ äëÿ ñêðèïòîâ
285        el.onerror = (e) => {
286            onError ? onError(url,e) : console.error(`Failed to load: ${url}`);
287        };
288        el.onload = () => {
289            LOADES[url] = 1;
290            urls2.splice(urls2.indexOf(url),1);
291            if(!urls2.length) { ajaxoff(); if(onSuccess) onSuccess(); }
292        };
293        document.head.appendChild(el);
294    });
295    ajaxon();
296}
297LOADS_sync=function(urls,onSuccess,onError) { LOADS(urls,onSuccess,onError,1) }
298LOADS_promise=LOADS_promice=include=function(urls,sync) { return new Promise(function(resolve,reject){ LOADS(urls,resolve,reject,sync) }); };
299
300
301// ñîçäàòü íîâûé <DIV class='cls' id='id'>s</div> â ýëåìåíòå paren (åñëè íå óêàçàí - òî ïðîñòî â äîêóìåíòå)
302// åñëè óêàçàí relative - òî ñëåäóþùèì çà relative
303// åñëè relative=='first'(èëè 0) - â íà÷àëî
304// åñëè relative==['before',relative] - òî ïåðåä relative
305// èíà÷å (ðåêîìíäóåòñÿ ïèñàòü 'last') - â êîíåö
306// rootElement=false;
307function mkdiv(id,s,cls,paren,relative,display){ if(dom(id)) { dom(id,s); dom(id).className=cls; return; }
308    var div=document.createElement('DIV');
309    if(cls) div.className=cls;
310    if(id) div.id=id;
311    if(s) div.innerHTML=s;
312    if(!display) div.style.display='none';
313//    if(!paren) paren = rootElement | document.body;
314    if(!paren) paren = document.body;
315
316    if(relative===undefined) {
317	try { paren.appendChild(div); } // paren.lastChild
318	catch(u) {
319	    if(admin) alert('id='+id+' paren='+paren+' s='+s);
320	}
321    }
322    else if(relative===0||relative=='first') paren.insertBefore(div,paren.firstChild);
323    else if(typeof(relative)=='object' && relative[0]=='before') paren.insertBefore(div,relative[1]);
324    else paren.insertBefore(div,relative.nextSibling);
325    return div;
326}
327
328function newdiv(s,ara,paren,relative,display){ if(typeof(ara)!='object') ara={};
329    var div=mkdiv(ara.id,s,(ara.cls?ara.cls:ara.class),paren,relative,(display==undefined?1:display));
330    if(ara.attr) for(var i in ara.attr) div.setAttribute(i,ara.attr[i]);
331    return div;
332}
333
334function posdiv(id,x,y) { // ïîçèöèîíèðîâàíèå ñ ïðîâåðêîé íà âûëåò, åñëè àðãóìåíò '-1' - ïî öåíòðó ýêðàíà
335    var e=dom(id),W,w,H,h,SW,SH,DW,DH;
336    if(newin(e)) e=dom(id+'_body');
337
338    e.style.position='absolute';
339    w=e.clientWidth; h=e.clientHeight;
340    e.style.display='none'; // ïåðåä èçìåðåíèåì óáðàòü
341    W=getWinW(); H=getWinH(); SW=getScrollW(); SH=getScrollH();
342    e.style.display='block';
343    var es=e.currentStyle||window.getComputedStyle(e);
344    var mL=1*es.marginLeft.replace(/px/,''),mR=1*es.marginRight.replace(/px/,'');
345
346    if(x==-1) x=(W-w)/2+SW+mL-mR;
347    if(y==-1) y=(H-h)/2+SH;
348    DW=W-10; if(w<DW && x+w>DW) x=DW-w; if(x<0) x=0;
349    if(y<0) y=0;
350    if(!newin(e)) e.style.top=y+'px';
351    e.style.left=(x-6)+'px';
352}
353
354function center(id) { dom.on(id); posdiv(id,0,0); posdiv(id,-1,-1); }
355
356function addEvent(e,evType,fn) {
357    if(e.addEventListener) { e.addEventListener(evType,fn,false); return true; }
358    if(e.attachEvent) { var r = e.attachEvent('on' + evType, fn); return r; }
359    e['on' + evType] = fn;
360}
361
362function removeEvent(e,evType,fn){
363    if(e.removeEventListener) { e.removeEventListener(evType,fn,false); return true; }
364    if(e.detachEvent) { e.detachEvent('on'+evType, fn) };
365}
366
367function hel(s,t) { ohelpc('id_'+(++hid),(t==undefined?'':s),s); }
368function helps_cancel(id,f) { idd(id).querySelectorAll('.can')[0].onclick=f; }
369function helpc(id,s) { helps(id,s); center(id); /* setTimeout(function(x){center(id)},500);*/ }
370function ohelpc(id,z,s) { helpc(id,mk_helpbody(z,s)); }
371function ohelp(id,z,s) { helps(id,mk_helpbody(z,s)); }
372function mk_helpbody(z,s) { return (z==''?'':"<div class='legend'>"+z+"</div>")+"<div class='textbody'>"+s+"</div>"; }
373
374function idie(s,t) {
375    var e=typeof(s); if(e=='object') s="<pre style='max-width:"+(getWinW()-200)+"px'>"+print_r(s,0,3)+'</pre>';
376    var header='';
377    if(t!=undefined) { if(t.length < 120) header=h(''+t); else s=t+'<p>'+s; }
378    var p=dom('idie'); if(p) { p=p.querySelectorAll('.textbody'); if(p&&p[0]) return dom.add(p[0],'<hr>'+s); }
379    ohelpc('idie',header,s);
380}
381dier=idie;
382
383HistoryEvent=function(e) {
384    e.preventDefault();
385    if( !window.history || !e ) return;
386    if( !e.state || !e.state.win || !dom(e.state.win) ) {
387	var wb=dom('winbody'); if(!wb) return;
388	wb.childNodes.forEach(ee=>{clean(ee)});
389	dom.on(document.body);
390	return;
391    }
392    var id=dom(e.state.win).id;
393    var w=document.location.href.split('?')[1];
394    if(!w || !w.indexOf('win_')===0) return;
395
396    var ee=dom('winbody').childNodes;
397    for(var i=ee.length-1;i>=0;i--) { if(ee[i].id != id) clean(ee[i]); else break; }
398};
399// set Listener history
400
401if(window.addEventListener) window.addEventListener('popstate', HistoryEvent,false);
402
403winret=function(e){ if(window.history.back) window.history.back(); else clean(e.parentNode); };
404
405// var wintempl="<div class='corners'><div class='inner'><div class='content' id='{id}_body' align=left>{text}</div></div></div>";
406// var wintempl_cls='popup';
407// var wintempl_cls='pop2';
408// var wintempl="<div id='{id}_body'>{s}</div><i id='{id}_close' title='Close' class='can'></i>";
409function helps(id,s,pos,cls,wt) {
410
411 if(!user_opt('nowin')) {
412
413    if(!dom('winbody')) {
414         var d=document.createElement('DIV'),b=document.body,bp=b.parentNode;
415	 d.id='winbody'; bp.insertBefore(d,bp.firstChild);
416    }
417
418  if(useropt.mobwin && !in_array(id,['salert','idie','dier','fotooper'])) {
419    if(!dom(id)) {
420	var em=dom('winbody');
421	dom.off(document.body); em.childNodes.forEach(e=>{dom.off(e)});
422//	rootElement.setAttribute('scrollTop',(document.documentElement.scrollTop || document.body.scrollTop));
423//	rootElement.setAttribute('scrollLeft',(document.documentElement.scrollLeft || document.body.scrollLeft));
424
425	newdiv("<div class='winret' onclick='winret(this)' style='font-size:50px;index:30;position:absolute;top:5px;left:5px;cursor:pointer;width:100%;text-align:left;'>&#9664;</div>\
426<div style='margin: 80px 10px 0 10px; text-align:left' class='"+cls+"' id='"+id+"_body'>"+s+"</div>",{id:id,cls:'newin animate fadeInLeft'},
427em);
428	init_tip(dom(id));
429
430	if(window.history && window.history.pushState) {
431		window.history.pushState({win:id},'?win_'+id,'?win_'+id);
432	}
433
434
435    } else { if(dom(id+'_body')) dom(id+'_body',s); }
436
437    hotkey=hotkey_def.slice(); // îáíóëèòü äëÿ îêíà âñå øîòêåè
438    return;
439  }
440
441}
442
443if(!dom(id)) {
444
445    if(!wt) wt=wintempl;
446    mkdiv(id,wt.replace(/\{id\}/g,id).replace(/\{s\}/g,s),wintempl_cls+(cls?' '+cls:''),undefined,undefined,1);
447    if(dom(id+'_close')) dom(id+'_close').onclick=function(e){clean(id)};
448
449    init_tip(dom(id));
450
451    onMoveObject(dom(id),false,
452        function(e) {
453            if(e.className=='legend' || e.id==id+'_body') return dom(id);
454            return ( e.id==id ? e : false );
455        }
456    );
457//  ===========================================================================
458
459++hid;
460
461if(!pos) posdiv(id,mouse_x,mouse_y);
462
463mHelps[id]=[hotkey.slice(),999999]; // ñäåëàòü ñàìûì âåðõíèì
464
465} else dom(id+'_body',s);
466
467hotkey=hotkey_def.slice(); // îáíóëèòü äëÿ îêíà âñå øîòêåè
468setTimeout("mHelps_sort('"+id+"');",10); // ïåðåñîðòèðîâàòü
469addEvent(dom(id),'click',function(){ mHelps_sort(this.id); });
470}
471
472// êîîðäèíàòû ìûøè
473var mouse_x=mouse_y=0;
474document.onmousemove = function(e){ e=e||window.event;
475  if(e.pageX || e.pageY) { mouse_x=e.pageX; mouse_y=e.pageY; }
476  else if(e.clientX || e.clientY) {
477    mouse_x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
478    mouse_y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
479  }
480try{e=dom('ajaxgif'); e.style.top=15+mouse_y+'px'; e.style.left=15+mouse_x+'px';}catch(e){}
481};
482
483function setOpacity(e,n) { e.style.opacity=n; }
484
485function getScrollH() { return window.pageYOffset; }
486function getScrollW() { return window.pageXOffset; }
487function getWinW() { return window.innerWidth; }
488function getWinH() { return window.innerHeight; }
489function getDocH() { return document.documentElement.scrollHeight; }
490function getDocW() { return document.documentElement.scrollWidth; }
491
492// =========================================================================
493
494
495// --- ïðîöåäóðû pins ---
496function insert_n(e) { var v=e.value;
497    var t1=v.substring(0,e.selectionStart); // òåêñò ïåðåä
498    var t2=v.substring(e.selectionEnd,v.length); // òåêñò ïîñëå
499    var pp=GetCaretPosition(e);
500    e.value=t1.replace(/\s+$/,'') + "\n" + t2.replace(/^\s+/,'');
501    setCaretPosition(e,pp);
502}
503
504function ti(id,tmpl) { // çàìåíèòü âûäåëåííîå íà tmpl, â êîòîðîì {select} çàìåíèòñÿ íà âûäåëåííîå
505    var e=dom(id),v=e.value,ss=e.selectionStart,es=e.selectionEnd;
506    var s=tmpl.replace(/\{select\}/g,v.substring(ss,es));
507    GetCaretPosition(e); e.value=v.substring(0,ss)+s+v.substring(es,v.length); setCaretPosition(e,ss+s.length);
508    e.selectionStart=ss; e.selectionEnd=ss+s.length;
509}
510
511function tin(id,s) { // çàìåíèòü âûäåëåííîå íà s
512    var e=dom(id),v=e.value,ss=e.selectionStart,es=e.selectionEnd;
513    GetCaretPosition(e); e.value=v.substring(0,ss)+s+v.substring(es,v.length); setCaretPosition(e,ss+s.length);
514}
515
516var scrollTop=0;
517
518function GetCaretPosition(e) { var p=0; // IE Support
519    if(document.selection){ e.focus(); var s=document.selection.createRange(); s.moveStart('character',-e.value.length); p=s.text.length; } // Firefox support
520    else if(e.selectionStart || e.selectionStart=='0') p=e.selectionStart;
521    scrollTop=e.scrollTop; return p;
522}
523
524function setCaretPosition(e,p) {
525    if(e.setSelectionRange){ e.focus(); e.setSelectionRange(p,p); }
526    else if(e.createTextRange){ var r=e.createTextRange(); r.collapse(true); r.moveEnd('character',p); r.moveStart('character',p); r.select(); }
527    e.scrollTop = scrollTop;
528}
529
530
531
532//======================================== jog
533function valid_up(l) {
534    var u=('#'+l).replace(/^#(\d+)\-[0-9ABCDEF]{32}$/gi,"$1"); return isNaN(u)||u==0?false:l;
535}
536
537var unic_rest_flag=0; function unic_rest(i) { return 0; // çàåáàëî! âðåìåííî îòêëþ÷èì!
538    /*
539    if(unic_rest_flag) return;
540    var upo=valid_up(i?fc_read('up'):f5_read('up')); // ïðî÷èòàòü èç îäíîãî èëè äðóãîãî õðàíèëèùà
541    if(up!=upo && upo!==false) { unic_rest_flag=1; return majax('restore_unic.php',{up:up,upo:upo,num:num,i:i}); } // âîññòàíîâèòü!
542    if(up!='candidat') return (i?fc_save('up',up):f5_save('up',up));
543    */
544}
545// page_onstart.push('unic_rest(0)'); // çàåáàëî! âðåìåííî îòêëþ÷èì!
546
547var jog=false,f5s=false;
548
549c_read=function(n) {
550    var a=' '+document.cookie+';'; var c=a.indexOf(' '+n+'='); if(c==-1) return false; a=a.substring(c+n.length+2);
551    return decodeURIComponent(a.substring(0,a.indexOf(';')))||false;
552};
553fc_read=fc_save=function(n,v){ return false; };
554f_read=function(n,def){ return f5_read(n,def)||c_read(n); };
555
556f_save=f5_save=l_save=function(key, value, storage) {
557    if(key.length>500) idie('f_save error k.length='+k.length);
558    if(value.length>20000) idie('f_save error v.length='+v.length);
559    try { window[storage?'sessionStorage':'localStorage'].setItem(key, value); return true; }
560    catch(er) { return err_store(er,arguments.callee.name); }
561};
562
563f5_read=l_read=function(key, def, storage) {
564    try { const val = window[storage?'sessionStorage':'localStorage'].getItem(key); return (val === null ? def : val); }
565    catch(er) { return err_store(er,arguments.callee.name); }
566};
567
568f5_del=l_del=function(key, storage) {
569    try { window[storage?'sessionStorage':'localStorage'].removeItem(key); return true; }
570    catch(er) { return err_store(er,arguments.callee.name); }
571};
572
573f5_all=function(storage) {
574  const items = {}, st = storage?'sessionStorage':'localStorage';
575  for(let i=0; i<window[st].length; i++) {
576    const key = window[st].key(i);
577    items[key] = window[st].getItem(key);
578  }
579  return items;
580};
581
582err_store=function(e,fnam) { // äà áëÿòü, èíîãäà äàæå îíè ðóøàòñÿ
583
584if(e.name=='NS_ERROR_FILE_CORRUPTED') alert("\
585Îïñ, äà ó âàñ åáàíóëîñü áðàóçåðíîå õðàíèëèùå!\nÓ ìåíÿ òàêîå áûëî, êîãäà ÿ ñêîïèðîâàë ïàïêó îò ñòàðîãî Firefox â íîâûé.\
586\n\nÍå äóìàþ, ÷òî ïðîáëåìà îãðàíè÷èòñÿ ëèøü ýòèì ñàéòîì. Íàäî íàéòè è ðó÷êàìè ¸áíóòü ôàéëû òèïà:\
587\n~/.mozilla/firefox/3t20ifl1.default/webappsstore.sqlite\
588\n~/.mozilla/firefox/3t20ifl1.default/webappsstore.sqlite-wal");
589
590    else alert('Error '+fnam+'(): '+e.name);
591    return false;
592}
593
594time=function(){ return new Date().getTime(); };
595sizer=function(x,p=2) { var i=0; for(;x>=1024;x/=1024,i++){} return Math.round(x,p)+['b','Kb','Mb','Gb','Tb','Pb'][i]; };
596
597unixtime2str = function(x,s='Y-m-d H:i:s') { // convert unixtime to string
598    var d = new Date(x * 1000); // Convert Unix time to milliseconds
599    function dd(x) { return ("0"+x).slice(-2) }
600    return s.replace('Y',d.getFullYear())
601        .replace('m',dd(d.getMonth()+1) ) // Months are zero-based
602        .replace('d',dd(d.getDate()) )
603        .replace('H',dd(d.getHours()) )
604        .replace('i',dd(d.getMinutes()) )
605        .replace('s',dd(d.getSeconds()) );
606};
607
608
609// comments
610var komsel_n=0,komsel_v='';
611var comnum=0;
612if(typeof(commenttmpl)=='undefined') var commenttmpl='';
613function kus(unic) { if(unic) majax('login.php',{a:'getinfo',unic:unic}); }// ëè÷íàÿ êàðòî÷êà
614function kd(e) { if(confirm('Delete?')) majax('comment.php',{a:'del',id:ecom(e).id}); } // del
615function ked(e) { majax('comment.php',{a:'edit',comnu:comnum,id:ecom(e).id,commenttmpl:commenttmpl}); } // edit
616function ksc(e) { majax('comment.php',{a:'scr',id:ecom(e).id,commenttmpl:commenttmpl}); } // screen/unscreen
617function ko(e) { majax('comment.php',{a:'ans',id:ecom(e).id,commenttmpl:commenttmpl}); } // ans-0-1-undef
618function rul(e) { majax('comment.php',{a:'rul',id:ecom(e).id,commenttmpl:commenttmpl}); } // rul-íå rul
619function ka(e) { e=ecom(e); majax('comment.php',{a:'comform',id:e.id,lev:e.style.marginLeft,comnu:comnum,commenttmpl:commenttmpl}); } // answer
620function kpl(e) { majax('comment.php',{a:'plus',id:ecom(e).id,commenttmpl:commenttmpl}); } // +
621function kmi(e) { majax('comment.php',{a:'minus',id:ecom(e).id,commenttmpl:commenttmpl}); } // -
622function kl(e) { if(komsel_n!==0) dom(komsel_n).style.border=komsel_v;
623    komsel_n=ecom(e).id; komsel_v=dom(komsel_n).style.border;
624    dom(komsel_n).style.border='5px dotted red'; return true;
625} // link
626function opc(e,num) { e=ecom(e); majax('comment.php',{a:'pokazat',dat:num,oid:e.id,lev:e.style.marginLeft,comnu:comnum,commenttmpl:commenttmpl}); } // ïîêàçàòü
627function ecom(e){while((e.id==''||e.id==undefined)&&e.parentNode!=undefined) e=e.parentNode; return e.id==undefined?0:e;}
628
629function skm(e) { var i=ecom(e).id; hide_comm(i); comhif5(i,1); } // óáðàòü êîììåíò
630
631function comhif5(i,z) { var n='hidcom'+num,r=f5_read(n); if(!r) r=[]; else r=r.split(',');
632    if(z) { if(!in_array(i,r)) r.push(i); } else { var l=in_array(i,r); if(false!==r) r.splice(l,1); }
633    f5_save(n,r.join(','));
634}
635
636function restore_comm(e) {
637    e=e||window.event,i=e.target.id.replace(/scc_/g,''),s='scc_'+i;
638    majax('comment.php',{a:'why_hidden_comm',e:e.target.id,unic:dom(i).getAttribute('unic')});
639}
640function hide_comm(i) { i=i.replace(/scc_/g,''); var s='scc_'+i; if(!dom(s)) dom(i,"<div id='"+s+"'>"+dom.s(i)+"</div>"); dom.off(s); setTimeout("addEvent(dom('"+i+"'),'click',restore_comm)",10); }
641
642// bigfoto - çàåáàëñÿ îòäåëüíî ïðèñòûêîâûâàòü
643// BigLoadImg("http://lleo.aha.ru/tmp/img.php?text="+Math.random());
644// Äâà âàðèàíòà âûçîâà: ëèáî ìîäóëåì äëÿ ñåðèè ôîòîê, ëèáî áåç âòîðîãî ïàðàìåòðà ïðîñòî bigfoto('somepath/file.jpg')
645// <img style='border:1px solid #ccc' onclick="return bigfoto('/backup/kniga_big.gif')" src="/backup/kniga_small.gif">
646
647var BigImgMas={},bigtoti=0,bigtotp=0;
648function bigfoto(i,p){
649    if(typeof(i)=='object') i=i.href;
650    var TDATA=(p!=undefined && isNaN(p) ? p : false); // ïåðåäàíû ëè ïîëåçíûå ñëîâà âòîðûì àðãóìåíòîì?
651
652    var Z=( p==undefined || TDATA!==false ); var n=Z?i:i+','+p;
653
654    if(typeof(BigImgMas[n])=='undefined'){
655        if(!Z && !dom("bigfot"+p+"_"+i)) return false;
656        // ajaxon();
657        BigImgMas[n]=new Image();
658        BigImgMas[n].src=Z?n:dom("bigfot"+p+"_"+i).href;
659    }
660
661    if(!Z) { bigtoti=i; bigtotp=p; }
662    if(BigImgMas[n].width*BigImgMas[n].height==0) { setTimeout('bigfoto('+(Z ? '"'+n+'"' : n)+')',200); return false; }
663    // ajaxoff();
664
665    if(Z) var tt="<div id='bigfostr' class=r>"+(TDATA===false?n:TDATA)+"</div>";
666    else {
667	var g=i; while(dom('bigfot'+p+'_'+g)) g++;
668	var tt=(g>1?(i+1)+" / "+g:'')+(dom('bigfott'+p+'_'+i)?"    <div style='display:inline;' title='nexïðåäûäóùàÿ/ñëåäóþùàÿ: ñòðåëêè êëàâèàòóðû' id='bigfottxt'>"+dom.s('bigfott'+p+'_'+i)+'</div>':'');
669	if(tt!=''||admin) tt="<div id='bigfostr' class=r"+(admin?" title='Admin, click to edit!' onclick=\"majax('editor.php',{a:'bigfotoedit',num:"+dom.s('bigfotnum'+p)+",i:"+i+",p:"+p+"})\"":"")+">"+tt+"</div>";
670    }
671    var navl=Z?'':"<div id='bigfotol' style='position:absolute;top:0px;left:0px;'"+((!i)?'>':" title='prev' onclick='bigfoto(bigtoti-1,bigtotp)' onmouseover=\"dom.on('bigfotoli')\" onmouseout=\"dom.off('bigfotoli')\"><i id='bigfotoli' style='position:absolute;top:0px;left:3px;display:none;' class='e_DiKiJ_l'></i>")+"</div>";
672    var navr=Z?'':"<div id='bigfotor' style='position:absolute;top:0px;right:0px;'"+((g==i+1)?'>':" title='next' onclick='bigfoto(bigtoti+1,bigtotp)' onmouseover=\"dom.on('bigfotori')\" onmouseout=\"dom.off('bigfotori')\"><i id='bigfotori' style='position:absolute;right:3px;display:none;' class='e_DiKiJ_r'></i>")+"</div>";
673
674helps('bigfoto',"<div style='position:relative'>"+(admin?"<div id='bigfoto_opt' style='position:absolute;display:inline;bottom:-18px;right:-5px'>\
675<i class='knop e_finish' title='Options' onclick=\"majax('foto.php',{a:'options',img:'"+BigImgMas[n].src+"',p:'"+p+"',num:num})\"></i>\
676</div>":'')+navl+"<img id='bigfotoimg' src='"+BigImgMas[n].src+"' onclick=\"clean('bigfoto')\">"+navr+"</div>"+tt,1);
677
678    var w=BigImgMas[n].width,h=BigImgMas[n].height,e=dom('bigfotoimg');
679    var H=(getWinH()-20); if(h>H && H>480) { w=w*(H/h); h=H; e.style.height=H+'px'; }
680    var W=(getWinW()-50); if(w>W && W>640) { h=h*(W/w); w=W; e.style.width=W+'px'; }
681    if(dom('bigfostr')) dom('bigfostr').style.width=w+'px';
682
683    if(!Z){
684        dom('bigfotol').style.width=dom('bigfotor').style.width=w/4+'px';
685        dom('bigfotol').style.height=dom('bigfotor').style.height=h+'px';
686        if(dom('bigfotoli')) dom('bigfotoli').style.top=(h-16)/2+'px';
687        if(dom('bigfotori')) dom('bigfotori').style.top=(h-16)/2+'px';
688        setkey(['ArrowLeft','4'],'',function(){bigfoto(bigtoti-1,bigtotp)},false);
689        setkey(['ArrowRight','7'],'',function(){bigfoto(bigtoti+1,bigtotp)},false);
690    }
691    // dom.on('bigfoto');
692    center('bigfoto');
693    return false;
694}
695
696// tip
697
698function init_tip(w) { w=w||document;
699
700    if(window.identicon_ready) identicon_init(w);
701
702if(!dom('tip')) {
703    mkdiv('tip','','b-popup bubble-node b-popup-noclosecontrol');
704    dom('tip','<div class="b-popup-outer"><div class="b-popup-inner"><div id="rtip"></div><i class="i-popup-arr i-popup-arrtl"><i class="i-popup-arr-brdr-outer"><i class="i-popup-arr-brdr-inner"><i class="i-popup-arr-bg"></i></i></i></i><i class="i-popup-close"></i></div></div>');
705}
706    if(w.id=='tip') return;
707
708    if(useropt.mat && (!w.id || '#'!=w.id.replace(/(editor|cm)\d+/g,'#'))) delmat(w===document?w.body:w); // è ñþäà æå çàîäíî âñð¸ì îáðàáîòêó ìàòà
709
710var attr,j,i,a,s,e,t,el=['a','label','input','img','span','div','textarea','area','select','i','td','tr','blockquote'];
711for(j=0;j<el.length;j++){ t=el[j]; e=w.getElementsByTagName(t); if(e){ for(i=0;i<e.length;i++){ a=e[i];
712
713if(t=='img' && user_opt('i')) { // äëÿ îøèáêè ïðè çàãðóçêè êàðòèíîê
714    a.setAttribute('onerror','erimg(this)');
715    a.setAttribute('src',a.getAttribute('src'));
716} else if(t=='input'||t=='textarea'||t=='select') { // è îòêëþ÷èòü íàâèãàöèþ äëÿ INPUT è TEXTAREA
717
718	// ïðîñèëè
719	if(t=='input' && (a.name=='email'||a.name=='mail')) { a.setAttribute('type','email'); a.setAttribute('inputmode','email'); }
720
721	if( (t=='input'||t=='textarea') && a.onFocus==undefined) addEvent(a,'focus',function(){nonav=1});
722	attr=a.getAttribute('ramsave');
723	if(attr!==null && !a.defaultValue) { // åñëè óêàçàí àòðèáóò ramsave='name', òî ñîõðàíÿòü â ïàìÿòè áðàóçåðà ýòó ïåðåìåííóþ è âîññòàíàâëèâàòü
724		if(attr=='') {
725		    attr=(a.id?a.id:(a.name?a.name:attr)); // åñëè =1, òî èìÿ òàêîå æå, êàê id èëè name
726		    a.setAttribute('ramsave',attr);
727		}
728		var vv=f5_read(attr) || a.getAttribute('placeholder') || '';
729		    if(a.type=='checkbox') a.checked=1*vv;
730		    else if(a.type=='radio') a.checked=(a.value==vv?1:0);
731		    else a.value=vv;
732		addEvent(a,'change',function(){
733		    f5_save(this.getAttribute('ramsave'), ( this.type=='checkbox' || (this.t
733ype!='radio' && this.checked) ? (this.checked?1:0) : this.value ) );
734		});
735	}
736}
737
738    attr=a.getAttribute('title')||a.getAttribute('alt');
739
740    if(attr=='play') {
741
742	var za=dom.s(a),url=za.split(' ')[0],text=za.substring(url.length+1),cls;
743	if(text=='') text=url;
744	if(/(mp3|ogg|wav|flac)$/.test(url)) { // mp3
745	    cls='ll pla';
746	    if(text.indexOf('<')<0) text="<img style='vertical-align:middle;padding-right:10px;' src='"+www_design+"img/play.png' width='22' height='22'>"+text;
747	} else {
748	    cls='ll plv';
749	    if(text.indexOf('<')<0) text="<i style='vertical-align:middle;padding-right:10px;' class='e_play-youtube'></i>"+text;
750	}
751	a.className=cls;
752	// addEvent(a,'click',function(){ changemp3x(url,text,this); });
753	a.setAttribute('media-url',url);
754	a.setAttribute('media-text',text);
755	addEvent(a,'click',function(){ changemp3x('','',this); });
756	// a.onclick="changemp3x('"+url+"','"+text+"',this);";
757	dom(a,text);
758	a.style.margin='10px';
759	tip_a_set(a,'Play Media');
760	a.style.display='block';
761    }
762    else if(attr=='cpbuf') addEvent(a,'click',cpbuf);
763
764    else tip_a_set(a,attr);
765
766}}}
767}
768
769function erimg(e){ e.onerror='';
770    tip_a_set(e,'image error<br>'+h(e.src));
771    e.src=www_design+'img/kgpg_photo.png';
772}
773
774function tip_pos(){ posdiv('tip',mouse_x-35,mouse_y+25); }
775
776function tip_a_set(a,s) { if(s && a.onMouseOver==undefined) {
777    a.setAttribute('tiptitle',s); a.removeAttribute('title'); a.removeAttribute('alt');
778    addEvent(a,'mouseover',function(){ dom('rtip',s); tip_pos(); });
779    addEvent(a,'mouseout',function(){ dom.off('tip') });
780    addEvent(a,'mousemove',function(){ tip_pos() });
781    addEvent(a,'dblclick',function(){ salert(this.getAttribute('tiptitle'),5000); });
782}}
783
784page_onstart.push("init_tip()");
785
786//==========
787// ïðîöåäóðà ïðàâêè v2.1
788//
789// (ñ)LLeo 2009 äëÿ ïðîåêòà áëîãîäâèæêà http://lleo.aha.ru/blog/
790//
791// çà áåñöåííûå ñîâåòû, äèçàéí âñïûâàþùåãî îêîøêà è ïðîöåäóðû ðàáîòû ñ âûäåëåíèåì - ñïàñèáî Ìèõàèëó Âàëåíöåâó http://valentsev.ru
792
793var leftHelper;
794var topHelper;
795var site_id;
796var Nx = 630;
797if(!hashpresent) var hashpresent='1';
798var keyalert=0;
799
800// 1 - Áðàóçåðû. 2 - IE. 3 - Íåèçâåñòíî.
801var browsertype=(document.createRange)?1:(-[1,])?3:2;
802
803window.onload=function(e) { e=e||window.event;
804    // document.onkeyup = function(e){ };
805    document.onkeydown = function(e) { e=e||window.event;
806        // var k=(e.key?e.key:e.keyCode?e.keyCode:e.which?e.which:null); if(k===0) return;
807        var kod=(e.code?e.code:null),ct=e.metaKey+2*e.altKey+4*e.shiftKey+8*e.ctrlKey;
808
809        if(keyalert) { setTimeout("talert('Code: "+kod+" Alt: "+ct+"',2000)",50); return false; }
810
811        for(var i in hotkey) if( hotkey[i][0]==kod && hotkey[i][1]==(hotkey[i][1]&ct)) {
812            if(nonav && !hotkey[i][4]) return true; // íàâèãàöèÿ îòêëþ÷åíà äëÿ íàâèãàöèîííûõ
813            setTimeout("hotkey["+i+"][2]('"+kod+" "+ct+"')",10);
814            return hotkey[i][3];
815        }
816    };
817
818    // === / KEYBOARD ===
819    window.onresize=function(){ screenWidth=document.body.clientWidth; }; window.onresize();
820
821    // === MOUSE ===
822    document.onmouseup=function(e){ e=e||window.event;
823        if(isHelps() || nonav) return; // Åñëè óæå åñòü îòêðûòûå îêíà - íàõ ïðàâêó!
824        opecha.o=((document.selection)?document.selection.createRange().text:window.getSelection())+'';
825
826        var n=(browsertype==1?(window.getSelection().anchorNode?window.getSelection().anchorNode:'')
827        :(browsertype==2?document.selection.createRange().parentElement():'')
828        );
829
830        if(browsertype==3 || !n || !opecha.o.length || opecha.o.length>1024) return;
831
832        while((n.tagName!='DIV' || n.id=='' || n.id==undefined) && n.parentNode!=undefined) n=n.parentNode;
833        if(n.id==undefined) return;
834        opecha.id=n.id;
835
836        if(user_opt('ope')) return helper_go();
837
838        if(!opecha.n) return;
839        opecha.n--;
840        salert("Îïå÷àòêà? Âûäåëèòå è Íàæìèòå Ctrl+Enter",1000);
841        setkey('Enter','ctrl',function(e){clean('salert');helper_go();},false);
842    };
843
844    for(var inok=page_onstart.length-1;inok>=0;inok--) { var F=page_onstart[inok],TF=typeof(F);
845        try{
846	    if(TF=='function') F(); else if(TF=='string') eval(F);
847	    else ErrorUnknownOnstartCallFunction();
848	} catch(e){ salert('Error ostart: '+h(e.name+":"+e.message)+"<br>"+h(e.stack)+'<p>'+h(page_onstart[inok])+"<hr>"+F); }
849    } page_onstart=[];
850};
851// end window.onload
852
853onstart=function(F) { page_onstart.push(F); return page_onstart.length-1; }
854
855var opecha={n:1,o:'',id:0};
856
857// Ñàì îáðàáîò÷èê îïå÷àòîê
858function helper_go() {
859    if(!opecha.id) return; var o=opecha.o,oid=opecha.id,b=stripp(dom.s(oid));
860    majax('ajax_pravka.php',{a:'textarea',num:num,n:scount(b,stripp(nl2brp(o))),oid:oid,o:o,ss:b.indexOf(nl2brp(o))});
861}
862
863function scount(str,s) { var i=0,c=0; while((i=str.indexOf(s,++i))>0) c++; return c; }
864function nl2brp(s) { return s.replace(/\n\n/g,"<p>").replace(/\n/g,"<br>"); }
865function brp2nl(s) { return s.replace(/<p>/gi,"\n\n").replace(/<br>/gi,"\n"); }
866function stripp(s) { return s.replace(/<\/p>/gi,""); }
867
868function salert(l,t) {
869    var p=dom('salert');
870    if(p){ p=p.querySelectorAll('textbody'); if(p && p[0]) { dom.add(p[0],'<hr>'+l); return false; } }
871    helpc('salert',"<div style='padding:20px' class='textbody'>"+l+"</div>");
872    if(t) setTimeout("clean('salert')",t);
873    return false;
874}
875
876//-------------------------------------------------------------------------
877
878function talert(s,t){ mkdiv('talert',s,'qTip'); posdiv('talert',-1,-1); if(t) setTimeout("clean('talert')",t); }
879
880function gethash_c(){ return 1*document.location.href.replace(/^.*?#(\d+)$/g,'$1'); }
881
882function plays(url,silent){ // silent: 1 - òîëüêî çàãðóçèòü, 0 - ïåòü, 2 - ïåòü ÍÅÏÐÅÌÅÍÍÎ, íåâçèðàÿ íà íàñòðîéêè
883    if(silent!=2 && typeof('user_opt')!='undefined' && !user_opt('s')) return; // åñëè â îïöèÿõ çàïðåùåíî
884    var audio = new Audio(url);
885    if(silent!=1) audio.play();
886//    newdiv("<audio style='position:absolute;width:1px;height:1px;overflow:hidden;left:-40px;top:0;opacity:0'"+(silent==1?'':" autoplay='autoplay'")+" src=\""+url+"\"></audio>",{id:'plays'+(silent==1?playsid++:'')});
887}
888
889function user_opt(s) { return typeof(useropt[s])=='undefined'?0:useropt[s]; };
890function go(s) { window.top.location=s; }
891
892h=function(s){
893    return (''+s)
894	.replace(/&(?![A-Za-z0-9]+;|#[0-9]+;|#x[0-9A-Fa-f]+;)/g,'&'+'amp;')
895	.replace(/</g, '&'+'lt;').replace(/>/g, '&'+'gt;')
896        .replace(/"/g, '&'+'quot;') // "
897        .replace(/'/g, '&'+'#039;'); // '
898};
899
900uh=function(s){
901    return (''+s)
902        .replace(/&quot;/g, '"')
903        .replace(/&#039;/g, "'")
904        .replace(/&lt;/g, '<')
905        .replace(/&gt;/g, '>')
906	.replace(/&amp;/g, '&');
907};
908
909h.dump = function(s){ return "<pre>"+h(s).replace(/\t/sg,blue('\\'+'t')).replace(/\r/sg,blue('\\'+'r')).replace(/\n/sg,blue('\\'+'n\n'))+"</pre>"; }
910
911function trim(s){ return s.replace(/\r/s,'').replace(/^\s+/s,'').replace(/\s+$/g,''); }
912
913// {_PLAY:
914
915var youtubeapiloaded=0;
916var mp3imgs={play:www_design+'img/play.png',pause:www_design+'img/play_pause.png',playing:www_design+'img/play_go.gif'};
917
918stopmp3x=function(ee){ ee.src=mp3imgs.play; setTimeout("clean('audiosrcx_win')",50); };
919
920changemp3x=function(url,name,ee,mode,viewurl,download_name) { //  // strt
921
922    if(url=='') url=ee.getAttribute('media-url');
923    if(name=='') name=ee.getAttribute('media-text'); if(!name) name='';
924
925    if(-1!=name.indexOf('</i>')) name=name.substring(name.split('</i>')[0].length+4);
926    // else if(-1!=name.indexOf('<img ')) name=name.substring(name.split('>')[0].length+1); 
927    name=name.replace(/<[^>]+>/gi,'');
928
929    var start=0,e;
930    var s=name.replace(/^\s*([\d\:]+)\s.*$/gi,'$1'); if(s!=name&&-1!=s.indexOf(':')) { s=s.split(':'); for(var i=0;i<s.length;i++) start=60*start+1*s[i]; }
931
932    var WWH="style='width:"+(Math.floor((getWinW()-50)*0.9))+"px;height:"+(Math.floor((getWinH()-50)*0.9))+"px;'";
933
934    if(/(youtu\.be\/|youtube\.com\/)/.test(url) || (url.indexOf('.')<0 && /(^|\/)(watch\?v\=|)([^\s\?\/\&]+)($|\"|\'|\?.*|\&.*)/.test(url))) { // "
935
936	var tt=url.split('?start=');
937	if(tt[1]) { start=1*tt[1]; url=tt[0]; } // ?start=1232343 â ñåêóíäàõ
938	else {
939	  var exp2=/[\?\&]t=([\dhms]+)$/gi; if(exp2.test(url)) { var tt=url.match(exp2)[0]; // ?t=7m40s -> 460 sec
940	    if(/\d+s/.test(tt)) start+=1*tt.replace(/^.*?(\d+)s.*?$/gi,"$1");
941	    if(/\d+m/.test(tt)) start+=60*tt.replace(/^.*?(\d+)m.*?$/gi,"$1");
942	    if(/\d+h/.test(tt)) start+=3600*tt.replace(/^.*?(\d+)h.*?$/gi,"$1");
943	  }
944	}
945
946	if(-1!=url.indexOf('://youtu') || -1!=url.indexOf('://www.youtu')) url=url.match(/(youtu\.be\/|youtube\.com\/)(embed\/|watch\?v\=|)([^\?\/]+)/)[3];
947
948	return ohelpc('audiosrcx_win','YouTube '+h(name),"<div id=audiosrcx><center>\
949<iframe "+WWH+" src=\"https://www.youtube.com/embed/"+h(url)+"?rel=0&autoplay=1"+(start?'&start='+start:'')+"\" frameborder='0' allowfullscreen></iframe>\
950</center></div>");
951    }
952
953    if(/([0-9a-z]{8}\-[0-9a-z]{4}\-[0-9a-z]{4}\-[0-9a-z]{4}\-[0-9a-z]{12})/.test(url)) { // Peertube
954	return ohelpc('audiosrcx_win','PeerTube '+h(name),"<div id=audiosrcx><center>\
955<iframe "+WWH+" sandbox='allow-same-origin allow-scripts allow-popups' src=\""+h(url)+"\" frameborder='0' allowfullscreen></iframe>\
956</div>");
957    }
958
959    if(/\.(mp4|avi|webm|mkv)$/.test(url)) s='<div>'+name+'</div><div><center><video controls autoplay id="audiidx" src="'+h(url)
960	+'" width="640" height="480"><span style="border:1px dotted red">ÂÀØ ÁÐÀÓÇÅÐ ÍÅ ÏÎÄÄÅÐÆÈÂÀÅÒ MP4, ÌÅÍßÉÒÅ ÅÃÎ</span></video></center></div>';
961
962    else if(/\.(jpg)$/.test(url)) { // panorama JPG
963	s='<div>'+name+"</div><div id='panorama' "+WWH+"></div>";
964	ohelpc('audiosrcx_win','<a class=r href="'+h(url)+'" title="download">'+h(url.replace(/^.*\//g,''))+'</a>','<div id=audiosrcx>'+s+'</div>');
965	return LOADS(["//cdnjs.cloudflare.com/ajax/libs/three.js/r69/three.min.js",wwwhost+'extended/panorama.js'],function(){panorama_jpg('panorama',url)});
966    }
967
968    else s='<div>'+name+'</div><div><center><audio controls autoplay id="audiidx"><source src="'+h(url)
969	+'" type="audio/mpeg; codecs=mp3"><span style="border:1px dotted red">ÂÀØ ÁÐÀÓÇÅÐ ÍÅ ÏÎÄÄÅÐÆÈÂÀÅÒ MP3, ÌÅÍßÉÒÅ ÅÃÎ</span></audio></center></div>';
970
971    if(!viewurl) viewurl=url.replace(/^.*\//g,'');
972    if(!download_name) download_name=url.replace(/^.*\//g,'');
973
974    if(e=dom('audiidx')) {
975        if(ee && ee.src && -1!=ee.src.indexOf('play_pause')){ ee.src=mp3imgs.playing; return e.play(); }
976        if(ee && ee.src && -1!=ee.src.indexOf('play_go')){ ee.src=mp3imgs.pause; return e.pause(); }
977        dom('audiosrcx',s);
978        posdiv('audiosrcx_win',-1,-1);
979        e=dom('audiidx');
980        e.currentTime=start;
981    } else {
982        ohelpc('audiosrcx_win','<a class=r href="'+h(url)+'" title="Download: '+h(download_name)+'" download="'+h(download_name)+'">'+h(viewurl)+'</a>','<div id=audiosrcx>'+s+'</div>');
983        e=dom('audiidx');
984        e.currentTime=start;
985    }
986
987    if(ee) addEvent(e,'ended',function(){ stopmp3x(ee) });
988    if(ee) addEvent(e,'pause',function(){ if(e.currentTime==e.duration) stopmp3x(ee); else ee.src=mp3imgs.pause; });
989    if(ee) addEvent(e,'play',function(){ ee.src=mp3imgs.playing; });
990}
991
992
993/*----------------------- */
994
995var fkey=0;
996function fpkey() {
997    return;
998/*
999    try{
1000        var q,i,h=0,s,v=document.createElement('canvas'),c=v.getContext('2d'),t='i9asdm..$#po((^@KbXrww!~cz';
1001        c.textBaseline="top";c.font="16px 'Arial'";c.textBaseline="alphabetic";c.rotate(.05);c.fillStyle="#f60";c.fillRect(125,1,62,20);c.fillStyle="#069";c.fillText(t,2,15);
1002        c.fillStyle="rgba(102,200,0,0.7)";c.fillText(t,4,17);c.shadowBlur=10;c.shadowColor="blue";c.fillRect(-20,10,234,5);s=v.toDataURL();
1003        if(s.length==0) return 0;for(i=0;i<s.length;i++){q=s.charCodeAt(i);h=((h<<5)-h)+q;h=h&h;} return h;
1004    }catch(e){return 0;}
1005*/
1006}
1007
1008function cot(e){e.style.display='none';e.nextSibling.style.display='inline';}
1009function delmat(e){ e.innerHTML=e.innerHTML.replace(/(\s|>
1009)(ïîäúåá|ïîäú¸á|çàåá|çà¸á|îòúåá|îòú¸á|áëÿ|áëÿä|áëÿò|âúåá|âûåá|äîëáîå|¸á|åáàë|åáàí|åáåí|åáë|åáóù|åáó÷|çàåá|ìàíä|ìóäà|ìóäå|ìóäè|ìóäî|ïèäàð|ïèäîð|ïèçä|óåá|õóå|õó¸|õóé|õóþ|õóÿ|õóè)/gi,"$1<span style='cursor:pointer' onclick=\"this.innerHTML='$2'\">***</span>"); }
1010
1011
1012/*********************** majax ***********************/
1013
1014var ajaxmgif = "<img src='"+www_design+"img/ajaxm.gif'>";
1015var ajaxgif = "<img src='"+www_design+"img/ajax.gif'>";
1016function ajaxon(){ var id='ajaxgif'; mkdiv(id,ajaxgif,'popup'); posdiv(id,15+mouse_x,15+mouse_y); } // @
1017// LLLLLLLLLLLL    ajaxonn=ajaxon;  // @
1018function ajaxoff(){ clean('ajaxgif'); } // @
1019var majax_lastu='',majax_lasta={},majax_err=1; // @
1020function tryer(er,e,js){ alert(er+': '+e.name+'\n\n'+js);} // @
1021
1022function mjax(url,a,id) { // @
1023    if(!id) id='im_'+(++hid);
1024    var pref=xdomain+www_ajax;
1025    if(url.indexOf('://')<0 && url.substring(0,1)!='/') { if(typeof(postMessage)=='function') url=pref+url; else url=pref+'frame.htm#'+url; }
1026    helpc(id+'_r',"<iframe style='width:300px;height:100px;margin:0;padding:0;max-width:none !important;' frameborder=0 hspace=0 marginheight=0 marginwidth=0 vspace=0 \
1027scrolling='no' \
1028onload='ajaxoff()' name='"+id+"' id='"+id+"'></iframe>");
1029    ajaxon();
1030    postToIframe(a,url+'?mjax='+id+'&w='+getWinW()+'&h='+getWinH(),id);
1031}
1032
1033function old_majax(url,a,js) { majax_lasta=cphash(a); majax_lastu=url; // @
1034    ajaxform(0,url,a,js);
1035}
1036
1037function mijax(u,a) {
1038    // if(typeof(up)!='undefined') a['up']=up;  ÍÅÒ ÁËßÒÜ! ÍÅ ÑÂÅÒÈÒÜ ÑÂÎÞ ÀÂÒÎÐÈÇÀÖÈÞ ÍÀ ×ÓÆÎÌ ÑÀÉÒÅ
1039     u=urlajax(u);
1040     u+='?minj='+(new Date()).getTime();
1041    for(var i in a) u+='&'+encodeURIComponent(i)+'='+encodeURIComponent(a[i]);
1042    loadScr(u);
1043}
1044
1045function form_addpole(e,n,v) { // #
1046    if(n!='id'&&n!='action'&&n!='name'&&e[n]) return e[n].value=v;
1047    var t; if(browsertype==2//browser.isIE
1048    ){t=document.createElement("<input type='hidden' name='"+h(n)+"' value='"+h(v)+"'>"); e.appendChild(t);}
1049    else{ t=document.createElement("input"); e.appendChild(t); t.type="hidden"; t.name=n; t.value=v; }
1050}
1051
1052function mojaxform(e,url,ara) {return mojax(url,ara,'','FORM',e); }
1053
1054function old_ajaxform(e,url,ara) { url=urlajax(url); var z='lajax_'+(hid++);
1055    url=url+'?lajax='+z+'&rando='+Math.random();
1056    ara=addara(ara);
1057    mkdiv(z+'_ifr',"<iframe width=1 height=1 frameborder=0 hspace=0 marginheight=0 marginwidth=0 vspace=0 name='"+z+"' id='"+z+"'></iframe>",'popup');
1058    if(typeof(e)=='object') { // óæå ôîðìà åñòü
1059	e.id=z+'_form0';
1060	e.target=z; e.enctype='multipart/form-data'; e.action=url; e.method='POST';
1061	e.setAttribute("target",z); e.setAttribute("enctype",'multipart/form-data'); e.setAttribute("action",url); e.setAttribute("method",'POST');
1062	if(ara) for(var i in ara) if(typeof(i)=='string') form_addpole(e,i,ara[i]);
1063	ajaxon(); return true;
1064    }
1065    postToIframe(ara,url,z);
1066}
1067
1068mojax_get_pole_ara=get_pole_ara=function(w,onlych) { var k=0,ara={names:''}; var el=['input','textarea','select']; w=dom(w);
1069        for(var j=0;j<el.length;j++){ var e=w.getElementsByTagName(el[j]); for(i=0;i<e.length;i++)
1070                        if(typeof(e[i].name)!='undefined' && e[i].name!=''
1071&& ( onlych!=1 || e[i].type=='hidden' || typeof(e[i].defaultValue)=='undefined' || e[i].value!=e[i].defaultValue)
1072) {
1073    var b=el[j]+':'+e[i].type;
1074
1075    if(b=='input:radio' && !e[i].checked) continue; // òîëüêî íàæàòûå
1076
1077    else if(b=='input:file') {
1078	if(e[i].value=='') continue; // ïóñòûõ ôàéëîâ íàì íå íàäî
1079	var p=e[i].files,nf=e[i].name.replace(/\[\]/g,'_'),q; for(q=0;q<p.length;q++) { ara[nf+q]=p[q]; ara['names']+=' '+nf+q; k++; }
1080	continue;
1081    } else if(b=='input:checkbox') {
1082	ara[e[i].name]=e[i].checked?1:0;
1083    } else {
1084        ara[e[i].name]=e[i].value;
1085	if(typeof(e[i].defaultValue)!='undefined') e[i].defaultValue=e[i].value;
1086    }
1087
1088    ara['names']+=' '+e[i].name; k++;
1089}
1090        }
1091        return (k==0?false:ara);
1092};
1093
1094
1095function find_form(e) { while(e.tagName!='FORM'&&e.parentNode!=undefined) e=e.parentNode; if(e.parentNode==undefined) idie('e.form error'); return e; }
1096
1097function mojax_send_this_form(e,mjphp,m,onlych) { while(e.tagName!='FORM'&&e.parentNode!=undefined) e=e.parentNode; // ---
1098    if(e.parentNode==undefined) return false; var ara=mojax_get_pole_ara(e,onlych);
1099    if(ara===false) return false; for(var i in m) ara[i]=m[i]; majax(mjphp,ara); return false;
1100}
1101function old_send_this_form(e,mjphp,m,onlych) { while(e.tagName!='FORM'&&e.parentNode!=undefined) e=e.parentNode; // ---
1102    if(e.parentNode==undefined) return false; var ara=get_pole_ara(e,onlych);
1103    if(ara===false) return false; for(var i in m) ara[i]=m[i]; majax(mjphp,ara); return false;
1104}
1105
1106
1107// ôóíêöèÿ ïîñòèò îáúåêò-õýø content â âèäå ôîðìû ñ íóæíûì action, target
1108// íàïð. postToIframe({a:5,b:6}, '/count.php', 'frame1')
1109
1110function repostToIframe(id,a){ var f=dom(id+'_form');
1111    if(!f) f=dom(id+'_form0');
1112    if(!f) idie('Repostiframe err:'+h(id));
1113    if(!a) a={}; a.repostform=1*(!f.repostform?0:1*f.repostform.value+1);
1114    for(var x in a) form_addpole(f,x,a[x]);
1115    f.submit();
1116} // åùå ðàç òó æå ôîðìó çàïîñòèòü, òîëüêî ìîæíî äîáàâèòü äàííûå
1117
1118function postToIframe(ara,url,id){
1119    ara=addara(ara);
1120    var f=document.createElement("form"); f.style.display="none"; f.id=id+'_form';
1121    f.enctype="application/x-www-form-urlencoded"; f.method="POST"; document.body.appendChild(f);
1122    f.action=url; f.target=id; f.setAttribute("target",id);
1123    for(var x in ara) form_addpole(f,x,ara[x]);
1124    f.submit();
1125}
1126
1127ifhelpc=function(src,id,head,X,Y){ if(!id) id='ifram'; X=(!X?1:X);Y=(!Y?1:Y);
1128    if(!head) head='iframe '+h(src);
1129    if(typeof(postMessage)!='function') src=www_ajax+'frame.htm#'+src;
1130    var s="<iframe name='"+id+"_ifr' id='"+id+"_ifr' src='"+src+"' onload='ajaxoff();' style='width:"+X+"px;height:"+Y+"px;'></iframe>";
1131    if(id=='xdomain') newdiv(s,{id:id});
1132    else { ohelpc(id,head,s); ajaxon(); }
1133};
1134
1135
1136/***************** MAJAX NEW **********************/
1137/*
1138function md5(s) { var e='',c,z,f=s.length;
1139    for(var i=0;i<f;i++) { c=s[i];z=c.charCodeAt(0); e+=z<256 ?c:String.fromCharCode(z&0x00FF)+String.fromCharCode((z&0xFF00)>>8); }
1140    return smd5(e);
1141}
1142*/
1143
1144function md5 ( str ) {  // Calculate the md5 hash of a string Webtoolkit.info (http://www.webtoolkit.info/) namespaced by: Michael White (http://crestidg.com)
1145        var RotateLeft = function(lValue, iShiftBits) { return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits)); };
1146        var AddUnsigned = function(lX,lY) {
1147                var lX4,lY4,lX8,lY8,lResult;
1148                lX8 = (lX & 0x80000000);
1149                lY8 = (lY & 0x80000000);
1150                lX4 = (lX & 0x40000000);
1151                lY4 = (lY & 0x40000000);
1152                lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
1153                if(lX4 & lY4) return(lResult ^ 0x80000000 ^ lX8 ^ lY8);
1154                if(lX4 | lY4) if(lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); else return(lResult ^ 0x40000000 ^ lX8 ^ lY8);
1155                else return (lResult ^ lX8 ^ lY8);
1156            };
1157        var F = function(x,y,z) { return (x & y) | ((~x) & z); };
1158        var G = function(x,y,z) { return (x & z) | (y & (~z)); };
1159        var H = function(x,y,z) { return (x ^ y ^ z); };
1160        var I = function(x,y,z) { return (y ^ (x | (~z))); };
1161
1162        var FF = function(a,b,c,d,x,s,ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b); };
1163        var GG = function(a,b,c,d,x,s,ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b); };
1164        var HH = function(a,b,c,d,x,s,ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b); };
1165        var II = function(a,b,c,d,x,s,ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b); };
1166
1167        var ConvertToWordArray = function(str) {
1168                var lWordCount;
1169                var lMessageLength = str.length;
1170                var lNumberOfWords_temp1=lMessageLength + 8;
1171                var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
1172                var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
1173                var lWordArray=Array(lNumberOfWords-1);
1174                var lBytePosition = 0;
1175                var lByteCount = 0;
1176                while ( lByteCount < lMessageLength ) {
1177                    lWordCount = (lByteCount-(lByteCount % 4))/4;
1178                    lBytePosition = (lByteCount % 4)*8;
1179                    lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount)<<lBytePosition));
1180                    lByteCount++;
1181                }
1182                lWordCount = (lByteCount-(lByteCount % 4))/4;
1183                lBytePosition = (lByteCount % 4)*8;
1184                lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
1185                lWordArray[lNumberOfWords-2] = lMessageLength<<3;
1186                lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
1187                return lWordArray;
1188            };
1189
1190        var WordToHex = function(lValue) {
1191                var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
1192                for (lCount = 0;lCount<=3;lCount++) {
1193                    lByte = (lValue>>>(lCount*8)) & 255;
1194                    WordToHexValue_temp = "0" + lByte.toString(16);
1195                    WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
1196                }
1197                return WordToHexValue;
1198            };
1199
1200        var x=Array();
1201        var k,AA,BB,CC,DD,a,b,c,d;
1202        var S11=7, S12=12, S13=17, S14=22;
1203        var S21=5, S22=9 , S23=14, S24=20;
1204        var S31=4, S32=11, S33=16, S34=23;
1205        var S41=6, S42=10, S43=15, S44=21;
1206
1207        // str = this.utf8_encode(str);
1208        x = ConvertToWordArray(str);
1209        a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
1210
1211        for(k=0;k<x.length;k+=16) {
1212            AA=a; BB=b; CC=c; DD=d;
1213            a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
1214            d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
1215            c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
1216            b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
1217            a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
1218            d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
1219            c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
1220            b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
1221            a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
1222            d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
1223            c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
1224            b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
1225            a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
1226            d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
1227            c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
1228            b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
1229            a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
1230            d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
1231            c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
1232            b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
1233            a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
1234            d=GG(d,a,b,c,x[k+10],S22,0x2441453);
1235            c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
1236            b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
1237            a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
1238            d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
1239            c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
1240            b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
1241            a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
1242            d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
1243            c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
1244            b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
1245            a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
1246            d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
1247            c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
1248            b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
1249            a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
1250            d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
1251            c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
1252            b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
1253            a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
1254            d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
1255            c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
1256            b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
1257            a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
1258            d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
1259            c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
1260            b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
1261            a=II(a,b,c,d,x[k+0], S41,0xF4292244);
1262            d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
1263            c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
1264            b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
1265            a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
1266            d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
1267            c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
1268            b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
1269            a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
1270            d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
1271            c=II(c,d,a,b,x[k+6], S43,0xA3014314);
1272            b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
1273            a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
1274            d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
1275            c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
1276            b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
1277            a=AddUnsigned(a,AA);
1278            b=AddUnsigned(b,BB);
1279            c=AddUnsigned(c,CC);
1280            d=AddUnsigned(d,DD);
1281        }
1282        var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
1283        return temp.toLowerCase();
1284}
1285
1286//================================================================================
1287function is_XHR(){ return typeof(XMLHttpRequest)!='undefined' || typeof(XDomainRequest)!='undefined'; }
1288function majax(url,ara,js,METHOD,form,size) {
1289    if(mnogouser==1) { var k=url+':'+ara.a; for(var i of ifrnames) if(k==i) return mjax(url,ara); }
1290    return is_XHR()?mojax(url,ara,js,METHOD,form,size):old_majax(url,ara,js);
1291}
1292function ajaxform(e,url,ara) { return is_XHR()?mojaxform(e,url,ara):old_ajaxform(e,url,ara); }
1293function send_this_form(e,mjphp,m,onlych) { return is_XHR()?mojax_send_this_form(e,mjphp,m,onlych):old_send_this_form(e,mjphp,m,onlych); }
1294
1295var lastzig='';
1296
1297arazig=function(ara) {
1298    var r=[]; for(var i in ara) r.push(i); r=r.sort(); var zig=''; for(var i in r) {
1299	if(typeof(ara[r[i]])!='object') zig+=r[i]+','; // +'='+lenlen(''+ara[r[i]])+','; // ôîòêè íå ñ÷èòàåì âîîáùå, íàõóé
1300    }
1301    var m=md5(mojaxsalt+'|'+zig);
1302    lastzig=mojaxsalt+'|'+zig+'/'+m;
1303    return m;
1304};
1305
1306
1307
1308
1309// progress.run(0, function(){ alert('Error: timeout'); });
1310// progress.stop(1);
1311progr = {
1312    total: 30000,
1313    now: 0,
1314    timeout: 100,
1315    id: 0,
1316    fn: function(){},
1317    run: function(x, fn) {
1318
1319            if(x===0) { progr.now=0; progr.fn=function(){}; }
1320            if(fn) progr.fn=fn;
1321
1322        if(dom('progr_info')) dom('progr_info', 1*progr.now+' '+1*progr.timeout);
1323
1324            if(x!=undefined && !progr.id) progr.id=setInterval(progr.run,progr.timeout);
1325
1326            progr.now += progr.timeout;
1327
1328            if(progr.now >= progr.total) {
1329                    clearInterval(progr.id); progr.id=false;
1330                    return progr.fn();
1331            }
1332
1333        progr.set( Math.floor(100*progr.now/progr.total) );
1334    },
1335    stop: function() {
1336        let q=dom('progr'); if(q) document.body.removeChild(q);
1337        if(progr.id) { clearInterval(progr.id); progr.id=false; }
1338    },
1339    set: function(prc){
1340        prc = Math.max(0, Math.min(100, prc|0));
1341
1342        let p = document.getElementById('progr');
1343        if(!p){
1344            p = document.createElement('div');
1345            p.id = 'progr';
1346            p.innerHTML = `
1347            <div class="bar">
1348                <div class="fill"></div>
1349                <div class="label"></div>
1350            </div>`;
1351            document.body.appendChild(p);
1352
1353            const st = document.createElement('style');
1354            st.textContent = `
1355#progr{position:fixed;left:0;bottom:0;width:100%;height:20px;z-index:99999}
1356#progr .bar{position:relative;height:100%;border:1px solid #666;background:#fff;overflow:hidden}
1357#progr .fill{height:100%;width:0%;
1358  background:linear-gradient(to right, #0a0, #ff0, #f00);
1359  background-repeat:no-repeat;
1360  background-position:left top;
1361  background-size:100% 100%;
1362}
1363#progr .label{position:absolute;left:0;top:0;width:100%;height:100%;
1364  display:flex;align-items:center;justify-content:center;
1365  font:18px/20px sans-serif;color:#000;pointer-events:none;
1366}`;
1367            document.head.appendChild(st);
1368            // чтобы при ресайзе не “плыла карта цветов”
1369            window.addEventListener('resize', () => progr.set(prc));
1370        }
1371
1372        const bar = p.querySelector('.bar');
1373        const fill = p.querySelector('.fill');
1374        const label = p.querySelector('.label');
1375
1376        fill.style.width = prc + '%';
1377        // вот ключ: градиент “натянут” на ПОЛНУЮ ширину бара, а не на fill
1378        fill.style.backgroundSize = bar.clientWidth + 'px 100%';
1379        label.textContent = prc + '%';
1380    }
1381
1382};
1383
1384progress=function(name,now,total,text) {
1385    if(!total) return progr.stop();
1386    progr.set(Math.floor(100*(now/total)));
1387};
1388
1389/*
1390progress=function(name,now,total,text) { name='progress'+(name?'_'+name:'');
1391    if(!dom(name)) { if(!total) return;
1392            helpc(name,"\
1393<div id='"+name+"_proc' style='text-align:center;font-size:23px;font-weight:bold;color:#555;'>0 %</div>\
1394<div id='"+name+"_tab' style='width:"+Math.floor(getWinW()/2)+"px;border:1px solid #666;'>\
1395<div id='"+name+"_bar' style='width:0;height:10px;background-color:red;'></div></div>");
1396    } else if(!total) return clean(name);
1397    var proc=Math.floor(1000*(now/total))/10;
1398    var W=1*dom(name+'_tab').style.width.replace(/[^\d]+/g,'');
1399    dom(name+'_bar').style.width=Math.floor(proc*(W/100))+'px';
1400    if(!text) text=''+proc+' %'; else text=text.replace(/\%\%/g,proc);
1401    dom(name+'_proc',text);
1402};
1403*/
1404
1405ProgressFunc=function(e){ progress('ajax',e.loaded,e.total,sizer(e.total)+': %% %'); };
1406
1407function catcherr(txt,e,code){
1408    ohelpc('JSerr','JS error: '+h(txt),"<font color=red><b><big>"+h(e.name)+": "+h(e.message)+"</big></b></font>"
1409	+"<br><b>"+h(majax_lastu)+' {'+h(print_r(majax_lasta))+" }</b>"
1410        +"<div style='border:1px dotted red'>"+h(e.stack)+"</div>"
1411    +h(code).replace(/\n/g,"<br>"));
1412}
1413
1414function addara(ara) {
1415    if(typeof(hashpage)!='undefined') ara.hashpage=hashpage;
1416    if(typeof(up)!='undefined') ara.up=up;
1417    if(typeof(acn)!='undefined') ara.acn=acn;
1418    if(typeof(ux)!='undefined') ara.ux=ux;
1419    if(typeof(upx)!='undefined') ara.upx=upx;
1420    if(typeof(mylang)!='undefined') ara.mylang=mylang;
1421    return ara;
1422}
1423
1424function mojax(url,ara,js,METHOD,form) { if(!url.indexOf) { alert('Mojax error url: '+url); return false; } url=urlajax(url);
1425    majax_lasta=cphash(ara); majax_lastu=url; // äëÿ îòëàäêè
1426    ara=addara(ara);
1427
1428    if(!METHOD) { // âûáðàòü ìåòîä
1429	var ara_len=0; for(var i in ara) ara_len++;
1430	var DD=Math.max(36*ara_len,256); // ñêîëüêî áàéò äîáàâèò POST form-data?
1431	U=0; for(var i in ara) {
1432	    if(typeof(ara[i])=='object') { METHOD='FORM'; break; }
1433	    U+=(encodeURIComponent(i+ara[i]).length - (i+ara[i]).length); // ñêîëüêî áàéò äîáàâèò êàæäûé ñëåäóþùèé form-urlencoded?
1434	    if(U>DD) { METHOD='FILE'; break; } // êàê òîëüêî ñòàëî äîðîæå - FILE
1435	}
1436	if(!METHOD) { if(U<256 && (''+document.location).substring(0,7)!='http://') METHOD='GET'; else METHOD='POST'; } // åñëè ðå÷ü î êîïåéêàõ, òî ïðîñòî GET, èíà÷å POST form-urlencoded
1437    }
1438
1439    ajaxon();
1440
1441    var x = new XMLHttpRequest();
1442
1443    x.onload=x.onerror=function(){
1444        if(this.status==200) {
1445	    ajaxoff();
1446	    progress('ajax');
1447	    if(js) { try{ if(typeof(js)=='string') eval(js); else if(js(x.responseText)===true) return; } catch(e){catcherr("Mojax JS",e,js)} }
1448	    var m=x.responseText.split('**'+'/');
1449	    if(!m[1]&&m[0]!='/'+'**') { var er='',ev=m[0]; }
1450	    else { var er=m[0].replace(/^\/[\*]+/g,''),ev=m[1]; }
1451	    if(er!='') ohelpc('SerErr','Server Error',h(er).replace(/\n/g,"<p>"));
1452	    ev=ev.replace(/\&\#10017\;\&\#10017;\//g,'**'+'/');
1453	    try{eval(ev)}catch(e){catcherr("Mojax RESULT",e,ev)}
1454	} else { salert('Mojax Error ['+url+']: '+this.status+': '+this.statusText,2000); ajaxoff(); }
1455      };
1456
1457    if(METHOD=='GET') {
1458	var o=''; for(var i in ara) o+='&'+h(i)+'='+encodeURIComponent(ara[i]); o='zi='+arazig(ara)+o; // êèäàåì çèãó
1459	x.open("GET",url+'?'+o,true);
1460	x.send();
1461	return; // íåëüçÿ false!!!!
1462    }
1463
1464    if(METHOD=='POST') {
1465	var o=''; for(var i in ara) o+='&'+h(i)+'='+encodeURIComponent(ara[i]); o='zi='+arazig(ara)+o.replace(/%20/g,'+'); // êèäàåì çèãó
1466	x.open("POST",url,true);
1467	x.setRequestHeader('Content-type','application/x-www-form-urlencoded');
1468	// x.setRequestHeader('Content-length',o.length);
1469	// x.setRequestHeader('Connection','close');
1470	x.send(o);
1471	return; // íåëüçÿ false!!!!
1472    }
1473
1474    if(METHOD=='FILE') {
1475	var boundary=md5(String(Math.random()).slice(2));
1476	var o=['\r\n']; for(var i in ara) o.push('Content-Disposition: form-data; name="'+i+'"\r\n\r\n'+ara[i]+'\r\n');
1477	o.push('Content-Disposition: form-data; name="zi"\r\n\r\n'+arazig(ara)+'\r\n');
1478	o=o.join('--'+boundary+'\r\n')+'--'+boundary+'--\r\n';
1479
1480	if(o.length>20*1024) x.upload.onprogress=ProgressFunc;
1481	x.open("POST",url,true);
1482	x.setRequestHeader('Content-Type','multipart/form-data; boundary='+boundary);
1483	x.setRequestHeader('Content-length',o.length);
1484	x.setRequestHeader('Connection','close');
1485	x.send(o);
1486	return; // íåëüçÿ false!!!!
1487    }
1488
1489    if(METHOD=='FORM') {
1490	// if(!form) { idie('mojax error: FORM'); return false; }
1491
1492	var FD=new FormData();
1493	var a=(form ? get_pole_ara(form) || {} : {});
1494
1495	for(var i in ara) a[i]=ara[i];
1496	var size=0; for(var i in a) { FD.append(i,a[i]); size+=typeof(a[i])=='object'?a[i].size:(''+a[i]).length; }
1497	if(size>20*1024) x.upload.onprogress=ProgressFunc;
1498	FD.append('zi',arazig(a)); // êèäàåì çèãó
1499	x.open("POST",url,true);
1500	x.send(FD);
1501	return false;
1502    }
1503
1504    idie('Mojax: unknoun method');
1505    return false;
1506}
1507
1508/// animate
1509function noanim(e) { e.className=(e.className||'').replace(/ *[a-z0-9]+ animated/gi,''); };
1510
1511function anim(e,i,fn,animeffect) {
1512    if(!e) return -1; // íåò îáúåêòà
1513    if(!user_opt('ani')&&!animeffect) { if(fn)fn(); return -2; } // íåò àíèìàöèè
1514    noanim(e); var c=e.className; e.className=(c==''?i:c+' '+i)+' animated';
1515    if( typeof(dom(e).onanimationend) != 'object' ) {
1516	if(!e.animate) { if(fn)fn(); return -3; } // ñîâñåì íåò àíèìàöèè
1517	setTimeout(function(){noanim(e);if(fn)fn();},1000); // åñëè íåò ñîáûòèÿ êîíöà àíèìàöèè - òî ïðîñòî òàéìàóò ñåêóíäó
1518	return -4;
1519    }
1520    var fs=function(){ removeEvent(e,'animationend',fs); noanim(e); if(fn)fn(); };
1521    addEvent(e,'animationend',fs);
1522    return 0;
1523}
1524
1525// AJAX from ESP8266 v3
1526AJAX=function(url,opt,s) {
1527
1528  if(!opt) opt={}; else if(typeof(opt)=='function') opt={callback:opt};
1529  var async=(opt.async!==undefined?opt.async:true);
1530  try{
1531    if(!async && !opt.callback) opt.callback=function(){};
1532    if(!opt.noajax) ajaxon();
1533    var xhr=new XMLHttpRequest();
1534
1535    xhr.onreadystatechange=function(){
1536      // idie('readyState='+this.readyState+' status='+this.status);
1537    try{
1538      if(this.readyState==4) {
1539        if(!opt.noajax) ajaxoff();
1540	progress('ajax');
1541	if(this.status==200 && this.responseText!=null) {
1542            if(this.callback) this.callback(this.responseText,url,s);
1543            else eval(this.responseText);
1544	} else if(this.status==500) {
1545	    if(this.onerror) this.onerror(this.responseText,url,s);
1546	    else if(opt.callback) opt.callback(false,url,s);
1547	}
1548      }
1549     } catch(e){
1550	    dier(e);
1551	    alert('Error Ajax: '+e.name
1552		+'\n\n'+e.message
1553		+'\n\n'+e.stack
1554		+'\n\n'
1555		+this.responseText);
1556	}
1557    };
1558
1559    for(var i in opt) xhr[i]=opt[i];
1560    // if(opt.error) xhr.onerror=opt.error;
1561    // if(opt.timeout) xhr.timeout=opt.timeout;
1562    // if(opt.ontimeout) xhr.ontimeout=opt.ontimeout;
1563    // dier(xhr);
1564
1565    xhr.open((opt.method?opt.method:(s?'POST':'GET')),url,async);
1566
1567    if(s) {
1568        if(typeof(s)=='object' && !(s instanceof FormData) ) {
1569          var formData = new FormData();
1570          for(var i in s) formData.append(i,s[i]);
1571          var k=0; Array.from(formData.entries(),([key,D])=>(k+=(typeof(D)==='string'?D.length:D.size)));
1572          if(k>20*1024) xhr.upload.onprogress=ProgressFunc;
1573          xhr.send(formData);
1574        } else xhr.send(s);
1575    } else xhr.send();
1576
1577    if(!async) return ( (xhr.status == 200 && xhr.readyState == 4)?xhr.responseText:false ); //xhr.statusText=='OK' // â õðîìå íå ðàáîòàåò áëÿòü
1578
1579  } catch(e) { if(!async) return false; }
1580};
1581
1582function AGET(url,s) { return AJAX(url,{noajax:1,async:false},s); } // àñèíõðîííî ïðîñòî âåðíóòü ðåçóëüòàò
1583
1584function AJ(url,callback,s) { AJAX(url,{callback:callback,noajax:1},s); }
1585
1586function AJC(name,period,url,callback,s) { if(!period) period=600;
1587    var t=1*(f5_read(name+'_time'));
1588    var V=''+f5_read(name);
1589    var T=parseInt(new Date().getTime()/1000);
1590    if( (T < (t+period) ) && V!='') { if(callback) callback(V,url); } // âåðíóòü êýø
1591    // èíà÷å íà÷àòü AJAX
1592    var xhr=new XMLHttpRequest(); xhr.onreadystatechange=function(){ if(this.readyState==4 && this.status==200 && this.responseText!=null) {
1593            f5_save(name,this.responseText);
1594            f5_save(name+'_time',T);
1595            if(callback) callback(this.responseText,url);
1596    }};
1597    xhr.open((s?'POST':'GET'),url);
1598    if(s) xhr.send(s); else xhr.send();
1599}
1600
1601
1602// ==============================================
1603// êàíäèäàòû íà áëèæàéøèé èçãî íàõóé (íà÷èíàì îòñëåæèâàòü, ïîíàäîáèòñÿ ëè ÷òî-òî èç ýòîãî, íà÷èíàÿ ñ 4 äåêàáðÿ 2019):
1604loadCSS=function(src){ return LOADS(www_css+src); };
1605loadScript=function(src,f){ return LOADS(urlajax(src,www_js),f); };
1606loadStyle=loadScr=LOADS;
1607
1608
1609function loadScriptBefore(src,runtext){ // ########### DEL ###########
1610    if(unic==4) alert("loadScriptbefore: "+src);
1611    if(JSload[src]=='load') return eval(runtext); if(JSload[src]) return; JSload[src]=runtext; loadScript(src);
1612}
1613
1614
1615var playsid=0;
1616playswf=function(a,silent){ if(unic==4) alert('playswf');
1617
1618a=a.replace(/\.mp3$/gi,''); // silent: 1 - ÔÏÌØËÏ ÚÁÇÒÕÚÉÔØ, 0 - ÐÅÔØ, 2 - ÐÅÔØ îåðòåíåîîï, ÎÅ ×ÚÉÒÁÑ ÎÁ ÎÁÓÔÒÏÊËÉ
1619if(silent!=2 && typeof('user_opt')!='undefined' && !user_opt('s')) return; // åñëè â îïöèÿõ çàïðåùåíî
1620var s=www_design+'mp3playerns.swf?autostart='+(silent==1?'no':'yes')+'&file='+a+'.mp3';
1621var id='plays'+(silent==1?playsid++:'');
1622mkdiv(id,"<div style='position:absolute;width:1px;height:1px;overflow:hidden;left:-40px;top:0;opacity:0'>\
1623<audio"+(silent==1?'':" autoplay='autoplay'")+">\
1624<source src='"+a+".mp3' type='audio/mpeg; codecs=mp3'>\
1625<object width='1' height='1' \
1626style='width:1px;height:1px;overflow:hidden;position:absolute;
1626left:-400px;top:0;border:0;'>\
1627<param name='movie' value='"+s+"' />\
1628<embed src='"+s+"' width='1' height='1' loop='false' type='application/x-shockwave-flash'>\
1629</embed></object></audio></div>");
1630dom.on(id);
1631} // <source src='"+a+".ogg' type='audio/ogg; codecs=vorbis'>\
1632
1633
1634
1635
1636//=======================================================
1637// âûíîñèì âíåäðÿþùèåñÿ ñêðèïòû íàõóé
1638
1639/*
1640
1641if(typeof(MutationObserver) == 'function') { try {
1642
1643var JS_BL="ulogin.ru highcharts.com rgraph.net RGraph.SVG revolvermaps.com jquery.com /"+"*lleo*"+"/ (i,s,o,g,r,a,m) google-analytics.com (m,e,t,r,i,k,a) yandex.ru/metrika counter.yadro.ru ipadfinger4()".split(" ");
1644// if(admin) JS_BL="";
1645
1646var JS_POGAN=[];
1647
1648poganAlert=function(){
1649    newdiv('Scripts:'+JS_POGAN.length,{id:'poganAlert',cls:'rama'});
1650    var e=dom('poganAlert').style;
1651    e.position='absolute'; e.top='50px'; e.left='50px'; e.zIndex='50'; e.cursor='pointer'; e.align='left';
1652    e.background='red';
1653    dom('poganAlert').onclick=function(){
1654	var lim=150;
1655	var o='<b>×óæîé ãîâíîêîä ïûòàëñÿ âëåçòü â ñòðàíèöó (îíà âåäü íå https), íî ìû åãî çàñåêëè íà ïîäë¸òå è âû÷èñòèëè íàõóé:</b>';
1656	for(var i in JS_POGAN) { var l=JS_POGAN[i].replace(/\r/,'').replace(/\n/,' '); o+="<p>"+(1*i+1)+'. '+h(l.length<lim?l:l.substring(0,lim)+" [...]"); }
1657	o+="<p><b>Åñëè âû ñ÷èòàåòå, ÷òî ýòî áûëî ÷òî-òî ðîäíîå, è ñòðàíèöà áåç ýòîãî ïëîõî ðàáîòàåò, ïîæàëóéñòà, íàïèøèòå ìíå.</b>";
1658	clean('poganAlert');
1659	helpc('poganAlertList2','<div class=r>'+o+'</div>');
1660	JS_POGAN=[];
1661    };
1662}; page_onstart.push("setTimeout('if(JS_POGAN.length) poganAlert()',1000)");
1663
1664const observer = new MutationObserver(function(mutationsList, observer) {
1665    for(let mutation of mutationsList) for(let node of mutation.addedNodes) {
1666	if(node.nodeName == "SCRIPT") {
1667		var s=node.src; if(s=='' && typeof(node.textContent)!='undefined') s=node.textContent;
1668		if(-1!=s.indexOf('://'+MYHOST) || -1 != s.indexOf('://kz.'+MYHOST)) continue;
1669		    var naiden=0;
1670		    for(var i in JS_BL) { if(JS_BL[i]=='') continue; if(-1 != s.indexOf(JS_BL[i])) { naiden=1; break; } }
1671		    if(!naiden) { node.parentNode.removeChild(node); JS_POGAN.push(s); } // alert('Çàáëîêèðîâàí ïîäîçðèòåëüíûé ñêðèïò: '+s);
1672	}
1673    }
1674}); observer.observe(document,{ attributes: true, childList: true, subtree: true });
1675
1676} catch(e) { alert('Err 12!'); }
1677
1678}
1679*/
1680
1681//=========================================================
1682
1683// ñêîïèðîâàòü
1684cpbuf=function(e,message){ if(typeof(e)=='object') e=e.innerHTML; // navigator.clipboard.writeText(e);
1685    var area = document.createElement('textarea');
1686    document.body.appendChild(area);
1687    area.value = e;
1688    area.select();
1689    document.execCommand('copy');
1690    document.body.removeChild(area);
1691    if(message===undefined) message=1000;
1692    if(message) salert('Copypasted:<p><b>'+(h(e).replace(/\n/g,'<br>'))+'</b>',1*message);
1693};
1694
1695cpbufh=function(e,message){ if(typeof(e)=='object') e=e.innerHTML;
1696    e=e.replace(/<\/p>/gi,'')
1697	.replace(/<p>/gi,"\n\n")
1698	.replace(/<br>/gi,"\n");
1699    cpbuf(e,message);
1700};
1701
1702Mailbox={
1703    write:function(e){MAIL("Mail.write("+e+")")}
1704};
1705
1706MAIL=function(cmd){ var ff=function(){eval(cmd)}; if(typeof(Mail)=='object') ff(); else Mbox.preload(ff); };
1707Mbox={
1708  preload:function(f,p){ LOADS([www_js+'jsonpro.js?'+Math.random(),www_css+'chat.css?'+Math.random()],function(x,p){f(p)}); },
1709/*
1710  mail:function(){ Mailbox.load(function(){Mail.All()}); },
1711  write:function(x){ Mailbox.load(function(){Mail.write({to:x})}); },
1712  Tread:function(x){ Mailbox.load(function(){Mail.Tread(x)}); },
1713*/
1714  check:function(){
1715    AJ(www_ajax+'json.php?a=mails&start=0&limit=20&his&time=0&new&opt=id,unicfrom,unicto,timecreate,timeread,text,answerid',function(p){
1716        if(p!='[]') Mbox.preload(function(x){Mail.New(x)},p);
1717	else doclass('mail_count',function(w){clean(w)});
1718    });
1719  },
1720
1721};
1722
1723/*****************************/
1724NFC={
1725    to: false,
1726    on: ()=>{
1727	if(NFC.to) clearTimeout(NFC.to);
1728	newdiv("<div style='display:table;height:100%;width:100%;'>"
1729		+"<div style='display:table-cell;vertical-align:middle;text-align:center'>"
1730		    +"<img src='"+www_design+"img/ajax.gif'>"
1731		+"</div>"
1732	    +"</div>",{id:'NFC.tenek',cls:'tenek'});
1733	var T=dom('NFC.tenek');
1734	T.style.backgroundColor="rgba(0, 0, 0, 0.8)";
1735	T.style.zIndex=999999;
1736	NFC.to=setTimeout('NFC.off()',10000);
1737    },
1738    off: ()=>{ clean('NFC.tenek'); },
1739    ndef: false,
1740    is: ()=>{ return ("NDEFReader" in window) },
1741    scan: async (m) => {
1742      if(!NFC.is()) {
1743	salert("Óâû, ýòîò áðàóçåð íå ïîääåðæèâàåò ÷òåíèå NFC-êàðò",4000);
1744      } else try {
1745        NFC.ndef = new NDEFReader();
1746        NFC.ndef.onreadingerror = (ev) => { NFC.off(); idie("Error! Cannot read the NFC tag."); };
1747        NFC.ndef.onreading = (ev) => { if(!dom('NFC.tenek')) return;
1748	    NFC.off();
1749            if(!m) return idie('Serial Number: <b><font color=green>'+h(ev.serialNumber)+'</font></b>');
1750            if(m=='set') return majax('module.php',{mod:'LOGIN',a:'setNFC',NFC:ev.serialNumber});
1751            if(m=='login') return majax('module.php',{mod:'LOGIN',a:'logNFC',NFC:ev.serialNumber});
1752	    const d = ev.message.records[0];
1753	    if(d) {
1754		    idie( ev.type+' '+d.recordType );
1755	            const uint8Array = new Uint8Array(d.data.buffer);
1756	            const text = new TextDecoder().decode(uint8Array);
1757    		    idie("DATA: " + text);
1758	    } else {
1759    		    idie("no data");
1760	    }
1761
1762	    // dier( ev.message.records[0] ); //; .data );
1763	    // dier( ev.message.records[0].toRecords() );
1764
1765        };
1766	await NFC.ndef.scan();
1767        NFC.on();
1768      } catch(error) { idie('Error NFC: '+h(error)); }
1769    },
1770    save: async (text, mode='text', lang='en') => {
1771      if(!NFC.is()) salert("áðàóçåð íå ïîääåðæèâàåò çàïèñü NFC-êàðò",4000);
1772      else try {
1773        NFC.on();
1774        // NFC.ndef = new NDEFReader();
1775	var records = { recordType: mode, data: text };
1776	if(lang) records.lang = lang;
1777        await new NDEFReader().write({ records: [records] });
1778	NFC.off();
1779	return true;
1780      } catch (err) { NFC.off(); alert('err:'+err); return false; }
1781    },
1782};
1783
1784// Îáíîâèòü êàðòèíêó âíóòðè êýøà âàøåãî ñðàíîãî áðàóçåðà, àäîâ õàê
1785recacheIMG=function(img,agetli) {
1786    var wd=document.querySelectorAll("IMG[src='"+img+"']");
1787    for(var q of wd) {
1788	//    q.style.width=q.clientWidth+'px';
1789	//    q.style.height=q.clientHeight+'px';
1790            q.onload=function(x){x=x.target; x.onload=false; setTimeout(function(){x.src=img},300); };
1791            q.src=wwwhost+'design/img/ajax.gif';
1792    }
1793
1794    if(img.indexOf('://')<0) var imgw=img;
1795    else var imgw=img.replace(/^[^\:]+\:\/\/[^\/]+/,'');
1796    imgw=imgw.substr(wwwhost.length);
1797    if(!agetli) var s=AGET(wwwhost+'cf?'+encodeURI(imgw));
1798
1799    var ifr = document.createElement("iframe");
1800    ifr.setAttribute("src",img);
1801    ifr.style.width = '1px';
1802    ifr.style.height = '1px';
1803    ifr.style.position = 'absolute';
1804    ifr.style.top = '0px';
1805    ifr.style.left = '0px';
1806    ifr.onload = ifr.onerror = function() {
1807        if(ifr.getAttribute('loadonce')!='yes') {
1808            ifr.setAttribute('loadonce','yes');
1809            ifr.contentWindow.location.reload(true);
1810        } else {
1811	    clean(ifr);
1812            for(var q of wd) q.onload=function(x){x=x.target; x.onload=false; x.src=img;};
1813        }
1814    }
1815    document.body.appendChild(ifr);
1816};
1817
1818function dobavil(id,s,ara) { newdiv(s,ara,dom(id),'last'); }
1819function dobavil1(id,s,ara) { newdiv(s,ara,dom(id),'first'); }
1820
1821/*
1822function functionStack(d){
1823  const error = new Error();
1824  const firefoxMatch = (error.stack.split('\n')[0 + d].match(/^.*(?=@)/) || [])[0];
1825  const chromeMatch = ((((error.stack.split('at ') || [])[1 + d] || '').match(/(^|\.| <| )(.*[^(<])( \()/) || [])[2] || '').split('.').pop();
1826  const safariMatch = error.stack.split('\n')[0 + d];
1827  // firefoxMatch ? console.log('firefoxMatch', firefoxMatch) : void 0;
1828  // chromeMatch ? console.log('chromeMatch', chromeMatch) : void 0;
1829  // safariMatch ? console.log('safariMatch', safariMatch) : void 0;
1830  return firefoxMatch || chromeMatch || safariMatch;
1831}
1832function_name=function(){ return functionStack(2);  };
1833*/
1834
1835lightgreen=function(s) { return "<font color='"+arguments.callee.name+"'>"+s+"</font>"; }
1836green=function(s) { return "<font color='"+arguments.callee.name+"'>"+s+"</font>"; }
1837red=function(s) { return "<font color='"+arguments.callee.name+"'>"+s+"</font>"; }
1838blue=function(s) { return "<font color='"+arguments.callee.name+"'>"+s+"</font>"; }
1839
1840// íîâûå îêíà
1841// onMoveObject(elem,fn,fntest)
1842// elem - ýëåìåíò, êîòîðûé ïðåäëàãàåòñÿ äâèãàòü ïî ýêðàíó (âèäèìî íåãî position:absolute äîëæíî áûòü)
1843// fn(e,x,y) - ñàìà ôóíêöèÿ äâèæåíèÿ ýëåìåíòà e ïî ñìåùåíèþ x è y, ëó÷øå ïîñòàâèòü false è äîâåðèòüñÿ äåôîëòíîé
1844// fntest(e) - ôóíêöèÿ ïðîâåðêè: åñëè ðàçðåøåíî äâèãàòü çà ýòîò ýëåìåíò, âîçâðàùàåò ýëåìåíò, èíà÷å false
1845//    ýòî ñäåëàíî ïîòîìó, ÷òî â îñíîâíîì ýëåìåíòå ìîãóò áûòü âñÿêèå ïîëÿ è âíóòðåííîñòè, çà êîòîðûå äâèãàòü íå íàäî
1846//    ýòè äâå ôóíêöèè ìîæíî íå óêàçûâàòü
1847npx=function(s) { return 1 * (s ? (''+s).replace(/[^\d\-\.]/g,'') : 0); }; // parseFloat('0'+s);
1848onMoveObject=function(elem,fn,fntest) { elem=dom(elem);
1849    elem.style.cursor='move';
1850
1851    if(!fn) fn=function(e,dx,dy) {
1852        var x,max=20;
1853        x=npx(e.style.left)+dx; x=Math.max(x,max-npx(e.clientWidth)); x=Math.min(x,getDocW()-max); e.style.left=x+'px';
1854        x=npx(e.style.top)+dy; x=Math.max(x,max-npx(e.clientHeight)); x=Math.min(x,getDocH()-max); e.style.top=x+'px';
1855    };
1856
1857    var m="touchstart touchmove touchend mousedown".split(' ');
1858    for(var l of m) elem.addEventListener(l,function(event) {
1859        var e=event.target;
1860        if(fntest && (e=fntest(e))===false) return;
1861        try{ event.preventDefault(); event.stopPropagation(); }catch(er){}
1862
1863        var mStart=function(x,y) { e.LastMovX=x; e.LastMovY=y; e.classList.add('active-mov'); };
1864        var fnRun=function(x,y) { fn(e, x-e.LastMovX, y-e.LastMovY); e.LastMovX=x; e.LastMovY=y; };
1865
1866        var pnt=e; while(pnt.parentNode) pnt=pnt.parentNode; // Èùåì Àäàìà
1867
1868        var fnMove=function(ev) { fnRun(ev.clientX,ev.clientY); try { ev.preventDefault(); }catch(er){} return false; };
1869        var fnUp=function(){ e.classList.remove('active-mov');pnt.removeEventListener("mousemove",fnMove); pnt.removeEventListener("mouseup",fnUp); };
1870        // íàæàëè ïàëüöåì
1871        if(event.type == 'touchstart') { mStart(event.targetTouches[0].pageX, event.targetTouches[0].pageY); }
1872        // íàæàëè ìûøü
1873        if(event.type == 'mousedown') { mStart(event.clientX, event.clientY); pnt.addEventListener("mousemove",fnMove); pnt.addEventListener("mouseup",fnUp); }
1874        // îòïóñòèëè ïàëåö
1875        if(event.type == 'touchend') { e.classList.remove('active-mov'); }
1876        // òÿíåì ïàëüöåì
1877        if(event.type == 'touchmove') { // òîëüêî 1 êàñàíèå
1878            if(event.targetTouches.length == 1) fnRun(event.targetTouches[0].pageX,event.targetTouches[0].pageY);
1879        }
1880    });
1881};
1882
1883// íîâûå ôóíêöèè DOM ÷òîá íå ñòûäíî áûëî çà áûäëîèìåíà
1884/*****************************/
1885lightgreen=function(s) { return "<font color='"+arguments.callee.name+"'>"+s+"</font>"; }
1886green=function(s) { return "<font color='"+arguments.callee.name+"'>"+s+"</font>"; }
1887red=function(s) { return "<font color='"+arguments.callee.name+"'>"+s+"</font>"; }
1888blue=function(s) { return "<font color='"+arguments.callee.name+"'>"+s+"</font>"; }
1889
1890dom=function(e,text){
1891    if(e===undefined) return false;
1892    if(text===undefined) return typeof(e)=='object' ? e : ((''+e).indexOf('.')===0 ? document.querySelectorAll(e)[0] : document.getElementById(e) );
1893    dom.s(e,text);
1894};
1895
1896dom.s=function(e,text) {
1897    if(typeof(e)!='object') {
1898        if(e.indexOf && e.indexOf('.')===0) return document.querySelectorAll(e).forEach(l=>l.innerHTML=text);
1899        e=dom(e);
1900    } if(!e) return '';
1901    if(text==undefined) return ( e.value!=undefined ? e.value : e.innerHTML );
1902    if(e.value!=undefined) e.value=text;
1903    else { if(e.innerHTML!=undefined) e.innerHTML=text; /*init_tip(e);*/ }
1904};
1905
1906dom.add=function(e,s,ara) { newdiv(s,ara,dom(e),'last'); };
1907
1908dom.add1=function(e,s,ara) { newdiv(s,ara,dom(e),'first'); };
1909
1910dom.on=function(e){ if(e=dom(e)) e.style.display='block'; };
1911
1912dom.off=function(e){ if(e=dom(e)) { e.style.display='none'; if(e.id!='tip') dom.off('tip'); } };
1913
1914dom.toggle=function(e){ if(e=dom(e)) { e.style.display = e.style.display==='none' ? 'block' : 'none'; if(e.id!='tip') dom.off('tip'); } };
1915
1916dom.class=function(e,text) { document.querySelectorAll( e.indexOf('.')===0?e:'.'+e ).forEach(l=>l.innerHTML=text) };
1917
1918// old
1919idd=zabil=dom; vzyal=dom.s; zakryl=dom.off; otkryl=dom.on;
1920function tudasuda(id) { if((id=dom(id))) if(id.style.display=='none') dom.on(id); else dom.off(id); }
1921function doclass(cla,f,s,node) { (node?node:document).querySelectorAll('.'+cla).forEach(e=>{f(e,s)}); }
1922function ifclass(id,l){ return dom(id).classList.contains(l) }
1923function classAdd(id,l){ dom(id).classList.add(l) }
1924function classDel(id,l){ dom(id).classList.remove(l) }
1925function zabilc(cla,s) { document.querySelectorAll('.'+cla).forEach(e=>{dom(e,s)}) }
1926
1927function view_ipinfo(ip){
1928    if(!(''+ip).length || ip=='0.0.0.0') return salert('no ip',300);
1929    fetch('https://ipinfo.io/'+ip+'/json').then(response => {
1930        if(!response.ok) { throw new Error('Network response was not ok'); }
1931        return response.json();
1932    }).then(data => {
1933	delete(data.readme);
1934	dier("<div class='r'>"+print_r(data).replace(/\n/g,'<br>') + '</div>'
1935	    +'<div id="myMapId" style="width:'+Math.min(getWinW()-70,500)+'px;height:400px;z-index:1;"></div>');
1936	var m = data['loc'].split(','); // 62.8924,27.6770
1937	LOADS(['/extended/geoip/2gis.ru.js','/extended/geoip/dg.css','/extended/geoip/dg.js'],function(){
1938          try {
1939            var myMap = new DG.Map('myMapId'); // Óñòàíàâëèâàåì öåíòð êàðòû è êîýôôèöèåíò ìàñøòàáèðîâàíèÿ:
1940	    myMap.setCenter(new DG.GeoPoint(1*m[1],1*m[0]),7); // 15
1941    	    myMap.controls.add(new DG.Controls.Zoom()); // óïðàâëåíèå êîýôôèöèåíòîì ìàñøòàáèðîâàíèÿ
1942          } catch(er){}
1943	});
1944    }).catch(error => {
1945	console.log('Error', error);
1946	salert('Error: '+error,5000);
1947    });
1948}
1949
1950
1951/*
1952function mpers(s,a) {
1953    return s.replace(/\{([^\{\}]+)\}/g,function(t0,t1){
1954        if(typeof(a[t1])!='undefined') return a[t1]; // åñòü åñòü òàêîå {çíà÷åíèå} - âåðíóòü åãî
1955        if(t1.match(/[\s\,\.]+/g)!==null) return t0; // åñëè è èìåíà ïåðåìåííûõ ÷òî-òî ÷åðåç çàïÿòóþ - òî ïðîñòî âåðíóòü
1956	var f=t1.substring(0,1),i=t1.substring(1);
1957	if(f=='#') return (typeof(a[i])=='undefined'?'': h(a[i]) );
1958        return '';
1959    });
1960}
1961*/
1962//======================================================= mpers
1963
1964mpersf=async function(file,ar){
1965    if(typeof("MPERS_TEMPLATES")!='object') MPERS_TEMPLATES={};
1966    if(!MPERS_TEMPLATES[file]) MPERS_TEMPLATES[file] = await loadFile(file);
1967    return mpers(MPERS_TEMPLATES[file],ar);
1968};
1969
1970/*
1971mpers=function(s,ar,del){ if(del==undefined) del=true;
1972    var stop=1000,s0=false,c,o='',end;
1973    while(--stop && s0!=s && (c=mpers.find(s)) ) {
1974	s0=s;
1975	var c0=c.substring(1,c.length-1);
1976	x=mpers.do(ar, c0, del);
1977	if(x!==false) s=s.replace(c,x);
1978	else {
1979	    var c1=mpers(c0,ar,del);
1980	    if(c1!=c0) s=s.replace(c0,c1);
1981	    else { // íè÷åãî íå èçìåíèëîñü, íî òàì ìîæåò ñëó÷èòüñÿ {÷òî-òî òàêîå}
1982		const end=s.indexOf(c)+c.length;
1983		o+=s.substring(0,end); // ïîýòîìó ýòó ÷àñòü ñòðîêè ñðàçó îòáðàñûâàåì
1984		s=s.substring(end); // è ðàáîòàåì ñ îñòàòêîì
1985	    }
1986	}
1987    }
1988    return o+s;
1989};
1990
1991mpers.ar=function(ar,name){
1992 try {
1993    var v = ar;
1994    if(name=='') return ar;
1995    name.split('.').forEach(n => {
1996	if(typeof(v[n])==undefined) return undefined;
1997	v = v[n];
1998    });
1999    return v;
2000 } catch(er) { return undefined; }
2001},
2002*/
2003
2004mpers=function(s,ar,del){ if(del==undefined) del=true;
2005    var stop=1000,s0=false,c;
2006    while(--stop && s0!=s && (c=mpers.find(s)) ) {
2007        s0=s;
2008        var c0=c.substring(1,c.length-1);
2009        x=mpers.do(ar, c0, del);
2010        if(x!==false) {
2011            s=s.replace(c,x);
2012        } else {
2013            var c1=mpers(c0,ar,del);
2014            if(c1!=c0) s=s.replace(c0,c1);
2015        }
2016    }
2017    return s;
2018};
2019
2020mpers.ar=function(ar,name){
2021 try {
2022    var v = ar;
2023    if(name=='') return ar;
2024    name.split('.').forEach(n => {
2025        if(typeof(v[n])==undefined) return undefined;
2026        v = v[n];
2027    });
2028    return v;
2029 } catch(er) { return undefined; }
2030},
2031
2032mpers.do=function(ar,s,del) {
2033
2034    var m,v,x='',X;
2035
2036    // Ïðîñòûå ïåðåìåííûå {name}, {#name}
2037    if(null !== (m=s.match(/^(\#|)([0-9a-zA-Z_\.]+)$/)) ) {
2038        var [,mod,name] = m;
2039        if((v=mpers.ar(ar,name))===undefined) return (del ? '' : '{'+s+'}');
2040        return (mod=='#' ? h(v) : v);
2041    }
2042
2043    // Îïåðàòîðû {opt(name):value} if(), for(), case(), date()
2044    if(null !== (m = s.match(/^([a-z]+)\(([0-9a-zA-Z_\.]*)\)\:([\s\S]*)/m) ) ) {
2045        var [,opt,name,value] = m;
2046        v=mpers.ar(ar,name);
2047
2048        const vif = (
2049            v === undefined || v === null || v === 0 || v === false
2050            || (typeof v === "string" && ["0","false","null","undefined"].includes(v))
2051        ) ? 0 : 1;
2052
2053        if(opt=='noif') return (vif ? '' : value);
2054        if(opt=='if') return (vif ? value : '');
2055
2056        if(opt=='case') {
2057            var st=100, c;
2058            while(--st && (c=mpers.find(value)) ) {
2059                if(null !== (m=c.match(/^\{([^\:]*)\:([\s\S]*)\}$/m)) ) {
2060                    var [,id,val] = m;
2061                    if(id==v) return val;
2062                    if(id==(''+v)) return val;
2063                    if(id=='*'||id=='default') x=val;
2064                }
2065                value = value.replace(c,'');
2066            }
2067            return x;
2068        }
2069
2070        if(v===undefined) return '';
2071
2072        if(opt=='for') {
2073            try { // [!!!]
2074                v.forEach((item,i)=> { x+=mpers( value ,{...ar, ...item, ...{i:i,i1:i+1,item:item} }); } );
2075            } catch(e) {
2076                console.error('mpers '+e+'\nfor('+name+'){\n'+value+'\n}');
2077                console.error('v('+typeof(v)+')=');
2078                console.error(v);
2079                console.error('-------- ar:');
2080                console.error(ar);
2081            }
2082            return x;
2083        }
2084
2085        if(opt=='date') { // date(time)Y-m-d H:i:s
2086            return unixtime2str(v,value);
2087        }
2088
2089        return false; // íå íàø ñëó÷àé
2090    }
2091
2092    // {oper:text}
2093    if(null !== (m=s.match(/^([0-9a-z\#\.]+)\:([\s\S]*)/m)) ) {
2094     var [,oper,text] = m;
2095
2096
2097     // îïåðàöèè ñ òåêñòîì
2098     if(oper=='no') return '';
2099
2100     // îïåðàöèè ñ òåêñòîì èëè ïåðåìåííîé
2101     v = mpers.ar(ar,text);
2102
2103     // stringify ìàññèâà
2104     if(oper=='stringify') return JSON.stringify(v);
2105
2106     x = (v!==undefined ? v : text);
2107     if(oper=='#') return h_fs(x);
2108     if(oper=='nl2br') return x.replace(/\n/g,"<br/>");
2109     if(oper=='#nl2br') return h_fs(x).replace(/\n/g,"<br/>"); // \n â <br\> è åùå ýêðàíèðîâàòü HTML-ñóùíîñòè
2110     if(oper=='url'||oper=='urlencode') return encodeURIComponent(x);
2111     if(oper=='urldecode') return x=decodeURIComponent(x);
2112
2113     // îïåðàöèè ñ ïåðåìåííîé
2114     if(! /^[0-9a-z_\.]+$/.test(text) ) return false; // íå èìÿ ïåðåìåííîé
2115     if(v===undefined) return ''; // íåò ïåðåìåííîé â ìàññèâå
2116     if(oper=='c') return v.replace(/^\s+/g,'').replace(/\s+$/g,'');
2117     if(oper=='cc') return v.split("\n").map(line => line.replace(/^[ \t]+|[ \t]+$/g, "")).join("\n");
2118
2119     if(oper=='length') return v.length; // ÷èñëî ñèìâîëîâ â òåêñòå
2120     if(oper=='date') return unixtime2str(v,'Y-m-d H:i:s'); // ÷èñëî â äàòó
2121     if(oper=='dat') return unixtime2str(v,'Y-m-d H:i'); // ÷èñëî â äàòó áåç ñåêóíä
2122     if(oper=='day') return unixtime2str(v,'Y-m-d'); // ÷èñëî â äàòó äíÿ
2123     if(oper=='.') return (1*v).toFixed(0); // {.00:}123.456 -> 123.4
2124     if(oper=='.0') return (1*v).toFixed(1); // {.00:}123.456 -> 123.4
2125     if(oper=='.00') return (1*v).toFixed(2); // 123.456 -> 123.45
2126     if(oper=='.0000') return (1*v).toFixed(4); // 123.456 -> 123.4560
2127
2128     return false;
2129    }
2130
2131    return false;
2132};
2133
2134nospaces=function(s){ return s.split("\n").map(line => line.replace(/^[ \t]+|[ \t]+$/g, "")).join("\n"); };
2135
2136// Ïîèñê ñîäåðæèìîãî ìåæäó ïàðíûìè ñêîáêàìè
2137mpers.find = function(s){
2138    var k, start=0, i, a,b, stop=1000, len=s.length;
2139    while( --stop ) {
2140            k=1, start=s.indexOf('{',start); // }
2141            if(start<0) return false;
2142
2143            i=start+1;
2144            while( --stop && k!=0 && i<len ) { // ïîêà åñòü ÷î
2145                a = s.indexOf('{',i); if( a<0 ) a=len;
2146                b = s.indexOf('}',i); if( b<0 ) b=len;
2147                if(a==b) break;
2148                if(a<b) { k++; i=a+1; } else { k--; i=b+1; }
2149            }
2150            if(!stop) console.log(`mpers.fing stop1 > 1000`);
2151            if(k==0) return s.substring(start,i);
2152            start++;
2153    }
2154    console.log(`mpers.fing stop > 1000`);
2155    return false;
2156};
2157
2158/*
2159mpers.do=function(ar,s,del) {
2160    var m,v,x='',X;
2161    // Ïðîñòûå ïåðåìåííûå {name}, {#name}
2162    if(null !== (m=s.match(/^(\#|)([0-9a-zA-Z_\.]+)$/)) ) {
2163	var [,mod,name] = m;
2164	if((v=mpers.ar(ar,name))===undefined) return (del ? '' : '{'+s+'}');
2165	return (mod=='#' ? h(v) : v);
2166    }
2167
2168    // Îïåðàòîðû {opt(name):value} if(), for(), case(), date()
2169    if(null !== (m = s.match(/^([a-z]+)\(([0-9a-zA-Z_\.]*)\)\:([\s\S]*)/m) ) ) {
2170	var [,opt,name,value] = m;
2171	v=mpers.ar(ar,name);
2172	// const vif = (v||false) && v !== "0" && v != "false" && v != "null" && v !== "undefined" ;
2173        const vif = (
2174            v === undefined || v === null || v === 0 || v === false
2175            || (typeof v === "string" && ["0","false","null","undefined"].includes(v))
2176        ) ? 0 : 1;
2177	if(opt=='noif') return (vif ? '' : value);
2178	if(opt=='if') return (vif ? value : '');
2179
2180	if(opt=='case') {
2181	    var st=100, c;
2182	    while(--st && (c=mpers.find(value)) ) {
2183		if(null !== (m=c.match(/^\{([^\:]*)\:([\s\S]*)\}$/m)) ) {
2184		    var [,id,val] = m;
2185		    if(id==v) return val;
2186		    if(id==(''+v)) return val;
2187		    if(id=='*'||id=='default') x=val;
2188		}
2189		value = value.replace(c,'');
2190	    }
2191	    return x;
2192	}
2193
2194	if(v===undefined) return '';
2195
2196	if(opt=='for') {
2197	    try { // [!!!] item i i1
2198		v.forEach((item,i)=> { x+=mpers( value ,{...ar, ...item, ...{i:i,i1:i+1,item:item} }); } );
2199	    } catch(e) {
2200	        console.error('mpers '+e+'\nfor('+name+'){\n'+value+'\n}');
2201	        console.error('v('+typeof(v)+')=');
2202	        console.error(v);
2203	        console.error('-------- ar:');
2204	        console.error(ar);
2205	    }
2206	    return x;
2207	}
2208
2209	if(opt=='date') { // date(time)Y-m-d H:i:s
2210	    return unixtime2str(v,value);
2211	}
2212
2213	return false; // íå íàø ñëó÷àé
2214    }
2215
2216    // {oper:text}
2217    if(null !== (m=s.match(/^([0-9a-z\#\.]+)\:([\s\S]*)/m)) ) {
2218     var [,oper,text] = m;
2219
2220     // îïåðàöèè ñ òåêñòîì
2221     if(oper=='no') return '';
2222
2223     // îïåðàöèè ñ òåêñòîì èëè ïåðåìåííîé
2224     v = mpers.ar(ar,text);
2225
2226     // stringify ìàññèâà
2227     if(oper=='stringify') return JSON.stringify(v);
2228
2229     x = (v!==undefined ? v : text);
2230     if(oper=='#') return h(x);
2231     if(oper=='nl2br') return x.replace(/\n/g,"<br/>");
2232     if(oper=='#nl2br') return h(x).replace(/\n/g,"<br/>"); // \n â <br\> è åùå ýêðàíèðîâàòü HTML-ñóùíîñòè
2233     if(oper=='url'||oper=='urlencode') return encodeURIComponent(x);
2234     if(oper=='urldecode') return x=decodeURIComponent(x);
2235
2236     // îïåðàöèè ñ ïåðåìåííîé
2237     if(! /^[0-9a-z_\.]+$/.test(text) ) return false; // íå èìÿ ïåðåìåííîé
2238     if(v===undefined) return ''; // íåò ïåðåìåííîé â ìàññèâå
2239     if(oper=='c') return v.replace(/^\s+/g,'').replace(/\s+$/g,'');
2240     if(oper=='length') return v.length; // ÷èñëî ñèìâîëîâ â òåêñòå
2241     if(oper=='date') return unixtime2str(v,'Y-m-d H:i:s'); // ÷èñëî â äàòó
2242     if(oper=='dat') return unixtime2str(v,'Y-m-d H:i'); // ÷èñëî â äàòó áåç ñåêóíä
2243     if(oper=='day') return unixtime2str(v,'Y-m-d'); // ÷èñëî â äàòó äíÿ
2244     if(oper=='.') return (1*v).toFixed(0); // {.00:}123.456 -> 123.4
2245     if(oper=='.0') return (1*v).toFixed(1); // {.00:}123.456 -> 123.4
2246     if(oper=='.00') return (1*v).toFixed(2); // 123.456 -> 123.45
2247     if(oper=='.0000') return (1*v).toFixed(4); // 123.456 -> 123.4560
2248     return false;
2249    }
2250
2251    return false;
2252};
2253
2254// Ïîèñê ñîäåðæèìîãî ìåæäó ïàðíûìè ñêîáêàìè
2255mpers.find = function(s){
2256    var k, start=0, i, a,b, stop=1000, len=s.length; // TODO ðàçîáðàòüñÿ!!!
2257    while( --stop ) {
2258	    k=1, start=s.indexOf('{',start); // }
2259	    if(start<0) return false;
2260
2261	    i=start+1;
2262	    while( --stop && k!=0 && i<len ) { // ïîêà åñòü ÷î
2263		a = s.indexOf('{',i); if( a<0 ) a=len;
2264		b = s.indexOf('}',i); if( b<0 ) b=len;
2265		if(a==b) break;
2266		if(a<b) { k++; i=a+1; } else { k--; i=b+1; }
2267	    }
2268	    if(k==0) return s.substring(start,i);
2269	    start++;
2270    }
2271};
2272*/
2273//======================================================= /mpers
2274site_templates = {};
2275async function template(name) {
2276    if(site_templates[name]) return site_templates[name];
2277    const url=wwwhost+'template/system/'+name;
2278    const response = await fetch(url);
2279    if(!response.ok) throw new Error(url+" " + response.status);
2280    return site_templates[name]=await response.text();
2281}
2282
2283async function Confirm(message,opt={yes:'YES',no:'NO'}) {
2284    const text = await template('confirm.htm');
2285    return new Promise((resolve) => {
2286	console.log(text,message,opt,{...{message},...opt});
2287        helpc('confirm',mpers(text, {...{message},...opt}));
2288
2289        setTimeout(()=>{
2290            const e = dom('confirm');
2291            e.querySelector('#confirm_close').addEventListener("click", () => { resolve(false); });
2292            e.querySelector("button.btn-yes").addEventListener("click", () => { clean(e); resolve(true); });
2293            e.querySelector("button.btn-no").addEventListener("click", () => { clean(e); resolve(false); });
2294        },10);
2295    });
2296}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.