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">×</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.