PageSourceSearch

https://vietnam-real.estate/themes/realestate/js/kit_theme_head.js

js vietnam-real.estate collected 2026-10-06 04:05:54 UTC 157,900 bytes, 4,404 lines download raw bytes

1/*!THIS IS AUTO GENERATED FILE !*/
2
3/* GOALS */
4function GOALS(args){
5	if(typeof args=='undefined') args={};
6	const logable=window.location.href.indexOf('.lo')>=0;
7	this.ya=args['ya_counter'];
8	this.ga=args['ga_counter'];
9	this.gtype=args['gtype'] ? args['gtype'] : 'gtag';
10	this.ytype=args['ytype'] ? args['ytype'] : 'ym';
11	this.register_ga=args['register_ga']===false ? false : true;
12	this.register_ya=args['register_ya']===false ? false : true;
13	this.wpcf7=args['wpcf7'] || [];
14
15	this.register=function(ev,args){
16		if(typeof args=='undefined') args={};
17		if(typeof args['yandex']=='undefined') args['yandex']=this.register_ya;
18		if(typeof args['google']=='undefined') args['google']=this.register_ga;
19		if(args['google']){
20			this.registerGA(ev,args);
21		}
22		if(args['yandex']){
23			this.registerYA(ev,args);
24		}
25	}
26	this.registerGA=function(ev,args){
27		try{
28			if(this.gtype=='gaq'){
29				this.ga.push(['_trackPageview', '/'+ev]);
30			}else if(this.gtype=='ga'){
31				this.ga('send','pageview','/'+ev.toString());
32			}else{
33				params={
34					'event_category': (args['category'] ? args['category'] : 'pageview'),
35					'event_action' : ev.toString(),
36				};
37				this.ga('event',ev.toString(),params);
38			}
39			this.log('GA sent: '+ev.toString());
40		}catch(ex){ this.log('Error sending YA goal',ex); }
41	}
42	this.registerYA=function(ev,args){
43		try{
44			if(this.ytype=='old'){
45				if(!this.ya) this.ya=this.getYaCounter();
46				params=args['params'] || {};
47				this.ya.reachGoal(ev,params);
48			}else{
49				if(!this.ya) this.ya=this.getYMCounter();
50				console.log(this.ya);
51				ym(this.ya,'reachGoal',ev);
52			}
53			this.log('YA sent: '+ev.toString());
54		}catch(ex){ this.log('Error sending YA goal',ex); }
55	}
56	this.getClientIDYA=function(){
57		var client_id='';
58		var client_id=this.getCookie('_ym_uid');
59		if(client_id && client_id.trim()!=''){
60			this.log('YA ClientID: '+client_id.toString());
61		}
62		return client_id;
63	}
64	this.log=function(txt,ex){
65		if(!logable) return;
66		if(txt) console.log(txt);
67		if(ex) console.log('Exception: '+ex);
68	}
69	this.initWPCF7=function(){
70		if(typeof this.wpcf7=='undefined') return false;
71		(function(G){
72			document.addEventListener('wpcf7mailsent', function(data){
73				if(data.detail && G.wpcf7[data.detail.contactFormId] && G.wpcf7[data.detail.contactFormId].sent){
74					var ev=G.wpcf7[data.detail.contactFormId].key ? G.wpcf7[data.detail.contactFormId].key : 'WPCF7_FORM_'+data.detail.contactFormId.toString();
75					G.register(ev+'_SENT');
76				}
77			});
78		})(this);
79	}
80	this.getYMCounter=function(){
81		var s=null;
82		for(var i=0; i < document.getElementsByTagName('script').length; ++i){
83			if(hasClass(document.getElementsByTagName('script')[i],'skip_ym_check')) continue;
84			if(document.getElementsByTagName('script')[i].innerHTML.indexOf('ym(')>0){ s=document.getElementsByTagName('script')[i].innerHTML; break; }
85		}
86		if(s==null) return false;
87		var num=s.toString().match(new RegExp('id\:([0-9]{1,})'));
88		if(!num){
89			num=s.toString().match(new RegExp('ym([^0-9\"]{1,})([0-9]{1,}),'));
90			num[1]=num[2];
91		}
92		return num && num[1] ? num[1] : false;
93	}
94	this.getYaCounter=function(eid){
95		var s=null;
96		if(e(eid)===null || e(eid)===undefined){
97			for(var i = 0; i < document.getElementsByTagName('script').length; i ++){
98				if(hasClass(document.getElementsByTagName('script')[i],'skip_ym_check')) continue;
99				if(document.getElementsByTagName('script')[i].innerHTML.indexOf('yaCounter') > 0){ s=document.getElementsByTagName('script')[i].innerHTML; break; }
100			}
101		}else{ s=e(eid).innerHTML; }
102		if(s==null) return null;
103		var pos = s.indexOf('yaCounter');
104		var sim=s[pos];
105		while(isNaN(sim)){ pos++; sim=s[pos]; }
106		var num=sim;
107		while(!isNaN(s[pos]) && s[pos]!=' ' && s[pos]!=' '){ pos++; num=num.toString()+s[pos].toString(); }
108		num=num.replace(/ /g,'');
109		num=num.replace(/=/g,'');
110		return (window['yaCounter'+num]==undefined) ? null : window['yaCounter'+num];
111	}
112	this.init=function(){
113		this.initWPCF7();
114		this.goalFromCookie();
115	}
116}
117GOALS.prototype.goalFromCookie=function(){
118	var goal=this.getCookie('register_goal');
119	if(goal && goal.trim()!=''){
120		this.log('Goal from cookie: '+goal.toString());
121		this.register(goal);
122		this.saveCookie('register_goal','');
123	}
124}
125GOALS.prototype.getExpDate=function(days,hours,minutes){
126	var expDate=new Date( );
127	if (typeof days=="number" && typeof hours=="number" && typeof hours=="number"){
128		expDate.setDate(expDate.getDate() + parseInt(days));
129		expDate.setHours(expDate.getHours() + parseInt(hours));
130		expDate.setMinutes(expDate.getMinutes() + parseInt(minutes));
131		return expDate.toGMTString();
132	}
133}
134GOALS.prototype.getCookieVal=function(offset) {
135	var endstr=document.cookie.indexOf(";",offset);
136	if (endstr==-1){ endstr = document.cookie.length; }
137	return unescape(document.cookie.substring(offset,endstr));
138}
139GOALS.prototype.getCookie=function(name){
140	var arg=name + "=";
141	var alen=arg.length;
142	var clen=document.cookie.length;
143	var i=0;
144	while(i<clen){
145		var j = i + alen;
146		if(document.cookie.substring(i, j) == arg){	return this.getCookieVal(j);	}
147		i=document.cookie.indexOf(" ", i) + 1;
148		if(i == 0) break;
149	}
150	return "";
151}
152GOALS.prototype.saveCookie=function(name,value){
153	this.setCookie(name, encodeURIComponent(value), this.getExpDate(365, 1, 1), '/');
154}
155GOALS.prototype.setCookie=function(name, value, expires, path, domain, secure){
156	document.cookie=name + "=" + escape (value) +
157		((expires) ? "; expires=" + expires : "") +
158		((path) ? "; path=" + path : "") +
159		((domain) ? "; domain=" + domain : "") +
160		((secure) ? "; secure" : "");
161}
162GOALS.prototype.deleteCookie=function(name,path,domain){
163	if (this.getCookie(name)) {
164		document.cookie = name + "=" +
165			((path) ? "; path=" + path : "") +
166			((domain) ? "; domain=" + domain : "") +
167			"; expires=Thu, 01-Jan-70 00:00:01 GMT";
168	}
169}
170
171/* INIT */
172goals=new GOALS({
173	'ga_counter' : (typeof gtag!='undefined' ? gtag : null),
174	//'ya_counter' : 57643036,
175});
176(function(G){
177	window.addEventListener('DOMContentLoaded',function(){
178		var it=setInterval((function(i){ return function(){
179			if(G.ga==null && typeof gtag!='undefined') G.ga=gtag;
180			if(i>1000 || typeof gtag!='undefined'){ clearInterval(it); }
181		}})(0),100);
182		G.init();
183		var els=document.body.querySelectorAll('.request_form.goal_block .button');
184		for(var i=0;i<els.length;++i) els[i].addEventListener('click',function(){ G.register('REQUEST_FORM_CLICK'); });
185		var object_contacts=document.querySelectorAll('.object .contact_agency.right_block .btn');
186		for(var i=0;i<object_contacts.length;++i) object_contacts[i].addEventListener('click',function(){G.register('OBJECT_CONTACT_CLICK'); });
187		var offer_icon=document.body.querySelector('.top_actions .icon.offer');
188		if(offer_icon) offer_icon.addEventListener('click',function(){ G.register('OFFER_CLICK'); });
189		var footer_feedback=document.body.querySelector('.footer .i_email a');
190		if(footer_feedback) footer_feedback.addEventListener('click',function(){ G.register('FEEDBACK_CLICK'); });
191		var sign_up=document.body.querySelector('.registration_page ul.navigation a[href="#registration"]');
192		if(sign_up) sign_up.addEventListener('click',function(){ G.register('SIGNUP_CLICK'); });
193		//phones
194		var phs=document.body.querySelectorAll('.phones a[onclick*="openList"]');
195		for(var i=0;i<phs.length;++i) phs[i].addEventListener('click',function(){ G.register('SHOW_PHONE_CLICK'); })
196		//contacts
197		var messengers=document.body.querySelectorAll('.contacts-page .contacts a.icon');
198		for(var i=0;i<messengers.length;++i) messengers[i].addEventListener('click',function(){ G.register('CONTACTS_MESSENGER_CLICK'); });
199		var email=document.body.querySelector('.contacts-page .contacts a[href*="mailto:"]');
200		if(email) email.addEventListener('click',function(){ G.register('CONTACTS_EMAIL_CLICK'); });
201		//object search forms
202		var searches=document.body.querySelectorAll('.objects_search.tabbed .controls .submit .btn');
203		for(var i=0;i<searches.length;++i) searches[i].addEventListener('click',function(){ G.register('OBJ
203ECTS_SEARCH_CLICK'); });
204	});
205})(goals);
206/* END GOALS */let tokens = {
207    getPreTokenSecret: function (dataObject) {
208        // в данный момент поддерживаются только простые типы в ключах и значениях
209        if (typeof (dataObject) != 'object') {
210            return false;
211        }
212
213        dataObject.userAgent = window.navigator.userAgent;
214        let result = 0;
215
216        for (let key in dataObject) {
217            if (!dataObject.hasOwnProperty(key)) {
218                continue;
219            }
220
221            let strKey = String(key);
222            let strValue = String(dataObject[key]);
223            let forCalculate = strKey + strValue;
224
225            for (let char of forCalculate) {
226                result += char.charCodeAt(0);
227            }
228        }
229        return result;
230    }
231};
232function e(eid) {return document.getElementById(eid)}
233Number.prototype.toDeg = function () { return (this * 180) / Math.PI; }
234
235function KIT(args){
236	if(args==null) args={};
237	this.initialize=args['init'] === true;
238	this.e=function(eid){return document.getElementById(eid)}
239	this.getParentTag=function(el,tag){
240		if(tag==null) tag='form';
241		for(var par=el;par!=null && par.tagName!=null && par.tagName.toLowerCase()!=tag;par=par.parentNode){}
242
243		return par==null || par.tagName==null || par.tagName.toLowerCase()!=tag ? null : par;
244	}
245	this.getParentClass=function(el,cl,strict){
246		if(strict==null) strict=false;
247		if(cl==null) cl='popup';
248		if(!strict)	for(var par=el;par.className!=null && par.className.indexOf(cl)<0; par=par.parentNode){}
249		else{
250			for(var par=el;par.className!=null; par=par.parentNode){
251				var reg=par.className.match(RegExp('(^|\s| )'+cl+'( |\s|$)','i'));
252				if(par.className==cl || reg!=null) break;
253			}
254		}
255		return par==null || par.className==null ? null : par;
256	}
257	this.hasClass=function(elem,cl){
258		if(elem==null || elem.className=='' || cl==null || cl.trim()=='') return false;
259		var classes=elem.className ? elem.className.split(' ') : [];
260		var res=false;
261		for(var i=0;i<classes.length;++i) if(classes[i]==cl){ res=true; break; }
262		return res;
263	}
264	this.addClass=function(elem,cl){
265		if(!this.hasClass(elem,cl)) elem.className=elem.className+' '+cl;
266	}
267	this.removeClass=function (elem,cl){
268		var classes=elem.className==null ? [] : elem.className.split(' ');
269		var new_classes=[];
270		for (var i=0;i<classes.length;i++) if (classes[i]!='' && classes[i]!=cl) new_classes.push(classes[i]);
271		elem.className=new_classes.join(' ');
272	}
273	this.switchClass=function(elem,cl){
274		if(!this.hasClass(elem,cl)) this.addClass(elem,cl);
275		else this.removeClass(elem,cl);
276	}
277	this.getOwnChilds=function(el,by,name){
278		var childs;
279		if(by=='tag') childs=el.getElementsByTagName(name);
280		else if(by=='class') childs=el.getElementsByClassName(name);
281		var new_c=[];
282		for(var i=0;i<childs.length;i++) if(childs[i].parentNode==el) new_c.push(childs[i]);
283		return new_c;
284	}
285	this.getPosition=function(obj,pos){
286		var x=0, y=0;
287		while(obj){
288			x+=obj.offsetLeft;
289			y+=obj.offsetTop;
290			obj=obj.offsetParent;
291		}
292		return (pos=='x' ? x : y);
293	}
294	this.getCoords=function(el){
295		var box=el.getBoundingClientRect();
296		return {
297			top: box.top + pageYOffset,
298			left: box.left + pageXOffset,
299		};
300	}
301	this.getClientSTop=function(){ return self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop); }
302	this.getClientSLeft=function(){ return self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft); }
303	this.Show=function(el,display,visibility){
304		if(visibility==null) visibility=false;
305		if(typeof el==='string') el=e(el);
306		if(el==null) return false;
307		if (display==null) display="block";
308		if(visibility) el.style.visibility='visible';
309		else el.style.display=display;
310	}
311	this.Hide=function(el,visibility){
312		if(typeof el==='string') el=e(el);
313		if(el==null) return false;
314		if (visibility==null) visibility=false;
315		if(visibility) el.style.visibility='hidden';
316		else el.style.display='none';
317	}
318	this.isNum=function(str){
319		if(str===0) return true;
320		if(str==null || !str) return false;
321		str=str.toString();
322		if(str.trim()=='') return false;
323		var re= /^[-]?\d*\.?\d*$/;
324		if (!str.match(re)) return false;
325		return true;
326	}
327	this.smoothScroll=function(x,y,it,delay,cb){
328		if(it==null) it=20;
329		if(delay==null) delay=1;
330		cur_x=getClientSLeft();
331		cur_y=getClientSTop();
332		var dir_y=1;
333		var dir_x=1;
334		if(y>cur_y) dir_y=2;
335		if(x>cur_x) dir_x=2;
336		var i=setInterval(function(){
337			if(cur_x>x && dir_x==1) cur_x-=it;
338			else if(cur_x<x && dir_x==2) cur_x+=it;
339			if(cur_y>y && dir_y==1) cur_y-=it;
340			else if(cur_y<y && dir_y==2) cur_y+=it;
341			window.scrollTo(cur_x,cur_y);
342			if((dir_x==1 && cur_x<=x || dir_x==2 && cur_x>=x) && (dir_y==1 && cur_y<=y || dir_y==2 && cur_y>=y)){
343				window.scrollTo(x,y);
344				if(typeof cb=='function'){
345					cb();
346				}
347				clearInterval(i);
348			}
349		},delay);
350	}
351	this.getExpDate=function(days,hours,minutes){
352		var expDate=new Date( );
353		if (typeof days=="number" && typeof hours=="number" && typeof hours=="number"){
354			expDate.setDate(expDate.getDate() + parseInt(days));
355			expDate.setHours(expDate.getHours() + parseInt(hours));
356			expDate.setMinutes(expDate.getMinutes() + parseInt(minutes));
357			return expDate.toGMTString();
358		}
359	}
360	this.getCookieVal=function(offset) {
361		var endstr=document.cookie.indexOf(";",offset);
362		if (endstr==-1){ endstr = document.cookie.length; }
363		return unescape(document.cookie.substring(offset,endstr));
364	}
365	this.getCookie=function(name){
366		var arg=name + "=";
367		var alen=arg.length;
368		var clen=document.cookie.length;
369		var i=0;
370		while(i<clen){
371			var j = i + alen;
372			if(document.cookie.substring(i, j) == arg){	return getCookieVal(j);	}
373			i=document.cookie.indexOf(" ", i) + 1;
374			if(i == 0) break;
375		}
376		return "";
377	}
378	this.saveCookie=function(name,value){
379		setCookie(name, encodeURIComponent(value), getExpDate(365, 1, 1), '/');
380	}
381	this.setCookie=function(name, value, expires, path, domain, secure){
382		document.cookie=name + "=" + escape (value) +
383			((expires) ? "; expires=" + expires : "") +
384			((path) ? "; path=" + path : "") +
385			((domain) ? "; domain=" + domain : "") +
386			((secure) ? "; secure" : "");
387	}
388	this.deleteCookie=function(name,path,domain){
389		if (getCookie(name)) {
390			document.cookie = name + "=" +
391				((path) ? "; path=" + path : "") +
392				((domain) ? "; domain=" + domain : "") +
393				"; expires=Thu, 01-Jan-70 00:00:01 GMT";
394		}
395	}
396	this.init=function(){
397		if(this.initialize){
398			for(var key in this) if(this.hasOwnProperty(key)){
399				if(typeof this[key]==='function' && !window[key]) window[key]=this[key];
400			}
401		}
402	}
403	this.init();
404}
405
406if(!("nextElementSibling" in document.documentElement)){
407	Object.defineProperty(Element.prototype, "nextElementSibling", {
408		get: function(){
409			var e = this.nextSibling;
410			while(e && 1 !== e.nodeType)
411				e = e.nextSibling;
412			return e;
413		}
414	});
415}
416if(!("previosElementSibling" in document.documentElement)){
417	Object.defineProperty(Element.prototype, "previosElementSibling", {
418		get: function(){
419			var e = this.nextSibling;
420			while(e && 1 !== e.nodeType)
421				e = e.nextSibling;
422			return e;
423		}
424	});
425}
426if(!("dataset" in document.documentElement)){
427	Object.defineProperty(Element.prototype, "dataset", {
428		get: function(){
429			var res={};
430			var attrs=this.attributes;
431			for(var i=0;i<attrs.length;++i){
432				if(attrs[i].nodeName.substring(0,5)=='data-'){
433					res[attrs[i].nodeName.replace('data-','')]=attrs[i].nodeValue;
434				}
435			}
436			return res;
437		}
438	});
439}
440if(!("dataset" in SVGElement.prototype)){
441	Object.defineProperty(SVGElement.prototype, "dataset", {
442		get: function(){
443			var res={};
444			var attrs=this.attributes;
445			for(var i=0;i<attrs.length;++i){
446				if(attrs[i].nodeName.substring(0,5)=='data-'){
447					res[attrs[i].nodeName.replace('data-','')]=attrs[i].nodeValue;
448				}
449			}
450			return res;
451		}
452	});
453}
454
455function openList(el){
456	var list=el.getElementsByClassName('list')[0];
457	var op=el.className.indexOf('open')<0;
458	el.className=!op ? el.className.replace('open','').trim() : el.className+' open';
459	list.style.display=!op ? 'none' : 'block';
460	if(list.getAttribute('data-initialized')!=1){
461		list.addEventListener('mouseover',(function(el){ return function(){
462			this.style.display='block';
463			el.className=el.className.indexOf('open')<0 ? el.className+' open' : el.className;
464		}})(el));
465		list.addEventListener('mouseout',(function(el){ return function(){
466			this.style.display='none';
467			el.className=el.className.replace('open','').trim();
468		}})(el));
469	}
470}
471
472/* FORMS */
473function trimLeft(str) {return str.replace(/^\s+/, '');}
474function trimRight(str) {return str.replace(/\s+$/, '');}
475function trimBoth(str) {return trimRight(trimLeft(str));}
476
477function fieldEmpty(elem){
478	rez=false;
479	if(elem.type!='checkbox') { if (trimBoth(elem.value)=="") rez=true; }
480	else{ if(!elem.checked) rez=true; }
481	return rez;
482}
483
484/* END FORMS */
485
486var star_status=0;
487/* agency languages block */
488var language_flags=[];
489function calcFlagsWidth() {
490	return language_flags.length*20+(language_flags.length-1)*9+40;
491}
492function getMaxFlags(width) {
493	return Math.floor((width-40-40+9)/29);
494}
495function alignSpokenLanguages() {
496	var container=document.querySelector('.page_content.company .languages');
497	if (!container) return false;
498	var flags=container.querySelector('.flags');
499	if (flags==null) return false;
500	var more=container.querySelector('.more');
501	if (language_flags.length==0) language_flags=container.querySelectorAll('.flags img');
502	//calculate widths
503	var column_w=document.querySelector('.page_content').clientWidth;
504	var preview=document.querySelector('.page_content .preview');
505	var preview_w=preview==null ? 0 : preview.clientWidth+30;
506	var icons_w=0;
507	var popular=container.querySelector('.icon-popular');
508	if (popular!=null) icons_w+=popular.clientWidth;
509	var trusted=container.querySelector('.icon-trusted');
510	if (trusted !=null) icons_w+=trusted.clientWidth;
511	var caption_w=container.querySelector('.caption').clientWidth+10;
512	var max_flags_width=column_w==(preview_w-30) ? column_w-icons_w-caption_w : column_w-preview_w-icons_w-caption_w;
513	var max_flags=getMaxFlags(max_flags_width);
514	//redraw flags
515	if (max_flags<language_flags.length) addClass(more,'active');
516	else removeClass(more,'active');
517	var flags_show='';
518	var flags_hidden='';
519	var img='';
520	for (var i=0;i<language_flags.length;i++) {
521		img='<img src="'+language_flags[i].src+'" alt="'+language_flags[i].alt+'" width="'+language_flags[i].getAttribute('width')+'" height="'+language_flags[i].getAttribute('width')+'">';
522		if (i<max_flags) flags_show+=img;
523		else  flags_hidden+=img;
524	}
525	flags.innerHTML=flags_show;
526	flags.style.display=max_flags>0 ? 'inline-block' : 'none';
527	flags.style.maxWidth='unset';
528	container.querySelector('.more .list').innerHTML=flags_hidden;
529	return true;
530}
531
532/* objects */
533function setSortMode(sort, sort_field) {
534    if (typeof (sort_field) === 'undefined') {
535        sort_field = 'objects_sort';
536    }
537    saveCookie(sort_field, sort);
538    window.location.href = window.location.href;
539    window.location.reload();
540}
541
542function setViewMode(mode,elem) {
543	var antimode=mode=='list' ? 'grid' : 'list';
544	//switch classes for ui
545	addClass(elem,'active');
546	removeClass(elem.parentNode.querySelector('.'+antimode),'active');
547	//switch classes for the list
548	var objects_lists=document.querySelectorAll('.objects-list.switchable');
549	objects_lists.forEach(function(objects_list){
550		removeClass(objects_list,antimode+'view');
551		addClass(objects_list,mode+'view');
552	});
553	/*if (objects_list!=null) {
554		removeClass(objects_list,antimode+'view');
555		addClass(objects_list,mode+'view');
556		}*/
557	//save cookie
558	saveCookie('objects_view',mode);
559}
560
561function projectOptionsUnfold(a) {
562	div=getParentClass(a,'features');;
563	if (!hasClass(div,'wrapped'))  {
564		addClass(div,'wrapped');
565		a.innerHTML=LANG['more'];
566	}
567	else {
568		removeClass(div,'wrapped');
569		a.innerHTML=LANG['less'];
570	}
571}
572
573function setPriceType(elem,price) {
574	var container=getParentClass(elem,'price_info');
575	if (container==null) return false;
576	var tp=container.querySelector('.type > span');
577	tp.innerHTML=elem.innerHTML;
578	var pr=container.querySelector('.value > span');
579	pr.innerHTML=price;
580	initPriceBlocks(true);
581}
582
583function setSquareUnits(unit)  {
584	saveCookie('square_units',unit);
585	window.location=window.location;
586}
587
588/* COMPARE */
589function add_to_compare(oid,el,txt){
590	if(txt==null) txt=false;
591	KITS.addCompare(oid,true,(function(el){
592		return function(){
593			if(typeof goals!='undefined') goals.register('OBJECT_TO_COMPARE');
594			addClass(el,'active');
595			if(el.title!='') el.title=LANG['remove_from_compare'];
596			if(txt && el.getElementsByClassName('text')[0]!=null) el.getElementsByClassName('text')[0].innerHTML=LANG['remove_from_compare'];
597			update_compare_count();
598			updateCompareButtons(oid,'remove_from_compare',LANG['remove_from_compare']);
599			var pl=el.querySelector('.page_link');
600			var pl=el.querySelector('.page_link');
601			if(pl){
602				el.onmouseenter=function(){
603					this.querySelector('.page_link').className='page_link active';
604				}
605				el.onmouseleave=function(){
606					this.querySelector('.page_link').className='page_link';
607				}
608				if(pl.className.indexOf('active')==-1){
609					pl.className=pl.className+' active';
610				}
611			}
612		}
613	})(el,txt));
614	el.setAttribute('onclick','remove_from_compare('+oid.toString()+',this,'+txt+');');
615}
616function remove_from_compare(oid,el,txt){
617	if(txt==null) txt=false;
618	KITS.removeCompare(oid,true,(function(el){
619		return function(){
620			removeClass(el,'active');
621			if(el.title!='') el.title=LANG['add_to_compare'];
622			if(txt && el.getElementsByClassName('text')[0]!=null) el.getElementsByClassName('text')[0].innerHTML=LANG['add_to_compare'];
623			if(typeof compare_page!='undefined' && compare_page===true) window.location=window.location.href;
624			update_compare_count();
625			updateCompareButtons(oid,'add_to_compare',LANG['add_to_compare']);
626			var pl=el.querySelector('.page_link');
627			if(pl){
628				el.onmouseenter=null;
629				el.onmouseleave=null;
630				pl.className='page_link';
631			}
632		}
633	})(el,txt));
634	el.setAttribute('onclick','add_to_compare('+oid.toString()+',this,'+txt+');');
635}
636
637function update_compare_count(){
638	var els=document.body.querySelectorAll('.compare_count');
639	if(els.length>0){
640		KITS.sendAjaxRequest({'get_compare_count':'1'},function(){},(function(els){ return function(res){
641			for(var i=0;i<els.length;++i){
642				els[i].innerHTML=res;
643			}
644		}})(els));
645	}
646}
647function updateCompareButtons(oid,function_name,text){
648	var els=document.body.querySelectorAll('*[data-compare-id="'+oid.toString()+'"]');
649	if(els.length>0){
650		for(var i=0;i<els.length;++i){
651			var txt=els[i].getElementsByClassName('text')[0];
652			if (txt!=null) txt.innerHTML=text;
653			var onclick=els[i].getAttribute('onclick');
654			var prts=onclick.split('(');
655			prts[0]=function_name;
656			els[i].setAttribute('onclick',prts.join('('));
657		}
658	}
659}
660
661/* WISHLIST */
662function add_to_wishlist(oid,el,txt){
663	if(txt==null) txt=false;
664	KITS.addWishlist(oid,true,(function(el){
665		return function(){
666			if(typeof goals!='undefined') goals.register('OBJECT_TO_WISHLIST');
667			addClass(el,'active');
668			if(el.title!='') el.title=LANG['remove_from_wishlist'];
669			if(txt && el.getElementsByClassName('text')[0]!=null) el.getElementsByClassName('text')[0].innerHTML=LANG['remove_from_wishlist'];
670			update_wishlist_count();
671			updateWishlistButtons(oid,'remove_from_wishlist',LANG['remove_from_wishlist']);
672			var pl=el.querySelector('.page_link');
673			if(pl){
674				el.onmouseenter=function(){
675					this.querySelector('.page_link').className='page_link active';
676				}
677				el.onmouseleave=function(){
678					this.querySelector('.page_link').className='page_link';
679				}
680				if(pl.className.indexOf('active')==-1){
681					pl.className=pl.className+' active';
682				}
683			}
684		}
685	})(el,txt));
686	el.setAttribute('onclick','remove_from_wishlist('+oid.toString()+',this,'+txt+');');
687}
688function remove_from_wishlist(oid,el,txt){
689	if(txt==null) txt=false;
690	KITS.removeWishlist(oid,true,(function(el){
691		return function(){
692			removeClass(el,'active');
693			if(el.title!='') el.title=LANG['add_to_wishlist'];
694			if(txt && el.getElementsByClassName('text')[0]!=null) el.getElementsByClassName('text')[0].innerHTML=LANG['add_to_wishlist'];
695			if(typeof wishlist_page!='undefined' && wishlist_page===true) window.location=window.location.href;
696			update_wishlist_count();
697			updateWishlistButtons(oid,'add_to_wishlist',LANG['add_to_wishlist']);
698			var pl=el.querySelector('.page_link');
699			if(pl){
700				el.onmouseenter=null;
701				el.onmouseleave=null;
702				pl.className='page_link';
703			}
704		}
705	})(el,txt));
706	el.setAttribute('onclick','add_to_wishlist('+oid.toString()+',this,'+txt+');');
707}
708
709function update_wishlist_count(){
710	var els=document.getElementsByClassName('wishlist_count');
711	if(els.length>0){
712		KITS.sendAjaxRequest({'get_wishlist_count':'1'},function(){},(function(els){ return function(res){
713			for(var i=0;i<els.length;++i){
714				els[i].innerHTML=res;
715			}
716		}})(els));
717	}
718}
719
720function updateWishlistButtons(oid,function_name,text){
721	var els=document.body.querySelectorAll('*[data-wishlist-id="'+oid.toString()+'"]');
722	if(els.length>0){
723		for(var i=0;i<els.length;++i){
724			var txt=els[i].getElementsByClassName('text')[0];
725			if (txt!=null) txt.innerHTML=text;
726			var onclick=els[i].getAttribute('onclick');
727			var prts=onclick.split('(');
728			prts[0]=function_name;
729			els[i].setAttribute('onclick',prts.join('('));
730		}
731	}
732}
733function initMobileParameters(){
734	var block=document.body.querySelector('.object .aside .right_block.parameters');
735	var cont=e('mobile_parameters');
736	if(!block || !cont) return false;
737	var mob=block.cloneNode(true);
738	cont.appendChild(mob);
739}
740function initMobileSeller(){
741	var block=document.body.querySelector('.object .aside .right_block.contact_agency');
742	var cont=e('mobile_seller');
743	if(!block || !cont) return false;
744	var mob=block.cloneNode(true);
745	cont.appendChild(mob);
746}
747function initMobileExpositionExpired(){
748	var block=document.body.querySelector('.object .aside .right_block.duration_exposure_expired');
749	var cont=e('mobile_duration_exposure_expired');
750	if(!block || !cont) return false;
751	var mob=block.cloneNode(true);
752	cont.appendChild(mob);
753}
754function initDesktopParameters(){
755	var block=e('mobile_parameters');
756	var cont=e('desktop_parameters');
757	if(!block || !cont) return false;
758	cont.innerHTML = block.innerHTML;
759}
760
761function setTab(container,n){
762	if(n==null) n=0;
763	if(container==null) return false;
764	var tabs_holder=container.getElementsByClassName('tabs')[0];
765	if(tabs_holder==null) return false;
766	var tabs=tabs_holder.getElementsByTagName('li');
767	for(var i=0;i<tabs.length;++i) if(i==n) tabs[i].click();
768}
769function hasNumber(str){
770	return /\d/.test(str);
771}
772function hasLetter(str){
773	return str.match(/[A-Za-z]{1,}/) ? true : false;
774}
775
776var GMAP={
777	'mobile_width' : 800,
778	'max_wait_google_iterator' : 1000,
779	'wrapper_class' : 'gm_info',
780	'close_file_url' : THEME_URL+"images/gm_info_close.png",
781	'map_center' : [21.018094, 105.839207],
782	'map_marker_url' : THEME_URL+'images/map_marker.png',
783	'label_class' : 'gm_labels',
784	'grid_size' : 50,
785	'additional_left_offset' : (isRTL() ? 20 : -20),
786	'additional_top_offset' : 57,
787	'objects' : [],
788	'markers' : [],
789	'infoboxes' : [],
790	'map' : null,
791}
792function isRTL(){
793	var parts=ALIAS_URL.split('/');
794	var lang=parts[parts.length-1];
795	if(lang.length!=2) return false;
796	var rtl_langs=['fa', 'ar', 'he'];
797	return rtl_langs.indexOf(lang.toLowerCase())>=0;
798}
799function initProjectsMapPage(objects){
800	calculateBigMapHeight();	
801	let s = typeof HD == 'undefined' ? true : HD.isHuman();
802	if(s) {
803		googleMapReady(function(){
804			initObjectsMap(objects,e('map'));
805		});
806	}
807	e('big_map').querySelector('.selector_show').addEventListener('click',openMapSelector);
808	window.addEventListener('load',function(){
809		checkMapSelector();
810		mapSelectorArrowPosition();
811		window.addEventListener('scroll',mapSelectorArrowPosition);
812	});
813	window.addEventListener('resize',function(){
814		checkMapSelector();
815		calculateBigMapHeight();
816	});
817}
818function initSingleProjectMap(objects){
819	googleMapReady(function(){initObjectsMap(objects,e('property_map'))});
820}
821function initProjectsMap(objects,eid){
822	googleMapReady(function(){initObjectsMap(objects,e(eid))});
823}
824function googleMapReady(cb){
825	if(typeof cb!='function') return;
826	var it=setInterval((function(i,cb){ return function(){
827		if(typeof google!='undefined' || ++i>GMAP.max_wait_google_iterator){
828			clearInterval(it);
829			if(typeof google!='undefined') cb.call();
830		}
831	}})(0,cb),100);
832}
833function mapSelectorArrowPosition(){
834	if(getClientSTop()+getPosition(e('big_map'))+150>e('big_map').offsetHeight){
835		addClass(e('big_map'),'selector_absolute');
836	}else{
837		removeClass(e('big_map'),'selector_absolute');
838	}
839}
840function calculateBigMapHeight(){
841	if(!e('big_map') || !e('big_map').querySelector('.selector')) return false;
842	//var h=e('big_map').querySelector('.selector').clientHeight;
843	var h=window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
844	var header=document.querySelector('.header');
845	if (header!=null) h=h-header.clientHeight;
846	e('big_map').style.height=h.toString()+'px';
847}
848function checkMapSelector(){
849	if(window.innerWidth>GMAP.mobile_width){
850		removeClass(e('big_map'),'active');
851		removeClass(e('big_map'),'mobile');
852	}
853	else{
854		addClass(e('big_map'),'mobile');
855	}
856}
857function openMapSelector(ev){
858	if(!ev || !ev.target) return false;
859	if(!e('big_map') || !e('big_map').querySelector('.selector')) return false;
860	if(hasClass(e('big_map'),'mobile')){
861		switchClass(e('big_map'),'active');
862	}else{
863		removeClass(e('big_map'),'active');
864	}
865}
866function getClusters(){
867	return [{
868		url: THEME_URL+'images/cluster.png',
869		height: 73,
870		width: 55,
871		anchor: [18],
872		textColor: '#333333',
873		textSize: 15
874	},{
875		url: THEME_URL+'images/cluster2.png',
876		height: 73,
877		width: 55,
878		anchor: [18],
879		textColor: '#333333',
880		textSize: 15
881	},{
882		url: THEME_URL+'images/cluster2.png',
883		height: 73,
884		width: 55,
885		anchor: [18],
886		textColor: '#333333',
887		textSize: 15
888	}];
889}
890function calculateOffset(html){
891	if(!html) return [0,0];
892	var buf=document.createElement('div');
893	buf.className=GMAP.wrapper_class;
894	buf.style.visibility='hidden';
895	buf.style.position='absolute';
896	buf.style.left='-1000000px';
897	buf.style.top='-1000000px';
898	buf.innerHTML=html;
899	document.body.appendChild(buf);
900	var l=buf.offsetWidth/2;
901	var t=buf.offsetHeight;
902	document.body.removeChild(buf);
903	return [-l,-t];
904}
905function getSingleObject(obj,ind){
906	//return false;
907	if(obj.html){
908		var info=obj.html;
909		if(ind) info+='<div class="back" onclick="singleBackToList(this);" data-ind="'+ind.toString()+'"><i class="fa fa-angle-left"></i></div>';
910	}else info='';
911	var offset=calculateOffset(info);
912	var options={
913		content: info
914		,disableAutoPan: false
915		,maxWidth: 0
916		,pixelOffset: new google.maps.Size(offset[0], offset[1])
917		,zIndex: null
918		,boxClass: GMAP.wrapper_class
919		,closeBoxMargin: "0px"
920		,closeBoxURL: GMAP.close_file_url
921		,infoBoxClearance: new google.maps.Size(1, 1)
922		,isHidden: false
923		,pane: "floatPane"
924		,enableEventPropagation: false
925	};
926	return new InfoBox(options);
927}
928function singleBackToList(el){
929	var ind=el.dataset.ind;
930	if(!ind) return false;
931	showInfobox(ind,ind);
932}
933function getMultipleObjects(objects,ind){
934	/*var info='<ul><li><div class="objects">';
935	for(var i=0;i<objects.length;++i){
936		info+='<div class="object'+objects[i].class+'" onclick="showSingleObject(this);" data-id="'+objects[i].id.toString()+'" data-ind="'+ind.toString()+'">\
937			<div class="image">\
938				<img src="'+objects[i].img+'">\
939			</div>\
940			<div class="name">'+objects[i].name+'</div>\
941		</div>';
942		GMAP.objects[objects[i].id]=objects[i];
943	}
944	info+='</div></li></ul>';*/
945	for(var i=0;i<objects.length;++i){
946		GMAP.objects[objects[i].id]=objects[i];
947	}
948	var info='';
949	var offset=calculateOffset(info);
950	var options={
951		content: info
952		,disableAutoPan: false
953		,maxWidth: 0
954		,pixelOffset: new google.maps.Size(offset[0], offset[1])
955		,zIndex: null
956		,boxClass: GMAP.wrapper_class
957		,closeBoxMargin: "0px"
958		,closeBoxURL: GMAP.close_file_url
959		,infoBoxClearance: new google.maps.Size(1, 1)
960		,isHidden: false
961		,pane: "floatPane"
962		,enableEventPropagation: false
963	};
964	return new InfoBox(options);
965}
966function showSingleObject(el){
967	var id=el.dataset.id;
968	var ind=el.dataset.ind;
969	var list_ind=el.dataset.list_index;
970	if(!id || !ind) return;
971	if(!GMAP.infoboxes[id]){
972		var ib=getSingleObject(GMAP.objects[id],ind);
973		GMAP.infoboxes[id]=ib;
974	}
975	//console.log(el);
976	//console.log(list_ind);
977	showInfobox(ind,id,list_ind);
978}
979function initObjectsMap(objects,container){
980	if(!container && !e(container)) return false;
981	if(typeof objects!=='object') objects=[];
982	if(typeof container==='string') container=e(container);
983
984	GMAP.map=new google.maps.Map(container,{
985		zoom: 4,
986		center: new google.maps.LatLng(GMAP.map_center[0], GMAP.map_center[1]),
987		mapTypeId: google.maps.MapTypeId.ROADMAP
988	});
989	var markersBounds=new google.maps.LatLngBounds();
990	var cluster_style=getClusters();
991	if(!objects || objects.length===0){
992		markersBounds.extend(new google.maps.LatLng(GMAP.map_center[0], GMAP.map_center[1]));
993		markersBounds.extend(new google.maps.LatLng(GMAP.map_center[0], GMAP.map_center[1]));
994	}
995
996	var i=0;
997	var no_infobox=false;
998	for(prop in objects) if(objects.hasOwnProperty(prop)){
999		var list=objects[prop];
1000		var latlng=prop.split('_');
1001		if(!latlng[0] || !latlng[1]) continue;
1002
1003		var marker_position=new google.maps.LatLng(latlng[0], latlng[1]);
1004		var marker = new MarkerWithLabel({
1005			position:marker_position,
1006			draggable: false,
1007			raiseOnDrag: true,
1008			map: GMAP.map,
1009			labelAnchor: new google.maps.Point(16, 59),
1010			labelClass: GMAP.label_class, // the CSS class for the label
1011			icon: GMAP.map_marker_url,
1012		});
1013		marker['index']=i;
1014		GMAP.markers.push(marker);
1015		markersBounds.extend(marker_position);
1016		if(list.length==1){
1017			var iw=getSingleObject(list[0]);
1018			if(list[0].no_infobox){
1019				no_infobox=true;
1020			}else{
1021				no_infobox=false;
1022			}
1023		}else{
1024			var iw=getMultipleObjects(list,i);
1025		}
1026
1027		if(!no_infobox){
1028			if(list.length==1){
1029				GMAP.infoboxes[list[0].id]=iw;
1030			}else{
1031				GMAP.infoboxes.push(iw);
1032			}
1033			var ind=list.length==1 ? list[0].id : GMAP.infoboxes.length-1;
1034			google.maps.event.addListener(GMAP.markers[i], "click",(function(iid,list,ind){ return function(ev){
1035				var multiple;
1036				if(list.length==1){
1037					multiple=false;
1038				}else{
1039					multiple=[];
1040					for(var j=0;j<list.length;++j) multiple.push(list[j].id);
1041				}
1042				showInfobox(this['index'],iid,false,multiple);
1043			}})(ind,list,i));
1044		}
1045		++i;
1046	}
1047	GMAP.map.setCenter(markersBounds.getCenter());
1048	if(typeof objects =="object" && objects.length!==0) GMAP.map.fitBounds(markersBounds);
1049
1050	var cluster=new MarkerClusterer(GMAP.map, GMAP.markers,{gridSize: GMAP.grid_size, styles: cluster_style});
1051	GMAP.checkzoom=true;
1052	google.maps.event.addListener(GMAP.map, "bounds_changed", function(){
1053		var w=window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
1054		var min_zoom=w>=1800 ? 6 : 5;
1055		if(GMAP.objects.length==0 && this.getZoom()>16 && GMAP.checkzoom===true){ this.setZoom(17); GMAP.checkzoom=false; }
1056		else if(this.getZoom()<min_zoom && GMAP.checkzoom===true){ this.setZoom(min_zoom); GMAP.checkzoom=false; }
1057	});
1058}
1059function loadObjectHTML(oid,m_ind,multiple,ind,cb){
1060	if(GMAP.infoboxes[oid].getContent()==''){
1061		if(multiple){
1062			KITS.sendAjaxRequest({'load_objects_data' : multiple.join(','),'oid':oid.toString(),'ind':ind.toString(),'ajax' : 2},function(){},function(data){
1063				GMAP.infoboxes[oid].setContent(data);
1064				cb.call();
1065			});
1066		}else{
1067			KITS.sendAjaxRequest({'load_object_data' : oid.toString(),'ajax' : 2},function(){},function(data){
1068				if(m_ind!==false) data+='<div class="back" onclick="singleBackToList(this);" data-ind="'+m_ind.toString()+'"><i class="fa fa-angle-left"></i></div>';
1069				GMAP.infoboxes[oid].setContent(data);
1070				cb.call();
1071			});
1072		}
1073	}else cb.call();
1074}
1075function showInfobox(m_ind,i_ind,multi_ind,multiple){
1076	//console.log(multi_ind);
1077	if(typeof multi_ind=='undefined') multi_ind=false;
1078	if(typeof multiple=='undefined') multiple=false;
1079	loadObjectHTML(i_ind,multi_ind,multiple,m_ind,(function(m_ind,i_ind){ return function(){
1080		for(var i=0;i<GMAP.infoboxes.length;++i) if(GMAP.infoboxes[i]) GMAP.infoboxes[i].setMap(null);
1081		var buf=document.createElement('div');
1082		buf.className=GMAP.wrapper_class;
1083		buf.style.visibility='hidden';
1084		buf.style.position='absolute';
1085		buf.style.left='-1000000px';
1086		buf.style.top='-1000000px';
1087		buf.innerHTML=GMAP.infoboxes[i_ind].getContent();
1088		document.body.appendChild(buf);
1089		afterImagesLoaded(buf,function(){
1090			var left=-(buf.offsetWidth/2+GMAP.additional_left_offset);
1091			var top=-(buf.offsetHeight+GMAP.additional_top_offset);
1092			GMAP.infoboxes[i_ind].setOptions({
1093				pixelOffset: new google.maps.Size(left, top),
1094			});
1095			m_ind=parseInt(m_ind);
1096			i_ind=parseInt(i_ind);
1097			GMAP.infoboxes[i_ind].open(GMAP.map,GMAP.markers[m_ind]);
1098			document.body.removeChild(buf);
1099		});
1100	}})(m_ind,i_ind));
1101}
1102function afterImagesLoaded(cont,cb){
1103	if(!cont || !cb) return false;
1104	var imgs=cont.querySelectorAll('img');
1105	var images_counter=0;
1106	if(imgs.length==0) cb.call();
1107	else for(var i=0;i<imgs.length;++i){
1108		var imloader=new Image();
1109		imloader.addEventListener('load',(function(ttl){ return function(){
1110			if(++images_counter==ttl){
1111				cb.call();
1112			}
1113		}})(imgs.length));
1114		imloader.src=imgs[i].src;
1115	}
1116}
1117//p1 - panorama location, p2 - marker location
1118function panoramaFindAngle(p1,p2) {
1119	var x=p2.lng-p1.lng();
1120	var y=p2.lat-p1.lat();
1121	var r=Math.sqrt(x*x+y*y);
1122	var angle=0;
1123	if (x>=0 && y>=0) angle=Math.asin(Math.abs(x)/r).toDeg();
1124	else if (x>=0 && y<=0) angle=90+Math.asin(Math.abs(y)/r).toDeg();
1125	else if (x<=0 && y<=0) angle=180+Math.asin(Math.abs(x)/r).toDeg();
1126	else angle=270+Math.asin(Math.abs(y)/r).toDeg();
1127	return angle;
1128}
1129
1130
1131
1132function setObjectPanorama(lat,lng) {
1133	GMAP.panorama = GMAP.map.getStreetView();
1134	GMAP.panorama.setPosition({'lat':lat,'lng':lng});
1135	//var rotate=panoramaFindAngle(GMAP.panorama.getPosition(),{'lat':lat,'lng':lng});
1136	//GMAP.panorama.setPov({heading:rotate,pitch:0});
1137	GMAP.panorama_created=true;
1138}
1139
1140function toggleObjectPanorama(el, status, lat, lng) {
1141	if(hasClass(el, 'active')) {
1142		return;
1143	}
1144	let curr = el.parentNode.querySelector('.active');
1145	if(curr) {
1146		curr.className = '';
1147	}
1148	addClass(el, 'active');
1149	if (GMAP.map==null) return false;
1150	if (status===null) status=true;
1151	if (status && !GMAP.panorama_created) setObjectPanorama(lat,lng)
1152	if (GMAP.panorama!==null) GMAP.panorama.setVisible(status);
1153}
1154
1155/* COMPARE */
1156function pinCompare(a,oid) {
1157	var th=getParentTag(a,'th');
1158	var table=getParentTag(th,'table');
1159	var pinned=table.getAttribute('data-pinned');
1160	var ths=table.querySelectorAll('th');
1161	if (pinned!='' && pinned!=null) {
1162		table.setAttribute('data-pinned','');
1163		ths[pinned].setAttribute('data-pinned','');
1164		removeClass(ths[pinned].querySelector('a.pin'),'active');
1165	}
1166	if (ths[pinned]!=th) {
1167		var new_pinned=0;
1168		for (var i=0;i<ths.length;i++) if (ths[i]==th) new_pinned=i;
1169		addClass(a,'active');
1170		th.setAttribute('data-pinned',1);
1171		table.setAttribute('data-pinned',new_pinned);
1172	}
1173}
1174function switchMainSearch(el){
1175	if(!el) return false;
1176	var sf=getParentClass(el,'slider_wrapper');
1177	if(!sf) return false;
1178	switchClass(sf,'opened');
1179}
1180function mainSearchButtonClick(ev,el){
1181	if(!ev || !ev.target) return;
1182	if(hasClass(ev.target,'arrow')){
1183		if(!el) return false;
1184		var btn=getParentClass(el,'btn');
1185		if(!btn) return false;
1186		switchClass(btn,'opened');
1187	}else{
1188		if(typeof goals!='undefined') goals.register('MAIN_SEARCH_CLICK');
1189		var f=getParentTag(el,'form');
1190		if(f) f.submit();
1191	}
1192}
1193function changeMainFormAction(el,type){
1194	if(!el || !type) return false;
1195	var types={
1196		search : 'action',
1197		map : 'map_action',
1198	};
1199	if(!types[type]) return false;
1200	var f=getParentTag(el,'form');
1201	if(!f || !f.dataset[types[type]]) return false;
1202	saveCookie('main_search_type',type);
1203	f.action=f.dataset[types[type]];
1204	f.submit();
1205}
1206function fulltext(el,txt){
1207	var txt1=typeof LANG==='object' && LANG['show_full_text']!=null && LANG['show_full_text']!='' ? LANG['show_full_text'] : 'Open more';
1208	var txt2=typeof LANG==='object' && LANG['hide_text']!=null && LANG['hide_text']!='' ? LANG['hide_text'] : 'Hide';
1209	if(txt==null || !Array.isArray(txt)) txt=[txt1,txt2];
1210	else if(txt[0]==null || txt[0]=='') txt[0]=txt1;
1211	else if(txt[1]==null || txt[1]=='') txt[1]=txt2;
1212	var k=null;
1213	for(var i=0; i<document.getElementsByClassName('show_button').length; ++i) if(el===document.getElementsByClassName('show_btn')[i]){ k=i; break; }
1214	if(k==null) return;
1215	var op=el.getAttribute('data-opened')==1 ? true : false;
1216	el.innerHTML = op ? txt[0] : txt[1];
1217	el.className=op ? el.className.replace('opened','').trim() : el.className+' opened';
1218	document.getElementsByClassName('hidden_text')[k].style.display = op ? 'none' : 'block';
1219	el.setAttribute('data-opened',(op ? 0 : 1));
1220	let cev=new CustomEvent('fulltext_done', {'detail':op});
1221	el.dispatchEvent(cev);
1222}
1223
1224var sticky_limit_y=0;
1225
1226function setStickyLimit() {
1227	var w=window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
1228	var header=document.querySelector('.header');
1229	var menu=document.querySelector('.header .main-menu');
1230	var header_y=getPosition(header,'y');
1231	var menu_y=getPosition(menu,'y');
1232	if (w>900) sticky_limit_y=menu_y;
1233	else if (w<=500) sticky_limit_y=getPosition(document.querySelector('.header .mobile_menuer'),'y');
1234	else sticky_limit_y=header_y;
1235}
1236
1237function trackStickyLimit() {
1238	var sticky_menu=document.querySelector('.sticky_menu');
1239	var y=getClientSTop();
1240	if (y>=sticky_limit_y) removeClass(sticky_menu,'hidden');
1241	else addClass(sticky_menu,'hidden');
1242}
1243
1244var vert_scroll=0;
1245function removeIosScroll() {
1246	var wrapper=document.querySelector('.superwrapper');
1247	if (wrapper==null) return false;
1248	vert_scroll=getClientSTop();
1249	addClass(wrapper,'noscroll');
1250}
1251
1252function restoreIosScroll() {
1253	var wrapper=document.querySelector('.superwrapper');
1254	if (wrapper==null) return false;
1255	removeClass(wrapper,'noscroll');
1256	window.scroll(0, vert_scroll);
1257}
1258
1259/* OBJECTS SEARCH */
1260function closeAllRanges(exclude) {
1261	var ranges=document.querySelectorAll('.range_popup.open');
1262	for (var i=0;i<ranges.length;i++)  if (ranges[i]!=exclude) removeClass(ranges[i],'open');
1263}
1264
1265function getActiveSearchTab() {
1266	var tabs=document.querySelectorAll('#objects_search_tabbed .stripe .navigation li');
1267	var active=0;
1268	var tab=tabs[0];
1269	for (var i=0;i<tabs.length;i++) if (hasClass(tabs[i],'active')) {
1270		tab=tabs[i];
1271		active=i;
1272	}
1273	return {'tab':tab,'index':active};
1274}
1275
1276function getActiveSearchForm() {
1277	var active_tab=getActiveSearchTab();
1278	var f=document.querySelectorAll('#objects_search_tabbed .items .tab')[active_tab.index].getElementsByTagName('form')[0];
1279	return f;
1280}
1281
1282function openAdvancedSearch() {
1283	var f=getActiveSearchForm();
1284	var open=false;
1285	if (f!=null) for (var i=0;i<f.length;i++){
1286		var is_advanced=getParentClass(f[i],'advanced',false);
1287		if (is_advanced && (f[i].type=='checkbox' && f[i].checked || f[i].type=='text' && f[i].value!='' || f[i].tagName.toLowerCase()=='select' && f[i].value!='')) open=true;
1288	}
1289	if (open) addClass(e('objects_search_tabbed'),'open')
1290}
1291
1292function searchSubmit(mode) {
1293	if (mode==null || mode!='map') mode='list';
1294	var f=getActiveSearchForm();
1295	if(f==null) return false;
1296	var action_url=f.getAttribute(mode=='map' ? 'data-map-action' : 'data-action');
1297	f.action=action_url;
1298	f.submit();
1299}
1300
1301function saveObjectsSearch(container) {
1302    var query = window.location.search;
1303    if (query == '' || query == '?') {
1304        alert(LANG['empty_search']);
1305        return false;
1306    }
1307    showPopup('save_search');
1308}
1309
1310function generateSearchName() {
1311	var active_tab=getActiveSearchTab();
1312	var f=getActiveSearchForm();
1313	var parts=[];
1314	parts.push(active_tab.tab.innerHTML);
1315	if (f!=null) {
1316		for (var i=0;i<f.length;i++){
1317			//checkbox
1318			if (f[i].type=='checkbox' && f[i].checked) {
1319				var labels=f[i].parentNode.querySelectorAll('label[for='+f[i].id+']');
1320				var label='';
1321				for (var j=0;j<labels.length;j++) if (labels[j].innerText!='') label=labels[j].innerText;
1322				if (label!='') parts.push(label);
1323			}
1324			//input
1325			if (f[i].type=='text' && f[i].value!='' && f[i].placeholder!='') {
1326				var label=f[i].placeholder;
1327				var range=getParentClass(f[i],'range',false);
1328				if (range!=null) {
1329					var span=range.getElementsByTagName('span')[0];
1330					if (span!=null && span.innerText!='') label=span.innerText+' '+label;
1331				}
1332				parts.push(label+': '+f[i].value);
1333			}
1334			//select
1335			if (f[i].tagName.toLowerCase()=='select' && f[i].value!='' && f[i].getAttribute('placeholder')!='') {
1336				var label=f[i].getAttribute('placeholder');
1337				var values=[];
1338				for (var j=0;j<f[i].options.length;j++) if (f[i].options[j].selected) values.push(f[i].options[j].innerText);
1339				parts.push(label+': '+values.join(','));
1340			}
1341		}
1342	}
1343	return parts.join(', ');
1344}
1345
1346function saveSearchSubmit() {
1347	var p=e('save_search');
1348	var field=p.querySelector('input[name=name]');
1349	var result_holder=p.getElementsByClassName('ajax_result')[0];
1350	Hide(result_holder);
1351	if (fieldEmpty(field)) {alert(LANG['fill_in_required']);field.focus();return false;}
1352	var result=saved_searches.saveSearch(field.value);
1353	if (result) result_holder.innerHTML=LANG['search_saved'];
1354	else result_holder.innerHTML='<span class="red">'+LANG['search_save_error']+'</span>';
1355	Show(result_holder);
1356}
1357
1358function showPreviousSearches(container) {
1359	if (hasClass(container,'open')) removeClass(container,'open');
1360	else {
1361		var event = event || window.event;
1362		event.stopPropagation ? event.stopPropagation() : (event.cancelBubble=true);
1363		addClass(container,'open');
1364		var holder=container.querySelector('.holder');
1365		if (holder!=null) holder.innerHTML=saved_searches.drawSearches();
1366	}
1367}
1368
1369function closePreviousSearches(exclude) {
1370	var searches=document.querySelectorAll('.objects_search.tabbed .controls .searches');
1371	for (var i=0;i<searches.length;i++) if (searches[i]!=exclude) removeClass(searches[i],'open');
1372}
1373
1374/* SAVED SEARCHES OBJECT */
1375function savedSearches() {
1376	this.support_storage=(typeof(Storage) !== "undefined");
1377	this.save_key='savedsearches';
1378	this.searches=[];
1379
1380	this.loadSearches=function(){
1381		var str='';
1382		if (this.support_storage) str=localStorage.getItem(this.save_key);
1383		else str=getCookie(this.save_key);
1384		if (str=='' || str==null) str='[]';
1385		this.searches=JSON.parse(str);
1386	}
1387
1388	this.saveSearches=function() {
1389		var str=JSON.stringify(this.searches);
1390		if (this.support_storage) localStorage.setItem(this.save_key,str);
1391		else saveCookie(this.save_key,str);
1392	}
1393
1394	this.drawSearches=function() {
1395		this.loadSearches();
1396		var html='';
1397		var base=window.location.href.replace(window.location.search,'');
1398		for (var i=0;i<this.searches.length;i++) {
1399			html+='<li><div class="name" onClick="window.location=\''+base+this.searches[i].query+'\'">'+this.searches[i].name+'</div><div class="delete" onClick="if (saved_searches.deleteSearch('+i+')) Hide(this.parentNode)"></div></li>';
1400		}
1401		if (html=='') html='<li class="gray">'+LANG['no_saved_searches']+'</li>';
1402		return '<ul>'+html+'</ul>';
1403	}
1404
1405	this.saveSearch=function(name) {
1406		if (name==null) return false;
1407		this.loadSearches();
1408		this.searches.push({'name':name,'query':window.location.search});
1409		this.saveSearches();
1410		return true;
1411	}
1412
1413	this.deleteSearch=function(index) {
1414		var event = event || window.event;
1415		event.stopPropagation ? event.stopPropagation() : (event.cancelBubble=true);
1416		if (index==null || index<0 || index>=this.searches.length) return false;
1417		this.searches.splice(index,1);
1418		this.saveSearches();
1419		return true;
1420	}
1421}
1422var saved_searches=new savedSearches();
1423
1424/* STATISTICS */
1425function compareCityStat(mode,holder,target_holder) {
1426	if (mode==null || holder==null || target_holder==null) return false;
1427	var compare=holder.querySelector('input[name=city_id]');
1428	var base=holder.querySelector('input[name=base_city]');
1429	if (compare==null || base==null || base.value=='') return false;
1430	if (compare.value=='') {
1431		alert(LANG['choose_compare_city']);
1432		return false;
1433	}
1434	KITS.sendAjaxRequest({'ajax':2,'numbeo_compare':mode,'city':base.value,'compare':compare.value},function(){},function(result){
1435		target_holder.innerHTML=result;
1436	});
1437}
1438function showHideSearchOnMobile(el){
1439	var cont=getParentClass(el,'main-holder');
1440	if(!cont) return false;
1441	var sw=cont.querySelector('.objects_search');
1442	var mb=cont.querySelector('.mobile_search_button');
1443	if(!sw || !mb) return false;
1444	var show=true;
1445	if(window.innerWidth<=600){
1446		show=hasClass(sw,'hidden');
1447	}
1448	if(show){
1449		addClass(mb,'hidden');
1450		addClass(sw,'active');
1451		removeClass(sw,'hidden');
1452		removeClass(mb,'disabled');
1453	}else{
1454		addClass(sw,'hidden');
1455		addClass(mb,'disabled');
1456		removeClass(mb,'hidden');
1457		removeClass(sw,'active');
1458	}
1459	recalculateFiltersCount(el);
1460}
1461function recalculateFiltersCount(el){
1462	var cont=getParentClass(el,'main-holder');
1463	var mode='active';
1464	var forms;
1465	if(mode=='active'){
1466		var tabs=cont.querySelectorAll('.tab');
1467		var msel=e('mobile_tab_switcher');
1468		var active_tab=null;
1469		if(msel){
1470			active_tab=tabs[msel.value];
1471		}else{
1472			for(var i=0;i<tabs.length;++i){
1473				if(tabs[i].style.display=='block'){
1474					active_tab=tabs[i];
1475					break;
1476				}
1477			}
1478		}
1479		if(active_tab) forms=active_tab.querySelectorAll('form');
1480	}else if(mode=='all'){
1481		forms=cont.querySelectorAll('.tab form');
1482	}
1483	var c=0;
1484	if(forms){
1485		for(var i=0;i<forms.length;++i){
1486			for(var j=0;j<forms[i].length;++j){
1487				if(fieldHasValue(forms[i][j])){
1488					++c;
1489				}
1490			}
1491		}
1492	}
1493	var counter=cont.querySelector('.mobile_search_button .counter');
1494	if(c==0){
1495		addClass(counter,'hidden');
1496	}else{
1497		removeClass(counter,'hidden');
1498	}
1499	counter.innerHTML=c==0 ? '' : c;
1500
1501}
1502function fieldHasValue(el){
1503	var tag=el.tagName.toLowerCase();
1504	var res=false;
1505	if(tag=='select'){
1506		for(var i=0;i<el.options.length;++i){
1507			res=el.options[i].selected && el.options[i].value!='';
1508			if(res===true) break;
1509		}
1510	}else if(tag=='radio'){
1511
1512	}else if(el.type=='checkbox'){
1513		res=el.checked;
1514	}else if(el.type=='hidden'){
1515
1516	}else{
1517		res=el.value!='';
1518	}
1519	return res;
1520}
1521function initMobileSearch(){
1522	var elem=document.body.querySelector('#objects_search_tabbed');
1523	if(!elem) return;
1524	var el=document.createElement('div');
1525	el.className='mobile_search_button';
1526	el.innerHTML='<div class="container"><div class="text">'+LANG['filters']+'<span class="counter"></span></div></div>';
1527	//elem.parentNode.insertBefore(el,elem);
1528	elem.parentNode.querySelector('#container_mobile_search_button').appendChild(el);
1529	el.addEventListener('click',function(){ showHideSearchOnMobile(this); });
1530	recalculateFiltersCount(elem);
1531	showHideSearchOnMobile(elem);
1532
1533	var els=document.body.querySelectorAll('.objects_search form');
1534	for(var i=0;i<els.length;++i){
1535		for(var j=0;j<els[i].length;++j){
1536			els[i][j].addEventListener('change',(function(el){ return function(){
1537				recalculateFiltersCount(this);
1538			}})(els[i]));
1539		}
1540	}
1541	var controls=elem.querySelector('.controls');
1542	var div=document.createElement('div');
1543	div.className='mobile_btn';
1544	div.innerHTML='<a onclick="showHideSearchOnMobile(this);">'+LANG['hide_filters']+'</a>';
1545	controls.appendChild(div);
1546	/*window.addEventListener('resize',(function(els){ return function(){
1547		for(var i=0;i<els.length;++i){
1548			showHideSearchOnMobile(els[i],true);
1549		}
1550	})(els));*/
1551}
1552function fullCrosslink(el){
1553	if(!el) return false;
1554	var par=getParentClass(el,'crosslink_block');
1555	if(!par) return false;
1556	var items=par.querySelector('.items');
1557	if(!items) return false;
1558	if(hasClass(items,'show_all')){
1559		el.innerHTML=LANG['more'].charAt(0).toUpperCase() + LANG['more'].slice(1);
1560	}else{
1561		el.innerHTML=LANG['less'].charAt(0).toUpperCase() + LANG['less'].slice(1);
1562	}
1563	switchClass(items,'show_all');
1564
1565}
1566function switchCrosslink(el){
1567	if(!el) return false;
1568	var par=getParentClass(el,'crosslink_block');
1569	if(!par) return false;
1570	addClass(par,'user_set');
1571	switchClass(par,'inactive');
1572}
1573function showHideCrosslinks(){
1574	var els=document.body.querySelectorAll('.crosslink_block');
1575	if(!els || !els.length) return;
1576	var show=window.innerWidth>800;
1577	for(var i=0;i<els.length;++i){
1578		if(!hasClass(els[i],'user_set')){
1579			if(show){
1580				removeClass(els[i],'inactive');
1581			}else{
1582				addClass(els[i],'inactive');
1583			}
1584		}
1585	}
1586}
1587
1588function complainObject(oid) {
1589    modalFormBuffer.clear();
1590    modalFormBuffer.oid = oid;
1591    showPopup('complain_object');
1592}
1593
1594function initTwoColumnsScroller(id,id1,id2,c,one_line){
1595	var cont=e(id);
1596	var sl1=e(id1);
1597	var sl2=e(id2);
1598	if(!cont || !sl1 || !sl2){
1599		return false;
1600	}
1601	if(typeof one_line=='undefined'){
1602		one_line=true;
1603	}
1604	if(one_line){
1605		var ol=document.createElement('div');
1606		ol.className='scroller_line one_line';
1607		ol.innerHTML=sl1.innerHTML;
1608		var its=ol.querySelector('.slides');
1609		if(its){
1610			var sits=sl2.querySelectorAll('.slides .item');
1611			for(var i=0;i<sits.length;++i){
1612				its.appendChild(sits[i].cloneNode(true));
1613			}
1614			cont.querySelector('.wrapper').appendChild(ol);
1615			var slider_inline=new kit_slider({
1616				'container': ol,
1617				'in_row' : c,
1618				//'offset' : '27px',
1619				'metrics' : 'px',
1620				'mobile' : [[1000,parseInt(c/(c/3))],[800,parseInt(c/(c/2))],[600,parseInt(c/(c/1.5))]],
1621			});
1622			swipe(ol,(function (obj){ return function(p){ obj.swipe(p);}})(slider_inline),100);
1623		}
1624	}
1625	var la=cont.querySelector('.arrow_left');
1626	var ra=cont.querySelector('.arrow_right');
1627	var slider_1=new kit_slider({
1628		'container': sl1,
1629		'in_row' : c,
1630		//'offset' : '27px',
1631		'metrics' : 'px',
1632		'mobile' : [[1000,parseInt(c/(c/3))],[800,parseInt(c/(c/2))],[600,parseInt(c/(c/1.5))]],
1633	});
1634	swipe(sl1,(function (obj){ return function(p){ obj.swipe(p);}})(slider_1),100);
1635	var slider_2=new kit_slider({
1636		'container': sl2,
1637		'in_row' : c,
1638		//'offset' : '27px',
1639		'metrics' : 'px',
1640		'mobile' : [[1000,parseInt(c/(c/3))],[800,parseInt(c/(c/2))],[600,parseInt(c/(c/1.5))]],
1641	});
1642	swipe(sl2,(function (obj){ return function(p){ obj.swipe(p);}})(slider_2),100);
1643	if(la){
1644		la.addEventListener('click',(function(s1,s2,si){ return function(){
1645			s1.slide(-1);
1646			s2.slide(-1);
1647			if(si){
1648				si.slide(-1);
1649			}
1650		}})(slider_1,slider_2,slider_inline));
1651	}
1652	if(ra){
1653		ra.addEventListener('click',(function(s1,s2,si){ return function(){
1654			s1.slide(1);
1655			s2.slide(1);
1656			if(si){
1657				si.slide(1);
1658			}
1659		}})(slider_1,slider_2,slider_inline));
1660	}
1661	window.addEventListener('load',(function(la,ra,s1,s2){ return function(){
1662		if(s1.pages==1 && s2.pages==1){
1663			if(la){
1664				addClass(la,'empty_class');
1665			}
1666			if(ra){
1667				addClass(ra,'empty_class');
1668			}
1669		}
1670	}})(la,ra,slider_1,slider_2));
1671	window.addEventListener('resize',(function(la,ra,s1,s2,si){ return function(){
1672		if(s1.pages==1 && s2.pages==1){
1673			if(la){
1674				addClass(la,'empty_class');
1675			}
1676			if(ra){
1677				addClass(ra,'empty_class');
1678			}
1679		}else{
1680			if(la){
1681				removeClass(la,'empty_class');
1682			}
1683			if(ra){
1684				removeClass(ra,'empty_class');
1685			}
1686		}
1687	}})(la,ra,slider_1,slider_2,slider_inline));
1688}
1689function hasSVGClass(elem,cl){
1690	if(elem==null || !elem.className=='' || !elem.className.baseVal || elem.className.baseVal=='' || cl==null || cl.trim()=='') return false;
1691	var classes=elem.className ? elem.className.split(' ') : [];
1692	var res=false;
1693	for(var i=0;i<classes.length;++i) if(classes[i]==cl){ res=true; break; }
1694	return res;
1695}
1696function addSVGClass(elem,cl){
1697	if(!hasSVGClass(elem,cl)) elem.className.baseVal=elem.className.baseVal+' '+cl;
1698}
1699function removeSVGClass(elem,cl){
1700	if(elem==null || elem.className==null || elem.className.baseVal==null) return false;
1701	var classes=elem.className.baseVal==null ? [] : elem.className.baseVal.split(' ');
1702	var new_classes=[];
1703	for (var i=0;i<classes.length;i++) if (classes[i]!='' && classes[i]!=cl) new_classes.push(classes[i]);
1704	elem.className.baseVal=new_classes.join(' ');
1705}
1706function switchSVGClass(elem,cl){
1707	if(hasSVGClass(elem,cl)) addSVGClass(elem,cl);
1708	else removeSVGClass(elem,cl);
1709}
1710
1711function setAjaxLoader(el,enable){
1712	if(typeof enable=='undefined'){
1713		enable=true;
1714	}
1715	var cont=getParentClass(el,'ajax_container');
1716	if(!cont){
1717		return false;
1718	}
1719	if(enable){
1720		addClass(cont,'active');
1721	}else{
1722		removeClass(cont,'active');
1723	}
1724}
1725
1726function ajaxFlatsSearch(el) {
1727	var f = getParentTag(el,'form');
1728	var cont = e('object_flats');
1729	setAjaxLoader(el);
1730	if(!f || !cont) {
1731		return false;
1732	}
1733	if(!f['flats_changed']){
1734		var inp = document.createElement('input');
1735		inp.type = 'hidden';
1736		inp.name = 'flats_changed';
1737		inp.value = 1;
1738		f.appendChild(inp);
1739	}
1740	KITS.sendAjaxRequest(formToAjaxObject(f),function(){},function(res){
1741		try{
1742			res=JSON.parse(res);
1743		}catch(ex){
1744			res={type:'error'};
1745		}
1746		setAjaxLoader(el,false);
1747		if(res.type=='success' && res.html){
1748			redrawComplexFlats(res.html);
1749		}
1750	});
1751}
1752function ajaxLayoutsSearch(el){
1753	var f=getParentTag(el,'form');
1754	var cont=e('complex_layouts_list');
1755	setAjaxLoader(el);
1756	if(!f || !cont){
1757		return false;
1758	}
1759	if(!f['layouts_changed']){
1760		var inp=document.createElement('input');
1761		inp.type='hidden';
1762		inp.name='layouts_changed';
1763		inp.value=1;
1764		f.appendChild(inp);
1765	}
1766	KITS.sendAjaxRequest(formToAjaxObject(f),function(){},function(res){
1767		try{
1768			res=JSON.parse(res);
1769		}catch(ex){
1770			res={type:'error'};
1771		}
1772		setAjaxLoader(el,false);
1773		if(res.type=='success' && res.html){
1774			redrawComplexLayoutsList(res.html);
1775		}
1776	});
1777}
1778function ajaxObjectsSort(ev){
1779	if(!ev || !ev.detail || !ev.detail.key){
1780		return false;
1781	}
1782	if(ev.detail.key=='complex_self_flats_sort'){
1783		if(ev.detail.html){
1784			redrawComplexFlatsList(ev.detail.html);
1785		}
1786	} if(ev.detail.key=='complex_flats_sort') {
1787		if(ev.detail.html){
1788			redrawComplexFlats(ev.detail.html);
1789		}
1790	} else if(ev.detail.key=='complex_agents_flats_sort'){
1791		if(ev.detail.html){
1792			redrawComplexAgentsFlatsList(ev.detail.html);
1793		}
1794	}else if(ev.detail.key=='complex_layouts_sort'){
1795		if(ev.detail.html){
1796			redrawComplexLayoutsList(ev.detail.html);
1797		}
1798	}else if(ev.detail.key=='layouts_flats_sort'){
1799		if(ev.detail.html){
1800			redrawLayoutFlatsList(ev.detail.html);
1801		}
1802	}
1803}
1804
1805function switchGallery(el,c){
1806	if(!el || hasClass(el,'active')){
1807		return;
1808	}
1809	var anti=c=='D2' ? 'D3' : 'D2';
1810	var cont=getParentClass(el,'switcher');
1811	var img=getParentClass(el,'main_image');
1812	if(!img || !cont){
1813		return;
1814	}
1815	var act=cont.querySelector('.active');
1816	if(act){
1817		removeClass(act,'active');
1818	}
1819	removeClass(img,anti);
1820	addClass(img,c);
1821	addClass(el,'active');
1822}
1823function floorChanged(el){
1824	if(!el){
1825		return;
1826	}
1827
1828	KITS.sendAjaxRequest({floor_changed:el.value},function(){},function(res){
1829		try{
1830			res=JSON.parse(res);
1831		}catch(ex){
1832			res={type:'error'};
1833		}
1834		if(res.type=='success' && res.link){
1835			window.location.href=res.link;
1836		}
1837	});
1838}
1839function ajaxLayoutFlatsSearch(el){
1840	var f=getParentTag(el,'form');
1841	var cont=e('layout_flats_list');
1842	setAjaxLoader(el);
1843	if(!f || !cont){
1844		return false;
1845	}
1846	if(!f['layout_flats_changed']){
1847		var inp=document.createElement('input');
1848		inp.type='hidden';
1849		inp.name='layout_flats_changed';
1850		inp.value=1;
1851		f.appendChild(inp);
1852	}
1853	KITS.sendAjaxRequest(formToAjaxObject(f),function(){},function(res){
1854		try{
1855			res=JSON.parse(res);
1856		}catch(ex){
1857			res={type:'error'};
1858		}
1859		setAjaxLoader(el,false);
1860		if(res.type=='success' && res.html){
1861			redrawLayoutFlatsList(res.html);
1862		}
1863	});
1864}
1865
1866function complaintAgency(id, ph) {
1867    modalFormBuffer.clear();
1868    modalFormBuffer.id = id;
1869    if (typeof ph != 'undefined') {
1870        modalFormBuffer.ph = ph;
1871    }
1872    showPopup('complaint_form');
1873}
1874function leaveReview(st, id) {
1875    modalFormBuffer.clear();
1876    if (typeof id !== 'undefined' && st != '') {
1877        modalFormBuffer.id = id;
1878    }
1879    if (typeof st !== 'undefined' && st != '') {
1880        modalFormBuffer.st = st;
1881    }
1882    showPopup('reviews_form');
1883}
1884function showAllReviews(el){
1885	if(!el){
1886		return false;
1887	}
1888	var par=getParentClass(el,'reviews_list');
1889	var new_text=el.dataset.text;
1890	el.dataset.text=el.innerHTML;
1891	el.innerHTML=new_text;
1892	switchClass(par,'show_all');
1893}
1894function redrawReviewsList(html){
1895	var cont=e('reviews_list');
1896	if(!cont || !html){
1897		return false;
1898	}
1899	setAjaxLoader(cont);
1900	cont.querySelector('.items').innerHTML=html;
1901	var items=cont.querySelectorAll('.items .review');
1902	var more_link=cont.querySelector('.more_link');
1903	if(items.length<2){
1904		Hide(more_link);
1905	}else{
1906		Show(more_link);
1907	}
1908	setAjaxLoader(cont,false);
1909}
1910function submitReview(submit_element,args) {
1911	if (args==null) args={};
1912	args.cb = function(f) {		
1913		var st=f.querySelector('.new_rating');
1914		if(st){
1915			drawStatus(0,st);
1916		}
1917	}
1918	formSubmit(submit_element, args);
1919}
1920function processQueuedImages(images) {
1921	if(typeof images=='undefined' || !images.length) {
1922		return;
1923	}
1924	for(var i = 0; i < images.length; ++i) {
1925		var imgs = document.body.querySelectorAll('img[src="'+images[i][1]+'"]');
1926		var bgs = document.body.querySelectorAll('*[style*="background-image"]');
1927		var backgrounds = [];
1928		for(var j = 0; j < bgs.length; ++j) {
1929			//console.log(bgs[j].style.backgroundImage);
1930			var src=bgs[j].style.backgroundImage.replace('url(','');
1931			src=src.replace(')','');
1932			if(src[0]=='"') {
1933				src=src.substring(1);
1934			}
1935			if(src[src.length-1]=='"') {
1936				src=src.substring(0,src.length-1);
1937			}
1938			if(src == images[i][1]) {
1939				backgrounds.push(bgs[j]);
1940			}
1941		}
1942		if(imgs.length || backgrounds.length) {
1943			loadQueuedImage(images[i][0], images[i][2], imgs, backgrounds, images[i][1]);
1944		}
1945	}
1946}
1947function loadQueuedImage(img, size, images, bgs, full_url) {
1948	KITS.sendAjaxRequest({ load_queued_image : img, size : size }, function() {
1949		for(var i = 0; i < images.length; ++i) {
1950			images[i].src = full_url;
1951		}
1952		for(var i = 0; i < bgs.length; ++i) {
1953			bgs[i].style.backgroundImage = "url('"+full_url+"')";
1954		}
1955	}, function(err) {
1956
1957	});
1958}
1959
1960/* NEW DEVELOPMENT */
1961function getElRealOffset(el) {
1962	if(!el) {
1963		return 0;
1964	}
1965	var t = getPosition(el);
1966	var h = document.body.querySelector('.sticky_menu');
1967	if(h) {
1968		t -= h.offsetHeight;
1969	}
1970	return t;
1971}
1972function orderOnlineTour(el) {
1973	var f = document.body.querySelector('#contact form');
1974	if(!f) {
1975		return false;
1976	}
1977	if(f.online_tour) {
1978		f.online_tour.checked = true;
1979		f.online_tour.fireChange();
1980	}
1981	smoothScroll(0, getElRealOffset(e('contact')));
1982}
1983function objectContactFormOnlineChanged(el) {
1984	if(!el || !el.form) {
1985		return;
1986	}
1987	el.form.dataset.success_goal = el.checked ? 'OBJECT_FORM_ONLINE_TOUR' : 'OBJECT_FORM_SENT';
1988}
1989function filterFlatsList(el) {
1990	if(!el || !isNum(el.dataset.rooms)) {
1991		return;
1992	}
1993	var f = document.forms['flats_filter'];
1994	if(!f || !f['prj_bedrooms[]']) {
1995		return;
1996	}
1997	var of = document.body.querySelector('.offers_filter select');
1998	for(var i = 0; i < f['prj_bedrooms[]'].options.length; ++i) {
1999		if(f['prj_bedrooms[]'].options[i].value == el.dataset.rooms) {
2000			f['prj_bedrooms[]'].options[i].selected = true;
2001		} else {
2002			f['prj_bedrooms[]'].options[i].selected = false;
2003		}
2004	}
2005	var current_fake = f['prj_bedrooms[]'].parentNode.querySelector('.kitui-select');
2006	if(current_fake) {
2007		current_fake.parentNode.removeChild(current_fake);
2008	}
2009	f['prj_bedrooms[]'].id = f['prj_bedrooms[]'].id ? f['prj_bedrooms[]'].id : 'flats_filter_bedrooms';
2010	document.kit_ui.addFakeSelects('#'+f['prj_bedrooms[]'].id.toString());
2011	var slct=new kitSelect(f['prj_bedrooms[]'].parentNode.querySelector('div.kitui-select'));
2012	document.kit_ui.selects.push(slct);
2013	var block = '';
2014	if(of) {
2015		block = of.value;
2016	}
2017	f.prj_section.value = block;
2018	var current_fake = f.prj_section.parentNode.querySelector('.kitui-select');
2019	if(current_fake) {
2020		current_fake.parentNode.removeChild(current_fake);
2021	}
2022	f.prj_section.id = f.prj_section.id ? f.prj_section.id : 'flats_filter_section';
2023	document.kit_ui.addFakeSelects('#'+f.prj_section.id.toString());
2024	var slct=new kitSelect(f.prj_section.parentNode.querySelector('div.kitui-select'));
2025	document.kit_ui.selects.push(slct);
2026
2027	f.querySelector('.btn').click();
2028	smoothScroll(0, getElRealOffset(f));
2029}
2030
2031
2032function filterOffersList(el) {
2033	var cont = e('object_offers');
2034	setAjaxLoader(el);
2035	if(!cont || !el){
2036		return false;
2037	}
2038	KITS.sendAjaxRequest({ 'offers_block' : el.value},function(){},function(res){
2039		if(res) {
2040			var div = document.createElement('div');
2041			div.innerHTML = res;
2042			cont.querySelector('.items').innerHTML = div.querySelector('.items').innerHTML;
2043			delete(div);
2044		}
2045		setAjaxLoader(cont,false);
2046	});
2047}
2048function changeBuildStage(el) {
2049	var cont = e('build_process');
2050	setAjaxLoader(el);
2051	if(!cont || !el){
2052		return false;
2053	}
2054	KITS.sendAjaxRequest({ 'build_stage_changed' : el.value},function(){},function(res){
2055		if(res) {
2056			cont.querySelector('.slides').innerHTML = res;
2057			var slider_object_build_process = new kit_slider({
2058				'container': e('object_buildprocess_scroller'),
2059				'metrics' : 'px',
2060				'in_row' : 1,
2061				'arrow_left' : '.arrow_left',
2062				'arrow_right' : '.arrow_right',
2063			});
2064			swipe(e('object_buildprocess_scroller'),(function (obj){ return function(p){ obj.swipe(p);}})(slider_object_build_process),100);
2065		}
2066		setAjaxLoader(cont,false);
2067	});
2068}
2069
2070function priceFilterChanged(el) {
2071	if(!el) {
2072		return '';
2073	}
2074	var cont = e('object_history');
2075	setAjaxLoader(el);
2076	if(!cont || !el){
2077		return false;
2078	}
2079	KITS.sendAjaxRequest({ 'history_bedrooms_changed' : el.value},function(){},function(res){
2080		try{
2081			res = JSON.parse(res);
2082		} catch(ex) {
2083			res = {
2084				type : 'error',
2085			}
2086		}
2087		if(res.type == 'success') {
2088			window.objects_chart.data.labels = res.dates;
2089			window.objects_chart.data.datasets[0].data = res.data;
2090			window.objects_chart.update();
2091			
2092			if (res.top_info) {
2093				const tempDiv = document.createElement('div');
2094				tempDiv.innerHTML = res.top_info;
2095
2096				const topInfoBlock = cont.querySelector('.top_info');
2097				topInfoBlock.parentNode.replaceChild(tempDiv, topInfoBlock);
2098			}
2099			
2100		}
2101		setAjaxLoader(cont,false);
2102	});
2103
2104}
2105
2106function showObjectsListForm(el) {
2107	/*if(!this) {
2108		return;
2109	}
2110	var par = getParentTag(this);
2111	if(!par) {
2112		return;
2113	}
2114	var hr = par.querySelector('.hidden_row');
2115	if(!hr) {
2116		return;
2117	}
2118	var wr = hr.querySelector('.wrapper');
2119	if(!wr) {
2120		return;
2121	}*/
2122	if(!this) {
2123		return;
2124	}
2125	var hr = this.querySelector('.hidden_row');
2126	if(!hr) {
2127		return;
2128	}
2129	var wr = hr.querySelector('.wrapper');
2130	if(!wr) {
2131		return;
2132	}
2133	addClass(hr, 'active');
2134	hr.style.height = wr.offsetHeight.toString() + 'px';
2135
2136}
2137function hideObjectsListForm(el) {
2138	if(!this) {
2139		return;
2140	}
2141	var hr = this.querySelector('.hidden_row');
2142	if(!hr) {
2143		return;
2144	}
2145	var wr = hr.querySelector('.wrapper');
2146	if(!wr) {
2147		return;
2148	}
2149	removeClass(hr, 'active');
2150	hr.style.height = '0';
2151
2152}
2153
2154function checkAdvancedBlock(number){
2155	let wrapper=document.querySelectorAll('#objects_search_tabbed .items .tab');
2156	if(!wrapper) return false;
2157	if (wrapper[number]!=null) {
2158		let advanced=wrapper[number].querySelector('.advanced');
2159		let advanced_switcher=document.querySelector('#objects_search_tabbed .advanced_search .more');
2160		if (advanced_switcher) {
2161			if(!advanced){
2162				advanced_switcher.style.visibility='hidden';
2163			} else {
2164				advanced_switcher.removeAttribute("style");
2165			}
2166		}
2167	}
2168}
2169
2170function redrawHotOffersList(html){
2171	var cont=e('hotoffers_list');
2172	if(!cont || !html){
2173		return false;
2174	}
2175	setAjaxLoader(cont);
2176	cont.querySelector('#items_list').innerHTML=html;
2177	setAjaxLoader(cont,false);
2178	let y=getPosition(cont,'y');
2179	let header_height=document.querySelector('.sticky_menu').clientHeight;
2180	window.scrollTo(0,y-header_height-5);
2181}
2182function setYaClientId(){
2183	var ya_client_id = '';
2184	var intervalYaClientId = setInterval(function(){
2185		try {
2186			if (typeof goals!=='undefined' && typeof window['jivo_api'] !== "undefined" ) {
2187				ya_client_id=goals.getClientIDYA();
2188				if (ya_client_id) {
2189					if (window['jivo_api']) {
2190						window['jivo_api'].setUserToken(ya_client_id);
2191					}
2192					clearInterval(intervalYaClientId);
2193				}
2194			}
2195		} catch(err) {
2196		}
2197	}, 1000);
2198}
2199
2200function filterPhoneInput() {
2201	let pattern = /[^0-9\-\(\)\+\s]/ig;
2202	this.value = this.value.replace(pattern, '');
2203}
2204
2205(function(W) {
2206	function Human_Detector() {
2207		this.isHuman = function(){
2208			let is_human = false;
2209			is_human = !this.isBotByUA();
2210			return is_human;
2211		};
2212
2213		this.isBotByUA = function(useragent) {
2214			if (useragent == null) {
2215				useragent = typeof navigator != 'undefined' ?  navigator.userAgent : '';
2216			}
2217			if (useragent=='') {
2218				return true;
2219			}
2220			let botsigns = ['bot', 'crawl', 'spider'/*, 'Chrome'*/];
2221			let re = new RegExp(botsigns.join('|'),'i');
2222			return re.test(useragent);
2223		}
2224	}
2225	W.HD = new Human_Detector();
2226})(window);
2227function initObjectMap(OBJECT_MAP) {
2228	let cont = e('property_map');
2229	if(!cont) {
2230		return;
2231	}
2232	if(!OBJECT_MAP) {
2233		return;
2234	}
2235	if(!!window.IntersectionObserver) {
2236        //intersection observer is supported
2237		let observermap = new IntersectionObserver((entries, observer) => {
2238			if(entries[0].isIntersecting) {
2239				let s = typeof HD == 'undefined' ? true : HD.isHuman();
2240				if(s) {
2241					initSingleProjectMap(OBJECT_MAP);
2242				}
2243				observer.unobserve(entries[0].target);
2244			}
2245	 	}, {threshold : [0]});
2246	  	observermap.observe(cont);
2247	} else if(typeof HD != 'undefined') {
2248        //intersection observer is not supported  
2249		let show = typeof HD == 'undefined' ? true : HD.isHuman();
2250		if(show) {
2251			initSingleProjectMap(OBJECT_MAP);
2252		}
2253	}
2254}
2255
2256function anchorScroll() {
2257	// Проверяем якорь из url при загрузке страницы
2258	if (location.hash) {
2259		var target = document.querySelector('*[id="' + location.hash.slice(1) + '"]');
2260		if (target) {
2261			window.scrollTo({
2262				top: getOffsetTop(target) - getMenuHeight(),
2263				behavior: 'smooth'
2264			});
2265		}
2266	}
2267
2268	// Добавляем слушатели кликов ко всем ссылкам с якорями
2269	var anchorLinks = document.querySelectorAll('a[href^="#"]');
2270	anchorLinks.forEach(function(link) {
2271		link.addEventListener('click', function(event) {
2272			event.preventDefault();
2273			// Получаем целевой элемент, к которому ведет ссылка-якорь
2274			var target = document.querySelector('*[id="' + this.getAttribute('href').slice(1) + '"]');
2275			if (target) {
2276				// Прокручиваем страницу к целевому элементу с учетом высоты закрепленной шапки
2277				window.scrollTo({
2278					top: getOffsetTop(target) - getMenuHeight(),
2279					behavior: 'smooth'
2280				});
2281			}
2282		});
2283	});
2284}
2285
2286function getMenuHeight() {
2287	var stickyMenu = document.querySelector('.sticky_menu');
2288	var stickyMenuHeight = stickyMenu.offsetHeight;
2289	if (stickyMenu.classList.contains('hidden')) {
2290		stickyMenu.classList.remove('hidden');
2291		stickyMenuHeight = stickyMenu.offsetHeight;
2292		stickyMenu.classList.add('hidden');
2293	}
2294	return stickyMenuHeight;
2295}
2296
2297function getOffsetTop(elem) {
2298    var offsetTop = 0;
2299    do {
2300        if (!isNaN(elem.offsetTop)) {
2301            offsetTop += elem.offsetTop;
2302        }
2303    } while (elem = elem.offsetParent);
2304    return offsetTop;
2305}
2306
2307function initPriceBlocks(update) {
2308	let cont_aside = document.querySelector('.object .aside .right_block .price_info');
2309	let cont_mobile = document.querySelector('#mobile_parameters .price_info');
2310	if(!cont_aside || !cont_mobile) {
2311		return;
2312	}
2313	let cont = cont_aside.offsetWidth ? cont_aside : cont_mobile;
2314	let price = cont.querySelector('.value');
2315	if(!price) {
2316		return;
2317	}
2318	let max_h = 21;
2319	let prec = 1.5;
2320	let eps = 0.2;
2321	let drop = false;
2322	if(price.offsetHeight > max_h * prec) {
2323		drop = true;
2324	}
2325	let text = cont.querySelector('.type span');
2326	let price_span = price.querySelector('span');
2327	if(text && (1 - (text.offsetWidth + price_span.offsetWidth) / cont.offsetWidth < eps)) {
2328		drop = true;
2329	}
2330	if(drop) {
2331		addClass(cont, 'force_drop');
2332	} else if (update) {
2333		removeClass(cont, 'force_drop');		
2334	}
2335}
2336
2337function closeAllLists(listForOpen) {
2338	document.querySelectorAll('.js-list-for-show, .js-list-languages-for-show, .js-list-user-actions-for-show').forEach(function (el) {
2339        if (el === listForOpen) {
2340            return;
2341        }
2342        el.classList.remove('open');
2343        let list = el.querySelector('.list');
2344        list.style.display = 'none';
2345        list.classList.add('prepare-show-loader');
2346    });
2347}
2348
2349function initMobilePartnerForm() {
2350	let cont = e('mobile_partners_calculator_holder');
2351	if(!cont) {
2352		return;
2353	}
2354	let form = document.querySelector('.price_calculator');
2355	if(!form) {
2356		return false;
2357	}
2358	cont.appendChild(form.cloneNode(true));
2359	initPartnerRange(cont.querySelector('.price_calculator'));
2360}
2361function initPartnerRange(form) {
2362	if(!form) {
2363		return false;
2364	}
2365	let inp = form.querySelector('input[name="price"]');
2366	let range = form.querySelector('input[name="value"]');
2367	let out = form.querySelector('.output .rate');
2368	let perc = parseFloat(form.dataset.percent);
2369	range.addEventListener('input', function() {
2370		inp.value = KITS.formatPrice(this.value, '', 0, ' ', '.', false, 0);
2371		out.innerHTML = KITS.formatPrice(this.value * perc, KITS_CURRENCY, 0, ' ', '.', true, false, false);
2372	});
2373	inp.addEventListener('input', function() {
2374		setPartnerCalculatorValues(this);
2375	});
2376}
2377
2378function filterNumeric(el, only_num, positive){
2379	if(!el) return false;
2380	if(typeof only_num=='undefined') {
2381		only_num=false;
2382	}
2383	if(typeof positive == 'undefined') {
2384		positive = false;
2385	}
2386	var replaces = !only_num ? {',':'.'} : {};
2387	var new_str = '';
2388	for(var i = 0; i < el.value.length; ++i) {
2389		if(!isNum(el.value[i]) || (positive && el.value[i]=='-')) {
2390			if(replaces[el.value[i]]) {
2391				new_str += replaces[el.value[i]];
2392			}
2393		} else {
2394			new_str+=only_num ? (el.value[i]=='.' ? '' : el.value[i]) : el.value[i];
2395		}
2396	}
2397	el.value = new_str;
2398}
2399function setPartnerCalculatorValues(el) {
2400	if(!el) {
2401		return false;
2402	}
2403	let par = el.closest('.price_calculator');
2404	if(!par) {
2405		return false;
2406	}
2407	let range = par.querySelector('input[name="value"]');
2408	if(!range) {
2409		return false;
2410	}
2411	if(!isNum(el.value) || el.value == '-') {
2412		filterNumeric(el, true, true);
2413	}
2414	if(!el.value) {
2415		return false;
2416	}
2417	let steps = (parseInt(range.max) - parseInt(range.min)) / parseInt(range.step);
2418	let mid = parseInt(range.step) * (steps / 2) + parseInt(range.min);
2419	let start = parseInt(el.value) > mid ? parseInt(range.max) : mid;
2420	let val = start;
2421	for(let i = start; i >= parseInt(el.value); i = i - parseInt(range.step)) {
2422		val = i;
2423	}
2424	let out = par.querySelector('.output .rate');
2425	let perc = parseFloat(par.dataset.percent);
2426	range.value = val;
2427	out.innerHTML = KITS.formatPrice(parseInt(el.value) * perc, KITS_CURRENCY, 0, ' ', '.', true, false, false);
2428	el.value = KITS.formatPrice(el.value, '', 0, ' ', '.', false, 0);
2429}
2430
2431
2432
2433function recalcMobilereplaceElements(checkedElements) {
2434    checkedElements.forEach(function (elem) {
2435        let elemResolution = parseInt(elem.dataset.resolution);
2436        if (elemResolution > 0) {
2437            if (window.innerWidth > elemResolution) {
2438                if (elem.classList.contains('mobile_version')) {
2439                    elem.classList.add('hidden');
2440                } else {
2441                    elem.classList.remove('hidden');
2442                }
2443            } else {
2444                if (elem.classList.contains('mobile_version')) {
2445                    elem.classList.remove('hidden');
2446                } else {
2447                    elem.classList.add('hidden');
2448                }
2449            }
2450        }
2451    });
2452}
2453
2454function showCommentsForm(el) {
2455	if(!el) {
2456        return false;
2457    }
2458    let par = el.closest('.comments_form_wrapper');
2459	if(!par) {
2460        return false;
2461    }
2462    let btn = par.querySelector('.comments_button');
2463    let f = par.querySelector('.comments_form');
2464	if(!btn || !f) {
2465        return false;
2466    }
2467    addClass(btn, 'hidden');
2468    removeClass(f, 'hidden');
2469}
2470
2471function hideCommentsForm(el) {
2472	if(!el) {
2473        return false;
2474    }
2475    let par = el.closest('.comments_form_wrapper');
2476	if(!par) {
2477        return false;
2478    }
2479    let btn = par.querySelector('.comments_button');
2480    let f = par.querySelector('.comments_form');
2481	if(!btn || !f) {
2482        return false;
2483    }
2484    removeClass(btn, 'hidden');
2485    addClass(f, 'hidden');
2486    let form = f.querySelector('form');
2487	if(form) {
2488        form.reset();
2489	}
2490}
2491
2492const rewievsSlider = {
2493    totalElems: 0,
2494    countElems: 0,
2495    elemsInSlide: 0,
2496    nextPointer: null,
2497    prevPointer: null,
2498    contentElement: null,
2499    sliderWrapper: null,
2500    stepWidth: 0,
2501    reviewElementsWidth: 0,
2502    reviewElementsMarginRight: 0,
2503    reviewElements: null,
2504    currentStep: 0,
2505    maxStep: 0,
2506    sendingAjax: false,
2507    mainParentWrap: false,
2508    init: function () {
2509        this.mainParentWrap = document.querySelector('#object_reviews');
2510		if(!this.mainParentWrap) {
2511			return;
2512		}
2513
2514        this.nextPointer = this.mainParentWrap.querySelector('.js-next-page-reviews');
2515
2516        if (this.nextPointer === null) {
2517            return;
2518        }
2519
2520        this.nextPointer.addEventListener('click', () => { this.next() });
2521        this.prevPointer = this.mainParentWrap.querySelector('.js-prev-page-reviews');
2522        this.prevPointer.addEventListener('click', () => { this.prev() });
2523        this.contentElement = this.mainParentWrap.querySelector('.reviews_block__content');
2524        this.sliderWrapper = this.mainParentWrap.querySelector('.reviews_slider__wrapper');
2525        this.totalElems = this.mainParentWrap.querySelector('.js-reviews-total').textContent;
2526        this.reviewElements = this.mainParentWrap.querySelectorAll('.reviews_block__review');
2527
2528        this.calc();
2529        this.checkHidePagination();
2530        this.setViewedText();
2531
2532        window.addEventListener('resize', () => {
2533            this.calc();
2534            this.currentStep = 0;
2535            this.move();
2536            this.setViewedText();
2537            this.checkHidePagination();
2538        });
2539
2540        swipe(this.sliderWrapper, (params) => {
2541            if (isRTL()) {
2542                if (params.scroll == 'right') {
2543                    this.next();
2544                }
2545                if (params.scroll == 'left') {
2546                    this.prev();
2547                }
2548            } else {
2549                if (params.scroll == 'left') {
2550                    this.next();
2551                }
2552                if (params.scroll == 'right') {
2553                    this.prev();
2554                }
2555            }
2556        }, 100, 1200, true, false);
2557    },
2558    checkHidePagination: function () {
2559        let pagination = this.mainParentWrap.querySelector('.pagination');
2560        if (this.elemsInSlide == 2 && this.totalElems == 2) {
2561            pagination.classList.add('hidden');
2562        } else {
2563            pagination.classList.remove('hidden');
2564        }
2565    },
2566    calc: function () {
2567        this.contentElement = this.mainParentWrap.querySelector('.reviews_block__content');
2568        let contentElementWidth = this.contentElement.clientWidth;
2569        this.stepWidth = this.contentElement.clientWidth;
2570
2571        if (document.documentElement.clientWidth <= 900) {
2572            this.elemsInSlide = 1;
2573            this.reviewElementsWidth = contentElementWidth;
2574            this.reviewElementsMarginRight = 0;
2575        } else {
2576            this.elemsInSlide = 2;
2577            this.reviewElementsWidth = Math.floor(contentElementWidth * 0.486666);
2578            this.reviewElementsMarginRight = contentElementWidth - this.reviewElementsWidth * 2;
2579            this.stepWidth = this.stepWidth + this.reviewElementsMarginRight;
2580        }
2581
2582        this.maxStep = Math.ceil(this.totalElems / this.elemsInSlide) - 1;
2583
2584        this.setElemsWidthAndCount();
2585    },
2586    setElemsWidthAndCount: function () {
2587        this.reviewElements.forEach((elem) => {
2588            elem.style.width = this.reviewElementsWidth + 'px';
2589            if (isRTL()) {
2590                elem.style.marginLeft = this.reviewElementsMarginRight + 'px';
2591            } else {
2592                elem.style.marginRight = this.reviewElementsMarginRight + 'px';
2593            }
2594        });
2595
2596        this.countElems = this.reviewElements.length;
2597    },
2598    next: function () {
2599        if (this.currentStep == this.maxStep || this.sendingAjax) {
2600            return;
2601        }
2602        this.currentStep++;
2603        if (!this.tryLoad()) {
2604            this.move();
2605        }
2606    },
2607    prev: function () {
2608        if (this.currentStep == 0 || this.sendingAjax) {
2609            return;
2610        }
2611        this.currentStep--;
2612        if (!this.tryLoad()) {
2613            this.move();
2614        }
2615    },
2616    move: function () {
2617        let leftValue = (-1) * this.currentStep * this.stepWidth;
2618        if (leftValue) {
2619            leftValue = leftValue;
2620        }
2621
2622        if (isRTL()) {
2623            this.sliderWrapper.style.right = leftValue + 'px';
2624        } else {
2625            this.sliderWrapper.style.left = leftValue + 'px';
2626        }
2627
2628        this.setViewedText();
2629        this.setHeight();
2630    },
2631    setHeight: function () {
2632        let needed_num1;
2633        let needed_num2;
2634        if (this.elemsInSlide == 1) {
2635            needed_num1 = this.currentStep;
2636            needed_num2 = -1;
2637        } else {
2638            needed_num1 = this.currentStep * 2;
2639            needed_num2 = this.currentStep * 2 + 1;
2640        }
2641
2642        let maxHeight = 0;
2643        this.reviewElements.forEach((elem, num) => {
2644            if (num == needed_num1 || num == needed_num2) {
2645                maxHeight = Math.max(maxHeight, elem.offsetHeight);
2646            }
2647        });
2648
2649        this.contentElement.style.height = maxHeight + 'px';
2650    },
2651    setViewedText: function () {
2652        let text;
2653        let multiplier = this.currentStep + 1;
2654        if (this.elemsInSlide == 1) {
2655            this.mainParentWrap.querySelector('.js-reviews-current').innerHTML = multiplier;
2656        } else {
2657            if (this.totalElems % this.elemsInSlide !== 0 && this.currentStep == this.maxStep) {
2658                text = multiplier * 2 - 1;
2659            } else {
2660                text = (multiplier * 2 - 1) + '-' + (multiplier * 2);
2661            }
2662            this.mainParentWrap.querySelector('.js-reviews-current').innerHTML = text;
2663        }
2664    },
2665    checkEventShowHideText: function () {
2666        this.mainParentWrap.querySelectorAll('.show_btn').forEach((elem) => {
2667            if (elem.getAttribute('check_size') == '1') {
2668                return;
2669            }
2670            elem.addEventListener('fulltext_done', () => {
2671                this.setHeight();
2672            });
2673            elem.setAttribute('check_size', '1');
2674        });
2675    },
2676    tryLoad: function () {
2677        if (
2678            this.elemsInSlide * (this.currentStep + 1) <= this.countElems
2679            || this.totalElems == this.countElems
2680        ) {
2681            return false;
2682        }
2683
2684        this.sendingAjax = true;
2685        setAjaxLoader(this.sliderWrapper);
2686
2687        let neededPage;
2688        if (this.elemsInSlide == 1) {
2689            neededPage = Math.floor(this.currentStep / 2) + 1;
2690        } else {
2691            neededPage = this.currentStep + 1;
2692        }
2693
2694        let ajax_data = {
2695            ajax_load_reviews: 1,
2696            page: neededPage
2697        };
2698
2699        KITS.sendAjaxRequest(ajax_data,
2700            () => {
2701                this.sendingAjax = false;
2702                setAjaxLoader(this.sliderWrapper, false);
2703            },
2704            (res) => {
2705                this.sliderWrapper.insertAdjacentHTML('beforeend', res);
2706                initHiddenText();
2707                this.checkEventShowHideText();
2708                this.reviewElements = this.mainParentWrap.querySelectorAll('.reviews_block__review');
2709                this.setElemsWidthAndCount();
2710                this.sendingAjax = false;
2711                setAjaxLoader(this.sliderWrapper, false);
2712                this.move();
2713            }
2714        );
2715
2716        return true;
2717    }
2718};
2719function setGalleryFullButton(id, gallery) {
2720	let el = e(id);
2721	if(!el || !gallery) {
2722		return;
2723	}
2724	let button = galleryFullButtonByWidth(el);
2725	if(!button) {
2726		return;
2727	}
2728	galleryButtonClickHandler(button, gallery);
2729
2730	return button;
2731}
2732function galleryButtonClickHandler(button, gallery) {
2733	button.removeEventListener('click', galleryButtonClickHandler);
2734	button.addEventListener('click', () => gallery.setFullImage(gallery.big_index));
2735}
2736function galleryFullButtonByWidth(element) {
2737	const isMobile = documentWidth() <= 600;
2738	if (isMobile) {
2739		return element.querySelector('#img_resize_container');
2740	} else {
2741		return element.parentNode.querySelector('.open_full');
2742	}
2743}
2744
2745function documentWidth() {
2746	return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
2747}
2748
2749function filterComplexLayouts(el) {
2750	if(!el) {
2751		return;
2752	}
2753	let cont = e('complex_layouts');
2754	let f = el.closest('form');
2755	if(!f || !cont) {
2756		return;
2757	}
2758	setAjaxLoader(cont);
2759	KITS.sendAjaxRequest(formToAjaxObject(f), function(){}, function(res) {
2760		let cont = e('complex_layouts');
2761		if(!cont) {
2762			return;
2763		}
2764		res = JSON.parse(res);
2765		if(!res) {
2766			return;
2767		}
2768		let buf = document.createElement('div');
2769		buf.innerHTML = res.html;
2770		let items = document.createElement('div');
2771		for(let i = 0; i < buf.childNodes.length; ++i) {
2772			if(buf.childNodes[i].className && hasClass(buf.childNodes[i], 'item')) {
2773				items.appendChild(buf.childNodes[i].cloneNode(true));
2774			}
2775		}
2776		cont.querySelector('.items').innerHTML = items.innerHTML;
2777		cont.querySelector('div.navigation').innerHTML = buf.querySelector('div.navigation') ? buf.querySelector('div.navigation').innerHTML : '';
2778		setAjaxLoader(cont, false);
2779		initTabs();
2780	});
2781}
2782
2783function showObjectMapPopup() {
2784	let s = typeof HD == 'undefined' ? true : HD.isHuman();
2785	if(!s) {
2786		return;
2787	}
2788	let pop = e('property_map_popup');
2789	if(!pop) {
2790		let d = {};
2791		for(let prop in OBJECT_MAP_DATA) {
2792			d = OBJECT_MAP_DATA[prop][0];
2793		}
2794		pop = document.createElement('div');
2795		let h = '<div class="popup inline map_popup" id="property_map_popup">';
2796		h += '<div class="popup_content"><div class="close" onclick="closePopup(this);"></div><div class="holder">';
2797		h += '<div class="title"><div>' + d.title + '</div></div>';
2798		h += '<div class="tabs styled custom" id="map_block"><div class="navigation_wrapper"><ul class="navigation">';
2799		h += '<li class="active" onclick="toggleObjectPanorama(this, false)"><a>' + d.tab_map + '</a></li><li onclick="toggleObjectPanorama(this, true, ' + d.lat + ', ' + d.lng + ')"><a>' + d.tab_street + '</a></li>';
2800		h += '</ul></div></div>';
2801		h += '<div id="property_map"></div>';
2802		h += '</div></div></div>';
2803		pop.innerHTML = h;
2804		document.body.appendChild(pop);
2805		initSingleProjectMap(OBJECT_MAP_DATA);
2806	}
2807	showPopup('property_map_popup');
2808}
2809
2810const successDownloadBrochureForm = () => {
2811if (typeof ComplexPage !== 'undefined') {
2812        ComplexPage.downloadBrochure('[:brochure_file:]', '[:object_id:]')
2813    }
2814}
2815
2816function getDownloadBrochure(el) {
2817    modalFormBuffer.clear();
2818    modalFormBuffer.oid = el.dataset.objectId;
2819    modalFormBuffer.popup_title = el.dataset.formTitle;
2820    modalFormBuffer.popup_contact_mode = el.dataset.formContactMode;
2821    modalFormBuffer.popup_contact_id = el.dataset.contactId;
2822    modalFormBuffer.name = el.dataset.formButton;
2823    showPopup('download_brochure');
2824}
2825
2826function getRequestObjects(el) {
2827    modalFormBuffer.clear();
2828    modalFormBuffer.oid = el.dataset.objectId;
2829    modalFormBuffer.popup_title = el.dataset.formTitle;
2830    modalFormBuffer.popup_contact_mode = el.dataset.formContactMode;
2831    modalFormBuffer.popup_contact_id = el.dataset.contactId;
2832    modalFormBuffer.name = el.dataset.formButton;
2833    showPopup('request_objects');
2834}
2835
2836/* ----------------------------  ONLOAD  ------------------------------------- */
2837window.addEventListener('DOMContentLoaded',function(){
2838	window.kit=new KIT({init:true});
2839});
2840window.jivo_onLoadCallback = function () {
2841	setYaClientId();
2842};
2843function kitGallery(params) {
2844
2845	this.target=params.target;
2846	if (this.target==null) return false;
2847	this.inrow=params.inlinePreviewsInRow==null ? [[0,2],[500,3],[700,4],[800,5],[1000,6]] : params.inlinePreviewsInRow;
2848	this.inrow_fullscreen=params.fullscreenPreviewsInRow==null ? [[0,4],[500,5],[700,7],[800,8],[1000,10]] : params.fullscreenPreviewsInRow;
2849	this.pages=0;
2850	this.pages_fullscreen=0;
2851	this.active_page=0;
2852	this.active_page_fullscreen=0;
2853	this.big_proportions=params.bigProportions==null ? 2/1 : params.bigProportions;
2854	this.big_index=0;
2855	this.full_index=0;
2856	this.fullscreenThumbsWidth=params.fullscreenThumbsWidth==null ? 1200 : params.fullscreenThumbsWidth;
2857	this.preloader=null;
2858	this.stylesPath=params.stylesPath==null ? this.getDefaultStylesPath() : params.stylesPath;
2859	this.imgs=[];
2860	this.imagesCount=0;
2861	this.smallOpenBig=params.smallOpenBig===false ? false : true;
2862	this.big_open_full = params.big_open_full===false ? false : true;
2863	this.drawInline=params.drawInline==null ? true : false;
2864	this.uniqClass=params.uniqId==null ? '' : ' '+params.uniqId;
2865	this.uniqRule=params.uniqId==null ? '' : '.'+params.uniqId;
2866	this.uniqPostfix = params.uniqId == null ? '' : params.uniqId;
2867	this.isOpenBig = params.isOpenBig === null ? '' :   params.isOpenBig;
2868
2869	if (typeof this.isOpenBig === 'function') {
2870		this.isOpenBig(function(status) {
2871			this.smallOpenBig = status;
2872		}.bind(this));
2873	}
2874
2875	if (typeof LANG !== 'undefined') this.LANG=LANG;
2876	else this.LANG={
2877		"share":"Share",
2878		"close":"Close",
2879		"hide_list":"Hide list",
2880		"show_list":"Show list"
2881	};
2882
2883	//load styles
2884	if(this.stylesPath) {
2885		var link = document.createElement( "link" );
2886		link.href = this.stylesPath;
2887		link.type = "text/css";
2888		link.rel = "stylesheet";
2889		link.media = "all";
2890		document.getElementsByTagName( "head" )[0].appendChild( link );
2891	}
2892
2893	//prepare images
2894	if (params.images!=null) this.imgs=params.images;
2895	else {
2896		//get images from the target
2897		var images=this.target.getElementsByTagName('img');
2898		for (var i=0;i<images.length;i++) {
2899			var big=images[i].getAttribute('data-big');
2900			var real=images[i].getAttribute('data-real');
2901			var a=null;
2902			if (real==null) {
2903				//find href
2904				for (a=images[i];real==null && a!=null;a=a.parentNode) real=a.getAttribute('href');
2905			}
2906			if (real==null || real=="") real=images[i].src;
2907			//this.imgs.push({"small":images[i].src,"big":big,"real":real,"title":images[i].getAttribute('title'),"alt":images[i].getAttribute('alt'),"a":a});
2908			this.imgs.push({
2909				"small":images[i].src,
2910				"big":big,
2911				"real":real,
2912				"title":images[i].getAttribute('title'),
2913				"alt":images[i].getAttribute('alt'),
2914				"a":a,
2915				'w' : images[i].getAttribute('width'),
2916				'h' : images[i].getAttribute('height'),
2917				'loading' : images[i].loading,
2918			});
2919		}
2920	}
2921	//now normalize images array
2922	this.imagesCount=this.imgs.length;
2923	for (i=0;i<this.imagesCount;i++) {
2924		if (this.imgs[i].big=="") {
2925			if (this.imgs[i].real!="") this.imgs[i].big=this.imgs[i].real;
2926			else this.imgs[i].big=this.imgs[i].small;
2927		}
2928		if (this.imgs[i].real=="") {
2929			if (this.imgs[i].big!="") this.imgs[i].real=this.imgs[i].big;
2930			else this.imgs[i].real=this.imgs[i].small;
2931		}
2932	}
2933
2934	this.init();
2935
2936}
2937
2938/* TEST */
2939kitGallery.prototype.testFunc=function(param1) {
2940	this.paramT=param1;
2941}
2942kitGallery.prototype.testFunc1=function(param1) {
2943	alert(this.param1+' - '+this.paramT);
2944}
2945/* END TEST */
2946
2947kitGallery.prototype.preload=function(src,callback) {
2948	if (callback==null) callback="";
2949	if (this.preloader==null) this.preloader=document.createElement('img');
2950	if (this.preloader.src!=src) {
2951		if (typeof(callback)=="function")  this.preloader.onload=function(){callback();};
2952		this.preloader.src=src;
2953	}
2954	else callback();
2955}
2956
2957kitGallery.prototype.getDefaultStylesPath=function() {
2958	var scripts=document.scripts;
2959	for (var i=0;i<scripts.length;i++) if (scripts[i].src.indexOf('/themes/')>=0 && scripts[i].src.indexOf('/languages/')==-1){
2960		var parts=scripts[i].src.split("/");
2961		parts[parts.length-2]="css";
2962		parts[parts.length-1]="kitgallery.css";
2963		return parts.join("/");
2964	}
2965	return "";
2966}
2967
2968kitGallery.prototype.init=function() {
2969	//inline gallery
2970	if (this.drawInline) {
2971		var inline="";
2972		inline+='<div class="kit_inline_gallery">';
2973		inline+='	<div id="img_resize_container"><div></div></div>';
2974		inline+='	<div class="thumbs unselectable">';
2975		inline+='		<div class="scroll_left"><svg aria-hidden="true" data-prefix="fas" data-icon="chevron-left" class="svg-inline--fa fa-chevron-left fa-w-10" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z"></path></svg></div>';
2976		inline+='		<div class="scroll_right"><svg aria-hidden="true" data-prefix="fas" data-icon="chevron-right" class="svg-inline--fa fa-chevron-right fa-w-10" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z"></path></svg></div>';
2977		inline+='		<div class="scroll"><ul>';
2978		for (var i=0;i<this.imagesCount;i++) {
2979
2980			inline += '<li>';
2981
2982			inline += '<img loading="' + this.imgs[i].loading + '" src="'+this.imgs[i].small+'" '+(this.imgs[i].alt ? ' alt="'+this.imgs[i].alt+'"' : '')+(this.imgs[i].w ? ' width="'+this.imgs[i].w+'"' : '')+(this.imgs[i].h ? ' height="'+this.imgs[i].h+'"' : '')+'>';
2983
2984			inline += '</li>';
2985
2986		}
2987		inline+='		</ul></div>';
2988		inline+='	</div>';
2989		inline+='</div>';
2990		this.target.innerHTML=inline;
2991
2992		var images=this.target.querySelectorAll('.kit_inline_gallery .thumbs ul img');
2993		for (i=0;i<this.imagesCount;i++) {
2994			(function(kge){
2995				var index=i;
2996				images[index].addEventListener('click',function(){
2997					if(kge.smallOpenBig) kge.setFullImage(index);
2998					else kge.setBigImage(index);
2999				});
3000			}(this));
3001		}
3002	}
3003	else {
3004		//change hrefs
3005		for (i=0;i<this.imagesCount;i++){
3006			(function(kge){
3007				var index=i;
3008				kge.imgs[index]['a'].addEventListener('click',function(evt){
3009					evt.preventDefault();
3010					if(kge.smallOpenBig) kge.setFullImage(index);
3011					else kge.setBigImage(index);
3012				});
3013			}(this));
3014		}
3015	}
3016
3017	//fullscreen gallery
3018	var fullscreen="";
3019	fullscreen+='<div id="kgf_foto" class="unselectable" unselectable="on">';
3020	fullscreen+='		<div class="share">'+this.LANG['share']+':';
3021	fullscreen+='			<span class="email" onclick="shareEmail(document.title,document.querySelector(\''+this.uniqRule+' #kgf_foto img\').src)"><svg aria-hidden="true" data-prefix="far" data-icon="envelope" class="svg-inline--fa fa-envelope fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z"></path></svg></span>';
3022	fullscreen+='			<span class="facebook" onclick="shareFacebook(document.title,document.title,document.querySelector(\'#kgf_foto img\').src,document.querySelector(\''+this.uniqRule+' #kgf_foto img\').src)"><svg aria-hidden="true" data-prefix="fab" data-icon="facebook-f" class="svg-inline--fa fa-facebook-f fa-w-9" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 264 512"><path fill="currentColor" d="M76.7 512V283H0v-91h76.7v-71.7C76.7 42.4 124.3 0 193.8 0c33.3 0 61.9 2.5 70.2 3.6V85h-48.2c-37.8 0-45.1 18-45.1 44.3V192H256l-11.7 91h-73.6v229"></path></svg></span>';
3023	fullscreen+='			<span class="vk" onclick="shareVk(document.title,document.title,document.querySelector(\''+this.uniqRule+' #kgf_foto img\').src,document.querySelector(\''+this.uniqRule+' #kgf_foto img\').src
3023)"><svg aria-hidden="true" data-prefix="fab" data-icon="vk" class="svg-inline--fa fa-vk fa-w-18" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="currentColor" d="M545 117.7c3.7-12.5 0-21.7-17.8-21.7h-58.9c-15 0-21.9 7.9-25.6 16.7 0 0-30 73.1-72.4 120.5-13.7 13.7-20 18.1-27.5 18.1-3.7 0-9.4-4.4-9.4-16.9V117.7c0-15-4.2-21.7-16.6-21.7h-92.6c-9.4 0-15 7-15 13.5 0 14.2 21.2 17.5 23.4 57.5v86.8c0 19-3.4 22.5-10.9 22.5-20 0-68.6-73.4-97.4-157.4-5.8-16.3-11.5-22.9-26.6-22.9H38.8c-16.8 0-20.2 7.9-20.2 16.7 0 15.6 20 93.1 93.1 195.5C160.4 378.1 229 416 291.4 416c37.5 0 42.1-8.4 42.1-22.9 0-66.8-3.4-73.1 15.4-73.1 8.7 0 23.7 4.4 58.7 38.1 40 40 46.6 57.9 69 57.9h58.9c16.8 0 25.3-8.4 20.4-25-11.2-34.9-86.9-106.7-90.3-111.5-8.7-11.2-6.2-16.2 0-26.2.1-.1 72-101.3 79.4-135.6z"></path></svg></span>';
3024	fullscreen+='			<span class="twitter" onclick="shareTwitter(\'\',document.title,\'\',document.querySelector(\''+this.uniqRule+' #kgf_foto img\').src)"><svg aria-hidden="true" data-prefix="fab" data-icon="twitter" class="svg-inline--fa fa-twitter fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg></span>';
3025	//fullscreen+='			<span class="gp" onclick="shareGooglePlus(document.querySelector(\''+this.uniqRule+' #kgf_foto img\').src)"><svg aria-hidden="true" data-prefix="fab" data-icon="google-plus-g" class="svg-inline--fa fa-google-plus-g fa-w-20" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M386.061 228.496c1.834 9.692 3.143 19.384 3.143 31.956C389.204 370.205 315.599 448 204.8 448c-106.084 0-192-85.915-192-192s85.916-192 192-192c51.864 0 95.083 18.859 128.611 50.292l-52.126 50.03c-14.145-13.621-39.028-29.599-76.485-29.599-65.484 0-118.92 54.221-118.92 121.277 0 67.056 53.436 121.277 118.92 121.277 75.961 0 104.513-54.745 108.965-82.773H204.8v-66.009h181.261zm185.406 6.437V179.2h-56.001v55.733h-55.733v56.001h55.733v55.733h56.001v-55.733H627.2v-56.001h-55.733z"></path></svg></span>';
3026	fullscreen+='			<span class="linkd" onclick="shareLinkdin(document.title,\'\',window.location,document.querySelector(\''+this.uniqRule+' #kgf_foto img\').src)"><svg aria-hidden="true" data-prefix="fab" data-icon="linkedin-in" class="svg-inline--fa fa-linkedin-in fa-w-14" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M100.3 480H7.4V180.9h92.9V480zM53.8 140.1C24.1 140.1 0 115.5 0 85.8 0 56.1 24.1 32 53.8 32c29.7 0 53.8 24.1 53.8 53.8 0 29.7-24.1 54.3-53.8 54.3zM448 480h-92.7V334.4c0-34.7-.7-79.2-48.3-79.2-48.3 0-55.7 37.7-55.7 76.7V480h-92.8V180.9h89.1v40.8h1.3c12.4-23.5 42.7-48.3 87.9-48.3 94 0 111.3 61.9 111.3 142.3V480z"></path></svg></span>';
3027	fullscreen+='			<span class="pin" onclick="sharePinterest(document.title,window.location,document.querySelector(\''+this.uniqRule+' #kgf_foto img\').src)"><svg aria-hidden="true" data-prefix="fab" data-icon="pinterest-p" class="svg-inline--fa fa-pinterest-p fa-w-12" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path fill="currentColor" d="M204 6.5C101.4 6.5 0 74.9 0 185.6 0 256 39.6 296 63.6 296c9.9 0 15.6-27.6 15.6-35.4 0-9.3-23.7-29.1-23.7-67.8 0-80.4 61.2-137.4 140.4-137.4 68.1 0 118.5 38.7 118.5 109.8 0 53.1-21.3 152.7-90.3 152.7-24.9 0-46.2-18-46.2-43.8 0-37.8 26.4-74.4 26.4-113.4 0-66.2-93.9-54.2-93.9 25.8 0 16.8 2.1 35.4 9.6 50.7-13.8 59.4-42 147.9-42 209.1 0 18.9 2.7 37.5 4.5 56.4 3.4 3.8 1.7 3.4 6.9 1.5 50.4-69 48.6-82.5 71.4-172.8 12.3 23.4 44.1 36 69.3 36 106.2 0 153.9-103.5 153.9-196.8C384 71.3 298.2 6.5 204 6.5z"></path></svg></span>';
3028	fullscreen+='		</div>';
3029	fullscreen+='		<div class="close">&times;</div>';
3030	fullscreen+='		<img src="" class="unselectable" unselectable="on">';
3031	fullscreen+='		<div class="prev" id="kgf_foto_prev"><svg aria-hidden="true" data-prefix="fas" data-icon="chevron-left" class="svg-inline--fa fa-chevron-left fa-w-10" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
3031<path fill="currentColor" d="M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z"></path></svg></div>';
3032	fullscreen+='		<div class="next" id="kgf_foto_next"><svg aria-hidden="true" data-prefix="fas" data-icon="chevron-right" class="svg-inline--fa fa-chevron-right fa-w-10" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z"></path></svg></div>';
3033	fullscreen+='		<div class="loader" id="kgf_foto_loader"><svg aria-hidden="true" data-prefix="fas" data-icon="spinner" class="svg-inline--fa fa-spinner fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M304 48c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-48 368c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm208-208c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zM96 256c0-26.51-21.49-48-48-48S0 229.49 0 256s21.49 48 48 48 48-21.49 48-48zm12.922 99.078c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.491-48-48-48zm294.156 0c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.49-48-48-48zM108.922 60.922c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.491-48-48-48z"></path></svg></div>';
3034	fullscreen+='	</div>';
3035
3036	fullscreen+='	<div class="container" style="max-width:'+this.fullscreenThumbsWidth+'px">';
3037	fullscreen+='		<div class="thumber">'+this.LANG['hide_list']+'</div>';
3038	fullscreen+='		<div class="title"></div>';
3039	fullscreen+='	</div>';
3040	fullscreen+='	<div class="container thumbs unselectable" style="max-width:'+this.fullscreenThumbsWidth+'px">';
3041	fullscreen+='		<div class="prev"><svg aria-hidden="true" data-prefix="fas" data-icon="chevron-left" class="svg-inline--fa fa-chevron-left fa-w-10" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z"></path></svg></div>';
3042	fullscreen+='		<div class="next"><svg aria-hidden="true" data-prefix="fas" data-icon="chevron-right" class="svg-inline--fa fa-chevron-right fa-w-10" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z"></path></svg></div>';
3043	fullscreen+='		<div class="scroll"><ul>';
3044	for (var i=0;i<this.imagesCount;i++) fullscreen+='<li><img loading="' + this.imgs[i].loading + '" src="'+this.imgs[i].small+'"></li>';
3045	fullscreen+='		</ul></div>';
3046	fullscreen+='	</div>';
3047	var div=document.createElement('div');
3048	div.id=`kit_fullscreen`;
3049	div.className=this.uniqClass;
3050	div.innerHTML=fullscreen;
3051	document.body.appendChild(div);
3052
3053	var images=document.querySelectorAll('#kit_fullscreen'+this.uniqRule+' .thumbs ul img');
3054	for (i=0;i<this.imagesCount;i++) {
3055		(function(kge, index ){
3056			images[index].addEventListener('click',function(){kge.setFullImage(index);});
3057		}(this, i));
3058	}
3059
3060	//invoke methods and attach events
3061	this.setThumbs();
3062	this.setBigProportions();
3063	this.setBigImage(0);
3064	this.setThumbsFullscreen();
3065	(function(kge){
3066		if (kge.drawInline) {
3067			kge.scrollHandler('left').addEventListener('click',function(){kge.changePage(-1);});
3068			kge.scrollHandler('right').addEventListener('click',function(){kge.changePage(1);});
3069			if(this.big_open_full) {
3070				document.querySelector('#img_resize_container > div').addEventListener('click',function(){kge.setFullImage(kge.big_index);});
3071			}
3072		}
3073		//console.log('#kit_fullscreen'+kge.uniqRule+' #kgf_foto_prev');
3074		document.querySelector('#kit_fullscreen'+kge.uniqRule+' #kgf_foto_prev').addEventListener('click',function(){kge.scrollFullImage(-1);});
3075		document.querySelector('#kit_fullscreen'+kge.uniqRule+' #kgf_foto_next').addEventListener('click',function(){kge.scrollFullImage(1);});
3076		document.querySelector('#kit_fullscreen'+kge.uniqRule+' .thumbs .prev').addEventListener('click',function(){kge.changePageFullscreen(-1);});
3077		document.querySelector('#kit_fullscreen'+kge.uniqRule+' .thumbs .next').addEventListener('click',function(){kge.changePageFullscreen(1);});
3078		document.querySelector('#kit_fullscreen'+kge.uniqRule+' .thumber').addEventListener('click',function(){kge.switchFullThumbs();});
3079		document.querySelector('#kit_fullscreen'+kge.uniqRule+' .close').addEventListener('click',function(){kge.hideFullscreen();});
3080		document.querySelector('#kit_fullscreen'+kge.uniqRule+' #kgf_foto img').src=kge.imgs[0].real;
3081		swipe(document.querySelector('#kit_fullscreen'+kge.uniqRule+' #kgf_foto img'),function(params){
3082			if (params['scroll']=="right") kge.scrollFullImage(-1);
3083			else if(params['scroll']=="left") kge.scrollFullImage(1);
3084		});
3085
3086		window.addEventListener('resize',function(){kge.setThumbs();kge.setBigProportions();kge.recalcFullscreen();});
3087		window.addEventListener('keydown',function(e){
3088			if (document.querySelector('#kit_fullscreen'+kge.uniqRule+'').style.display=='block') {
3089				if(e.keyCode==37) kge.scrollFullImage(-1);
3090				else if(e.keyCode==39) kge.scrollFullImage(1);
3091				else if(e.keyCode==27) kge.hideFullscreen();
3092			}
3093		});
3094	}(this))
3095}
3096
3097/* inline methods */
3098kitGallery.prototype.getInrow=function()
3099{
3100	var c=this.target.querySelector('.kit_inline_gallery .thumbs');
3101	var w=c.clientWidth;
3102	var in_row=0;
3103	for (var i=0;i<this.inrow.length;i++) {
3104		if (this.inrow[i][0]<=w) in_row=this.inrow[i][1];
3105	}
3106	if (in_row==0) in_row=this.inrow[0][1];
3107	return in_row;
3108}
3109kitGallery.prototype.setThumbs=function()
3110{
3111	if (!this.drawInline) return true;
3112	var ul=this.target.querySelector('.kit_inline_gallery .thumbs ul');
3113	var lis=ul.querySelectorAll('li');
3114	var in_row=this.getInrow();
3115	this.pages=Math.ceil(lis.length/in_row);
3116	ul.style.width=(this.pages*100).toString()+'%';
3117	for (var i=0;i<lis.length;i++) lis[i].style.width=(100/(in_row*this.pages)).toString()+'%';
3118	this.scrollPage();
3119}
3120kitGallery.prototype.changePage=function(dir)
3121{
3122	if (dir!=1) dir=-1;
3123	this.active_page=this.active_page+dir;
3124	if (this.active_page<0) this.active_page=this.pages-1;
3125	else if (this.active_page>=this.pages) this.active_page=0;
3126	this.scrollPage();
3127}
3128kitGallery.prototype.scrollPage=function() {
3129	if (this.active_page>=this.pages) this.active_page=this.pages-1;
3130	var left=-this.active_page*100;
3131	this.target.querySelector('.kit_inline_gallery .thumbs ul').style.marginLeft=left.toString()+'%';
3132}
3133kitGallery.prototype.setBigImage=function(index) {
3134	if (!this.drawInline) return true;
3135	if (index<0 || index>=this.imagesCount) return false;
3136	this.big_index=index;
3137	var images=this.target.querySelectorAll('.kit_inline_gallery .thumbs ul img');
3138	for (var i=0;i<images.length;i++) images[i].className=images[i].className.replace('active','');
3139	images[index].className=images[index].className+' active';
3140
3141	var c=this.target.querySelector('#img_resize_container > div');
3142	c.style.opacity="0.5";
3143	(function(kge){
3144		kge.preload(kge.imgs[index].big,function(){
3145			c.style.backgroundImage='url('+kge.imgs[index].big+')';
3146			c.style.opacity="1";
3147		});
3148	}(this));
3149}
3150kitGallery.prototype.setBigProportions=function() {
3151	if (!this.drawInline) return true;
3152	var c=this.target.querySelector('#img_resize_container > div');
3153	c.style.height=Math.round(c.clientWidth/this.big_proportions).toString()+'px';
3154}
3155
3156/* full screen methods */
3157kitGallery.prototype.getInrowFullscreen=function() {
3158	var c=document.querySelector('#kit_fullscreen'+this.uniqRule+' .thumbs');
3159	var w=c.clientWidth;
3160	var in_row=0;
3161	for (var i=0;i<this.inrow_fullscreen.length;i++) {
3162		if (this.inrow_fullscreen[i][0]<=w) in_row=this.inrow_fullscreen[i][1];
3163	}
3164	if (in_row==0) in_row=this.inrow_fullscreen[0][1];
3165	return in_row;
3166}
3167kitGallery.prototype.setThumbsFullscreen=function()
3168{
3169	var ul=document.querySelector('#kit_fullscreen'+this.uniqRule+' .thumbs ul');
3170	var lis=ul.querySelectorAll('li');
3171	var in_row=this.getInrowFullscreen();
3172	this.pages_fullscreen=Math.ceil(lis.length/in_row);
3173	ul.style.width=(this.pages_fullscreen*100).toString()+'%';
3174	for (var i=0;i<lis.length;i++) lis[i].style.width=(100/(in_row*this.pages_fullscreen)).toString()+'%';
3175	this.scrollPageFullscreen();
3176}
3177kitGallery.prototype.changePageFullscreen=function(dir)
3178{
3179	if (dir!=1) dir=-1;
3180	this.active_page_fullscreen=this.active_page_fullscreen+dir;
3181	if (this.active_page_fullscreen<0) this.active_page_fullscreen=this.pages_fullscreen-1;
3182	else if (this.active_page_fullscreen>=this.pages_fullscreen) this.active_page_fullscreen=0;
3183	this.scrollPageFullscreen();
3184}
3185kitGallery.prototype.scrollPageFullscreen=function() {
3186	if (this.active_page_fullscreen>=this.pages_fullscreen) this.active_page_fullscreen=this.pages_fullscreen-1;
3187	var left=-this.active_page_fullscreen*100;
3188	document.querySelector('#kit_fullscreen'+this.uniqRule+' .thumbs ul').style.marginLeft=left.toString()+'%';
3189}
3190
3191kitGallery.prototype.recalcFullscreen=function() {
3192	if (document.querySelector('#kit_fullscreen'+this.uniqRule+'').style.display=="none") return false;
3193	document.querySelector('#kit_fullscreen'+this.uniqRule+' .thumbs ul').className="transition_disabled";
3194	this.setThumbsFullscreen();
3195
3196	var h = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
3197	var full_img=document.querySelector('#kit_fullscreen'+this.uniqRule+' #kgf_foto img');
3198	var vmargin=20;
3199	var containers=document.querySelectorAll('#kit_fullscreen'+this.uniqRule+' .container');
3200	var share=document.querySelector('#kit_fullscreen'+this.uniqRule+' #kgf_foto .share');
3201	var maxheight=h-vmargin*2-20-containers[0].clientHeight-containers[1].clientHeight-share.clientHeight;
3202	full_img.style.maxHeight=maxheight.toString()+'px';
3203	//get real image sizes and center it vertically
3204	var margintop=Math.round((h-full_img.clientHeight-containers[0].clientHeight-containers[1].clientHeight-share.clientHeight-40)/2);
3205	if ((margintop<0 || maxheight<100)  && document.querySelector('#kit_fullscreen'+this.uniqRule+' .thumbs').style.display!='none') this.switchFullThumbs();
3206	document.querySelector(''+this.uniqRule+' #kgf_foto').style.marginTop=margintop.toString()+'px';
3207	document.querySelector('#kit_fullscreen'+this.uniqRule+' .thumbs ul').className="";
3208	//alert(margintop);
3209}
3210
3211kitGallery.prototype.setFullImage=function(index) {
3212	document.querySelector('#kit_fullscreen'+this.uniqRule+'').style.display='block';
3213	if (index<0 || index>=this.imagesCount) return false;
3214	this.full_index=index;
3215	var fimgs=document.querySelectorAll('#kit_fullscreen'+this.uniqRule+' .thumbs ul li img')
3216	for (var i=0;i<fimgs.length;i++) fimgs[i].className=fimgs[i].className.replace('active','');
3217	fimgs[index].className=fimgs[index].className+' active';
3218
3219	var c=document.querySelector('#kit_fullscreen'+this.uniqRule+' #kgf_foto img');
3220	var loader=document.querySelector('#kit_fullscreen'+this.uniqRule+' #kgf_foto .loader');
3221	loader.style.display="block";
3222	(function(kge){
3223		kge.preload(kge.imgs[index].real,function(){
3224			document.querySelector('#kit_fullscreen'+kge.uniqRule+' #kgf_foto img').src=kge.imgs[index].real;
3225			document.querySelector('#kit_fullscreen'+kge.uniqRule+' .title').innerHTML=kge.imgs[index].title==null ? "" : kge.imgs[index].title;
3226			loader.style.display="none";
3227			kge.recalcFullscreen();
3228		});
3229	}(this));
3230}
3231
3232kitGallery.prototype.scrollFullImage=function(dir) {
3233	if (dir!=1) dir=-1;
3234	this.full_index+=dir;
3235	if (this.full_index<0) this.full_index=this.imagesCount-1;
3236	else if (this.full_index>=this.imagesCount) this.full_index=0;
3237	this.setFullImage(this.full_index);
3238}
3239
3240kitGallery.prototype.hideFullscreen=function() {
3241	document.querySelector('#kit_fullscreen'+this.uniqRule+'').style.display='none';
3242}
3243kitGallery.prototype.switchFullThumbs=function() {
3244	var thumbs=document.querySelector('#kit_fullscreen'+this.uniqRule+' .thumbs');
3245	var thumber=document.querySelector('#kit_fullscreen'+this.uniqRule+' .thumber');
3246	if (thumbs.style.display=='none') {
3247		thumbs.style.display='block';
3248		thumber.innerHTML=this.LANG['hide_list'];
3249		thumber.className="thumber";
3250	}
3251	else {
3252		thumbs.style.display='none';
3253		thumber.innerHTML=this.LANG['show_list'];
3254		thumber.className="thumber up";
3255	}
3256	this.recalcFullscreen();
3257}
3258
3259kitGallery.prototype.scrollHandler = function(direction) {
3260	const pageGalleryElement = document.getElementById(`page_gallery_${this.uniqPostfix}`);
3261	let scrollElement;
3262
3263	if (pageGalleryElement) {
3264		scrollElement = pageGalleryElement.querySelector(`.kit_inline_gallery .thumbs .scroll_${direction}`);
3265	} else {
3266		scrollElement = document.querySelector(`.kit_inline_gallery .thumbs .scroll_${direction}`);
3267	}
3268
3269	return scrollElement;
3270}
3271
3272/* default share functions */
3273
3274if (typeof shareEmail !=='function') {
3275	function shareEmail(subject,body) {
3276		mailto_link="mailto:?subject="+encodeURIComponent(subject)+"&body="+encodeURIComponent(body);
3277		ew=window.open(mailto_link, 'emailWindow');
3278		if (ew && ew.open && !ew.closed) ew.close();
3279	}
3280}
3281
3282if (typeof shareVk !=='function') {
3283	function shareVk(title,text,link,image) {
3284		if (image==null) image="";
3285
3286		url  = 'http://vk.com/share.php?';
3287		url += 'url='          + encodeURIComponent(link);
3288		url += '&title='       + encodeURIComponent(title);
3289		url += '&description=' + encodeURIComponent(text);
3290		if (image!="") url += '&image='       + encodeURIComponent(image);
3291		url += '&noparse=true';
3292		window.open(url,'','toolbar=0,status=0,width=626,height=436');
3293	}
3294}
3295
3296if (typeof shareFacebook !=='function') {
3297	function shareFacebook(title,text,link,image) {
3298		if (image==null) image="";
3299
3300		url  = 'http://www.facebook.com/sharer.php?s=100';
3301		url += '&p[title]='     + encodeURIComponent(title);
3302		url += '&p[summary]='   + encodeURIComponent(text);
3303		url += '&p[url]='       + encodeURIComponent(link);
3304		if (image!="") url += '&p[images][0]=' + encodeURIComponent(image);
3305
3306		window.open(url,'','toolbar=0,status=0,width=626,height=436');
3307	}
3308}
3309
3310if (typeof shareTwitter !=='function') {
3311	function shareTwitter(title,text,link,image) {
3312		if (image==null) image="";
3313		if (image!="") link=image;
3314
3315		url  = 'https://twitter.com/intent/tweet?';
3316		url += 'text='     + encodeURIComponent(text);
3317		url += '&url='       + encodeURIComponent(link);
3318
3319		window.open(url,'','toolbar=0,status=0,width=626,height=436');
3320	}
3321}
3322
3323if (typeof shareGooglePlus !=='function') {
3324	function shareGooglePlus(link) {
3325		url  = 'https://plus.google.com/share?url='+encodeURIComponent(link);
3326		window.open(url,'','toolbar=0,status=0,width=626,height=436');
3327	}
3328}
3329
3330if (typeof shareLinkdin !=='function') {
3331	function shareLinkdin(title,text,link,image) {
3332		if (image==null) image="";
3333
3334		url  = 'https://www.linkedin.com/shareArticle?mini=true';
3335		url += '&url='     + encodeURIComponent(image!="" ? image : link);
3336		url += '&title='   + encodeURIComponent(title);
3337		url += '&summary='       + encodeURIComponent(text);
3338		if (image!="") url += '&source=' + encodeURIComponent(link);
3339
3340		window.open(url,'','toolbar=0,status=0,width=626,height=436');
3341	}
3342}
3343
3344if (typeof sharePinterest !=='function') {
3345	function sharePinterest(title,link,image) {
3346		url  = 'https://pinterest.com/pin/create/button/?';
3347		url += 'url='     + encodeURIComponent(link);
3348		url += '&media='   + encodeURIComponent(image);
3349		url += '&description='       + encodeURIComponent(title);
3350
3351		window.open(url,'','toolbar=0,status=0,width=626,height=436');
3352	}
3353}function kit_slider(args){
3354	if(!args) args={};
3355	if(typeof KIT==='function') KIT.call(this);
3356	this.container=args['container'];
3357	this.holder=null;
3358	this.items=[];
3359	this.bullets=null;
3360	this.metrics=args['metrics']=='px' ? 'px' : '%';
3361	this.infinity=args['infinity']===false ? false : true;
3362	this.after_init_class=args['after_init_class'] || 'initialized';
3363	this.active_class=args['active_class'] || 'active';
3364	this.disabled_class=args['disabled_class'] || 'disabled';
3365	this.empty_class=args['empty_class'] || 'empty_class';
3366	this.arrow_left=args['arrow_left'] || '.left_arrow';
3367	this.arrow_right=args['arrow_right'] || '.right_arrow';
3368	this.add_bullets=args['add_bullets']===true ? true : false;
3369	this.current=args['first'] || 1;
3370	this.adapt=args['adapt']===true ? true : false;
3371	this.is_mobile=!!('ontouchstart' in document.documentElement);
3372	this.desctop_drag=args['desctop_drag']===true && !this.is_mobile ? true : false;
3373	this.desctop_drag_cut=args['desctop_drag_cut']===true ? true : false;
3374	this.drag=args['drag']===false || !this.is_mobile ? false : true;
3375	this.drag_cut=args['drag_cut']===true ? true : false;
3376	this.drag_sens=args['drag_sens'] || 2;
3377	this.change_time=args['change_time'] || 0;
3378	this.mobile=args['mobile'] || [];
3379	this.in_row=args['in_row'] || 1;
3380	this.offset=args['offset']==null || this.in_row==1 ? 0 : args['offset'];
3381	this.timer=null;
3382	this.left_scroll=0;
3383	this.count=0;
3384	this.initialized=false;
3385	this.page=1;
3386	this.pages=0;
3387	this.bullets=[];
3388 	this.init=function(){
3389		if(typeof this.container==='string') this.container=document.body.querySelector(this.container);
3390		if(this.container==null) return false;
3391		this.holder=this.container.querySelector('.slides');
3392		if(this.holder==null) return false;
3393		this.items=this.holder.querySelectorAll('.item');
3394		if(this.items.length==0) return false;
3395		this.change_time=this.change_time>100 ? this.change_time : this.change_time*1000;
3396		this.count=this.items.length;
3397		if(!this.isNum(this.in_row) || this.in_row>this.count) this.in_row=1;
3398
3399		if(typeof this.arrow_left==='string') this.arrows_left=this.container.querySelectorAll(this.arrow_left);
3400		if(typeof this.arrow_right==='string') this.arrows_right=this.container.querySelectorAll(this.arrow_right);
3401
3402		if(!this.draw()) return false;
3403
3404
3405		if(this.arrows_left.length>0) for(var i=0;i<this.arrows_left.length;++i){
3406			this.arrows_left[i].addEventListener('click',(function(kss){ return function(){kss.slide(-1);}})(this));
3407			//if(this.items.length==1) this.arrows_left[i].style.display='none';
3408		}
3409		if(this.arrows_right.length>0) for(var i=0;i<this.arrows_right.length;++i){
3410			this.arrows_right[i].addEventListener('click',(function(kss){ return function(){kss.slide(1);}})(this));
3411			//if(this.items.length==1) this.arrows_right[i].style.display='none';
3412		}
3413
3414		if(this.drag) this.addDrag();
3415		this.adaptHeight();
3416		window.addEventListener('resize',(function(kss){ return function(){ kss.adaptHeight(); }})(this));
3417		if(!this.isNum(this.current) || this.current>=this.count) this.current=1;
3418
3419		this.reDraw();
3420
3421		this.initialized=true;
3422	}
3423	this.draw=function(){
3424		var in_row=this.in_row;
3425		for(var i=0;i<this.mobile.length;++i){
3426			if(Array.isArray(this.mobile[i])){ if(this.mobile[i][0]>=window.innerWidth) in_row=this.mobile[i][1]; }
3427			else if(this.mobile[i]>=window.innerWidth){ --in_row; }
3428		}
3429		if(in_row<=0) in_row=1;
3430		this.show_count=in_row;
3431		// need to fix
3432		var c_width=this.container.clientWidth;
3433		var pad=getComputedStyle(this.container).padding.split(' ');
3434		if(pad[1]){
3435			pad[1]=Math.round(pad[1].replace('px',''));
3436			c_width-=(pad[1]*2);
3437		}
3438		//
3439		if(this.metrics=='px') this.holder.style.width=((c_width*this.items.length)/in_row).toString()+'px';
3440		else this.holder.style.width=((100*this.items.length)/in_row).toString()+'%';
3441		var offset=0;
3442		if(in_row>1){
3443			if(this.offset){
3444				if(Array.isArray(this.offset)){
3445					for(var i=0;i<this.offset.length;++i){
3446						if(Array.isArray(this.offset[i])) if(this.offset[i][0]>=window.innerWidth) offset=this.offset[i][1];
3447					}
3448				}else if(this.offset) offset=this.offset;
3449			}
3450			if(offset!==0){
3451				if(this.metrics=='px' && offset.indexOf('%')>=0){
3452					offset=Math.round(offset.replace('%',''));
3453					offset=offset/this.count;
3454					offset=this.holder.clientWidth*offset/100;
3455				}
3456				offset=offset.toString();
3457				offset=offset.replace('%','');
3458				offset=offset.replace('px','');
3459				offset=Math.round(offset);
3460			}
3461		}
3462		var w=0;
3463		if(this.metrics=='px'){
3464			w=Math.ceil(c_width/in_row);
3465			this.holder.style.width=(w*this.count).toString()+'px';
3466		}
3467		else if(this.metrics=='%'){
3468			offset=offset/this.count;
3469			w=100/this.count;
3470		}
3471		if(offset>0){ w-=offset; }
3472		//if(w==0) return false;
3473		for(var i=0;i<this.count;++i){
3474			this.items[i].style.width=w.toString()+this.metrics;
3475			this.items[i].style.marginRight=offset.toString()+this.metrics;
3476			this.addClass(this.items[i],this.after_init_class);
3477		}
3478		this.pages=Math.ceil(this.count/in_row);
3479		this.bullets=[];
3480		if(this.add_bullets){
3481			this.bullets_holder=this.container.querySelector('.bullets');
3482			this.bullets_holder.innerHTML='';
3483			if(this.bullets_holder && this.pages>1){
3484				for(var i=0;i<this.pages;++i){
3485					var bullet=document.createElement((this.bullets_holder.tagName.toLowerCase()=='ul' ? 'li' : 'div'));
3486					bullet.className='bullet';
3487					if(i==this.current-1) this.addClass(bullet,this.active_class);
3488					bullet.addEventListener('click',(function(kss,p){ return function(){ kss.setPage(p); }})(this,(i+1)));
3489					this.bullets_holder.appendChild(bullet);
3490					this.bullets.push(bullet);
3491				}
3492			}
3493		}
3494		if(this.pages==1){
3495			console.log(this.empty_class);
3496			if(this.bullets_holder) this.addClass(this.bullets_holder,this.empty_class);
3497			for(var i=0;i<this.arrows_left.length;++i) this.addClass(this.arrows_left[i],this.empty_class);
3498			for(var i=0;i<this.arrows_right.length;++i) this.addClass(this.arrows_right[i],this.empty_class);
3499		}
3500		this.set(this.current);
3501		return true;
3502	}
3503	this.reDraw=function(){
3504		window.addEventListener('resize',(function(kss){ return function(){
3505			if(kss.metrics=='px'){
3506				kss.draw();
3507			}
3508			else{
3509				for(var i=0;i<kss.mobile.length;++i){
3510					if(Array.isArray(kss.mobile[i])) if(kss.mobile[i][0]>=window.innerWidth) kss.draw();
3511					else if(kss.mobile[i]>=window.innerWidth) kss.draw();
3512				}
3513			}
3514		}})(this));
3515	}
3516	this.slide=function(dir){
3517		var pos=this.current+dir;
3518		if(pos<=0){ if(this.infinity){ pos=this.count-this.show_count+1; } else { return false; } }
3519		if(pos+(this.show_count-1)>this.count){ if(this.infinity){ pos=1; } else{ return false; } }
3520		if(!this.infinity){
3521			if(pos+1+(this.show_count-1)>this.count) this.addClass(this.arrow_right,this.disabled_class);
3522			else this.removeClass(this.arrow_right,this.disabled_class);
3523			if(pos-1<=0) this.addClass(this.arrow_left,this.disabled_class);
3524			else this.removeClass(this.arrow_left,this.disabled_class);
3525		}
3526		this.set(pos);
3527	}
3528	this.setPage=function(p){
3529		if(p>this.pages || p<=0) return false;
3530		var cur_page=Math.ceil(this.current/this.show_count);
3531		if(cur_page==p) return false;
3532		this.set((p-1)*this.show_count+1);
3533	}
3534	this.set=function(i){
3535		if(typeof this.container.dispatchEvent==='function'){
3536			var event=new CustomEvent("kit_slider_pre_change",{detail:{num:this.current,container:this.container}});
3537			this.container.dispatchEvent(event);
3538		}
3539		// need to fix
3540		var c_width=this.container.clientWidth;
3541		var pad=getComputedStyle(this.container).padding.split(' ');
3542		if(pad[1]){
3543			pad[1]=Math.round(pad[1].replace('px',''));
3544			c_width-=(pad[1]*2);
3545		}
3546		//
3547		if(this.metrics=='px') this.holder.style.marginLeft=(-(i-1)*c_width/this.show_count).toString()+'px';
3548		else this.holder.style.marginLeft=(-(i-1)*100/this.show_count).toString()+'%';
3549		if(this.bullets.length>0){
3550			var cur_page=Math.ceil(i/this.show_count);
3551			for (var j=0;j<this.bullets.length;j++) {
3552				if (j==cur_page-1) this.addClass(this.bullets[j],this.active_class);
3553					else this.removeClass(this.bullets[j],this.active_class);
3554				}
3555		}
3556		this.current=i;
3557		this.adaptHeight();
3558		if(this.timer!=null) clearTimeout(this.timer);
3559		this.autoChange();
3560		this.page=Math.ceil(this.count/this.current);
3561		if(typeof this.container.dispatchEvent==='function'){
3562			var event=new CustomEvent("kit_slider_changed",{detail:{num:this.current,container:this.container,obj:this}});
3563			this.container.dispatchEvent(event);
3564		}
3565	}
3566	this.adaptHeight=function(){
3567		if(!this.adapt) return false;
3568		var cur_page=Math.ceil(this.current/this.show_count);
3569		var from=(cur_page-1)*this.show_count;
3570		var to=from+this.show_count-1;
3571		var max_height=0;
3572		for (var i=from;i<=to && i<this.items.length;i++)  if (this.items[i].offsetHeight>max_height) max_height=this.items[i].offsetHeight;
3573		this.holder.style.height=max_height.toString()+'px';
3574	}
3575	this.autoChange=function(){
3576		if(this.change_time==0) return false;
3577		if(this.timer!=null) clearTimeout(this.timer);
3578		this.timer=setTimeout((function(kss){ return function(){ kss.slide(1); }})(this),this.change_time);
3579	}
3580	/* FOR FUTURE, THIS IS'T WORK NOW */
3581	this.addDrag=function(){
3582		if(!this.desctop_drag) return false;
3583		this.holder.addEventListener('mousedown',(function(kss){return function(ev){
3584			if(ev.button==2) return false;
3585			var coords=kss.getCoords(this);
3586			var shiftX=ev.pageX-coords.left;
3587			var sliderCoords=kss.getCoords(kss.container);
3588			var start_scroll=kss.holder.style.marginLeft;
3589			document.addEventListener('mousemove',(function (kss,sX,sC,ss){ return kss.mmH=function(ev){
3590				var left=ev.pageX-sX-sC.left;
3591				if(left<0 && Math.abs(left)<kss.container.clientWidth*(kss.count-1)){
3592					if(kss.metrics=='px') kss.holder.style.marginLeft=left.toString()+'px';
3593					else kss.holder.style.marginLeft=(left/kss.container.clientWidth*100).toString()+'%';
3594				}
3595				kss.left_scroll=left;
3596				if(!kss.moving) document.addEventListener('mouseup',(function(kss,ss){ return kss.muH=function(){
3597					if(!kss.drag_cut){
3598						ss=ss.replace('%','');
3599						ss=ss.replace('px','');
3600						ss=kss.metrics=='px' ? parseFloat(ss,2)/kss.container.clientWidth : parseFloat(ss,2)/100;
3601						var curpx=kss.container.clientWidth*ss;
3602						var delta=curpx-kss.left_scroll;
3603						if(Math.abs(delta)>=kss.container.clientWidth/kss.drag_sens){
3604							if(delta>=0) kss.slide(1);
3605							else kss.slide(-1);
3606						}
3607						else kss.set(kss.current);
3608					}
3609					kss.moving=false;
3610					kss.left_scroll=0;
3611					document.removeEventListener('mousemove', kss.mmH);
3612					document.removeEventListener('mouseup',kss.muH);
3613					kss.mmH=null;
3614					kss.muH=null;
3615				}})(kss,ss));
3616				kss.dragstart=false;
3617				kss.moving=true;
3618			}}(kss,shiftX,sliderCoords,start_scroll)));
3619		}})(this));
3620		this.holder.addEventListener('dragstart',function(ev){ev.preventDefault();});
3621		this.holder.addEventListener('click',(function(kss){ return function(){
3622			document.removeEventListener('mousemove', kss.mmH);
3623			document.removeEventListener('mouseup',kss.muH);
3624			kss.mmH=null;
3625			kss.muH=null;
3626		}})(this));
3627		this.holder.addEventListener('dblclick',(function(kss){ return function(){
3628			document.removeEventListener('mousemove', kss.mmH);
3629			document.removeEventListener('mouseup',kss.muH);
3630			kss.mmH=null;
3631			kss.muH=null;
3632		}})(this));
3633	}
3634	this.swipe=function(params){
3635		if (params['scroll']=="right") this.slide(-1);
3636		else if(params['scroll']=="left") this.slide(1);
3637	}
3638	this.init();
3639}
3640if(Object.hasOwnProperty('create') || typeof KIT==='function'){
3641	kit_slider.prototype=Object.create(KIT.prototype);
3642	kit_slider.prototype.constructor=kit_slider;
3643}
3644
3645var isMobile=('ontouchstart' in document.documentElement);
3646
3647function swipe(el,callback,dx,width,fastscroll,prevent){
3648	//el - элемент
3649	// dx - изменение по x при свайпе (по умолчанию 100)
3650	// callback - callback функция, 1м параметром ей посылается массив параметров
3651	// width - если передано, то свайп будет считаться только при разрешениях меньше переданного значения
3652	// fastscroll (bool) - быстрый скролл, если палец не прошёл нужное расстояние, но был быстро поднят (по умолчанию true)
3653	if(!isMobile || !el) return false;
3654	if(width!=null) if(window.innerWidth > width){
3655		el.touchstart=null;
3656		el.touchmove=null;
3657		el.touchend=null;
3658		return false;
3659	}
3660	if(fastscroll==null) fastscroll=true;
3661	if(dx==null) dx=100;
3662	if(prevent==null) prevent=false;
3663	var startPoint={};
3664	var nowPoint;
3665	var ldelay;
3666	var params=[];
3667	var swiping=false;
3668	el.addEventListener('touchstart', function(event){
3669		if(prevent) event.preventDefault();
3670		event.stopPropagation();
3671		startPoint.x=event.changedTouches[0].pageX;
3672		startPoint.y=event.changedTouches[0].pageY;
3673		ldelay=new Date();
3674	}, false);
3675
3676	el.addEventListener('touchmove', function(event) {
3677		if(prevent) event.preventDefault();
3678		event.stopPropagation();
3679		var otk={};
3680		nowPoint=event.changedTouches[0];
3681		otk.x=nowPoint.pageX-startPoint.x;
3682		//alert(swiping);
3683		if(Math.abs(otk.x)>dx && !swiping){
3684			swiping=true;
3685			if(otk.x<0){ params['scroll']='left'; }
3686			if(otk.x>0){ params['scroll']='right'; }
3687			startPoint={x:nowPoint.pageX,y:nowPoint.pageY};
3688			if(params['scroll']==null) params['scroll']=false;
3689			callback(params);
3690			//setTimeout(function(){swiping=false;},100);
3691		}
3692	}, false);
3693	if(fastscroll) el.addEventListener('touchend', function(event){
3694		var pdelay=new Date();
3695		nowPoint=event.changedTouches[0];
3696		var xAbs = Math.abs(startPoint.x - nowPoint.pageX);
3697		if (xAbs > dx/5 && (pdelay.getTime()-ldelay.getTime())<dx && !swiping) {
3698			//swiping=true;
3699			if (nowPoint.pageX < startPoint.x){ params['scroll']='left'; }
3700			else{ params['scroll']='right'; }
3701			if(params['scroll']==null) params['scroll']=false;
3702			callback(params);
3703		}
3704		swiping=false;
3705	}, false);
3706	el.addEventListener('touchend', function(){ swiping=false; },false);
3707}function kit_fader(args) {�	if(!args) args={};�    this.container=args['container'];
3708	this.items=[];
3709	this.count=0;
3710	this.current=0;
3711	this.change_time=args['change_time'] || 0;
3712	this.timer=null;
3713
3714	this.init=function(){
3715		if(typeof this.container==='string') this.container=document.body.querySelector(this.container);
3716		if(this.container==null) return false;
3717		this.items=this.container.querySelectorAll('.item');
3718		if(this.items.length==0) {�			this.items=[];
3719            var lis=this.container.childNodes
3720            for (var i = 0; i < lis.length;i++) if (lis[i].nodeType==1) this.items.push(lis[i]);
3721            if(this.items.length==0) return false;
3722			}
3723		this.change_time=this.change_time>100 ? this.change_time : this.change_time*1000;
3724		this.count=this.items.length;
3725		this.setSlide(0);
3726		this.autoChange();
3727	}
3728	this.setSlide=function(num){�        if (num<0) num=this.count-1;
3729        if (num>=this.count) num=0;
3730        if (num!=this.current)  this.items[this.current].className=this.items[this.current].className.replace('active','');
3731        if (this.items[num].className.indexOf('active')<0) this.items[num].className=this.items[num].className+' active';
3732        this.current=num;
3733		}
3734	this.next=function() {�		this.setSlide(this.current+1);
3735		}
3736	this.previous=function() {
3737		this.setSlide(this.current-1);
3738		}
3739	this.autoChange=function(){
3740		if(this.change_time==0) return false;
3741		if(this.timer==null) this.timer=setInterval((function(kss){ return function(){ kss.next();}})(this),this.change_time);
3742	}
3743
3744	this.init();
3745}/**
3746 * Класс для работы со страницей ЖК
3747 */
3748class ComplexPage {
3749
3750  constructor (data) {
3751    this.extend(this, data);
3752    this.initControls();
3753    this.initHandles();
3754    this.render();
3755
3756    let videoPlayer;
3757  }
3758
3759  /**
3760   * Расширение объекта.
3761   * @param {ComplexPage} self - объект для расширения
3762   * @param {Object} variation - объект для расширения объекта self.
3763   * @returns {void}
3764   */
3765  extend (self, variation) {
3766    for (const key in variation) {
3767      if (variation.hasOwnProperty(key)) {
3768        self[key] = variation[key]
3769      }
3770    }
3771  }
3772
3773  /**
3774   * Инициализация элементов управления.
3775   * @returns {void}
3776   */
3777  initControls() {
3778    this.isMobile = ComplexPage.isMobileSize();
3779    this.mobilePreviewContainer = document.querySelector('[data-block="mobile-preview-container"]')
3780  }
3781
3782  /**
3783   * Инициализация обработчиков.
3784   * @returns {void}
3785   */
3786  initHandles () {
3787    this.videoButtonHandler();
3788    this.featuresButtonHandler();
3789    this.documentResizeHandler();
3790    this.projectMainParametersSliderHandler();
3791    this.layoutsListHandler();
3792    this.layoutsListGalleryHandler();
3793    this.videoLinkToVideoIFrame();
3794    this.clickReviewsLink();
3795    this.paymentPlans();
3796  }
3797
3798  /**
3799   * Рендеринг страницы.
3800   * @returns {void}
3801   */
3802  render() {
3803    this.reBuild();
3804  }
3805
3806  /**
3807   * Перестройка страницы.
3808   * @returns {void}
3809   */
3810  reBuild() {
3811    this.moveRatingBlock();
3812    this.moveLabelsBlock();
3813    this.moveProjectInfo();
3814    this.moveProjectButtonsGroup();
3815    this.responsiveHeightPreviewContainer();
3816  }
3817
3818  /**
3819   * Обработчик кнопки "Показать видео".
3820   * @returns {void}
3821   */
3822  videoButtonHandler() {
3823    const projectVideoButton = document.getElementById('video_project_button');
3824    const projectVideoButtonClose = document.getElementById('close-video-project');
3825    const projectVideoContent = document.getElementById('video_project_content');
3826
3827    if (!projectVideoButton) {
3828      return;
3829    }
3830
3831    projectVideoButton.addEventListener('click',() => {
3832      const videoUrl = projectVideoButton.getAttribute('data-video');
3833      const videoId = this.getVideoIDByUrl(videoUrl);
3834      //const previewImage = this.previewImageVideoByVideoID(videoId);
3835      const iframe = this.createEmbed(videoUrl);
3836
3837      projectVideoContent.appendChild(iframe);
3838      showPopup('video_project_popup');
3839
3840      //this.videoPopupHandler();
3841    });
3842
3843    projectVideoButtonClose.addEventListener('click', function () {
3844      projectVideoContent.innerHTML = '';
3845      closePopup(this);
3846    })
3847  }
3848
3849  /**
3850   * Создание iframe блока с видео
3851   * @param videoUrl
3852   * @returns {HTMLIFrameElement}
3853   */
3854  createEmbed(videoUrl) {
3855    const iframe = document.createElement('iframe');
3856    iframe.setAttribute('src', videoUrl);
3857    iframe.setAttribute('frameborder', '0');
3858    iframe.setAttribute('allowfullscreen', '');
3859
3860    return iframe;
3861  }
3862
3863  /**
3864   * Получение VIDEO_ID youtube по ссылке
3865   * @param {string} url - ссылка на видео
3866   * @returns {*}
3867   */
3868  getVideoIDByUrl(url) {
3869    const parts = url.split("/");
3870    const videoId = parts[parts.length - 1];
3871
3872    return videoId;
3873  }
3874
3875  /**
3876   * Стартовая картинка видео
3877   * @param {string} videoId VIDEO_ID
3878   * @returns {HTMLDivElement}
3879   */
3880  previewImageVideoByVideoID(videoId) {
3881    const src = `https://img.youtube.com/vi/${videoId}/sddefault.jpg`;
3882    const div = document.createElement('div');
3883    div.setAttribute('data-action', 'start-video');
3884    div.setAttribute('id', 'player');
3885    const img = document.createElement('img');
3886    img.setAttribute('src', src);
3887    img.setAttribute('alt', '');
3888    img.setAttribute('width', '100%');
3889    img.setAttribute('height', '100%');
3890    div.appendChild(img);
3891
3892    return div;
3893  }
3894
3895  /**
3896   * Замена стартовой картинки видео на видео
3897   * Автоматический запуск видео
3898   * @returns {void}
3899   */
3900  videoPopupHandler() {
3901    const projectVideoButton = document.getElementById('video_project_button');
3902    const popupVideoButton = document.querySelector('[data-action="start-video"]');
3903    const projectVideoContent = document.getElementById('video_project_content');
3904    popupVideoButton.addEventListener('click',(event) => {
3905      if (event.target === popupVideoButton || popupVideoButton.contains(event.target)) {
3906        const videoUrl = projectVideoButton.getAttribute('data-video');
3907        const iframe = this.createEmbed(videoUrl);
3908
3909        projectVideoContent.innerHTML = "";
3910        projectVideoContent.appendChild(iframe);
3911      }
3912    });
3913  }
3914
3915  featuresButtonHandler() {
3916    let cont = e('object_features');
3917    if(!cont) {
3918      return;
3919    }
3920    let btn = cont.querySelector('.button a');
3921    if(!btn) {
3922      return;
3923    }
3924    let pop = e('features_popup');
3925    if(!pop) {
3926      btn.parentNode.removeChild(btn);
3927      return;
3928    }
3929    btn.addEventListener('click', () => { showPopup('features_popup'); });
3930  }
3931
3932  /**
3933   * Обработчик изменения размера окна.
3934   * @returns {void}
3935   */
3936  documentResizeHandler() {
3937    window.addEventListener('resize', () => {
3938      this.isMobile = ComplexPage.isMobileSize();
3939      this.reBuild();
3940    });
3941  }
3942
3943  /**
3944   * Обработчик слайдера параметров ЖК
3945   * @returns {void}
3946   */
3947  projectMainParametersSliderHandler() {
3948    const container = document.querySelector('.project-main-parameters__content');
3949    const track = document.querySelector('.project-main-parameters__slider-track');
3950    const handle = document.querySelector('.project-main-parameters__slider-handle');
3951    let startX, startLeft;
3952
3953    handle.addEventListener('mousedown', onMouseDown);
3954    handle.addEventListener('touchstart', onMouseDown);
3955
3956    function onMouseDown(event) {
3957      event.preventDefault();
3958      startX = event.clientX || event.touches[0].clientX;
3959      startLeft = handle.offsetLeft;
3960
3961      document.addEventListener('mousemove', onMouseMove);
3962      document.addEventListener('mouseup', onMouseUp);
3963      document.addEventListener('touchmove', onMouseMove);
3964      document.addEventListener('touchend', onMouseUp);
3965    }
3966
3967    function onMouseMove(event) {
3968      event.preventDefault();
3969      const clientX = event.clientX || event.touches[0].clientX;
3970      const deltaX = clientX - startX;
3971      const newLeft = startLeft + deltaX;
3972
3973      if (newLeft >= 0 && newLeft <= track.offsetWidth - handle.offsetWidth) {
3974        handle.style.left = newLeft + 'px';
3975        container.scrollLeft =
3976          (newLeft / (track.offsetWidth - handle.offsetWidth)) * (container.scrollWidth - container.clientWidth);
3977      }
3978    }
3979
3980    function onMouseUp() {
3981      document.removeEventListener('mousemove', onMouseMove);
3982      document.removeEventListener('mouseup', onMouseUp);
3983      document.removeEventListener('touchmove', onMouseMove);
3984      document.removeEventListener('touchend', onMouseUp);
3985    }
3986
3987    container.addEventListener('scroll', () => {
3988      const scrollAmount =
3989        (container.scrollLeft / (container.scrollWidth - container.clientWidth)) * (track.offsetWidth - handle.offsetWidth);
3990      handle.style.left = `${scrollAmount}px`;
3991    });
3992
3993    function handleVisibility() {
3994      if (container.scrollWidth <= container.clientWidth) {
3995        handle.classList.add('hide');
3996      } else {
3997        handle.classList.remove('hide');
3998      }
3999    }
4000    handleVisibility();
4001    window.addEventListener('resize', handleVisibility);
4002  }
4003
4004  /**
4005   * Наличие "меток" у комплекса.
4006   * @returns {Element}
4007   */
4008  labelsComplex() {
4009    const previewBlock = document.querySelector('.preview_block');
4010    const previewMobileBlock = document.querySelector('[data-block="mobile-preview-container"]');
4011    return previewBlock.querySelector('.labels_block') ||
4012      previewMobileBlock.querySelector('.labels_block');
4013  }
4014
4015  /**
4016   * Наличие "рейтинга" у комплекса.
4017   * @returns {Element}
4018   */
4019  ratingComplex() {
4020    const previewBlock = document.querySelector('.preview_block');
4021    const previewMobileBlock = document.querySelector('[data-block="mobile-preview-container"]');
4022    return previewBlock.querySelector('.reviews_form') ||
4023      previewMobileBlock.querySelector('.reviews_form');
4024  }
4025
4026  /**
4027   * Перемещение блока рейтинга.
4028   * @returns {void}
4029   */
4030  moveRatingBlock() {
4031    const previewBlockContainer = document.querySelector('.preview_block .container');
4032    const ratingBlock = this.ratingComplex();
4033    if (this.isMobile === true && ratingBlock) {
4034      this.mobilePreviewContainer.appendChild(ratingBlock);
4035      ratingBlock.style.display = "inline-block";
4036    } else if (previewBlockContainer && ratingBlock) {
4037      ratingBlock.style.display = "inline-block";
4038      const top_row = previewBlockContainer.querySelector('.top_row');
4039      const video_cont = top_row.querySelector('.video_project_button');
4040      if(video_cont) {
4041        video_cont.parentNode.insertBefore(ratingBlock, video_cont);
4042      } else {
4043        top_row.appendChild(ratingBlock);
4044      }
4045    }
4046  }
4047
4048  /**
4049   * Перемещение блока меток.
4050   * @returns {void}
4051   */
4052  moveLabelsBlock() {
4053    const previewBlock = document.querySelector('.preview_block');
4054    const projectInfoBlock = previewBlock.querySelector('.project_info');
4055    const labelsBlock = this.labelsComplex();
4056
4057    if (this.isMobile === true) {
4058      if (labelsBlock) {
4059        this.mobilePreviewContainer.appendChild(labelsBlock);
4060        labelsBlock.style.display = "block";
4061      }
4062    } else if (projectInfoBlock) {
4063      if (labelsBlock) {
4064        projectInfoBlock.parentNode.insertBefore(labelsBlock, projectInfoBlock);
4065        labelsBlock.style.removeProperty("display");
4066      }
4067    }
4068  }
4069
4070  /**
4071   * Перемещение информации о проекте (за исключение названия ЖК).
4072   * Название ЖК остается на месте.
4073   * @returns {void}
4074   */
4075  moveProjectInfo() {
4076    const projectInfoBlock = document.querySelector('.preview_block .project_info');
4077    const projectMinCost = document.querySelector('.project_info__min-cost-object');
4078    const projectMinCostSquareMeter = document.querySelector('.project_info__min-cost-square-meter');
4079
4080    if (this.isMobile === true) {
4081      if (projectMinCost) {
4082        this.mobilePreviewContainer.appendChild(projectMinCost);
4083        projectMinCost.style.display = "block";
4084      }
4085      if (projectMinCostSquareMeter) {
4086        this.mobilePreviewContainer.appendChild(projectMinCostSquareMeter);
4087        projectMinCostSquareMeter.style.display = "block";
4088      }
4089    } else {
4090      if (projectMinCost) {
4091        projectInfoBlock.appendChild(projectMinCost);
4092      }
4093      if (projectMinCostSquareMeter) {
4094        projectInfoBlock.appendChild(projectMinCostSquareMeter);
4095      }
4096    }
4097  }
4098
4099  /**
4100   * Перемещение блока кнопок.
4101   * @returns {void}
4102   */
4103  moveProjectButtonsGroup() {
4104    const projectButtonsGroup = document.querySelector('.project_buttons_group');
4105    if (this.isMobile === true) {
4106      if (projectButtonsGroup) {
4107        this.mobilePreviewContainer.appendChild(projectButtonsGroup);
4108        projectButtonsGroup.style.display = "block";
4109      }
4110    } else {
4111      const projectInfoBlock = document.querySelector('.preview_block .project_info');
4112      if (projectInfoBlock && projectButtonsGroup) {
4113        projectInfoBlock.insertAdjacentElement('afterend', projectButtonsGroup);
4114        projectButtonsGroup.style.display = "flex";
4115      }
4116    }
4117  }
4118
4119  /**
4120   * Получение блока "рейтинг" который необходимо перемещать
4121   * В зависимости от разрешения экрана блок можен находиться в разных контейнерах   *
4122   * @returns {Element}
4123   */
4124  ratingMoveableBlock() {
4125    const previewBlock = document.querySelector('.preview_block');
4126    const previewMobileBlock = document.querySelector('[data-block="mobile-preview-container"]');
4127    let ratingBlock = null;
4128    if (this.isMobile === false) {
4129      ratingBlock = previewBlock.querySelector('.reviews_form') || null;
4130    } else  {
4131      ratingBlock = previewMobileBlock.querySelector('.reviews_form') || null;
4132    }
4133
4134    return ratingBlock;
4135  }
4136
4137  /**
4138   * Получение блока "метки" который необходимо перемещать
4139   * В зависимости от разрешения экрана блок можен находиться в разных контейнерах
4140   * @returns {Element}
4141   */
4142  labelMoveableBlock() {
4143    const previewBlock = document.querySelector('.preview_block');
4144    const previewMobileBlock = document.querySelector('[data-block="mobile-preview-container"]');
4145    let labelsBlock = null;
4146    if (this.isMobile === false) {
4147      labelsBlock = previewBlock.querySelector('.labels_block') || null;
4148    } else  {
4149      labelsBlock = previewMobileBlock.querySelector('.labels_block') || null;
4150    }
4151
4152    return labelsBlock;
4153  }
4154
4155  /**
4156   * Проверка наличия рейтинга на странице.
4157   * @returns {boolean}
4158   */
4159  hasRatingOnPage() {
4160    return !!this.ratingMoveableBlock();
4161  }
4162
4163  /**
4164   * Проверка наличия меток на странице.
4165   * @returns {boolean}
4166   */
4167  hasLabelsOnPage() {
4168    return !!this.labelMoveableBlock();
4169  }
4170
4171  /**
4172   * Проверка наличия кнопки "Запросить объекты" на странице.
4173   * @returns {boolean}
4174   */
4175  hasRequestObjectsButtonOnPage() {
4176    return !!document.querySelector('[data-action="request-objects"]');
4177  }
4178
4179  /**
4180   * Проверка наличия кнопки "Скачать брошюру" на странице.
4181   * @returns {boolean}
4182   */
4183  hasDownloadBrochureButtonOnPage() {
4184    return !!document.querySelector('[data-action="download-brochure"]');
4185  }
4186
4187  /**
4188   * Получение ширины документа.
4189   * @returns {number}
4190   */
4191  static documentWidth() {
4192    return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
4193  }
4194
4195  /**
4196   * Проверка размера экрана на мобильный размер.
4197   * @returns {boolean}
4198   */
4199  static isMobileSize() {
4200    return ComplexPage.documentWidth() <= 600;
4201  }
4202
4203  /**
4204   * Скачивание брошюры.
4205   * @param {string} fileURL - ссылка на брошюру
4206   * @param {number} complexId - id комплекса
4207   */
4208  static downloadBrochure(fileURL, complexId) {
4209    if (!fileURL || !complexId) {
4210      return;
4211    }
4212    const pageUrl = window.location.href;
4213    const downloadUrl = new URL(pageUrl);
4214    downloadUrl.searchParams.append('brochure_download', '1');
4215    window.location.href = downloadUrl.href;
4216  }
4217
4218  layoutsListHandler() {
4219    let cont = e('complex_layouts_list');
4220    if(!cont) {
4221      return;
4222    }
4223    let els = cont.querySelectorAll('.items > .item');
4224    if(!els.length) {
4225      return;
4226    }
4227    for(let i = 0; i < els.length; ++i) {
4228      els[i].addEventListener('click', function() {
4229        let mobile_data = this.nextElementSibling;
4230        if(mobile_data && hasClass(mobile_data, 'mobile_data') && this.isMobile) {
4231          switchClass(mobile_data, 'active');
4232          switchClass(this, 'hidden');
4233          if(hasClass(mobile_data, 'active')) {
4234            mobile_data.querySelector('.action.close').addEventListener('click', function() {
4235              let md = this.closest('.mobile_data');
4236              let item = md.previousElementSibling;
4237              removeClass(item, 'hidden');
4238              removeClass(md, 'active');
4239            }, {once : true});
4240          }
4241        }
4242      });
4243    }
4244  }
4245
4246  /**
4247   * Инициализация галереи для layouts list.
4248   * @returns {void}
4249   */
4250  layoutsListGalleryHandler() {
4251    const self = this;
4252    window.addEventListener('ajax_pagenav_done', function(event) {
4253      const eventData = event.detail;
4254      const status = eventData.type;
4255      const isLayoutsList = eventData.key === 'complex_layouts_list';
4256      const html = eventData.html;
4257      if (status === 'success' && isLayoutsList && html) {
4258        const galleryItems = self.getGalleryItems(html);
4259        self.initializeLayoutsListGallery(galleryItems);
4260      }
4261    });
4262  }
4263
4264  /**
4265   * Получение элементов галереи из html.
4266   * @param html
4267   * @returns {NodeListOf<Element>}
4268   */
4269  getGalleryItems(html) {
4270    const tempContainer = document.createElement('div');
4271    tempContainer.innerHTML = html;
4272    const galleryItems = tempContainer.querySelectorAll('.preview');
4273
4274    return galleryItems;
4275  }
4276
4277  /**
4278   * Инициализация галереи для layouts list.
4279   * @param {NodeListOf<Element>} galleryItems - элементы галереи
4280   * @returns {void}
4281   */
4282  initializeLayoutsListGallery(galleryItems) {
4283    galleryItems.forEach(function(item) {
4284      const galleryId = item.querySelector('div[id^="layouts_gallery_"]').getAttribute('id');
4285      /** @see shortcodes/complex/layouts_list/preview */
4286      if (typeof initializeLayoutsListGallery === 'function' && galleryId) {
4287        initializeLayoutsListGallery(galleryId);
4288      }
4289    });
4290  }
4291
4292  /**
4293   * Создание iframe для видео.
4294   * @returns {void}
4295   */
4296  videoLinkToVideoIFrame() {
4297    const self = this;
4298    const videoBlocks = document.querySelectorAll('[data-action="create-iframe"]');
4299    videoBlocks.forEach(function(videoBlock) {
4300      const videoLink = videoBlock.getAttribute('data-video_url');
4301      if (videoLink) {
4302        const iframe = self.createEmbed(videoLink);
4303        videoBlock.appendChild(iframe);
4304      }
4305    });
4306  }
4307
4308  /**
4309   * Обработчик клика по ссылке "Отзывы"
4310   * @returns {void}
4311   */
4312  clickReviewsLink() {
4313    const reviewsLink = document.querySelector('[data-action="scroll-to-reviews"]');
4314    if (reviewsLink) {
4315      reviewsLink.addEventListener('click', function(event) {
4316        event.preventDefault();
4317        const menu  = document.getElementById('object_fixed_menu');
4318        const reviewsMenu = menu.querySelector('.item a[href="#object-object_reviews"]');
4319        reviewsMenu.click();
4320      });
4321    }
4322  }
4323
4324  paymentPlans() {
4325    let els = document.querySelectorAll('.complex_payment_plan');
4326    if(!els.length) {
4327      return;
4328    }
4329    for(let i = 0; i < els.length; ++i) {
4330      let tabs = els[i].querySelectorAll('.navigation li');
4331      if(!tabs.length) {
4332        continue;
4333      }
4334      for(let j = 0; j < tabs.length; ++j) {
4335        tabs[j].addEventListener('click', this.paymentPlanTab);
4336      }
4337      let sel = els[i].querySelector('.mobile_select select');
4338      sel.addEventListener('change', this.paymentPlanSelect);
4339    }
4340  }
4341  paymentPlanTab() {
4342    let nav = this.closest('.navigation');
4343    let cont = this.closest('.complex_payment_plan');
4344    let curr = nav.querySelector('.active');
4345    if(curr) {
4346      curr.classList.remove('active');
4347    }
4348    addClass(this, 'active');
4349    let price = parseFloat(this.dataset.value);
4350    let items = cont.querySelectorAll('*[data-percent]');
4351    for(let i = 0; i < items.length; ++i) {
4352		const roundPrice = Math.round(price * (parseFloat(items[i].dataset.percent) / 100))
4353      items[i].innerHTML = KITS.formatPrice(roundPrice, KITS_CURRENCY, 0, ' ', '.', true, false, false);
4354    }
4355  }
4356  paymentPlanSelect() {
4357    let cont = this.closest('.complex_payment_plan');
4358    let nav = cont.querySelector('.navigation');
4359    let nav_els = nav.querySelectorAll('li');
4360    let val = 0;
4361    for(let i = 0; i < this.options.length; ++i) {
4362      if(this.options[i].selected) {
4363        val = this.options[i].value;
4364        break;
4365      }
4366    }
4367    if(nav_els[val]) {
4368      nav_els[val].click();
4369    }
4370  }
4371
4372  /**
4373   * Вычисление видимой высоты экрана
4374   * @returns {number}
4375   */
4376  getVisibleScreenHeight() {
4377    return window.innerHeight || document.documentElement.clientHeight;
4378  }
4379
4380  /**
4381   * Установка пользовательской высоты блока .preview_block__container
4382   * @returns {void}
4383   */
4384  responsiveHeightPreviewContainer() {
4385    const container = document.querySelector('.preview_block .preview_block__container');
4386    if (this.isMobile) {
4387      container.style.minHeight = '';
4388    } else {
4389      const minContainerHeight = 600;
4390      const maxContainerHeight = 800;
4391      const additionalHeightSetting = 0;
4392      const screenHeight = this.getVisibleScreenHeight();
4393      const headerHeight = document.querySelector('header').offsetHeight;
4394      const containerHeight = screenHeight - headerHeight - additionalHeightSetting;
4395      if (containerHeight <= minContainerHeight) {
4396        container.style.minHeight = '';
4397      } else if (containerHeight <= maxContainerHeight) {
4398        container.style.minHeight = containerHeight + 'px';
4399      } else {
4400        container.style.minHeight = maxContainerHeight + 'px';
4401      }
4402    }
4403  }
4404}

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.