Søg bolig
0 Boliger til salg
Error executing template "Designs/rm/eCom/Product/Boligvisning.cshtml" System.NullReferenceException: Object reference not set to an instance of an object. at CompiledRazorTemplates.Dynamic.RazorEngine_049782240f7f4224842bd68db90a1ba8.ExecuteAsync() at RazorEngine.Templating.TemplateBase.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.DynamicWrapperService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass23_0.<Run>b__0(TextWriter writer) at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter) at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag) at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 @using Custom.Tracking; 3 @using Dynamicweb; 4 @using Dynamicweb.Content.Items; 5 @using Dynamicweb.Core; 6 @using Dynamicweb.Core.Encoders; 7 @using RealMaeglerne.Library; 8 @using RealMaeglerne.Library.Models 9 @using System 10 @using System.Linq; 11 12 @functions { 13 string FormatPrice(int price, bool currencyBefore = false) 14 { 15 return currencyBefore ? "kr. " + price.ToString("#,##0") : price.ToString("#,##0") + " kr."; 16 } 17 18 string GetFullAddress(Dynamicweb.Security.UserManagement.UserGroup user) 19 { 20 if (user == null) { return string.Empty; } 21 22 var hasAddress = !string.IsNullOrEmpty(user.Address); 23 var hasZip = !string.IsNullOrEmpty(user.ZipCode); 24 var hasCity = !string.IsNullOrEmpty(user.City); 25 26 if (!hasAddress && !hasZip && !hasCity) return string.Empty; 27 28 return $"{(hasAddress ? user.Address + ", " : "")}{(hasZip ? user.ZipCode + " " : "")}{(hasCity ? user.City : "")}".TrimEnd(' ', ','); 29 } 30 } 31 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 32 @using Dynamicweb.Content.Items; 33 34 @functions{ 35 void RenderErhvervsTypeCheckboxes(string productGroupFilter) 36 { 37 <div class="col-xs-6 col-md-4"> 38 <div class="checkbox"> 39 <label> 40 <input type="checkbox" name="propertytype" value="bolig/erhverv, kombineret erhverv og bolig, byejendom (kontor, butik, beboelse)" /> 41 <span>Bolig/erhverv</span> 42 </label> 43 </div> 44 <div class="checkbox"> 45 <label> 46 <input type="checkbox" name="propertytype" value="erhvervsgrund" /> 47 <span>Erhvervsgrund</span> 48 </label> 49 </div> 50 <div class="checkbox"> 51 <label> 52 <input type="checkbox" name="propertytype" value="boligudlejning" /> 53 <span>Boligudlejningsejendom</span> 54 </label> 55 </div> 56 <div class="checkbox"> 57 <label> 58 <input type="checkbox" name="propertytype" value="kontor, klinik, kontorhotel, showroom, undervisningslokaler" /> 59 <span>Kontor</span> 60 </label> 61 </div> 62 </div> 63 <div class="col-xs-6 col-md-4"> 64 <div class="checkbox"> 65 <label> 66 <input type="checkbox" name="propertytype" value="butik / detail, butik / detailhandel" /> 67 <span>Butik/detailhandel</span> 68 </label> 69 </div> 70 <div class="checkbox"> 71 <label> 72 <input type="checkbox" name="propertytype" value="industri / logistik, håndværk, industri, kontor / lager, logistik" /> 73 <span>Produktion/lager</span> 74 </label> 75 </div> 76 <div class="checkbox"> 77 <label> 78 <input type="checkbox" name="propertytype" value="hotel - kursusejendom, restaurant" /> 79 <span>Hotel og restaurant</span> 80 </label> 81 </div> 82 <div class="checkbox"> 83 <label> 84 <input type="checkbox" name="propertytype" value="projekt ejendom" /> 85 <span>Projektejendom</span> 86 </label> 87 </div> 88 </div> 89 <div class="col-xs-6 col-md-4"> 90 <div class="checkbox"> 91 <label> 92 <input type="checkbox" name="propertytype" value="andet" /> 93 <span>Andet</span> 94 </label> 95 </div> 96 </div> 97 98 <input type="hidden" name="propertycategory" value="erhverv, udlejning" /> 99 <input type="hidden" name="filtrering" value="@productGroupFilter" /> 100 } 101 void RenderBoligtypeCheckboxes() 102 { 103 <div class="col-6 col-md-4"> 104 <div class="checkbox"> 105 <label> 106 <input type="checkbox" name="propertytype" value="villa" /> 107 <span>Villa</span> 108 </label> 109 </div> 110 <div class="checkbox"> 111 <label> 112 <input type="checkbox" name="propertytype" value="rækkehus" /> 113 <span>Rækkehus</span> 114 </label> 115 </div> 116 <div class="checkbox"> 117 <label> 118 <input type="checkbox" name="propertytype" value="villalejlighed" /> 119 <span>Villalejlighed</span> 120 </label> 121 </div> 122 <div class="checkbox"> 123 <label> 124 <input type="checkbox" name="propertytype" value="andelsbolig" /> 125 <span>Andelsbolig</span> 126 </label> 127 </div> 128 </div> 129 <div class="col-6 col-md-4"> 130 <div class="checkbox"> 131 <label> 132 <input type="checkbox" name="propertytype" value="fritidshus, fritidsbolig" /> 133 <span>Fritidsbolig</span> 134 </label> 135 </div> 136 <div class="checkbox"> 137 <label> 138 <input type="checkbox" name="propertytype" value="ejerlejlighed" class="specialOption" data-disable-slider="#grundareal" data-disable-slider-ranges="#grundarealmin,#grundarealmax" /> 139 <span>Ejerlejlighed</span> 140 </label> 141 </div> 142 <div class="checkbox"> 143 <label> 144 <input type="checkbox" name="propertytype" value="helårsgrund" class="specialOption" data-disable-slider="#boligareal,#roomsslider" data-disable-slider-ranges="#boligarealmin,#boligarealmax,#roomsmin" /> 145 <span>Helårsgrund</span> 146 </label> 147 </div> 148 <div class="checkbox"> 149 <label> 150 <input type="checkbox" name="propertytype" value="fritidsgrund" class="specialOption" data-disable-slider="#boligareal,#roomsslider" data-disable-slider-ranges="#boligarealmin,#boligarealmax,#roomsmin" /> 151 <span>Fritidsgrund</span> 152 </label> 153 </div> 154 </div> 155 <div class="col-6 col-md-4"> 156 <div class="checkbox"> 157 <label> 158 <input type="checkbox" name="propertytype" value="landejendom, lystejendom" class="specialOption" data-disable-checkbox="true" /> 159 <span>Landejendom</span> 160 </label> 161 </div> 162 <div class="checkbox"> 163 <label> 164 <input type="checkbox" name="propertytype" value="erhverv" class="specialOption" data-disable-checkbox="true" data-disable-slider="#roomsslider" data-disable-slider-ranges="#roomsmin" /> 165 <span>Erhverv</span> 166 </label> 167 </div> 168 </div> 169 } 170 171 void RenderChecked(string queryString) 172 { 173 if (Dynamicweb.Context.Current.Request.QueryString["propertytype"] == queryString) 174 { 175 @("checked") 176 } 177 } 178 179 void RenderBoligtypeCheckboxesDropdown() 180 { 181 Dictionary<string, string> propertyTypes = new Dictionary<string, string>(){ 182 { "Villa", "villa" }, { "Rækkehus", "rækkehus" }, { "Villalejlighed", "villalejlighed" }, 183 { "Andelsbolig", "andelsbolig" } 184 }; 185 foreach (KeyValuePair<string, string> type in propertyTypes) 186 { 187 bool ischecked = false; 188 string[] propertytypeSplit = new string[0]; 189 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["propertytype"])) 190 { 191 propertytypeSplit = Dynamicweb.Context.Current.Request.QueryString["propertytype"].Split(','); 192 } 193 foreach (var propertytypeParams in propertytypeSplit) 194 { 195 if (propertytypeParams == type.Value) 196 { 197 ischecked = true; 198 } 199 } 200 <li> 201 <label class="checkbox-container d-flex"> 202 @Translate("Smartpage:Search.DropDown." + type.Key + "", "" + type.Key + "") 203 <input type="checkbox" name="propertytype" value="@type.Value" class="js-input-check datavalue js-datavalue js-count" data-val="@type.Key" onchange="submitFilter()" checked="@ischecked" /> 204 <span class="checkmark grey"></span> 205 </label> 206 </li> 207 } 208 209 <li> 210 <label class="checkbox-container d-flex"> 211 @Translate("Smartpage:Search.DropDown.Blandet Bolig/Erhverv", "Blandet Bolig/Erhverv") 212 @{ 213 bool blboligcheck = false; 214 } 215 @if (Dynamicweb.Context.Current.Request.QueryString["propertycategory"] == "Blandet Bolig/Erhverv") 216 { 217 blboligcheck = true; 218 } 219 <input type="checkbox" name="propertycategory" value="Blandet Bolig/Erhverv" class="specialOption js-input-check js-datavalue js-count" data-disable-checkbox="true" data-disable-slider="#roomsslider" data-disable-slider-ranges="#roomsmin" checked="@blboligcheck" /> 220 <span class="checkmark grey"></span> 221 </label> 222 </li> 223 224 Dictionary<string, string> propertyTypes2 = new Dictionary<string, string>(){ 225 { "Fritidsbolig", "fritidshus, fritidsbolig" }, { "Ejerlejlighed", "ejerlejlighed" }, { "Helårsgrund", "helårsgrund" }, 226 { "Fritidsgrund", "fritidsgrund" }, { "Landejendom", "landejendom, lystejendom" } 227 }; 228 foreach (KeyValuePair<string, string> type in propertyTypes2) 229 { 230 bool ischecked = false; 231 string[] propertytypeSplit2 = new string[0]; 232 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["propertytype"])) 233 { 234 propertytypeSplit2 = Dynamicweb.Context.Current.Request.QueryString["propertytype"].Split(','); 235 } 236 foreach (var propertytypeParams in propertytypeSplit2) 237 { 238 if (propertytypeParams == type.Value) 239 { 240 ischecked = true; 241 } 242 } 243 <li> 244 <label class="checkbox-container d-flex"> 245 @Translate("Smartpage:Search.DropDown." + type.Key + "", "" + type.Key + "") 246 @if (type.Value == "ejerlejlighed") 247 { 248 <input type="checkbox" name="propertytype" value="@type.Value" class="js-input-check datavalue" data-disable-slider="#grundareal" data-disable-slider-ranges="#grundarealmin,#grundarealmax" data-val="@type.Key" onchange="submitFilter()" checked="@ischecked" /> 249 } 250 else if (type.Value == "helårsgrund") 251 { 252 <input type="checkbox" name="propertytype" value="@type.Value" class="js-input-check datavalue" data-disable-slider="#boligareal,#roomsslider" data-disable-slider-ranges="#boligarealmin,#boligarealmax,#roomsmin" data-val="@type.Key" onchange="submitFilter()" checked="@ischecked" /> 253 } 254 else if (type.Value == "fritidsgrund") 255 { 256 <input type="checkbox" name="propertytype" value="@type.Value" class="js-input-check datavalue" data-disable-slider="#boligareal,#roomsslider" data-disable-slider-ranges="#boligarealmin,#boligarealmax,#roomsmin" data-val="@type.Key" onchange="submitFilter()" checked="@ischecked" /> 257 } 258 else 259 { 260 <input type="checkbox" name="propertytype" value="@type.Value" class="js-input-check datavalue" data-val="@type.Key" onchange="submitFilter()" checked="@ischecked" /> 261 } 262 <span class="checkmark grey"></span> 263 </label> 264 </li> 265 } 266 } 267 268 void RenderBoligTypeErhverv(bool submitOnChange = false, bool frontpage = false) 269 { 270 Dictionary<string, string> erhverType = new Dictionary<string, string>(){ 271 { "Kontor", "OwnUseOffices" }, { "Lager + Produktion", "OwnUseStoresAndProductions" }, { "Detailhandel", "OwnUseRetailAndStores" }, 272 { "Grunde", "OwnUseParcel" }, { "Andre typer", "OwnUseOtherTypes" }, { "Hotel + Restaurant", "OwnUseHotelsAndRestaurants" } 273 }; 274 var submitonchange = ""; 275 if (submitOnChange) 276 { 277 submitonchange = "onchange='submitFilter()'"; 278 } 279 280 foreach (KeyValuePair<string, string> type in erhverType) 281 { 282 string ischecked = ""; 283 string[] olineParamsSplit = new string[0]; 284 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["olinecategory"])) 285 { 286 olineParamsSplit = Dynamicweb.Context.Current.Request.QueryString["olinecategory"].Split(','); 287 } 288 foreach (var olineParams in olineParamsSplit) 289 { 290 if (olineParams == type.Value) 291 { 292 ischecked = "checked"; 293 } 294 } 295 296 <li> 297 <label class="checkbox-container d-flex"> 298 @Translate("Smartpage:Search.DropDown." + type.Key + "", "" + type.Key + "") 299 <input type="checkbox" name="olinecategory" value="@type.Value" class="js-input-check datavalue" data-val="@type.Key" @submitonchange @ischecked /> 300 <span class="checkmark grey"></span> 301 </label> 302 </li> 303 } 304 305 306 bool ischeckedpropertycat = false; 307 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["propertycategory"])) 308 { 309 if (Dynamicweb.Context.Current.Request.QueryString["propertycategory"] == "Blandet Bolig/Erhverv") 310 { 311 ischeckedpropertycat = true; 312 } 313 } 314 <li> 315 <label class="checkbox-container"> 316 @Translate("Smartpage:Search.DropDown.Blandet Bolig/Erhverv", "Blandet Bolig/Erhverv") 317 <input type="checkbox" name="propertycategory" value="Blandet Bolig/Erhverv" class="js-input-check datavalue" data-val="Blandet Bolig/Erhverv" onchange="submitFilter()" checked="@ischeckedpropertycat" /> 318 <span class="checkmark grey"></span> 319 </label> 320 </li> 321 } 322 323 void RenderBoligTypeErhvervInvest(bool submitOnChange = false) 324 { 325 Dictionary<string, string> erhverType = new Dictionary<string, string>(){ 326 { "Kontor", "Kontor" }, { "Lager + Produktion", "InvestmentStoresAndProductions" }, { "Boligudlejning", "InvestmentHousingRental" }, 327 { "Detailhandel", "InvestmentRetailAndStores" }, { "Grunde", "InvestmentParcel" }, { "Hotel + Restaurant", "InvestmentHotelsAndRestaurants" }, { "Andre typer", "InvestmentOtherTypes" } 328 }; 329 330 foreach (KeyValuePair<string, string> type in erhverType) 331 { 332 bool ischecked = false; 333 string[] olineParamsSplit = new string[0]; 334 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["olinecategory"])) 335 { 336 olineParamsSplit = Dynamicweb.Context.Current.Request.QueryString["olinecategory"].Split(','); 337 } 338 foreach (var olineParams in olineParamsSplit) 339 { 340 if (olineParams == type.Value) 341 { 342 ischecked = true; 343 } 344 } 345 346 <li> 347 <label class="checkbox-container"> 348 @Translate("Smartpage:Search.DropDown." + type.Key + "", "" + type.Key + "") 349 <input type="checkbox" name="olinecategory" value="@type.Value" class="js-input-check datavalue" data-val="@type.Key" onchange="submitFilter()" checked="@ischecked" /> 350 <span class="checkmark grey"></span> 351 </label> 352 </li> 353 } 354 } 355 int GetWebsiteSettingsPageId(string pageSysName) 356 { 357 int sideId = 0; 358 359 var pw = Dynamicweb.Frontend.PageView.Current(); 360 361 string settingsItemId = "1"; 362 363 if ((pw.Area.Item.ContainsKey("Type") && pw.Area.Item["Type"].ToString() == "bone") || Dynamicweb.Context.Current.Request.QueryString["bone"] == "true") 364 { 365 settingsItemId = "2"; 366 } 367 368 var settingsItem = ItemManager.Storage.GetById("Delte_Egenskaber", settingsItemId); 369 370 if (settingsItem == null || !settingsItem.ContainsKey(pageSysName)) 371 { 372 return sideId; 373 } 374 375 string boligsideLink = settingsItem[pageSysName] as String; 376 string linkPrefix = "Default.aspx?ID="; 377 378 if (!String.IsNullOrEmpty(boligsideLink) && boligsideLink.ToLower().StartsWith(linkPrefix.ToLower())) 379 { 380 Int32.TryParse(boligsideLink.Substring(linkPrefix.Length), out sideId); 381 } 382 383 return sideId; 384 } 385 386 int GetPageSettingsPageId(string pageSysName) 387 { 388 int sideId = 0; 389 390 var pw = Dynamicweb.Frontend.PageView.Current(); 391 392 if (pw.Page == null || pw.Page.PropertyItem == null || !pw.Page.PropertyItem.ContainsKey(pageSysName)) 393 { 394 return sideId; 395 } 396 397 string boligsideLink = pw.Page.PropertyItem[pageSysName] as String; 398 string linkPrefix = "Default.aspx?ID="; 399 400 if (!String.IsNullOrEmpty(boligsideLink) && boligsideLink.ToLower().StartsWith(linkPrefix.ToLower())) 401 { 402 Int32.TryParse(boligsideLink.Substring(linkPrefix.Length), out sideId); 403 } 404 405 return sideId; 406 } 407 void RenderMobileSelectBox(string name, int max, int step, string className, string inputname) 408 { 409 <select class="form-control d-block d-lg-none mb-10 @className" onchange="submitFilter()" name="@inputname"> 410 <option selected="true" disabled="disabled">@Translate("Smartpage:Search.Placeholder." + name + "", "" + name + "")</option> 411 412 @for (var i = 0; i <= max; i += step) 413 { 414 var selected = string.Empty; 415 var current = string.Empty; 416 if (i == max) 417 { 418 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString[inputname]) && Dynamicweb.Context.Current.Request.QueryString[inputname] == Convert.ToString(i)) 419 { 420 <option value="@i" data-value='@Convert.ToInt32(i).ToString("N0")' selected="selected">@Convert.ToInt32(i).ToString("N0")+</option> 421 } 422 else 423 { 424 <option value="@i" data-value='@Convert.ToInt32(i).ToString("N0")'>@Convert.ToInt32(i).ToString("N0")+</option> 425 } 426 } 427 else 428 { 429 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString[inputname]) && Dynamicweb.Context.Current.Request.QueryString[inputname] == Convert.ToString(i)) 430 { 431 <option value="@i" data-value='@Convert.ToInt32(i).ToString("N0")' selected="selected">@Convert.ToInt32(i).ToString("N0")</option> 432 } 433 else 434 { 435 <option value="@i" data-value='@Convert.ToInt32(i).ToString("N0")'>@Convert.ToInt32(i).ToString("N0")</option> 436 } 437 } 438 } 439 </select> 440 } 441 442 void RenderTopFilter(string parameter) 443 { 444 if (parameter == "pricemin" || parameter == "pricemax") 445 { 446 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["pricemin"])) 447 { 448 if (parameter == "pricemin") 449 { 450 @("<div class='search-terms' id='priceFilter'>") 451 @("Pris ") @Dynamicweb.Context.Current.Request[parameter] 452 } 453 454 else 455 { 456 @(" - ") @Dynamicweb.Context.Current.Request[parameter] @(" kr.") <i class="fa fa-times ml-2 pointer" onclick="removeParams(this)" data-tag="pricemin,pricemax"></i> 457 @("</div>") 458 } 459 } 460 } 461 462 else if (parameter == "subsidymin" || parameter == "subsidymax") 463 { 464 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["subsidymin"])) 465 { 466 if (parameter == "subsidymin") 467 { 468 @("<div class='search-terms' id='subsidyFilter'>") 469 @("Årlig leje ") @Dynamicweb.Context.Current.Request[parameter] 470 } 471 472 else 473 { 474 @(" - ") @Dynamicweb.Context.Current.Request[parameter] @(" kr.") <i class="fa fa-times ml-2 pointer" onclick="removeParams(this)" data-tag="subsidymin,subsidymax"></i> 475 @("</div>") 476 } 477 } 478 } 479 else if (parameter == "etagearealmin" || parameter == "etagearealmax") 480 { 481 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["etagearealmin"])) 482 { 483 if (parameter == "etagearealmin") 484 { 485 @("<div class='search-terms' id='etagearealFilter'>") 486 @("Etageareal ") @Dynamicweb.Context.Current.Request[parameter] 487 } 488 489 else 490 { 491 @(" - ") @Dynamicweb.Context.Current.Request[parameter] @(" kvm.") <i class="fa fa-times ml-2 pointer" onclick="removeParams(this)" data-tag="etagearealmin,etagearealmax"></i> 492 @("</div>") 493 } 494 } 495 } 496 497 else if (parameter == "grundarealmin" || parameter == "grundarealmax") 498 { 499 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["grundarealmin"])) 500 { 501 if (parameter == "grundarealmin") 502 { 503 @("<div class='search-terms' id='grundarealFilter'>") 504 @("Grundareal ") @Dynamicweb.Context.Current.Request[parameter] 505 } 506 507 else 508 { 509 @(" - ") @Dynamicweb.Context.Current.Request[parameter] @(" kvm.") <i class="fa fa-times ml-2 pointer" onclick="removeParams(this)" data-tag="grundarealmin,grundarealmax"></i> 510 @("</div>") 511 } 512 } 513 } 514 515 else if (parameter == "subsidykvmmin" || parameter == "subsidykvmmax") 516 { 517 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["subsidykvmmin"])) 518 { 519 if (parameter == "subsidykvmmin") 520 { 521 @("<div class='search-terms' id='subsidykvmFilter'>") 522 @("Årlig leje kvm ") @Dynamicweb.Context.Current.Request[parameter] 523 } 524 525 else 526 { 527 @(" - ") @Dynamicweb.Context.Current.Request[parameter] @(" kr.") <i class="fa fa-times ml-2 pointer" onclick="removeParams(this)" data-tag="subsidykvmmin,subsidykvmmax"></i> 528 @("</div>") 529 } 530 } 531 } 532 533 else if (parameter == "olinecategory") 534 { 535 536 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["olinecategory"])) 537 { 538 Dictionary<string, string> erhverType = new Dictionary<string, string>(){ 539 {"OwnUseOffices", "Kontor" }, { "OwnUseStoresAndProductions","Lager + Produktion" }, { "OwnUseRetailAndStores","Detailhandel" }, 540 { "OwnUseParcel", "Grunde" }, { "OwnUseHotelsAndRestaurants", "Hotel + Restaurant" }, { "OwnUseOtherTypes", "Andre typer"}, 541 { "Kontor", "Kontor" }, { "InvestmentStoresAndProductions", "Lager + Produktion" }, { "InvestmentHousingRental", "Boligudlejning" }, 542 { "InvestmentRetailAndStores", "Detailhandel" }, { "InvestmentParcel", "Grunde" }, { "InvestmentHotelsAndRestaurants", "Hotel + Restaurant" }, { "InvestmentOtherTypes", "Andre typer" } 543 }; 544 545 546 foreach (var er in erhverType) 547 { 548 if (Dynamicweb.Context.Current.Request[parameter].Contains(er.Key)) 549 { 550 <div class="search-terms" id="@parameter"> 551 @er.Value <i class="fa fa-times ml-2 pointer" onclick="removeParams(this)" data-tag="@parameter" data-val="@er.Key"></i> 552 </div> 553 } 554 } 555 } 556 } 557 else if (parameter == "propertycategory") 558 { 559 560 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["propertycategory"])) 561 { 562 Dictionary<string, string> erhverType = new Dictionary<string, string>(){ 563 { "propertycategory", "Blandet Bolig/Erhverv" } 564 }; 565 566 foreach (var er in erhverType) 567 { 568 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request[parameter]) && Dynamicweb.Context.Current.Request[parameter] == er.Value) 569 { 570 <div class="search-terms" id="@parameter"> 571 @er.Value <i class="fa fa-times ml-2 pointer" onclick="removeParams(this)" data-tag="@parameter" data-val="@er.Key"></i> 572 </div> 573 } 574 } 575 } 576 } 577 else if (parameter == "search") 578 { 579 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["search"])) 580 { 581 <div class="search-terms" id="@parameter"> 582 @Dynamicweb.Context.Current.Request[parameter] <i class="fa fa-times ml-2 pointer" onclick="removeParams(this)" data-tag="@parameter"></i> 583 </div> 584 } 585 } 586 else 587 { 588 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request[parameter])) 589 { 590 Dictionary<string, string> 591 ubudsform = new Dictionary<string, string> 592 (){ 593 {"salg", "Salg" }, { "leje","Leje" } 594 }; 595 596 foreach (var er in ubudsform) 597 { 598 if (Dynamicweb.Context.Current.Request[parameter].Contains(er.Key)) 599 { 600 <div class="search-terms" id="@parameter"> 601 @er.Value <i class="fa fa-times ml-2 pointer" onclick="removeParams(this)" data-tag="@parameter" data-val="@er.Key"></i> 602 </div> 603 } 604 } 605 606 607 } 608 } 609 } 610 611 void RenderSelectValue(string dropdownname, string dropdownvalue, string queryString) 612 { 613 var selected = ""; 614 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString[queryString]) && Dynamicweb.Context.Current.Request.QueryString[queryString] == dropdownvalue) 615 { 616 selected = "selected"; 617 } 618 619 var current = string.Format("<option value='" + dropdownvalue + "'>" + dropdownname + "</option>", selected); 620 621 @current 622 } 623 624 void RenderSearchForHousing(int searchPageId, string querySearch, string querySearchNameAttr, string queryZipCodeFrom, string queryZipCodeTo, string template, Item SettingsItem, string cssClasses = "") 625 { 626 <div class="main-search-form frontpage @cssClasses"> 627 <div class="dropdown-overlay"></div> 628 <div class="row mb-3 align-items-center"> 629 <div class="col-xs-12 col-md-3 border-right"> 630 <h3>@Translate("Smartpage:Search.Søg bolig", "Søg bolig")</h3> 631 </div> 632 <div class="col-xs-12 col-md-9 home-count d-none d-md-block"> 633 <span class="search-count" id="searchCounter">0</span> <span>@Translate("Smartpage:Search.BoligerTilSalg", "Boliger til salg")</span> 634 </div> 635 </div> 636 637 <form id="main-search-frontpage" class="searchbar-wrapper" action="/Default.aspx" method="GET"> 638 <input type="hidden" name="ID" value='@searchPageId' id="searchPageId-frontpage" disabled="disabled" /> 639 <div class="row form-wrapper no-gutters"> 640 641 <div class="col-xs-12 col-md-5 col-searchbar"> 642 <div class="searchbar"> 643 <input type="text" name="@querySearchNameAttr" id="searchfield-frontpage" class="search-input" placeholder="Postnummer, by, vej eller sagsnummer" tabindex="1" value="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(querySearch)" /> 644 <input type="hidden" id="zipcodefrom-frontpage" name="zipcodefrom" value="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(queryZipCodeFrom)" /> 645 <input type="hidden" id="zipcodeto-frontpage" name="zipcodeto" value="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(queryZipCodeTo)" /> 646 </div> 647 </div> 648 <div class="col-xs-12 col-md-5"> 649 <div class="row no-gutters"> 650 <div class="col-xs-12 col-md-6 input-col"> 651 <div class="dropdown w-overlay"> 652 <button class="btn btn-dropdown dropdown-toggle reverse position-absolute-md" type="button" id="Boligtype-frontpage" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 653 @Translate("Smartpage:Search.Boligtype", "Boligtype") 654 </button> 655 <div class="dropdown-menu box-shadow bolig-dropdown-container" aria-labelledby="Boligtype"> 656 <ul class="bolig-dropdown list-unstyled"> 657 @{ 658 RenderBoligtypeCheckboxesDropdown(); 659 } 660 </ul> 661 <span class="border-fat"></span> 662 <button class="btn btn-primary js-close-dropdown">@Translate("Smartpage:Search.Anvend", "Anvend")</button> 663 </div> 664 665 </div> 666 667 </div> 668 <div class="col-xs-12 col-md-6 input-col"> 669 <div class="dropdown w-overlay"> 670 <button class="btn btn-dropdown dropdown-toggle reverse position-absolute-md" type="button" id="Pris-frontpage" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 671 @Translate("Smartpage:Search.Pris", "Pris") 672 </button> 673 <div class="dropdown-menu box-shadow dropdown-price" aria-labelledby="Pris"> 674 <input type="text" class="form-control mb-10 js-auto-thousand js-pricemin-frontpage-input" placeholder='@Translate("Smartpage:Search.Placeholder.MinPris","Min. pris")' /> 675 <select class="form-control js-pricemin-frontpage-select js-input-min-select mb-10"> 676 <option selected="true" disabled="disabled">@Translate("Smartpage:Search.Placeholder.MinPris", "Min. pris")</option> 677 @for (var i = 0; i <= 10000000; i += 100000) 678 { 679 if (i == 10000000) 680 { 681 <option value="@i" data-value='@Convert.ToInt32(i).ToString("N0")+'>@Convert.ToInt32(i).ToString("N0")+</option> 682 } 683 else 684 { 685 <option value="@i" data-value='@Convert.ToInt32(i).ToString("N0")'>@Convert.ToInt32(i).ToString("N0")</option> 686 } 687 } 688 </select> 689 <input type="hidden" id="pricemin-frontpage" name="pricemin" /> 690 691 <input type="text" class="form-control js-auto-thousand js-pricemax-frontpage-input" placeholder='@Translate("Smartpage:Search.Placeholder.MaxPris","Max. pris")' /> 692 <select class="form-control js-pricemax-frontpage-select js-input-max-select"> 693 <option selected="true" disabled="disabled">@Translate("Smartpage:Search.Placeholder.MaxPris", "Max. pris")</option> 694 @for (var i = 0; i <= 10000000; i += 100000) 695 { 696 if (i == 10000000) 697 { 698 <option value="@i" data-value='@Convert.ToInt32(i).ToString("N0")+'>@Convert.ToInt32(i).ToString("N0")+</option> 699 } 700 else 701 { 702 <option value="@i" data-value='@Convert.ToInt32(i).ToString("N0")'>@Convert.ToInt32(i).ToString("N0")</option> 703 } 704 } 705 </select> 706 <input type="hidden" id="pricemax-frontpage" name="pricemax" /> 707 <button class="btn btn-primary js-close-dropdown mt-3">@Translate("Smartpage:Search.Anvend", "Anvend")</button> 708 </div> 709 </div> 710 </div> 711 </div> 712 </div> 713 <div class="col-xs-12 col-md-2 d-none d-md-block"> 714 <button type="submit" class="btn btn-block btn-search"><i class="fa fa-search"></i> @Translate("Smartpage:Search.Søg", "Søg")</button> 715 </div> 716 </div> 717 718 <div class="row moresearch-btn no-gutters"> 719 <div class="col-sm-12"> 720 <div class="row align-items-center no-gutters"> 721 <div class="col-12 col-md-4"> 722 <button class="btn-blank js-search-collapse" type="button" data-toggle="collapse" data-target="#moreSearch" aria-expanded="false" aria-controls="moreSearch"> 723 <span class="moreSearch-text"><i class="fas fa-plus open-close"></i> <span class="not-open">@Translate("Smartpage:Search.Flere søgemuligheder", "Flere søgemuligheder")</span> <span class="open"><span class="js-filter-count">0</span> @Translate("Smartpage:Search.FiltreAnvendt", "filtre anvendt") </span></span> 724 </button> 725 </div> 726 <div class="col-6 col-md-2 mb-xs-4"> 727 <a class="js-reset reset-btn">@Translate("Smartpage:Search.NulstilValg", "Nulstil valg")</a> 728 </div> 729 </div> 730 731 <div class="collapse" id="moreSearch"> 732 <h4 class="mt-20"><b>@Translate("Smartpage:Search.Bolig", "Bolig")</b></h4> 733 <div class="row align-items-end mb-30"> 734 <div class="col-12 col-sm-6 col-lg-3 mb-3 mb-lg-0"> 735 <div class="filter-container row"> 736 <label class="d-block col-12">@Translate("Smartpage:Search.Boligareal", "Boligareal")</label> 737 <div class="col-6 pr-sm-0 pr-2"> 738 <input type="text" name="boligarealmin" id="boligarealmin-frontpage" class="form-control js-boligarealmin-frontpage-input js-count" placeholder='@Translate("Smartpage:Search.Placeholder.Minm2","Min. m2")' /> 739 <select class="form-control js-boligarealmin-frontpage-select js-count"> 740 <option selected="true" disabled="disabled">@Translate("Smartpage:Search.Placeholder.Minm2", "Min. m2")</option> 741 @for (var i = 0; i <= 300; i += 10) 742 { 743 if (i == 300) 744 { 745 <option value="@i">@i+</option> 746 } 747 else 748 { 749 <option value="@i">@i</option> 750 } 751 } 752 </select> 753 </div> 754 <div class="col-6 pl-sm-0 pl-2"> 755 <input type="text" name="boligarealmax" id="boligarealmax-frontpage" class="form-control js-boligarealmax-frontpage-input js-count" placeholder='@Translate("Smartpage:Search.Placeholder.Maxm2","Max. m2")' /> 756 <select class="form-control js-boligarealmax-frontpage-select js-count"> 757 <option selected="true" disabled="disabled">@Translate("Smartpage:Search.Placeholder.Maxm2", "Max. m2")</option> 758 @for (var i = 0; i <= 300; i += 10) 759 { 760 if (i == 300) 761 { 762 <option value="@i">@i+</option> 763 } 764 else 765 { 766 <option value="@i">@i</option> 767 } 768 } 769 </select> 770 </div> 771 </div> 772 </div> 773 <div class="col-12 col-sm-6 col-lg-3 mb-3 mb-lg-0"> 774 <div class="filter-container row"> 775 <label class="d-block col-12">@Translate("Smartpage:Search.Grundareal", "Grundareal")</label> 776 <div class="col-6 pr-sm-0 pr-2"> 777 <input type="text" name="grundarealmin" id="grundarealmin-frontpage" class="form-control js-grundarealmin-frontpage-input js-count" placeholder='@Translate("Smartpage:Search.Placeholder.Minm2","Min. m2")' /> 778 <select class="form-control js-grundarealmin-frontpage-select js-count"> 779 <option selected="true" disabled="disabled">@Translate("Smartpage:Search.Placeholder.Minm2", "Min. m2")</option> 780 @for (var i = 0; i <= 10000; i += 100) 781 { 782 if (i == 10000) 783 { 784 <option value="@i">@i+</option> 785 } 786 else 787 { 788 <option value="@i">@i</option> 789 } 790 } 791 </select> 792 </div> 793 <div class="col-6 pl-sm-0 pl-2"> 794 <input type="text" name="grundarealmax" id="grundarealmax-frontpage" class="form-control js-grundarealmax-frontpage-input js-count" placeholder='@Translate("Smartpage:Search.Placeholder.Maxm2","Max. m2")' /> 795 <select class="form-control js-grundarealmax-frontpage-select js-count"> 796 <option selected="true" disabled="disabled">@Translate("Smartpage:Search.Placeholder.Maxm2", "Max. m2")</option> 797 @for (var i = 0; i <= 10000; i += 100) 798 { 799 if (i == 10000) 800 { 801 <option value="@i">@i+</option> 802 } 803 else 804 { 805 <option value="@i">@i</option> 806 } 807 } 808 </select> 809 </div> 810 </div> 811 </div> 812 <div class="col-12 col-sm-6 col-lg-3 mb-3 mb-lg-0"> 813 <div class="filter-container row"> 814 <label class="d-block col-12">Antal rum</label> 815 816 <div class="col-6 pr-sm-0 pr-2"> 817 <select name="roomsmin" id="roomsmin-frontpage" class="form-control reverse js-count"> 818 <option selected="true" disabled="disabled">@Translate("Smartpage:Search.Placeholder.Min", "Min")</option> 819 <option value="1">1</option> 820 <option value="2">2</option> 821 <option value="3">3</option> 822 <option value="4">4</option> 823 <option value="5+">5+</option> 824 </select> 825 </div> 826 <div class="col-6 pl-sm-0 pl-2"> 827 <select name="roomsmax" id="roomsmax-frontpage" class="form-control reverse js-count"> 828 <option selected="true" disabled="disabled">@Translate("Smartpage:Search.Placeholder.Max", "Max")</option> 829 <option value="1">1</option> 830 <option value="2">2</option> 831 <option value="3">3</option> 832 <option value="4">4</option> 833 <option value="5+">@Translate("Smartpage:Rooms.5", "5")</option> 834 </select> 835 </div> 836 </div> 837 </div> 838 <div class="col-12 col-sm-6 col-lg-3 mb-3 mb-lg-0"> 839 <div class="row"> 840 <div class="col-12"> 841 <div class="filter-container"> 842 <label class="d-block">Energimærke</label> 843 <select name="energylabel" id="energylabel-frontpage" class="form-control reverse js-count"> 844 <option disabled selected="selected">@Translate("Smartpage:Search.Vælg", "Vælg")</option> 845 <option value="01">G</option> 846 <option value="02">F</option> 847 <option value="03">E</option> 848 <option value="04">D</option> 849 <option value="05">C</option> 850 <option value="06">B</option> 851 <option value="07">A</option> 852 <option value="08">A2010</option> 853 <option value="09">A2015</option> 854 <option value="10">A2020+</option> 855 </select> 856 </div> 857 </div> 858 </div> 859 </div> 860 <div class="col-12 col-sm-6 col-lg-3 mt-3"> 861 <h4 class=""><b>@Translate("Smartpage:Search.Økonomi", "Økonomi")</b></h4> 862 <div class="filter-container row"> 863 <label class="d-block col-12">@Translate("Smartpage:Search.Ejerudgift/boligydelse pr. måned", "Ejerudgift/boligydelse pr. måned")</label> 864 <div class="col-6 pr-sm-0 pr-2"> 865 <input type="text" name="subsidymin" id="subsidymin-frontpage" class="form-control js-subsidymin-frontpage-input js-count" placeholder='@Translate("Smartpage:Search.Placeholder.MinDKK","Min. DKK")' /> 866 <select class="form-control js-subsidymin-frontpage-select js-count"> 867 <option selected="true" disabled="disabled">@Translate("Smartpage:Search.Placeholder.MinDKK", "Min. DKK")</option> 868 @for (var i = 0; i <= 25000; i += 1250) 869 { 870 if (i == 25000) 871 { 872 <option>@Convert.ToInt32(i).ToString("N0")+</option> 873 } 874 else 875 { 876 <option>@Convert.ToInt32(i).ToString("N0")</option> 877 } 878 } 879 </select> 880 </div> 881 <div class="col-6 pl-sm-0 pl-2"> 882 <input type="text" name="subsidymax" id="subsidymax-frontpage" class="form-control js-subsidymax-frontpage-input js-count" placeholder='@Translate("Smartpage:Search.Placeholder.MaxDKK","Max. DKK")' /> 883 <select class="form-control js-subsidymax-frontpage-select js-count"> 884 <option selected="true" disabled="disabled">@Translate("Smartpage:Search.Placeholder.MaxDKK", "Max. DKK")</option> 885 @for (var i = 0; i <= 25000; i += 1250) 886 { 887 if (i == 25000) 888 { 889 <option value="@Convert.ToInt32(i)">@Convert.ToInt32(i).ToString("N0")+</option> 890 } 891 else 892 { 893 <option value="@Convert.ToInt32(i)">@Convert.ToInt32(i).ToString("N0")</option> 894 } 895 } 896 </select> 897 </div> 898 </div> 899 </div> 900 <div class="col-12 col-sm-6 col-lg-4 offset-lg-5 mt-3 mt-sm-0"> 901 <button type="submit" class="btn btn-block btn-search"><i class="fa fa-search"></i> @Translate("Smartpage:Search.AnvendFiltre", "Anvend filtre")</button> 902 </div> 903 </div> 904 </div> 905 </div> 906 </div> 907 908 <div class="row d-block d-md-none form-wrapper no-gutters"> 909 <div class="col-xs-12 col-md-2"> 910 <button type="submit" class="btn btn-block btn-search btn-mobile-search">@Translate("Smartpage:Search.SøgBolig", "Søg Bolig")<i class="fa fa-search cta-icon"></i></button> 911 </div> 912 </div> 913 </form> 914 <div class="front-page-actions d-md-none"> 915 <div> 916 <button class="btn btn-block btn-search btn-mobile-search js-search-mobile">@Translate("Smartpage:Search.SøgBolig", "Søg Bolig")<i class="fa fa-search cta-icon"></i></button> 917 </div> 918 <div> 919 @{ 920 string brokerSearchId = SettingsItem != null ? Dynamicweb.Core.Converter.ToString(SettingsItem["Maeglersogning"]).Replace("Default.aspx?Id=", "") : ""; 921 string ctaText = Translate("Smartpage.Frontpage.Mobile.FindBroker", "FIND EJENDOMSMÆGLER"); 922 <form method="GET" action="/Default.aspx"> 923 <input name="id" value="@brokerSearchId" type="hidden" /> 924 <div class="icon-wrapper-wclick"> 925 <i class="fas fa-search ta-submit-on-icon-click"></i> 926 <input class="box-cta-input ta-postnummer ta-submit-on-select ta-submit-on-enter" name="q" type="text" placeholder="@ctaText" onfocus="this.placeholder = ''" onblur="this.placeholder='@ctaText'" /> 927 </div> 928 </form> 929 } 930 </div> 931 <div> 932 <a href="javascript:panelSalgsvurdering('Hovedmenu')" class="btn btn-orange btn-block">@Translate("Smartpage:Frontpage.Mobile.GetFreeAppraisal", "BESTIL GRATIS VURDERING")<i class="cta-icon fa fa-angle-right"></i></a> 933 </div> 934 </div> 935 </div> 936 937 } 938 Custom.Integration.Brokers.Models.BrokerEmployee GetBrokerFromCurrentProduct() 939 { 940 string productId = Dynamicweb.Context.Current.Request["ProductId"]; 941 942 if (string.IsNullOrWhiteSpace(productId)) 943 { 944 return null; 945 } 946 947 var propertyProduct = Dynamicweb.Ecommerce.Services.Products.GetProductById(productId, string.Empty, true); 948 if (propertyProduct == null) 949 { 950 return null; 951 } 952 953 string employee = Dynamicweb.Core.Converter.ToString( 954 Dynamicweb.Ecommerce.Services.Products.GetProductFieldValue(propertyProduct, "xAktoererMaeglerKontaktEmail") 955 ); 956 string storeId = Dynamicweb.Core.Converter.ToString( 957 Dynamicweb.Ecommerce.Services.Products.GetProductFieldValue(propertyProduct, "xButikID") 958 ); 959 960 if (string.IsNullOrWhiteSpace(employee) || string.IsNullOrWhiteSpace(storeId)) 961 { 962 return null; 963 } 964 965 return Custom.Integration.Brokers.Search.GetEmployee(storeId, employee); 966 } 967 968 string GetAgentTitleFromCurrentProduct() 969 { 970 var propBroker = GetBrokerFromCurrentProduct(); 971 972 if (propBroker?.Broker == null) 973 { 974 return string.Empty; 975 } 976 977 if (!string.IsNullOrEmpty(propBroker.Broker.CompanyName)) 978 { 979 return propBroker.Broker.CompanyName; 980 } 981 982 return propBroker.Broker.Name ?? string.Empty; 983 } 984 985 string GetMasterBrokerUrlFromCurrentProduct() 986 { 987 var propBroker = GetBrokerFromCurrentProduct(); 988 989 var itemId = propBroker?.Broker?.ItemId; 990 var itemType = propBroker?.Broker?.ItemType; 991 992 if (string.IsNullOrWhiteSpace(itemId) || string.IsNullOrWhiteSpace(itemType)) 993 { 994 return string.Empty; 995 } 996 var brokerItem = Dynamicweb.Content.Items.ItemManager.Storage.GetById(itemType, itemId); 997 998 if (brokerItem == null) 999 { 1000 return string.Empty; 1001 } 1002 1003 var websiteId = Dynamicweb.Core.Converter.ToInt32(brokerItem["WebsiteId"]); 1004 var page = Dynamicweb.Content.Services.Pages.GetFirstPageForArea(websiteId); 1005 return Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?Id=" + page?.ID); 1006 } 1007 } 1008 1009 @{ 1010 1011 var settingsItem = ItemManager.Storage.GetById("Delte_Egenskaber", "1"); 1012 var settingsActivateGreenMobility = Dynamicweb.Frontend.PageView.Current().AreaSettings.GetBoolean("Activate_Green_Mobility"); 1013 1014 var iconPath = "/Files/Templates/Designs/rm/assets/images/svg/"; 1015 var imagePath = "/Files/Images/RM billeder/"; 1016 string fallbackImage = "/Files/Templates/Designs/rm/assets/images/na-real.png"; 1017 1018 string productId = GetString("Ecom:Product.ID"); 1019 var product = Dynamicweb.Ecommerce.Services.Products.GetProductById(productId, string.Empty, true); 1020 string propCategory = GetString("Ecom:Product:Field.xEjendomEjendomskategori"); 1021 string propType = GetString("Ecom:Product:Field.xEjendomEjendomstype"); 1022 string propTypeCategory = ""; 1023 if (!string.IsNullOrEmpty(propType)) 1024 { 1025 propTypeCategory = RealMaeglerne.Dynamicweb.PropertyClassification.GetCategoryByTypeName(propType).ToLower(); 1026 } 1027 1028 string propTypeDisplay = !string.IsNullOrWhiteSpace(propCategory) ? propCategory : propTypeCategory; 1029 bool isRental = (propCategory != null && GetString("Ecom:Product:Field.xUdbudsForm").ToLower() == "leje" && !propCategory.Contains("erhverv")) || Converter.ToBoolean(Dynamicweb.Context.Current.Request["Udlejning"]); 1030 1031 string Employee = GetString("Ecom:Product:Field.xAktoererMaeglerKontaktEmail"); 1032 Custom.Integration.Brokers.Models.BrokerEmployee propBroker = Custom.Integration.Brokers.Search.GetEmployee(GetString("Ecom:Product:Field.xButikID"), Employee); 1033 var employeeItem = Dynamicweb.Content.Items.ItemManager.Storage.GetById(propBroker?.Employee?.ItemType, propBroker?.Employee?.ItemId); 1034 var brokerItem = Dynamicweb.Content.Items.ItemManager.Storage.GetById(propBroker?.Broker?.ItemType, propBroker?.Broker?.ItemId); 1035 1036 var popularityMetrics = Custom.Tracking.Providers.TrackingProvider.GetPopularityMetrics(productId); 1037 1038 bool isValidForGreenMobility = false; 1039 1040 if (settingsActivateGreenMobility) 1041 { 1042 var settingsGreenMobilityPostalCodes = Dynamicweb.Frontend.PageView.Current().AreaSettings.GetItems("Green_Mobility_Postnumre"); 1043 int postalCode = GetInteger("Ecom:Product:Field.xEjendomAdressePostnummer"); 1044 1045 isValidForGreenMobility = settingsGreenMobilityPostalCodes.Any(range => 1046 { 1047 int start = Convert.ToInt32(range.GetRawValue("Start")); 1048 int end = Convert.ToInt32(range.GetValue("Slut")); 1049 1050 return end > 0 ? postalCode >= start && postalCode <= end : postalCode == start; 1051 }); 1052 } 1053 1054 Dictionary<string, string> edhFiles = RealMaeglerne.Library.BoligManager.GetEDHFilesCompact(product); 1055 1056 var origin = $"{Context.Current.Session["DP"]}Boligvisning (sektion: galleri)"; 1057 1058 } 1059 1060 <script> 1061 // Set RMAPI (defined in master) values relevant for this page 1062 if(RMAPI) { 1063 RMAPI.ButikId = "@GetString("Ecom:Product:Field.xButikID")"; 1064 RMAPI.Boligvisning = true; 1065 RMAPI.SagsNr = "@productId"; 1066 RMAPI.MarkerColor = "#F06F18"; 1067 } 1068 </script> 1069 1070 <div propertypage-top role="main" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyMain", "Ejendomsvisning hovedindhold"))"> 1071 @*SECTION: Breadcrumbs*@ 1072 1073 <nav class="container breadcrumbs" role="navigation" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.Breadcrumb", "Brødkrumme navigation"))"> 1074 <div class="divider-blue d-none d-md-block" aria-hidden="true"></div> 1075 <div class="row py-md-3 py-2"> 1076 <div class="col-6"> 1077 @{ 1078 int searchPageId = GetPageSettingsPageId("Boligside"); 1079 if (searchPageId == 0) 1080 { 1081 searchPageId = GetWebsiteSettingsPageId("Boligside"); 1082 } 1083 } 1084 <a href="/Default.aspx?ID=@searchPageId" class="breadcrumb-item" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.BackToSearch", "Tilbage til boligsøgning"))"> 1085 @Translate("Custom:Propertypage.Breadcrumbs.Search", "Søg bolig") 1086 </a> 1087 @if (propBroker != null) 1088 { 1089 <a href="/Default.aspx?ID=@searchPageId&search=@propBroker.Broker.City" class="breadcrumb-item" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.SearchInCity", "Søg boliger i")) @propBroker.Broker.City"> 1090 @propBroker.Broker.City 1091 </a> 1092 } 1093 </div> 1094 <div class="col-6 text-right"> 1095 <a class="breadcrumb-link cursor-pointer" data-share-text="@Translate("Custom:Propertypage.Sharelink.ShareText", "Se denne bolig")" data-alert-text="@Translate("Custom:Propertypage.Sharelink.AlertText", "Link kopieret til udklipsholder!")" onclick="shareProperty(event, this)" role="button" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ShareProperty", "Del denne bolig"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') shareProperty(event, this)"> 1096 <img class="d-md-none d-inline mr-1" src="@(iconPath + "icon-share.svg")" alt="" aria-hidden="true" /> 1097 <img class="d-none d-md-inline mr-1" src="@(iconPath + "icon-share-desktop.svg")" alt="" aria-hidden="true" /> 1098 @Translate("Custom:Propertypage.Breadcrumbs.Share", "Del bolig") 1099 </a> 1100 </div> 1101 </div> 1102 <div class="divider-blue d-none d-md-block" aria-hidden="true"></div> 1103 </nav> 1104 1105 @*SECTION: Images*@ 1106 @{ 1107 var boligManager = new RealMaeglerne.Library.BoligManager(Pageview); 1108 RealMaeglerne.Library.Models.Bolig bolig = boligManager.CreateBolig(product, true); 1109 1110 1111 bool useEsoftImages = settingsItem != null ? Converter.ToBoolean(settingsItem["SpUseEsoftImages"]) : false; 1112 bool hasVideos = bolig.Videos != null && bolig.Videos.Any(); 1113 bool hasSlideShow = bolig.EsoftAssets != null && bolig.EsoftAssets.HasSlideShows; 1114 bool hasBlueprints = bolig.Plantegninger != null && bolig.Plantegninger.Any(); 1115 var panoramas = bolig.EsoftAssets?.PanoramasHtml5? 1116 .Where(x => Converter.ToInt32(x.ListOrder) > 0 && x.EmbedAssets?.Count > 0) 1117 .ToList() ?? new List<Custom.Esoft.Models.EsoftAssetContainer>(); 1118 bool hasPanorama = panoramas.Any(); 1119 1120 string mapLng = GetString("Ecom:Product:Field.xEjendomGeoinfoWGS84Y.Value.Raw").Replace(",", "."); 1121 string mapLat = GetString("Ecom:Product:Field.xEjendomGeoinfoWGS84X.Value.Raw").Replace(",", "."); 1122 bool hasMapCoordinates = !string.IsNullOrEmpty(mapLng) && !string.IsNullOrEmpty(mapLat); 1123 1124 1125 List<Bolig.CaseAsset> images = bolig.ImagesOfProperty != null ? bolig.ImagesOfProperty : new List<Bolig.CaseAsset>(); 1126 1127 @*Make sure we have 3 images to display on frontpage*@ 1128 while(images.Count < 3) 1129 { 1130 images.Add(new Bolig.CaseAsset() { ImageXs = fallbackImage, ImageSm = fallbackImage, ImageMd = fallbackImage, ImageLg = fallbackImage, ImageXl = fallbackImage }); 1131 } 1132 1133 var primaryImage = images.First(); 1134 1135 images = images.Skip(1).ToList(); 1136 1137 1138 string primaryVideo = string.Empty; 1139 1140 if (hasVideos) 1141 { 1142 primaryVideo = bolig.Videos.First(); 1143 } 1144 } 1145 1146 <section class="container image-section pt-3 pb-3" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ImageGallery", "Billedegalleri"))"> 1147 1148 <div class="image-wrapper position-relative h-100 w-100"> 1149 <div class="main-image position-relative"> 1150 @if (!string.IsNullOrEmpty(primaryVideo)) 1151 { 1152 <video width="100%" height="auto" autoplay="autoplay" muted loop preload="auto" poster="@primaryImage.ImageMd" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyVideo", "Ejendomsvideo for")) @GetString("Ecom:Product:Field.xEjendomAdresseAdresseLinie")"> 1153 <source src="@primaryVideo" type="video/mp4" /> 1154 @Translate("Custom:Accessibility.VideoNotSupported", "Din browser understøtter ikke HTML5 video.") 1155 </video> 1156 } 1157 else 1158 { 1159 <img class="img-fluid w-100" src="@primaryImage.ImageLg" alt="@Translate("Custom.Propertypage.PrimaryImage.AltTag", "Image of realestate")" /> 1160 } 1161 </div> 1162 1163 @{ 1164 var imageCount = 0; 1165 } 1166 1167 @foreach (var image in images.Take(2)) 1168 { 1169 <div class="secondary-image position-relative" data-toggle="modal" data-target="#assets-modal" role="button" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.OpenImageGallery", "Åbn billedegalleri"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') { $(this).click(); }"> 1170 <img class="img-fluid w-100 h-100" src="@image.ImageLg" alt="@Translate("Custom:Accessibility.PropertyImage", "Ejendomsbillede") @(imageCount + 2) @Translate("Custom:Accessibility.Of", "af") @(images.Count() + 1)" /> 1171 @if (imageCount == 1) 1172 { 1173 <button type="button" class="d-block d-lg-none btn btn-modal position-absolute" data-toggle="modal" data-target="#assets-modal" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewAllImages", "Vis alle billeder"))"> 1174 @string.Format(Translate("Custom:Propertypage.AssetsModal.Button.Mobile.Open", "+ {0} billeder"), images.Count()) 1175 </button> 1176 1177 <button type="button" class="d-none d-md-block btn btn-modal position-absolute" data-toggle="modal" data-target="#assets-modal" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewAllImages", "Vis alle billeder"))"> 1178 <img src="@(iconPath + "icon-images.svg")" alt="" aria-hidden="true" /> 1179 @string.Format(Translate("Custom:Propertypage.AssetsModal.Button.Desktop.Open", "Se alle {0} billeder"), images.Count()) 1180 </button> 1181 } 1182 @if (bolig.AabentHus && imageCount == 0) 1183 { 1184 var upcomingOpenHouses = boligManager.KommendeAabnehuse(bolig); 1185 1186 <div class="open-house position-absolute d-none d-md-flex" onclick="stopPropagation(event)" role="region" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.OpenHouseInfo", "Åbent hus information"))"> 1187 <div class="section-header semi-bold mb-0"> 1188 @Translate("Custom.Propertypage.OpenHouseSection.Header", "Åbent hus") 1189 </div> 1190 <div class="open-house-dates d-flex align-items-center"> 1191 @if (upcomingOpenHouses.Count() > 1) 1192 { 1193 <select id="openhouse-selector-desktop" class="open-house-selector js-aabenthus-liste-val" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.SelectOpenHouse", "Vælg åbent hus tidspunkt"))"> 1194 @foreach (var openHouse in upcomingOpenHouses) 1195 { 1196 var json = System.Text.Json.JsonSerializer.Serialize(openHouse); 1197 1198 <option class="open-house-selector__option" data-aabent-hus="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(json)"> 1199 @openHouse.Dato.ToString("d. MMM", Pageview.Area.CultureInfo) kl. @openHouse.FraKlokken.Substring(0, 5) 1200 </option> 1201 } 1202 </select> 1203 } 1204 else 1205 { 1206 var primaryOpenHouse = upcomingOpenHouses.First(); 1207 var json = System.Text.Json.JsonSerializer.Serialize(primaryOpenHouse); 1208 1209 <div class="open-house-text"> 1210 <span class="js-aabenthus-date-val">@primaryOpenHouse.Dato.ToString("d. MMM", Pageview.Area.CultureInfo)</span> 1211 1212 @if (!string.IsNullOrEmpty(primaryOpenHouse.TidspunktFormateret)) 1213 { 1214 <div class="d-inline-block js-aabenthus-time-val js-primary-open-house" data-aabent-hus="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(json)"> 1215 @Translate("Custom.Propertypage.OpenHouseSection.Kl", "kl.") @primaryOpenHouse.FraKlokken.Substring(0, 5)@(" - ")@primaryOpenHouse.TilKlokken.Substring(0, 5) 1216 </div> 1217 } 1218 </div> 1219 } 1220 @if (upcomingOpenHouses.Any(oh => oh.Tilmelding)) 1221 { 1222 <a class="btn btn-orange" href="javascript:panelAabenthus('@origin');"> 1223 @Translate("Custom.Propertypage.OpenHouseSection.SignupButton.Label", "Tilmeld") 1224 </a> 1225 } 1226 </div> 1227 </div> 1228 } 1229 @if (popularityMetrics.Any() && imageCount == 0) 1230 { 1231 <div class="popular position-absolute d-none d-md-flex" role="region" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PopularityMetrics", "Popularitetsmålinger"))"> 1232 <div class="popular-header"> 1233 @Translate("Custom.Propertypage.PopularSection.Header", "Populær") 1234 </div> 1235 <div class="popular-metrics-wrapper js-popular-metrics-wrapper"> 1236 @foreach (var metric in popularityMetrics) 1237 { 1238 1239 <div class="popular-metric d-inline-flex align-items-center"> 1240 <div class="bold">@metric.Value</div> 1241 <div class="popular-metric-label">@Translate($"Custom.Propertypage.PopularSection.{metric.Key}.Label", "har interageret med denne bolig")</div> 1242 </div> 1243 } 1244 </div> 1245 </div> 1246 } 1247 </div> 1248 imageCount++; 1249 } 1250 1251 </div> 1252 <div class="image-wrapper__subtext d-md-block d-none"> 1253 @if (propBroker != null) 1254 { 1255 <span>@Translate("Custom:Propertypage.Images.Subtext.Label", "Har du nogle spørgsmål?")</span> 1256 <span class="font-weight-normal">@Translate("Custom:Propertypage.Images.Subtext.Text", "Vi er klar til at hjælpe på telefon")</span> 1257 <span class="font-weight-normal">@(!string.IsNullOrEmpty(propBroker.Employee?.PhoneMobile) ? propBroker.Employee.PhoneMobile : propBroker.Broker.Telephone)</span> 1258 } 1259 1260 </div> 1261 1262 1263 <div class="modal fade images-modal" id="images-modal" tabindex="-1" aria-labelledby="images-modal-label" aria-hidden="true" aria-modal="true"> 1264 <div class="modal-dialog"> 1265 <div class="modal-content"> 1266 <div class="position-absolute d-flex flex-column images-navigation"> 1267 <button type="button" class="close-round mb-5" data-dismiss="modal" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.CloseModal", "Luk vindue"))"> 1268 <img src="@(iconPath + "icon-minimize.svg")" alt="" aria-hidden="true" /> 1269 </button> 1270 <div class="d-flex flex-column"> 1271 <button id="image-prev-images-modal" type="button" class="close-round mb-2" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PreviousImage", "Forrige billede"))"> 1272 <img src="@(iconPath + "icon-arrow-narrow-up.svg")" alt="" aria-hidden="true" /> 1273 </button> 1274 <button id="image-next-images-modal" type="button" class="close-round" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.NextImage", "Næste billede"))"> 1275 <img src="@(iconPath + "icon-arrow-narrow-down.svg")" alt="" aria-hidden="true" /> 1276 </button> 1277 </div> 1278 </div> 1279 <div class="image-gallery large-images"> 1280 @{ 1281 int largeImageCounter = 0; 1282 } 1283 1284 @foreach (var image in images) 1285 { 1286 var largeImageId = "image_large_" + largeImageCounter; 1287 <img id="@largeImageId" class="img-fluid" src="@fallbackImage" data-src="@image.ImageXl" /> 1288 largeImageCounter++; 1289 } 1290 </div> 1291 </div> 1292 </div> 1293 </div> 1294 1295 <div class="modal fade" id="assets-modal" tabindex="-1" aria-labelledby="assets-modal-label" aria-hidden="true" aria-modal="true" role="dialog"> 1296 <div class="modal-dialog"> 1297 <div class="modal-content h-100 mh-100"> 1298 1299 @if (hasVideos || hasSlideShow) 1300 { 1301 <input type="radio" id="video" name="category" class="category-radio" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.SelectVideoCategory", "Vælg video kategori"))"> 1302 } 1303 1304 <input type="radio" id="images" name="category" class="category-radio" checked aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.SelectImagesCategory", "Vælg billeder kategori"))"> 1305 1306 @if (hasBlueprints) 1307 { 1308 <input type="radio" id="blueprint" name="category" class="category-radio" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.SelectBlueprintCategory", "Vælg plantegning kategori"))"> 1309 } 1310 1311 @if (hasMapCoordinates) 1312 { 1313 <input type="radio" id="mapradio" name="category" class="category-radio" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.SelectMapCategory", "Vælg kort kategori"))"> 1314 } 1315 1316 @if (hasPanorama) 1317 { 1318 <input type="radio" id="view360" name="category" class="category-radio" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.Select360Category", "Vælg 360 graders visning kategori"))"> 1319 } 1320 1321 <div class="modal-header"> 1322 1323 <div class="nav-wrapper"> 1324 <div class="category-scroll"> 1325 <div class="category-buttons"> 1326 @if (hasVideos || hasSlideShow) 1327 { 1328 <label for="video" class="category-btn" tabindex="0" role="button" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ShowVideoContent", "Vis video indhold"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') { document.getElementById('video').click(); }"> 1329 <span class="category-icon icon-video" aria-hidden="true"></span> 1330 <span>@Translate("Custom.Propertypage.AssetsModal.Category.Video", "Video")</span> 1331 </label> 1332 } 1333 1334 <label for="images" class="category-btn" tabindex="0" role="button" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ShowImagesContent", "Vis billeder"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') { document.getElementById('images').click(); }"> 1335 <span class="category-icon icon-image" aria-hidden="true"></span> 1336 <span>@Translate("Custom.Propertypage.AssetsModal.Category.Images", "Billeder")</span> 1337 </label> 1338 1339 @if (hasBlueprints) 1340 { 1341 <label for="blueprint" class="category-btn" tabindex="0" role="button" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ShowBlueprintContent", "Vis plantegning"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') { document.getElementById('blueprint').click(); }"> 1342 <span class="category-icon icon-plan" aria-hidden="true"></span> 1343 <span>@Translate("Custom.Propertypage.AssetsModal.Category.Plan", "Plantegning")</span> 1344 </label> 1345 } 1346 1347 @if (hasMapCoordinates) 1348 { 1349 <label for="mapradio" class="js-init-map category-btn" tabindex="0" role="button" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ShowMapContent", "Vis kort"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') { document.getElementById('mapradio').click(); }"> 1350 <span class="category-icon icon-map" aria-hidden="true"></span> 1351 <span>@Translate("Custom.Propertypage.AssetsModal.Category.Map", "Vis på kort")</span> 1352 </label> 1353 } 1354 1355 @if (hasPanorama) 1356 { 1357 <label for="view360" class="category-btn" tabindex="0" role="button" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.Show360Content", "Vis 360 graders visning"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') { document.getElementById('view360').click(); }"> 1358 <span class="category-icon icon-360" aria-hidden="true"></span> 1359 <span>@Translate("Custom.Propertypage.AssetsModal.Category.Panorama", "360°")</span> 1360 </label> 1361 } 1362 </div> 1363 <div class="d-none d-md-block"> 1364 <a class="btn btn-orange" href="javascript:panelFremvisning('@origin');" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.BookViewing", "Bestil fremvisning"))">@Translate("Custom.Propertypage.AssetsModal.Header.Showing.ButtonLabel", "Bestil fremvisning")</a> 1365 </div> 1366 </div> 1367 </div> 1368 <button type="button" class="close" data-dismiss="modal" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.CloseAssetModal", "Luk medie vindue"))"> 1369 @*Mobile*@ 1370 <div class="d-md-none d-block" aria-hidden="true"> 1371 <img src="@(iconPath + "icon-modal-close.svg")" alt="" aria-hidden="true" /> 1372 </div> 1373 <div class="d-md-none d-block pb-2" aria-hidden="true">@Translate("Custom:Propertypage.AssetsModal.Button.Close.Mobile", "Luk")</div> 1374 @*Desktop*@ 1375 <div class="d-none d-md-block pb-2" aria-hidden="true">@Translate("Custom:Propertypage.AssetsModal.Button.Close.Desktop", "Luk vindue")</div> 1376 <div class="d-none d-md-block" aria-hidden="true"> 1377 <img src="@(iconPath + "icon-modal-close-small.svg")" alt="" aria-hidden="true" /> 1378 </div> 1379 </button> 1380 </div> 1381 <div class="modal-body"> 1382 <!-- Video Content --> 1383 @if (hasVideos || hasSlideShow) 1384 { 1385 <div class="content-section video-content"> 1386 <div class="image-gallery"> 1387 @if (hasVideos) 1388 { 1389 @foreach (var video in bolig.Videos) 1390 { 1391 <video width="100%" controls="controls" muted loop preload="auto"> 1392 <source src="@video" type="video/mp4" /> 1393 Your browser does not support HTML5 video. 1394 </video> 1395 } 1396 } 1397 @if (hasSlideShow) 1398 { 1399 @foreach (var slide in bolig.EsoftAssets.ActiveSlideShows) 1400 { 1401 <div class="slide-show">@slide.EmbedAssets[0].EmbedCode.Replace("http://", "https://")</div> 1402 } 1403 } 1404 </div> 1405 </div> 1406 } 1407 1408 <!-- Billeder (Images) Content --> 1409 <div class="content-section images-content"> 1410 <div class="image-gallery"> 1411 @{ 1412 int imageCounter = 0; 1413 } 1414 1415 @foreach (var image in images) 1416 { 1417 var imageId = "image_" + imageCounter; 1418 <img id="@imageId" class="img-fluid" src="@fallbackImage" data-src="@image.ImageLg" /> 1419 imageCounter++; 1420 } 1421 </div> 1422 <div class="d-md-flex d-none flex-column"> 1423 <button type="button" class="btn btn-modal btn-modal__clean" data-toggle="modal" data-target="#images-modal" onclick="initImageNavigation('.images-modal', { imageSelector: '.large-images img', buttonIdPostFix: '-images-modal' })"> 1424 <div class="pb-2" aria-hidden="true">@Translate("Custom:Propertypage.AssetsModal.Button.LargeImages", "Vis som store billeder")</div> 1425 <div aria-hidden="true"> 1426 <img src="@(iconPath + "icon-expand.svg")" alt="" aria-hidden="true" /> 1427 </div> 1428 </button> 1429 <div class="image-thumbnails"> 1430 @{ 1431 int imageThumbnailCounter = 0; 1432 } 1433 1434 @foreach (var image in images) 1435 { 1436 var imageId = "image_" + imageThumbnailCounter; 1437 <label class="thumbnail-radio" onclick="scrollToElementById('@imageId');"> 1438 <input type="radio" id="@(imageId)_thumbnail" name="thumbnailradio" class="d-none" checked="@(imageThumbnailCounter == 0)" /> 1439 <img class="img-fluid" src="@fallbackImage" data-src="@image.ImageSm" /> 1440 </label> 1441 1442 imageThumbnailCounter++; 1443 } 1444 </div> 1445 </div> 1446 </div> 1447 1448 <!-- Plantegning (Floor Plan) Content --> 1449 @if (hasBlueprints) 1450 { 1451 <div class="content-section blueprint-content"> 1452 <div class="image-gallery"> 1453 @foreach (var plan in bolig.Plantegninger) 1454 { 1455 <img class="img-fluid" src="@fallbackImage" data-src="@plan.ImageXl" /> 1456 } 1457 </div> 1458 </div> 1459 } 1460 1461 <!-- Kort (Map) Content --> 1462 @if (hasMapCoordinates) 1463 { 1464 var mapFeedPageId = Converter.ToString(GetPageIdByNavigationTag("MapFeed")); 1465 string mapMarkerUrl = "Files/Templates/Designs/rm/assets/images/map-pin-real-maeglerne.svg"; 1466 int mapMarkerHeight = 32; 1467 int mapMarkerWidth = 32; 1468 1469 <div class="content-section map-content"> 1470 <div class="image-gallery"> 1471 <div class="map js-map" data-map-feed="@mapFeedPageId"> 1472 <div class="renderMap" id="map"></div> 1473 </div> 1474 </div> 1475 </div> 1476 1477 <input type="hidden" class="js-hasmapcoordinates" value="true" /> 1478 <input type="hidden" class="js-mapLng" value="@mapLng" /> 1479 <input type="hidden" class="js-mapLat" value="@mapLat" /> 1480 <input type="hidden" class="js-mapMarkerWidth" value="@mapMarkerWidth" /> 1481 <input type="hidden" class="js-mapMarkerHeight" value="@mapMarkerHeight" /> 1482 <input type="hidden" class="js-mapMarkerUrl" value="@mapMarkerUrl" /> 1483 1484 <link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.4/dist/leaflet.css" integrity="sha512-puBpdR0798OZvTTbP4A8Ix/l+A4dHDD0DGqYW6RQ+9jxkRFclaxxQb/SJAWZfWAkuyeQUytO7+7N4QKrDh+drA==" crossorigin="" /> 1485 <script src="https://unpkg.com/leaflet@1.3.4/dist/leaflet.js" integrity="sha512-nMMmRyTVoLYqjP9hrbed9S+FzjZHW5gY1TWCHA5ckwXZBadntCNs8kEqAWdrb9O7rxbCaA4lKTIWjDXZxflOcA==" crossorigin=""> 1486 </script> 1487 1488 } 1489 1490 <!-- 360 View Content --> 1491 @if (hasPanorama) 1492 { 1493 <div class="content-section view360-content"> 1494 <div class="image-gallery"> 1495 @{ 1496 string largeThumbnail = string.Empty; 1497 1498 foreach (var thumbnail in panoramas.First().Assets) 1499 { 1500 if (thumbnail.Width == "1920") 1501 { 1502 largeThumbnail = thumbnail.SecureUrl; 1503 } 1504 } 1505 <div class="panorama"> 1506 <div class="renderMap position-relative"> 1507 <img class="panorama-thumbnail" src="@largeThumbnail" /> 1508 <div class="js-clickme clickme"> 1509 <img src="@(iconPath + "icon-360.svg")" /> 1510 <span>@Translate("Custom.Propertypage.AssetsModal.ShowPanorama", "Vis 360°")</span> 1511 </div> 1512 <span class="js-panorama-encoded" style="display:none">@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlEncode(panoramas.First().EmbedAssets[0].EmbedCode.Replace("http://", "https://"))</span> 1513 </div> 1514 </div> 1515 } 1516 </div> 1517 </div> 1518 } 1519 </div> 1520 </div> 1521 </div> 1522 </div> 1523 </section> 1524 </div> 1525 1526 <div propertypage-anchor> 1527 @*SECTION: Subpage Navigation*@ 1528 @{ 1529 bool homePresentationOn = Converter.ToBoolean(GetString("Ecom:Product:Field.SpHomePresentationOn")); 1530 bool inspiireON = Converter.ToBoolean(GetString("Ecom:Product:Field.SPInspiireON")); 1531 } 1532 <section class="container subpage-navigation pb-0" role="navigation" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyNavigation", "Ejendomsnavigation"))"> 1533 <div class="subpage-links"> 1534 @if (hasVideos || hasSlideShow) 1535 { 1536 <label for="video" role="button" class="subpage-link cursor-pointer d-none d-md-flex order-md-0 order-8" data-toggle="modal" data-target="#assets-modal" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewVideo", "Se video"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') { $(this).click(); }"> 1537 <img src="@(iconPath + "icon-video.svg")" alt="" aria-hidden="true" /> 1538 <span>@Translate("Custom.Propertypage.SubpageLink.Video", "Video")</span> 1539 </label> 1540 } 1541 1542 @if (images.Any()) 1543 { 1544 <label for="images" role="button" class="subpage-link cursor-pointer d-none d-md-flex order-md-1 order-9" data-toggle="modal" data-target="#assets-modal" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewImages", "Se billeder"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') { $(this).click(); }"> 1545 <img src="@(iconPath + "icon-images.svg")" alt="" aria-hidden="true" /> 1546 <span>@Translate("Custom.Propertypage.SubpageLink.Images", "Billeder")</span> 1547 </label> 1548 } 1549 1550 <a class="subpage-link d-flex d-md-none order-2 order-md-2" onclick="scrollToElementById('information-section')" role="button" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewPropertyFacts", "Se boligfakta"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') scrollToElementById('information-section')"> 1551 <img src="@(iconPath + "icon-house.svg")" alt="" aria-hidden="true" /> 1552 <span>@Translate("Custom.Propertypage.SubpageLink.Information", "Boligfakta")</span> 1553 </a> 1554 1555 @if (hasBlueprints) 1556 { 1557 <label for="blueprint" role="button" class="subpage-link cursor-pointer order-md-3 order-0" data-toggle="modal" data-target="#assets-modal" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewBlueprint", "Se plantegning"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') { $(this).click(); }"> 1558 <img src="@(iconPath + "icon-blueprint.svg")" alt="" aria-hidden="true" /> 1559 <span>@Translate("Custom.Propertypage.SubpageLink.Blueprint", "Plantegning")</span> 1560 </label> 1561 } 1562 1563 @if (hasMapCoordinates) 1564 { 1565 <label for="mapradio" role="button" class="subpage-link cursor-pointer js-init-map order-1 order-md-4" data-toggle="modal" data-target="#assets-modal" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewMap", "Se kort"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') { $(this).click(); }"> 1566 <img src="@(iconPath + "icon-map.svg")" alt="" aria-hidden="true" /> 1567 <span>@Translate("Custom.Propertypage.SubpageLink.Map", "Kort")</span> 1568 </label> 1569 } 1570 1571 @if (hasPanorama) 1572 { 1573 <label for="view360" role="button" class="subpage-link cursor-pointer order-3 order-md-5" data-toggle="modal" data-target="#assets-modal" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.View360", "Se 360 graders visning"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') { $(this).click(); }"> 1574 <img src="@(iconPath + "icon-360.svg")" alt="" aria-hidden="true" /> 1575 <span>@Translate("Custom.Propertypage.SubpageLink.360view", "360°")</span> 1576 </label> 1577 } 1578 1579 @if (homePresentationOn) 1580 { 1581 string homePresentationLink = GetString("Ecom:Product:Field.SpHomePresentationLink"); 1582 1583 @if (!string.IsNullOrEmpty(homePresentationLink)) 1584 { 1585 <a class="subpage-link order-4 order-md-6" href="@homePresentationLink" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewPresentation", "Se boligpræsentation"))"> 1586 <img src="@(iconPath + "icon-presentation.svg")" alt="" aria-hidden="true" /> 1587 <span>@Translate("Custom.Propertypage.SubpageLink.Presentation", "Boligpræsentation")</span> 1588 </a> 1589 } 1590 } 1591 else if (inspiireON) 1592 { 1593 string inspiireLink = GetString("Ecom:Product:Field.SPInspiireLink"); 1594 1595 @if (!string.IsNullOrEmpty(inspiireLink)) 1596 { 1597 <a class="subpage-link order-4 order-md-6" href="@inspiireLink" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewInspiire", "Se Inspiire præsentation"))"> 1598 <img src="@(iconPath + "icon-presentation.svg")" alt="" aria-hidden="true" /> 1599 <span>@Translate("Custom.Propertypage.SubpageLink.Inspiire", "Inspiire")</span> 1600 </a> 1601 } 1602 } 1603 </div> 1604 <div class="broker-card d-none d-md-flex align-items-center" role="complementary" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.BrokerInfo", "Mæglerinformation"))"> 1605 @if (employeeItem != null) 1606 { 1607 string image = Converter.ToString(employeeItem["BilledeUrl"]); 1608 <img src="@image" alt="@Translate("Custom:Accessibility.BrokerImage", "Billede af mægler") @propBroker.Employee.Name" /> 1609 } 1610 <div class="d-flex flex-column justify-content-around"> 1611 @if (!string.IsNullOrEmpty(propBroker?.Employee?.Name)) 1612 { 1613 <div class="bold">@propBroker.Employee.Name</div> 1614 } 1615 else if (!string.IsNullOrEmpty(propBroker?.Broker?.Name)) 1616 { 1617 <div class="bold">@propBroker.Broker.Name</div> 1618 } 1619 @if (!string.IsNullOrEmpty(propBroker?.Employee?.JobTitle)) 1620 { 1621 <div class="regular">@propBroker.Employee.JobTitle</div> 1622 } 1623 else if (!string.IsNullOrEmpty(propBroker?.Broker?.JobTitle)) 1624 { 1625 <div class="regular">@propBroker.Broker.JobTitle</div> 1626 } 1627 @if (!string.IsNullOrEmpty(propBroker?.Employee?.PhoneMobile) && Converter.ToBoolean(employeeItem["VisMobilNrPaaSager"])) 1628 { 1629 <div class="regular">@Translate("Custom.Propertypage.BrokerCard.Call", "Ring på")<span class="pl-1">@RealMaeglerne.Library.Helper.FormatPhoneNumber(propBroker.Employee.PhoneMobile)</span></div> 1630 } 1631 else if (!string.IsNullOrEmpty(propBroker?.Broker?.Telephone)) 1632 { 1633 <div class="regular">@Translate("Custom.Propertypage.BrokerCard.Call", "Ring på")<span class="pl-1">@RealMaeglerne.Library.Helper.FormatPhoneNumber(propBroker.Broker.Telephone)</span></div> 1634 } 1635 </div> 1636 <div class="divider-blue__vertical mx-4" aria-hidden="true"></div> 1637 <div class="broker-interactions" aria-hidden="true"> 1638 <a class="btn btn-orange" aria-hidden="true" href="javascript:panelFremvisning('@origin');">@Translate("Custom.Propertypage.AssetsModal.Header.Showing.ButtonLabel", "Bestil fremvisning")</a> 1639 </div> 1640 </div> 1641 @*SECTION: Open house/Popular section*@ 1642 @if (bolig.AabentHus || popularityMetrics.Any()) 1643 { 1644 <section class="container open-house-popular-section p-0 pt-3 d-block d-md-none"> 1645 <div class="open-house-popular-wrapper"> 1646 @if (bolig.AabentHus) 1647 { 1648 var upcomingOpenHouses = boligManager.KommendeAabnehuse(bolig); 1649 1650 <div class="open-house w-50 @(!popularityMetrics.Any() ? "w-100" : "")"> 1651 <h2 class="section-header section-header-md semi-bold mb-0"> 1652 @Translate("Custom.Propertypage.OpenHouseSection.Header", "Åbent hus") 1653 </h2> 1654 <div class="open-house-dates"> 1655 @if (upcomingOpenHouses.Count() > 1) 1656 { 1657 <select id="openhouse-selector-mobile" class="open-house-selector js-aabenthus-liste-val"> 1658 @foreach (var openHouse in upcomingOpenHouses) 1659 { 1660 var json = System.Text.Json.JsonSerializer.Serialize(openHouse); 1661 1662 <option class="open-house-selector__option" data-aabent-hus="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(json)"> 1663 @openHouse.Dato.ToString("d. MMM", Pageview.Area.CultureInfo) kl. @openHouse.FraKlokken.Substring(0, 5) 1664 </option> 1665 } 1666 </select> 1667 } 1668 else 1669 { 1670 var primaryOpenHouse = upcomingOpenHouses.First(); 1671 var json = System.Text.Json.JsonSerializer.Serialize(primaryOpenHouse); 1672 1673 <div class="open-house-text"> 1674 <span class="js-aabenthus-date-val">@primaryOpenHouse.Dato.ToString("d. MMM", Pageview.Area.CultureInfo)</span> 1675 1676 @if (!string.IsNullOrEmpty(primaryOpenHouse.TidspunktFormateret)) 1677 { 1678 <div class="d-inline-block js-aabenthus-time-val js-primary-open-house" data-aabent-hus="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(json)"> 1679 @Translate("Custom.Propertypage.OpenHouseSection.Kl", "kl.") @primaryOpenHouse.FraKlokken.Substring(0, 5)@(" - ")@primaryOpenHouse.TilKlokken.Substring(0, 5) 1680 </div> 1681 } 1682 </div> 1683 } 1684 </div> 1685 @if (upcomingOpenHouses.Any(oh => oh.Tilmelding)) 1686 { 1687 <a class="btn btn-orange" href="javascript:panelAabenthus('@origin');" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.SignUpOpenHouse", "Tilmeld til åbent hus"))"> 1688 @Translate("Custom.Propertypage.OpenHouseSection.SignupButton.Label", "Tilmeld") 1689 </a> 1690 } 1691 </div> 1692 } 1693 @if (popularityMetrics.Any()) 1694 { 1695 <div class="popular w-50 @(!bolig.AabentHus ? "w-100" : "")"> 1696 <div class="section-header section-header-md semi-bold mb-0"> 1697 @Translate("Custom.Propertypage.PopularSection.Header", "Populær") 1698 </div> 1699 <div class="divider-orange ml-auto mr-auto"></div> 1700 <div class="popular-metrics-wrapper"> 1701 @foreach (var metric in popularityMetrics) 1702 { 1703 <div class="popular-metric d-flex flex-column align-items-center justify-content-between"> 1704 <div class="bold">@metric.Value</div> 1705 <div>@Translate($"Custom.Propertypage.PopularSection.{metric.Key}.Label", "har interageret med denne bolig")</div> 1706 </div> 1707 } 1708 </div> 1709 </div> 1710 } 1711 </div> 1712 </section> 1713 } 1714 1715 @*SECTION: ADDRESS SECTION*@ 1716 <section class="container address-section p-0 pt-3 pb-3" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.AddressSection", "Adresse og pris information"))"> 1717 <div class="address-wrapper"> 1718 <h2 class="address-header d-flex align-items-center justify-content-between w-100 order-0"> 1719 <div class="d-flex flex-column"> 1720 <div class="js-aabenthus-address-val">@GetString("Ecom:Product:Field.xEjendomAdresseAdresseLinie")</div> 1721 <div class="js-aabenthus-zip-city-val">@GetString("Ecom:Product:Field.xEjendomAdressePostAdresseLinie")</div> 1722 </div> 1723 @{ 1724 var (cssColor, translationKey, defaultText) = bolig switch 1725 { 1726 { Solgt: true, UdbudsForm: "Leje" } => ("red", "Custom.Propertypage.Leased", "Udlejet"), 1727 { Solgt: true } => ("red", "Custom.Propertypage.Sold", "Solgt"), 1728 { PurchaseAgreementSigned: true } => ("blue", "Custom.Propertypage.PurchaseAgreementSigned", "Købsaftale underskrevet"), 1729 { Nyhed: true } => ("orange", "Custom.Propertypage.New", "Nyhed"), 1730 { NyPris: true } => ("orange", "Custom.Propertypage.NewPrice", "Ny pris"), 1731 _ => (null, null, null) 1732 }; 1733 1734 if (translationKey != null) 1735 { 1736 <div class="label" role="status" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyStatus", "Ejendomsstatus"))"><div class="label-icon @cssColor" aria-hidden="true"></div>@Translate(translationKey, defaultText)</div> 1737 } 1738 } 1739 </h2> 1740 <div class="divider-orange d-none d-md-block" aria-hidden="true"></div> 1741 <div class="address-price d-none d-md-flex flex-column w-100"> 1742 @if (bolig.Solgt || bolig.PurchaseAgreementSigned) 1743 { 1744 //Do Nothing 1745 } 1746 else 1747 { 1748 @if (isRental) 1749 { 1750 <div class="d-flex align-items-center justify-content-between"> 1751 <div>@Translate("Custom.Propertypage.Financing.RentPerMonth", "Leje pr. måned")</div> 1752 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningLejeMaaned.Value.Clean"))</div> 1753 </div> 1754 1755 int usagePerMonth = GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVarmeMaaned.Value.Clean") + GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVandMaaned.Value.Clean") + GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcontoForbrugFri01Beloeb.Value.Clean"); 1756 1757 if (usagePerMonth > 0) 1758 { 1759 <div class="d-flex align-items-center justify-content-between address-price-small"> 1760 <div>@Translate("Custom.Propertypage.Financing.UsagePerMonth", "Forbrugsudgift pr. md.")</div> 1761 <div>@FormatPrice(usagePerMonth)</div> 1762 </div> 1763 } 1764 } 1765 else 1766 { 1767 <div class="d-flex align-items-center justify-content-between"> 1768 @if (propCategory == "Andelsbolig") 1769 { 1770 <div>@Translate("Custom.Propertypage.Financing.Table.Deposit", "Indskud")</div> 1771 } 1772 else 1773 { 1774 <div>@Translate("Custom.Propertypage.Financing.Table.Price", "Kontantpris")</div> 1775 } 1776 <div>@FormatPrice(GetInteger("Ecom:Product.DBPrice"))</div> 1777 </div> 1778 <div class="d-flex align-items-center justify-content-between address-price-small"> 1779 <div>@Translate("Custom.Propertypage.Financing.Table.OwnerCost", "Ejerudgift")</div> 1780 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomEjerudgifterMaanedSum"))</div> 1781 </div> 1782 } 1783 } 1784 </div> 1785 <div class="address-info d-flex flex-wrap d-md-none align-items-center order-1"> 1786 @if (!string.IsNullOrEmpty(propTypeDisplay)) 1787 { 1788 <div class="address-info-item"> 1789 @propTypeDisplay 1790 </div> 1791 } 1792 @if (GetInteger("Ecom:Product:Field.xEjendomArealerBoligAreal") > 0) 1793 { 1794 <div class="address-info-item"> 1795 @GetString("Ecom:Product:Field.xEjendomArealerBoligAreal") @Translate("Custom.Propertypage.Units.SquareMeters", "m²") 1796 </div> 1797 } 1798 @if (bolig.Solgt || bolig.PurchaseAgreementSigned) 1799 { 1800 //Do Nothing 1801 } 1802 else 1803 { 1804 <div class="address-info-item"> 1805 @if (isRental) 1806 { 1807 @GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningLejeMaaned.Value.Clean").ToString("#,##0") @Translate("Custom.Propertypage.RentPerMonth", "pr. md.") 1808 } 1809 else 1810 { 1811 @FormatPrice(GetInteger("Ecom:Product.DBPrice"), true) 1812 } 1813 </div> 1814 } 1815 @if (!string.IsNullOrEmpty(GetString("Ecom:Product:Field.xEjendomEnergiklassifikation")) || !isRental) 1816 { 1817 <div class="address-info-item d-flex align-items-center"> 1818 1819 @{ 1820 var scenarioNumber = GetString("Ecom:Product:Field.EnergyLabelScenarioNumber"); 1821 var savings = GetInteger("Ecom:Product:Field.EnergyLabelSavings"); 1822 var energyLink = GetString("Ecom:Product:Field.EnergyLabelLink"); 1823 } 1824 1825 <div @(scenarioNumber == "3" ? "id='energi-kontrol-address-mobile'" : "")> 1826 @Translate("Custom.Propertypage.Information.Energy", "Energimærke") 1827 </div> 1828 1829 <div class="energylabel @(scenarioNumber == "2" ? "energy__hover" : "")" 1830 data-energylabel="@HtmlEncoder.HtmlAttributeEncode(GetString("Ecom:Product:Field.xEjendomEnergiklassifikation"))"> 1831 @if (scenarioNumber == "2") 1832 { 1833 <span id="energi-testgruppe-address-mobile" class="tooltiptext"> 1834 @if (savings > 0) 1835 { 1836 @string.Format(Translate("Smartpage:Boligvisning.Energimærketekst1-1", "OBS: du kan spare {0} årligt ved at renovere denne bolig - {1}"), savings.ToString("#,##0"), "") 1837 <a target="_blank" href="@(energyLink)&utm_source=realmaeglerne&utm_medium=energimaerke&utm_campaign=testgruppe1">@Translate("Custom.Propertypage.EnergyLabel.Tooltip.Linktext", "klik her")</a> 1838 } 1839 else 1840 { 1841 @string.Format(Translate("Smartpage:Boligvisning.Energimærketekst1-2", "OBS: du kan energi renovere denne bolig {0}"), "") 1842 <a target="_blank" href="@(energyLink)&utm_source=realmaeglerne&utm_medium=energimaerke&utm_campaign=testgruppe1">@Translate("Custom.Propertypage.EnergyLabel.Tooltip.Linktext", "klik her")</a> 1843 } 1844 </span> 1845 } 1846 </div> 1847 </div> 1848 } 1849 </div> 1850 @if (bolig.BudOenskes) 1851 { 1852 <div class="divider-blue order-2" aria-hidden="true"></div> 1853 <div class="address-offer d-flex align-items-center order-3"> 1854 <div> 1855 @Translate("Custom.Propertypage.Address.Offerlink.label", "Har du et bud i tankerne?") 1856 </div> 1857 <a class="btn-link" onclick="scrollToElementById('offer-section', 'center')" role="button" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.MakeOffer", "Gå til bud sektion"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') scrollToElementById('offer-section', 'center')">@Translate("Custom.Propertypage.Address.Offerlink.linktext", "Giv et bud")</a> 1858 <img height="12px" width="12px" src="@(iconPath + "icon-arrow-narrow-down-white.svg")" alt="" aria-hidden="true" /> 1859 </div> 1860 <div class="divider-blue order-4" aria-hidden="true"></div> 1861 } 1862 1863 @if (bolig.Solgt || bolig.PurchaseAgreementSigned) 1864 { 1865 <div class="w-100 btn btn-light order-5 cursor-default"> 1866 @Translate(translationKey, defaultText) 1867 </div> 1868 } 1869 else 1870 { 1871 <a class="btn btn-orange w-100 order-6" href="javascript:panelFremvisning('@origin');" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.BookViewing", "Bestil fremvisning"))"> 1872 @Translate("Custom.Propertypage.AssetsModal.Header.Showing.ButtonLabel", "Bestil fremvisning") 1873 </a> 1874 1875 <div class="d-flex align-items-center justify-content-between flex-wrap order-7"> 1876 @if (edhFiles.Any()) 1877 { 1878 <a class="btn btn-link text-left d-flex align-items-center" href="javascript:panelSalgsopstilling('@origin');" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.DownloadDocuments", "Hent salgsdokumenter"))">@Translate("form-salgsopstilling-downloadbtn", "Hent salgsdokumenter") <img class="pl-1" src="@(iconPath + "icon-download-white.svg")" alt="" aria-hidden="true" /></a> 1879 } 1880 1881 <a class="btn btn-link text-left d-flex align-items-center" onclick="scrollToElementById('finance-section', 'center')" role="button" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewFinance", "Se økonomi og lån"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') scrollToElementById('finance-section', 'center')">@Translate("Custom.Propertypage.Address.Financelink.linktext", "Økonomi & lån")<img height="12px" width="12px" src="@(iconPath + "icon-arrow-narrow-down-white.svg")" alt="" aria-hidden="true" /></a> 1882 </div> 1883 } 1884 </div> 1885 <div class="address-info d-none d-md-flex"> 1886 @if (!string.IsNullOrEmpty(propTypeDisplay)) 1887 { 1888 <div class="address-info-item d-flex align-items-center justify-content-between"> 1889 <div> 1890 @Translate("Custom.Propertypage.Address.PropertyType", "Type") 1891 </div> 1892 <div> 1893 @propTypeDisplay 1894 </div> 1895 </div> 1896 } 1897 @if (GetInteger("Ecom:Product:Field.xEjendomArealerBoligAreal") > 0) 1898 { 1899 <div class="address-info-item d-flex align-items-center justify-content-between"> 1900 <div> 1901 @Translate("Custom.Propertypage.Address.PropertyArea", "Boligareal") 1902 </div> 1903 <div> 1904 @GetString("Ecom:Product:Field.xEjendomArealerBoligAreal") @Translate("Custom.Propertypage.Units.SquareMeters", "m²") 1905 </div> 1906 </div> 1907 } 1908 @if (GetInteger("Ecom:Product:Field.xEjendomArealerVaerelser") != 0) 1909 { 1910 <div class="address-info-item d-md-flex justify-content-between"> 1911 <div>@Translate("Custom.Propertypage.Address.Rooms", "Rum")</div> 1912 <div>@GetString("Ecom:Product:Field.xEjendomArealerVaerelser")</div> 1913 </div> 1914 } 1915 @if (!string.IsNullOrEmpty(GetString("Ecom:Product:Field.xEjendomEnergiklassifikation")) || !isRental) 1916 { 1917 <div class="address-info-item d-flex justify-content-between align-items-center"> 1918 @{ 1919 var scenarioNumber = GetString("Ecom:Product:Field.EnergyLabelScenarioNumber"); 1920 var savings = GetInteger("Ecom:Product:Field.EnergyLabelSavings"); 1921 var energyLink = GetString("Ecom:Product:Field.EnergyLabelLink"); 1922 } 1923 1924 <div @(scenarioNumber == "3" ? "id='energi-kontrol-address-desktop'" : "")> 1925 @Translate("Custom.Propertypage.Information.Energy", "Energimærke") 1926 </div> 1927 1928 <div class="energylabel @(scenarioNumber == "2" ? "energy__hover" : "")" 1929 data-energylabel="@HtmlEncoder.HtmlAttributeEncode(GetString("Ecom:Product:Field.xEjendomEnergiklassifikation"))"> 1930 @if (scenarioNumber == "2") 1931 { 1932 <span id="energi-testgruppe-address-desktop" class="tooltiptext"> 1933 @if (savings > 0) 1934 { 1935 @string.Format(Translate("Smartpage:Boligvisning.Energimærketekst1-1", "OBS: du kan spare {0} årligt ved at renovere denne bolig - {1}"), savings.ToString("#,##0"), "") 1936 <a target="_blank" href="@(energyLink)&utm_source=realmaeglerne&utm_medium=energimaerke&utm_campaign=testgruppe1">@Translate("Custom.Propertypage.EnergyLabel.Tooltip.Linktext", "klik her")</a> 1937 } 1938 else 1939 { 1940 @string.Format(Translate("Smartpage:Boligvisning.Energimærketekst1-2", "OBS: du kan energi renovere denne bolig {0}"), "") 1941 <a target="_blank" href="@(energyLink)&utm_source=realmaeglerne&utm_medium=energimaerke&utm_campaign=testgruppe1">@Translate("Custom.Propertypage.EnergyLabel.Tooltip.Linktext", "klik her")</a> 1942 } 1943 </span> 1944 } 1945 </div> 1946 </div> 1947 } 1948 <div class="d-flex align-items-center"> 1949 <a class="btn-link cursor-pointer" onclick="scrollToElementById('information-section', 'center')" role="button" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewAllFacts", "Vis alle fakta om boligen"))" onkeypress="if(event.key === 'Enter' || event.key === ' ') scrollToElementById('information-section', 'center')">@Translate("Custom.Propertypage.Address.InfoLink.linktext", "Vis alle fakta om boligen")</a> 1950 <img class="ml-1" height="12px" width="12px" src="@(iconPath + "icon-arrow-narrow-down.svg")" alt="" aria-hidden="true" /> 1951 </div> 1952 </div> 1953 </section> 1954 </section> 1955 </div> 1956 1957 <div propertypage-light> 1958 1959 @*SECTION USPs TODO*@ 1960 @{ 1961 bool hasUSPs = false; 1962 } 1963 @if (hasUSPs) 1964 { 1965 <section class="container usp-section"> 1966 <div class="usps d-flex position-relative"> 1967 <button id="image-prev-usps" type="button" class="prev-button btn-round d-none d-md-flex" aria-label="@HtmlEncoder.HtmlAttributeEncode(@Translate("Custom:Accessiblity.UpsBtn.Previous","Forrige"))"> 1968 </button> 1969 <button id="image-next-usps" type="button" class="next-button btn-round d-none d-md-flex" aria-label="@HtmlEncoder.HtmlAttributeEncode(@Translate("Custom:Accessiblity.UpsBtn.Next","Næste"))"> 1970 </button> 1971 <h2 class="usps-header d-flex flex-column align-items-start justify-content-center"> 1972 <div class="usps-header-number"> 1973 6 1974 </div> 1975 <div class="usps-header-text d-block d-md-none"> 1976 @Translate("Custom.Propertypage.USPSection.Header.Mobile", "gode grunde til at købe") 1977 </div> 1978 <div class="usps-header-text d-none d-md-block"> 1979 @Translate("Custom.Propertypage.USPSection.Header.Desktop", "gode grunde til at købe denne bolig") 1980 </div> 1981 <div class="divider-orange d-none d-md-block"></div> 1982 </h2> 1983 <div class="usps-wrapper d-flex"> 1984 <div class="usps-items d-flex"> 1985 <div class="usp-item d-flex flex-column"> 1986 <div class="circle-orange"> 1987 <img src="@(iconPath + "icon-check-small.svg")" /> 1988 </div> 1989 <div class="usp-text"> 1990 Her får du et trygt fundament for familien med både god plads og et roligt nabolag. 1991 </div> 1992 </div> 1993 <div class="divider-blue__vertical"></div> 1994 <div class="usp-item d-flex flex-column"> 1995 <div class="circle-orange"> 1996 <img src="@(iconPath + "icon-check-small.svg")" /> 1997 </div> 1998 <div class="usp-text"> 1999 Du får en bolig med lavt energiforbrug, hvilket både gavner økonomien og miljøet. Lorem ipsum dolor est. 2000 </div> 2001 </div> 2002 <div class="divider-blue__vertical"></div> 2003 <div class="usp-item d-flex flex-column"> 2004 <div class="circle-orange"> 2005 <img src="@(iconPath + "icon-check-small.svg")" /> 2006 </div> 2007 <div class="usp-text"> 2008 Dette hjem har de detaljer, som mange købere efterspørger – lys og luft. 2009 </div> 2010 </div> 2011 <div class="divider-blue__vertical"></div> 2012 <div class="usp-item d-flex flex-column"> 2013 <div class="circle-orange"> 2014 <img src="@(iconPath + "icon-check-small.svg")" /> 2015 </div> 2016 <div class="usp-text"> 2017 Her får du et trygt fundament for familien med både god plads og et roligt nabolag. 2018 </div> 2019 </div> 2020 <div class="divider-blue__vertical"></div> 2021 <div class="usp-item d-flex flex-column"> 2022 <div class="circle-orange"> 2023 <img src="@(iconPath + "icon-check-small.svg")" /> 2024 </div> 2025 <div class="usp-text"> 2026 Du får en bolig med lavt energiforbrug, hvilket både gavner økonomien og miljøet. Lorem ipsum dolor est. 2027 </div> 2028 </div> 2029 <div class="divider-blue__vertical"></div> 2030 <div class="usp-item d-flex flex-column"> 2031 <div class="circle-orange"> 2032 <img src="@(iconPath + "icon-check-small.svg")" /> 2033 </div> 2034 <div class="usp-text"> 2035 Dette hjem har de detaljer, som mange købere efterspørger – lys og luft. 2036 </div> 2037 </div> 2038 </div> 2039 </div> 2040 </div> 2041 </section> 2042 } 2043 @*SECTION: Description*@ 2044 <section id="description-section" class="container description-section" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyDescription", "Ejendomsbeskrivelse"))"> 2045 <div class="description js-description"> 2046 @{ 2047 string shortDesc = GetString("Ecom:Product.ShortDescription.Raw"); 2048 string longDesc = GetString("Ecom:Product.LongDescription"); 2049 2050 // Replace uplifted numbers with markup (the characters doesn't exist in the current font) 2051 shortDesc = shortDesc.Replace("²", "<sup>2</sup>").Replace("³", "<sup>3</sup>"); 2052 longDesc = longDesc.Replace("²", "<sup>2</sup>").Replace("³", "<sup>3</sup>"); 2053 } 2054 2055 <h2 class="display-sm semi-bold m-0">@shortDesc</h2> 2056 2057 @if (longDesc.Length > 300) 2058 { 2059 <div class="text-wrapper"> 2060 <div class="text-full @(hasUSPs ? "has-buying-reasons" : "")"> 2061 @longDesc 2062 </div> 2063 <button class="read-more btn--clean" type="button" role="button" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ReadMoreText", "Læs hele beskrivelsen"))" aria-expanded="false">@Translate("product-read-more", "Læs hele teksten")<img src="@(iconPath + "plus.svg")" alt="" aria-hidden="true" /></button> 2064 <button class="read-less d-none" type="button" role="button" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ReadLessText", "Skjul noget af beskrivelsen"))" aria-expanded="true">@Translate("product-read-less", "Læs mindre")<img src="@(iconPath + "minus.svg")" alt="" aria-hidden="true" /></button> 2065 </div> 2066 } 2067 else 2068 { 2069 <div>@longDesc</div> 2070 } 2071 </div> 2072 2073 </section> 2074 @*SECTION: BLueprints*@ 2075 @if (hasBlueprints) 2076 { 2077 <section class="container blueprint-section"> 2078 <div class="blueprints position-relative"> 2079 <h2 class="section-header semi-bold">@Translate("Custom.Propertypage.Blueprints.Header", "Plantegning")</h2> 2080 <div class="divider-orange mb-3 mb-md-5"></div> 2081 <div class="blueprints-wrapper"> 2082 @foreach (var blueprint in bolig.Plantegninger) 2083 { 2084 <img class="blueprint img-fluid" src="@blueprint.ImageLg" /> 2085 } 2086 </div> 2087 <button id="image-prev-blueprints" type="button" class="prev-button btn-round mb-2 d-none d-md-flex" aria-label="@HtmlEncoder.HtmlAttributeEncode(@Translate("Custom:Accessiblity.BlueprintsBtn.Previous","Forrige"))"> 2088 </button> 2089 <button id="image-next-blueprints" type="button" class="next-button btn-round d-none d-md-flex" aria-label="@HtmlEncoder.HtmlAttributeEncode(@Translate("Custom:Accessiblity.BlueprintsBtn.Next","Næste"))"> 2090 </button> 2091 </div> 2092 </section> 2093 } 2094 2095 @if (hasMapCoordinates) 2096 { 2097 <section class="container map-mobile-section d-md-none d-block js-init-map-onload" data-map-container="map-mobile" data-map-pois="false"> 2098 <h2 class="section-header semi-bold">@Translate("Custom.Propertypage.MobileMap.Header", "Kort")</h2> 2099 <div class="divider-orange mb-3" aria-hidden="true"></div> 2100 <div id="map-mobile" class="map-mobile"> 2101 <button type="button" class="btn btn-link" onclick="fullScreen('map-mobile')" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ToggleFullscreen", "Skift til fuldskærm"))" tabindex="0" onkeypress="if(event.key === 'Enter' || event.key === ' ') fullScreen('map-mobile')"> 2102 <div class="pb-2">@Translate("Custom:Propertypage.MobileMap.Button.FullScreen", "Fuld skærm")</div> 2103 <div> 2104 <img src="@(iconPath + "icon-expand.svg")" alt="" aria-hidden="true" /> 2105 </div> 2106 </button> 2107 <div class="map h-100 w-100 js-map" data-map-feed="@Converter.ToString(GetPageIdByNavigationTag("MapFeed"))" role="application" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.InteractiveMap", "Interaktivt kort"))"> 2108 <div class="renderMap" id="map-mobile"></div> 2109 </div> 2110 </div> 2111 </section> 2112 } 2113 2114 @*SECTION: Broker mobile*@ 2115 <section class="container broker-mobile d-block d-md-none"> 2116 <div class="broker-card d-flex align-items-center"> 2117 <div class="broker-info"> 2118 @if (employeeItem != null) 2119 { 2120 string image = Converter.ToString(employeeItem["BilledeUrl"]); 2121 <img src="@image" /> 2122 } 2123 <div class="d-flex flex-column justify-content-around"> 2124 @if (!string.IsNullOrEmpty(propBroker?.Employee?.Name)) 2125 { 2126 <div class="bold">@propBroker.Employee.Name</div> 2127 } 2128 else if (!string.IsNullOrEmpty(propBroker?.Broker?.Name)) 2129 { 2130 <div class="bold">@propBroker.Broker.Name</div> 2131 } 2132 @if (!string.IsNullOrEmpty(propBroker?.Employee?.JobTitle)) 2133 { 2134 <div class="regular">@propBroker.Employee.JobTitle</div> 2135 } 2136 else if (!string.IsNullOrEmpty(propBroker?.Broker?.JobTitle)) 2137 { 2138 <div class="regular">@propBroker.Broker.JobTitle</div> 2139 } 2140 </div> 2141 </div> 2142 <div class="broker-interactions"> 2143 <a class="btn btn-orange" href="javascript:panelFremvisning('@origin');">@Translate("Custom.Propertypage.AssetsModal.Header.Showing.ButtonLabel", "Bestil fremvisning")</a> 2144 @if (!string.IsNullOrEmpty(propBroker?.Employee?.PhoneMobile) && Converter.ToBoolean(employeeItem["VisMobilNrPaaSager"])) 2145 { 2146 <div class="regular">@Translate("Custom.Propertypage.BrokerCard.Call", "Ring på")<a href="tel:@RealMaeglerne.Library.Helper.FormatPhoneNumber(propBroker.Employee.PhoneMobile)" class="phone-link pl-1">@RealMaeglerne.Library.Helper.FormatPhoneNumber(propBroker.Employee.PhoneMobile)</a></div> 2147 } 2148 else if (!string.IsNullOrEmpty(propBroker?.Broker?.Telephone)) 2149 { 2150 <div class="regular">@Translate("Custom.Propertypage.BrokerCard.Call", "Ring på")<a href="tel:@RealMaeglerne.Library.Helper.FormatPhoneNumber(propBroker.Broker.Telephone)" class="phone-link pl-1">@RealMaeglerne.Library.Helper.FormatPhoneNumber(propBroker.Broker.Telephone)</a></div> 2151 } 2152 </div> 2153 </div> 2154 </section> 2155 2156 @*SECTION: Information*@ 2157 <section id="information-section" class="container information-section" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyFactsSection", "Fakta om boligen"))"> 2158 @{ 2159 int garageArea = GetInteger("Ecom:Product:Field.xEjendomArealerHovedbygningIntegreredeArealerGarage"); 2160 int carportArea = GetInteger("Ecom:Product:Field.xEjendomArealerHovedbygningIntegreredeArealerCarport.Value"); 2161 bool altan = GetBoolean("Ecom:Product:Field.xEjendomFaciliteterAltan"); 2162 } 2163 <div class="information"> 2164 <h2 class="information-header semi-bold">@Translate("Custom.Propertypage.Information.Header", "Fakta om boligen")</h2> 2165 <div class="d-none d-md-block divider-orange mb-4" aria-hidden="true"></div> 2166 <div class="table-wrapper" role="table" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyFactsTable", "Boligfakta tabel"))"> 2167 <div class="table-item d-flex justify-content-between" role="row"> 2168 <div role="cell">@Translate("Custom.Propertypage.Information.Case", "Sagsnummer")</div> 2169 <div role="cell" class="js-sagsnr-val" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.CaseNumber", "Sagsnummer")) @productId">@productId</div> 2170 </div> 2171 @if (!string.IsNullOrEmpty(propTypeDisplay)) 2172 { 2173 <div class="table-item d-flex justify-content-between" role="row"> 2174 <div role="cell">@Translate("Custom.Propertypage.Information.PropertyType", "Boligtype")</div> 2175 <div role="cell" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyType", "Boligtype")) @propTypeDisplay">@propTypeDisplay</div> 2176 </div> 2177 } 2178 @if (GetInteger("Ecom:Product:Field.xEjendomArealerBoligAreal") > 0) 2179 { 2180 <div class="table-item d-flex justify-content-between" role="row"> 2181 <div role="cell">@Translate("Custom.Propertypage.Information.Residentialrea", "Boligareal")</div> 2182 <div role="cell" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ResidentialArea", "Boligareal")) @GetString("Ecom:Product:Field.xEjendomArealerBoligAreal") @HtmlEncoder.HtmlAttributeEncode(Translate("Custom.Propertypage.Units.SquareMeters", "kvadratmeter"))">@GetString("Ecom:Product:Field.xEjendomArealerBoligAreal") @Translate("Custom.Propertypage.Units.SquareMeters", "m²")</div> 2183 </div> 2184 } 2185 @if (GetInteger("Ecom:Product:Field.xEjendomArealerGrundAreal") > 0) 2186 { 2187 <div class="table-item d-flex justify-content-between" role="row"> 2188 <div role="cell">@Translate("Custom.Propertypage.Information.Landarea", "Grundareal")</div> 2189 <div role="cell" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.LandArea", "Grundareal")) @GetString("Ecom:Product:Field.xEjendomArealerGrundAreal") @HtmlEncoder.HtmlAttributeEncode(Translate("Custom.Propertypage.Units.SquareMeters", "kvadratmeter"))">@GetString("Ecom:Product:Field.xEjendomArealerGrundAreal") @Translate("Custom.Propertypage.Units.SquareMeters", "m²")</div> 2190 </div> 2191 } 2192 else if (GetInteger("Ecom:Product:Field.xEjendomArealerGrundArealHA") > 0) 2193 { 2194 <div class="table-item d-flex justify-content-between" role="row"> 2195 <div role="cell">@Translate("Custom.Propertypage.Information.Landarea", "Grundareal")</div> 2196 <div role="cell" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.LandArea", "Grundareal")) @GetString("Ecom:Product:Field.xEjendomArealerGrundArealHA") @HtmlEncoder.HtmlAttributeEncode(Translate("Custom.Propertypage.Units.Acres", "hektar"))">@GetString("Ecom:Product:Field.xEjendomArealerGrundArealHA") @Translate("Custom.Propertypage.Units.Acres", "hektar")</div> 2197 </div> 2198 } 2199 2200 2201 @if (garageArea > 0 || carportArea > 0) 2202 { 2203 if (garageArea > 0 && carportArea > 0) 2204 { 2205 <div class="table-item d-flex justify-content-between"> 2206 <div>@Translate("Custom.Propertypage.Information.GarageCarport", "Garage/Carport")</div> 2207 <div>@garageArea/@carportArea @Translate("Custom.Propertypage.Units.SquareMeters", "m²")</div> 2208 </div> 2209 } 2210 else if (garageArea > 0 && carportArea <= 0) 2211 { 2212 <div class="table-item d-flex justify-content-between"> 2213 <div>@Translate("Custom.Propertypage.Information.Garage", "Garage")</div> 2214 <div>@garageArea @Translate("Custom.Propertypage.Units.SquareMeters", "m²")</div> 2215 </div> 2216 } 2217 else 2218 { 2219 <div class="table-item d-flex justify-content-between"> 2220 <div>@Translate("Custom.Propertypage.Information.Carport", "Carport")</div> 2221 <div>@carportArea @Translate("Custom.Propertypage.Units.SquareMeters", "m²")</div> 2222 </div> 2223 } 2224 } 2225 @if (altan) 2226 { 2227 <div class="table-item d-flex justify-content-between" role="row"> 2228 <div role="cell">@Translate("Custom.Propertypage.Information.Balkony", "Altan")</div> 2229 <div role="cell" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.Balcony", "Altan")) @HtmlEncoder.HtmlAttributeEncode(Translate("Custom.Propertypage.Information.Yes", "Ja"))">@Translate("Custom.Propertypage.Information.Yes", "Ja")</div> 2230 </div> 2231 } 2232 @if (GetInteger("Ecom:Product:Field.xEjendomOpfoertAar") != 0) 2233 { 2234 <div class="table-item d-flex justify-content-between" role="row"> 2235 <div role="cell">@Translate("Custom.Propertypage.Information.BuildRebuild", "Bygget/ombygget")</div> 2236 <div role="cell" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.BuildYear", "Byggeår")) @GetInteger("Ecom:Product:Field.xEjendomOpfoertAar") @(GetInteger("Ecom:Product:Field.xEjendomOmbyggetAar") != 0 ? HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.RebuildYear", "Ombygget")) + " " + GetString("Ecom:Product:Field.xEjendomOmbyggetAar") : "")">@GetInteger("Ecom:Product:Field.xEjendomOpfoertAar") @(GetInteger("Ecom:Product:Field.xEjendomOmbyggetAar") != 0 ? "/ " + GetString("Ecom:Product:Field.xEjendomOmbyggetAar") : "")</div> 2237 </div> 2238 } 2239 @if (GetInteger("Ecom:Product:Field.xEjendomArealerVaerelser") != 0) 2240 { 2241 <div class="table-item d-flex justify-content-between" role="row"> 2242 <div role="cell">@Translate("Custom.Propertypage.Information.Rooms", "Antal rum")</div> 2243 <div role="cell" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.NumberOfRooms", "Antal rum")) @GetString("Ecom:Product:Field.xEjendomArealerVaerelser")">@GetString("Ecom:Product:Field.xEjendomArealerVaerelser")</div> 2244 </div> 2245 } 2246 @if (GetInteger("Ecom:Product:Field.xEjendomArealerEtager") != 0 && (propType != "Ejerlejlighed" && propType != "Andelsbolig")) 2247 { 2248 <div class="table-item d-flex justify-content-between" role="row"> 2249 <div role="cell">@Translate("Custom.Propertypage.Information.Stories", "Etager")</div> 2250 <div role="cell" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.NumberOfFloors", "Antal etager")) @GetString("Ecom:Product:Field.xEjendomArealerEtager")">@GetString("Ecom:Product:Field.xEjendomArealerEtager")</div> 2251 </div> 2252 } 2253 @if (!string.IsNullOrEmpty(GetString("Ecom:Product:Field.xEjendomEnergiklassifikation"))) 2254 { 2255 <div class="table-item d-flex justify-content-between align-items-center"> 2256 @{ 2257 var scenarioNumber = GetString("Ecom:Product:Field.EnergyLabelScenarioNumber"); 2258 var savings = GetInteger("Ecom:Product:Field.EnergyLabelSavings"); 2259 var energyLink = GetString("Ecom:Product:Field.EnergyLabelLink"); 2260 } 2261 2262 <div @(scenarioNumber == "3" ? "id='energi-kontrol-information'" : "")> 2263 @Translate("Custom.Propertypage.Information.Energy", "Energimærke") 2264 </div> 2265 2266 <div class="energylabel @(scenarioNumber == "2" ? "energy__hover" : "")" 2267 data-energylabel="@HtmlEncoder.HtmlAttributeEncode(GetString("Ecom:Product:Field.xEjendomEnergiklassifikation"))"> 2268 @if (scenarioNumber == "2") 2269 { 2270 <span id="energi-testgruppe-information" class="tooltiptext"> 2271 @if (savings > 0) 2272 { 2273 @string.Format(Translate("Smartpage:Boligvisning.Energimærketekst1-1", "OBS: du kan spare {0} årligt ved at renovere denne bolig - {1}"), savings.ToString("#,##0"), "") 2274 <a target="_blank" href="@(energyLink)&utm_source=realmaeglerne&utm_medium=energimaerke&utm_campaign=testgruppe1">@Translate("Custom.Propertypage.EnergyLabel.Tooltip.Linktext", "klik her")</a> 2275 } 2276 else 2277 { 2278 @string.Format(Translate("Smartpage:Boligvisning.Energimærketekst1-2", "OBS: du kan energi renovere denne bolig {0}"), "") 2279 <a target="_blank" href="@(energyLink)&utm_source=realmaeglerne&utm_medium=energimaerke&utm_campaign=testgruppe1">@Translate("Custom.Propertypage.EnergyLabel.Tooltip.Linktext", "klik her")</a> 2280 } 2281 </span> 2282 } 2283 </div> 2284 </div> 2285 } 2286 </div> 2287 @if (edhFiles.Any()) 2288 { 2289 <div class="table-item"> 2290 <a class="btn btn-link text-left d-flex align-items-center" href="javascript:panelSalgsopstilling('@origin');" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.DownloadSalesDocuments", "Hent salgsdokumenter"))" tabindex="0">@Translate("form-salgsopstilling-downloadbtn", "Hent salgsdokumenter") <img class="pl-1" src="@(iconPath + "icon-download.svg")" alt="" aria-hidden="true" /></a> 2291 </div> 2292 } 2293 </div> 2294 </section> 2295 @*SECTION: Finance*@ 2296 @if (!bolig.Solgt) 2297 { 2298 2299 string status = GetString("Ecom:Product:Field.xStatus"); 2300 string statusCode = !string.IsNullOrEmpty(status) ? status.Substring(0, 1).ToUpper() : ""; 2301 2302 string brfQuery = $"price={GetInteger("Ecom:Product.DBPrice")}"; 2303 2304 if (propCategory != null) 2305 { 2306 if (propCategory.Contains("Ejerlejlighed", StringComparison.InvariantCultureIgnoreCase)) 2307 { 2308 brfQuery += "&housingType=ejerlejlighed"; 2309 } 2310 else if (propCategory.Contains("Villa", StringComparison.InvariantCultureIgnoreCase) || 2311 propCategory.Contains("Boliglandbrug", StringComparison.InvariantCultureIgnoreCase)) 2312 { 2313 brfQuery += "&housingType=parcelhus"; 2314 } 2315 } 2316 2317 brfQuery += "&partnerID=REM100"; 2318 2319 2320 <section id="finance-section" class="container financing-section"> 2321 <div class="financing d-flex flex-column flex-md-row"> 2322 <div class="financing-bank d-flex flex-column justify-content-center"> 2323 <img src="@(imagePath + "Jyske_Bank_logo1.png")" class="img-fluid logo" /> 2324 <h2 class="section-header mb-0"> 2325 @Translate("Custom.Propertypage.Financing.Bank.Header", "Find den finansiering, der passer dig. Få din drømmebolig til at blive virkelighed") 2326 </h2> 2327 <div class="d-none d-md-block divider-orange mb-4"></div> 2328 <div> 2329 @Translate("Custom.Propertypage.Financing.Bank.SubHeader", "Med en hurtig online vurdering kender du bedre dine muligheder") 2330 </div> 2331 @if (propCategory == "Andelsbolig") 2332 { 2333 <a href="https://www.jyskebank.dk/bolig/boliglaan/andelsbolig" target="_blank" id="gtm-brf" class="btn btn-light">@Translate("Smartpage:Boligvisning.CalculatorContact", "Kontakt Jyske Bank")</a> 2334 } 2335 else 2336 { 2337 <a href="https://www.jyskebank.dk/bolig/regn-paa-bolig/beregn-laan-til-ny-bolig?@(brfQuery)" target="_blank" id="gtm-brf" class="btn btn-light w-100">@Translate("Smartpage:Boligvisning.CalculatorLink", "Hvor meget kan jeg købe for?")<img src="@(iconPath + "icon-link-external.svg")" /></a> 2338 } 2339 </div> 2340 <div class="financing-table d-flex flex-column"> 2341 <div class="section-header semi-bold mb-0"> 2342 @Translate("Custom.Propertypage.Financing.Table.Header", "Økonomi og boliglån") 2343 </div> 2344 <div class="d-none d-md-block divider-orange mb-4"></div> 2345 <div class="table-wrapper w-100"> 2346 @if (isRental) 2347 { 2348 <div class="table-item d-flex justify-content-between"> 2349 <div>@Translate("Custom.Propertypage.Financing.RentPerMonth", "Leje pr. måned")</div> 2350 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningLejeMaaned.Value.Clean"))</div> 2351 </div> 2352 2353 int usagePerMonth = GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVarmeMaaned.Value.Clean") + GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVandMaaned.Value.Clean") + GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcontoForbrugFri01Beloeb.Value.Clean"); 2354 2355 if (usagePerMonth > 0) 2356 { 2357 <div class="table-item d-flex justify-content-between"> 2358 <div>@Translate("Custom.Propertypage.Financing.UsagePerMonth", "Forbrugsudgift pr. md.")</div> 2359 <div>@FormatPrice(usagePerMonth)</div> 2360 </div> 2361 } 2362 2363 if (GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVarmeMaaned.Value.Clean") > 0) 2364 { 2365 <div class="table-item d-flex justify-content-between"> 2366 <div>@Translate("Custom.Propertypage.Financing.AcontoHeat", "Aconto varme pr. md.")</div> 2367 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVarmeMaaned.Value.Clean"))</div> 2368 </div> 2369 } 2370 2371 if (GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVandMaaned.Value.Clean") > 0) 2372 { 2373 <div class="table-item d-flex justify-content-between"> 2374 <div>@Translate("Custom.Propertypage.Financing.AcontoWater", "Aconto vand pr. md.")</div> 2375 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVandMaaned.Value.Clean"))</div> 2376 </div> 2377 } 2378 2379 if (GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningDepositum") > 0) 2380 { 2381 <div class="table-item d-flex justify-content-between"> 2382 <div>@Translate("Custom.Propertypage.Financing.Deposit", "Depositum")</div> 2383 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningDepositum"))</div> 2384 </div> 2385 } 2386 2387 if (GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningForudbetaltLeje") > 0) 2388 { 2389 <div class="table-item d-flex justify-content-between"> 2390 <div>@Translate("Custom.Propertypage.Financing.Prepayment", "Forudbetalt leje")</div> 2391 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningForudbetaltLeje"))</div> 2392 </div> 2393 } 2394 } 2395 else 2396 { 2397 <div class="table-item d-flex justify-content-between"> 2398 @if (propCategory == "Andelsbolig") 2399 { 2400 <div>@Translate("Custom.Propertypage.Financing.Table.Deposit", "Indskud")</div> 2401 } 2402 else 2403 { 2404 <div>@Translate("Custom.Propertypage.Financing.Table.Price", "Kontantpris")</div> 2405 } 2406 <div>@FormatPrice(GetInteger("Ecom:Product.DBPrice"))</div> 2407 </div> 2408 <div class="table-item d-flex justify-content-between"> 2409 <div>@Translate("Custom.Propertypage.Financing.Table.OwnerCost", "Ejerudgift")</div> 2410 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomEjerudgifterMaanedSum"))</div> 2411 </div> 2412 @if (propCategory != "Andelsbolig") 2413 { 2414 <div class="table-item d-flex justify-content-between"> 2415 <div>@Translate("Custom.Propertypage.Financing.Table.Payout", "Udbetaling")</div> 2416 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xFinansieringUdbetaling"))</div> 2417 </div> 2418 } 2419 <div class="table-item d-flex justify-content-between"> 2420 <div>@Translate("Custom.Propertypage.Financing.Table.Brutto", "Brutto ekskl. ejerudgift")</div> 2421 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xFinansieringBruttoMaaned"))</div> 2422 </div> 2423 <div class="table-item d-flex justify-content-between"> 2424 <div>@Translate("Custom.Propertypage.Financing.Table.Netto", "Netto ekskl. ejerudgift")</div> 2425 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xFinansieringNettoMaaned"))</div> 2426 </div> 2427 } 2428 </div> 2429 </div> 2430 </div> 2431 </section> 2432 } 2433 2434 @*SECTION: Offer*@ 2435 @if (bolig.BudOenskes) 2436 { 2437 <section id="offer-section" class="container offer-section"> 2438 <div class="offer"> 2439 <div class="offer-wrapper d-flex flex-column text-center"> 2440 <h2 class="section-header semi-bold"> 2441 @Translate("Custom.Propertypage.OfferSection.Header", "Har du et bud i tankerne?") 2442 </h2> 2443 <div class="divider-orange d-none d-md-block mx-auto mb-4"></div> 2444 <div class="offer-text d-block d-md-none"> 2445 @Translate("Custom.Propertypage.OfferSection.Text.Mobile", "Jeg vil gerne byde:") 2446 </div> 2447 <div class="offer-container"> 2448 <div class="offer-text d-none d-md-block"> 2449 @Translate("Custom.Propertypage.OfferSection.Text.Desktop", "Jeg byder") 2450 </div> 2451 <input class="form-control js-input-offer text-right" id="offer-input" type="text" /> 2452 <a class="btn btn-orange js-send-offer-to-form" href="javascript:panelMakeAnOffer('@origin');"> 2453 @Translate("Custom.Propertypage.OfferSection.Button.Send", "Send bud") 2454 <img height="20px" width="20px" src="@(iconPath + "icon-arrow-right.svg")" /> 2455 </a> 2456 </div> 2457 <div class="offer-subtext"> 2458 @Translate("Custom.Propertypage.OfferSection.Subtext", "Dit bud er helt uforpligtende") 2459 </div> 2460 </div> 2461 <img class="img-fluid d-none d-md-block" src="@(imagePath + "skriv_din_pris.jpg")" data-fallback="@fallbackImage" onerror="handleImageError(this)" /> 2462 </div> 2463 </section> 2464 } 2465 2466 @*SECTION: Map with filter*@ 2467 @if (hasMapCoordinates) 2468 { 2469 <section class="container map-filter-section js-init-map-onload" data-map-container="map-filter" data-map-pois="true"> 2470 <div class="map-filter-wrapper"> 2471 <h2 class="section-header semi-bold">@Translate("Custom.Propertypage.FilterMap.Header", "Hvor finder jeg?")</h2> 2472 <div class="divider-orange mb-3 d-none d-md-block"></div> 2473 <div class="map-filters d-flex flex-wrap"> 2474 <label class="mapfilter-btn"> 2475 <input type="checkbox" id="shopping" name="mapfilter" class="mapfilter-checkbox" onchange="toggleMapCategory(this.id, this)" checked> 2476 <span>@Translate("Custom.Propertypage.MapFilter.Filter.Shopping", "Indkøb")</span> 2477 </label> 2478 <label class="mapfilter-btn"> 2479 <input type="checkbox" id="schools" name="mapfilter" class="mapfilter-checkbox" onchange="toggleMapCategory(this.id, this)" checked> 2480 <span>@Translate("Custom.Propertypage.MapFilter.Filter.Schools", "Dagtilbud")</span> 2481 </label> 2482 <label class="mapfilter-btn"> 2483 <input type="checkbox" id="health" name="mapfilter" class="mapfilter-checkbox" onchange="toggleMapCategory(this.id, this)" checked> 2484 <span>@Translate("Custom.Propertypage.MapFilter.Filter.Health", "Helbred")</span> 2485 </label> 2486 <label class="mapfilter-btn"> 2487 <input type="checkbox" id="nature" name="mapfilter" class="mapfilter-checkbox" onchange="toggleMapCategory(this.id, this)" checked> 2488 <span>@Translate("Custom.Propertypage.MapFilter.Filter.Nature", "Natur")</span> 2489 </label> 2490 <label class="mapfilter-btn"> 2491 <input type="checkbox" id="transportation" name="mapfilter" class="mapfilter-checkbox" onchange="toggleMapCategory(this.id, this)" checked> 2492 <span>@Translate("Custom.Propertypage.MapFilter.Filter.Transportation", "Transport")</span> 2493 </label> 2494 </div> 2495 </div> 2496 <div id="map-filter-container" class="map-filter"> 2497 <button type="button" class="btn btn-link" onclick="fullScreen('map-filter-container')"> 2498 <div class="pb-2">@Translate("Custom:Propertypage.MobileMap.Button.FullScreen", "Fuld skærm")</div> 2499 <div> 2500 <img src="@(iconPath + "icon-expand.svg")" /> 2501 </div> 2502 </button> 2503 <div class="map h-100 w-100 js-map" data-map-feed="@Converter.ToString(GetPageIdByNavigationTag("MapFeed"))"> 2504 <div class="renderMap" id="map-filter"></div> 2505 </div> 2506 </div> 2507 </section> 2508 } 2509 2510 @*SECTION: Broker*@ 2511 @{ 2512 string brokerUrl = "/" + Converter.ToString(brokerItem["CBMedlemsnummer"]).Substring(1); 2513 string brokerAddress = GetFullAddress(propBroker.Broker); 2514 } 2515 2516 @if (employeeItem != null) 2517 { 2518 <input type="hidden" class="js-hasEmployee" value="true" /> 2519 <section class="container broker-section"> 2520 <div class="broker d-flex flex-column flex-md-row"> 2521 <div class="broker-wrapper d-flex flex-column"> 2522 <h2 class="section-header semi-bold mb-md-0"> 2523 @string.Format(Translate("Custom.Propertypage.BrokerSection.Header", "Har du spørgsmål? Spørg {0}"), propBroker.Employee.FirstName) 2524 </h2> 2525 <div class="divider-orange d-none d-md-block"></div> 2526 <img class="img-fluid d-block d-md-none" src="@employeeItem["BilledeUrl"]" data-fallback="@fallbackImage" onerror="handleImageError(this)" /> 2527 <div class="employee-info d-flex flex-column"> 2528 @if (!string.IsNullOrEmpty(propBroker?.Employee?.Name)) 2529 { 2530 <div class="bold js-maegler-employee-name-val">@propBroker.Employee.Name</div> 2531 } 2532 @if (!string.IsNullOrEmpty(propBroker?.Employee?.JobTitle)) 2533 { 2534 <div class="regular js-maegler-employee-title-val">@propBroker.Employee.JobTitle</div> 2535 } 2536 @if (!string.IsNullOrEmpty(propBroker?.Employee?.Email)) 2537 { 2538 <div class="regular js-maegler-mail-val">@Translate("Custom.Propertypage.BrokerSection.EmplyeeInfo.Emailprefix", "Mail:") <a class="btn-link regular" href="mailto:@propBroker.Employee.Email">@propBroker.Employee.Email</a></div> 2539 } 2540 @if (!string.IsNullOrEmpty(propBroker?.Employee?.PhoneMobile) && Converter.ToBoolean(employeeItem["VisMobilNrPaaSager"])) 2541 { 2542 <div class="regular">@Translate("Custom.Propertypage.BrokerSection.EmplyeeInfo.Phoneprefix", "Tlf:") <a class="btn-link regular js-maegler-mobile-val" href="tel:@propBroker.Employee.PhoneMobile">@RealMaeglerne.Library.Helper.FormatPhoneNumber(propBroker.Employee.PhoneMobile)</a></div> 2543 } 2544 else if (!string.IsNullOrEmpty(propBroker?.Broker?.Telephone)) 2545 { 2546 <div class="regular">@Translate("Custom.Propertypage.BrokerSection.EmplyeeInfo.Phoneprefix", "Tlf:") <a class="btn-link regular" href="tel:@propBroker.Broker.Telephone">@RealMaeglerne.Library.Helper.FormatPhoneNumber(propBroker.Broker.Telephone)</a></div> 2547 } 2548 </div> 2549 <div class="divider-grey"></div> 2550 2551 @if (brokerItem != null) 2552 { 2553 var brokerEmail = Converter.ToString(brokerItem["Email"]); 2554 2555 <div class="broker-info"> 2556 @if (!string.IsNullOrEmpty(propBroker?.Broker?.CompanyName)) 2557 { 2558 <div class="bold js-maegler-name-val">@propBroker.Broker.CompanyName</div> 2559 } 2560 else if (!string.IsNullOrEmpty(propBroker?.Broker?.Name)) 2561 { 2562 <div class="bold js-maegler-name-val">@propBroker.Broker.Name</div> 2563 } 2564 @if (!string.IsNullOrEmpty(brokerAddress)) 2565 { 2566 <div class="regular">@brokerAddress</div> 2567 } 2568 @if (!string.IsNullOrEmpty(brokerEmail)) 2569 { 2570 <div class="regular">@Translate("Custom.Propertypage.BrokerSection.EmployeeInfo.Emailprefix", "Mail:") <a class="btn-link regular" href="mailto:@brokerEmail">@brokerEmail</a></div> 2571 } 2572 @if (!string.IsNullOrEmpty(propBroker?.Broker?.Telephone)) 2573 { 2574 <div class="regular">@Translate("Custom.Propertypage.BrokerSection.EmployeeInfo.Phoneprefix", "Tlf:") <a class="btn-link regular js-maegler-phone-val" href="tel:@propBroker.Broker.Telephone">@RealMaeglerne.Library.Helper.FormatPhoneNumber(propBroker.Broker.Telephone)</a></div> 2575 } 2576 </div> 2577 <span class="js-butikId d-none">@Converter.ToString(employeeItem["CBMedlemsnummer"])</span> 2578 <span class="js-maegler-address-val d-none">@propBroker.Broker.Address</span> 2579 <span class="js-maegler-zip-city-val d-none">@propBroker.Broker.ZipCode @propBroker.Broker.City</span> 2580 } 2581 2582 <div class="broker-buttons d-flex flex-column flex-md-row"> 2583 <a href="@brokerUrl" class="btn btn-blue w-100"> 2584 @Translate("Custom.Propertypage.BrokerSection.BrokerLink.Label", "Vis mæglerens side") 2585 <img height="20px" width="20px" src="@(iconPath + "icon-arrow-right.svg")" /> 2586 </a> 2587 <a class="btn btn-orange w-100" href="javascript:panelFremvisning('@origin');"> 2588 @Translate("Custom.Propertypage.AssetsModal.Header.Showing.ButtonLabel", "Bestil fremvisning") 2589 <img height="20px" width="20px" src="@(iconPath + "icon-arrow-right.svg")" /> 2590 </a> 2591 </div> 2592 </div> 2593 <img class="img-fluid d-none d-md-block" src="@employeeItem["BilledeUrl"]" data-fallback="@fallbackImage" onerror="handleImageError(this)" /> 2594 </div> 2595 </section> 2596 } 2597 2598 @*SECTION: Silmilar properties*@ 2599 @{ 2600 int sliderFeedPageId = GetPageIdByNavigationTag("PropertySlider"); 2601 } 2602 @if (sliderFeedPageId > 0) 2603 { 2604 <section class="container property-slider-section"> 2605 <div class="d-flex flex-column justify-content-center align-content-center"> 2606 <h2 class="property-slider-header">@Translate("Custom.PropertySlider.Header", "Se lignende boliger")</h2> 2607 <div class="property-slider-subheader">@Translate("Custom.PropertySlider.Subheader", "- måske gemmer din drømmebolig sig her?")</div> 2608 </div> 2609 <div id="property-slider" class="property-slider" data-slider-feed="@Converter.ToString(sliderFeedPageId)" data-zip-code="@GetString("Ecom:Product:Field.xEjendomAdressePostnummer")" data-property-category="@propCategory"> 2610 <div class="property-slider-skeleton"> 2611 </div> 2612 </div> 2613 </section> 2614 } 2615 @*SECTION: Goldbuyer*@ 2616 @{ 2617 var becomeGoldBuyerLink = Dynamicweb.Frontend.PageView.Current().AreaSettings.GetRawValueString("BecomeGoldBuyerLink", ""); 2618 } 2619 2620 @if (!string.IsNullOrEmpty(becomeGoldBuyerLink)) 2621 { 2622 <section class="container goldbuyer-section"> 2623 <div class="goldbuyer"> 2624 <div class="goldbuyer-wrapper d-flex flex-column"> 2625 <h2 class="section-header semi-bold text-left mb-md-0"> 2626 @Translate("Custom.Propertypage.GoldBuyerSection.Header", "Guldkøber®") 2627 </h2> 2628 <div class="divider-orange d-none d-md-block"></div> 2629 <div class="section-usps"> 2630 <div class="d-flex"> 2631 <img class="circle-gold mr-2" height="24px" width="24px" src="@(iconPath + "icon-check.svg")" /> 2632 @Translate("Custom.Propertypage.GoldBuyerSection.Usp1", "Få besked, når en bolig matcher dine ønsker.") 2633 </div> 2634 <div class="d-flex"> 2635 <img class="circle-gold mr-2" height="24px" width="24px" src="@(iconPath + "icon-check.svg")" /> 2636 @Translate("Custom.Propertypage.GoldBuyerSection.Usp2", "Vi overvåger markedet for dig.") 2637 </div> 2638 <div class="d-flex"> 2639 <img class="circle-gold mr-2" height="24px" width="24px" src="@(iconPath + "icon-check.svg")" /> 2640 @Translate("Custom.Propertypage.GoldBuyerSection.Usp3", "Få et nemt køb.") 2641 </div> 2642 </div> 2643 <a class="btn btn-gold align-self-center align-self-md-start" href="/Default.aspx?ID=@becomeGoldBuyerLink"> 2644 @Translate("Custom.Propertypage.GoldBuyerSection.ButtonLabel", "Bliv guldkøber") 2645 <img height="20px" width="20px" src="@(iconPath + "icon-arrow-right.svg")" /> 2646 </a> 2647 </div> 2648 <img class="img-fluid d-none d-md-block" src="@(imagePath + "goldbuyer.jpg")" data-fallback="@fallbackImage" onerror="handleImageError(this)" /> 2649 </div> 2650 </section> 2651 } 2652 2653 @*SECTION: Buyer Advice*@ 2654 @{ 2655 var rmBuyingAdvicePageId = Dynamicweb.Frontend.PageView.Current().AreaSettings.GetRawValueString("RMBuyingAdviceMasterPageID", ""); 2656 } 2657 2658 @if (!string.IsNullOrEmpty(rmBuyingAdvicePageId)) 2659 { 2660 <section class="container buyeradvice-section"> 2661 <div class="buyeradvice"> 2662 <img class="img-fluid d-none d-md-block" src="@(imagePath + "buyeradvice.jpg")" data-fallback="@fallbackImage" onerror="handleImageError(this)" /> 2663 <div class="buyeradvice-wrapper d-flex flex-column"> 2664 <h2 class="section-header semi-bold text-left mb-md-0"> 2665 @Translate("Custom.Propertypage.BuyerAdviceSection.Header", "Køber du hos anden mægler? Få ærlig køberrådgivning") 2666 </h2> 2667 <div class="divider-orange d-none d-md-block"></div> 2668 <div class="section-usps"> 2669 <div class="d-flex"> 2670 <img class="circle-blue mr-2" height="24px" width="24px" src="@(iconPath + "icon-check.svg")" /> 2671 @Translate("Custom.Propertypage.BuyerAdviceSection.Usp1", "Vi gennemgår købsaftale, skøde og finansiering, så du undgår skjulte faldgruber og dyre fejl.") 2672 </div> 2673 <div class="d-flex"> 2674 <img class="circle-blue mr-2" height="24px" width="24px" src="@(iconPath + "icon-check.svg")" /> 2675 @Translate("Custom.Propertypage.BuyerAdviceSection.Usp2", "Du får en dedikeret køberrådgiver, som kun arbejder for dig – ikke sælger.") 2676 </div> 2677 <div class="d-flex"> 2678 <img class="circle-blue mr-2" height="24px" width="24px" src="@(iconPath + "icon-check.svg")" /> 2679 @Translate("Custom.Propertypage.BuyerAdviceSection.Usp3", "Vi kan forhandle på dine vegne og ofte skaffe bedre pris, vilkår eller overtagelsesdato.") 2680 </div> 2681 </div> 2682 <a class="btn btn-blue align-self-center align-self-md-start" href="/Default.aspx?ID=@rmBuyingAdvicePageId"> 2683 @Translate("Custom.Propertypage.BuyerAdviceSection.ButtonLabel", "Sådan hjælper køberrådgivning dig") 2684 <img height="20px" width="20px" src="@(iconPath + "icon-arrow-right.svg")" /> 2685 </a> 2686 </div> 2687 </div> 2688 </section> 2689 } 2690 <div id="sticky-sales-assessment-button" class="sales-assessment-mobile d-block d-md-none"> 2691 <a class="btn btn-blue" href="javascript:panelSalgsvurdering('@origin');">@Translate("Custom.Propertypage.SalesAssessment.ButtonLabel", "Bestil salgsvurdering")</a> 2692 </div> 2693 </div> 2694 <!--PANELS--> 2695 @{ 2696 var settingsPersondatapolitik = settingsItem != null ? settingsItem["Persondatapolitik"] : ""; 2697 var termsMail = Dynamicweb.Frontend.PageView.Current().AreaSettings.GetRawValueString("TermsEmail", ""); 2698 var userId = Dynamicweb.Security.UserManagement.UserContext.Current.UserId; 2699 var user = Dynamicweb.Security.UserManagement.UserContext.Current.User; 2700 string brokerName = !string.IsNullOrEmpty(propBroker?.Broker?.CompanyName) ? propBroker.Broker.CompanyName : propBroker.Broker.Name; 2701 string butikId = brokerItem?["CBMedlemsNummer"] != null ? Converter.ToString(brokerItem["CBMedlemsnummer"]) : string.Empty; 2702 2703 } 2704 2705 <div id="panel-book-showing" class="panel panel-form" role="dialog" aria-modal="true" aria-labelledby="book-showing-title"> 2706 <button type="button" class="close" data-dismiss="panel-form" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.CloseForm", "Luk formular"))"> 2707 <b></b> 2708 </button> 2709 <h2 id="book-showing-title" class="js-showing-header">@Translate("form-fremvisning-titel", "Bestil fremvisning")</h2> 2710 <p>@Translate("form-fremvisning-beskrivelse", "")</p> 2711 <form id="book-showing" method="POST" action="/InboxHandler"> 2712 <div class="form-group"> 2713 <label><strong>@Translate("form-navn", "Navn")*</strong></label> 2714 <input class="form-control" type="text" name="navn" placeholder="@HtmlEncoder.HtmlAttributeEncode(Translate("Smartpage:Placeholder.Navn", "Indtast dit navn"))" value="@HtmlEncoder.HtmlAttributeEncode(user?.UserName)" required="required" aria-required="true" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.NameField", "Navn"))" /> 2715 </div> 2716 <div class="form-group"> 2717 <label><strong>@Translate("form-email", "E-mail")*</strong></label> 2718 <input class="form-control" type="email" pattern="[_a-z0-9.%+-]+@[a-z0-9.-]+.[a-z]{2,4}$" name="email" placeholder="@HtmlEncoder.HtmlAttributeEncode(Translate("Smartpage:Placeholder.Email", "Indtast din e-mail"))" value="@HtmlEncoder.HtmlAttributeEncode(user?.Email)" required="required" aria-required="true" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.EmailField", "E-mail adresse"))" /> 2719 </div> 2720 <div class="form-group row"> 2721 <div class="col-6"> 2722 <label><strong>@Translate("form-mobile", "Mobil nr.")*</strong></label> 2723 <input class="form-control" type="tel" pattern="^[0-9]*$" maxlength="20" name="mobile" placeholder="@HtmlEncoder.HtmlAttributeEncode(Translate("Smartpage:Salgsopstilling.Placeholder.Mobile", "Indtast mobil nr."))" value="@HtmlEncoder.HtmlAttributeEncode(user?.Phone)" required="required" aria-required="true" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.MobileField", "Mobilnummer"))" /> 2724 </div> 2725 <div class="col-6"> 2726 <label><strong>@Translate("form-telephone", "Telefon nr.")</strong></label> 2727 <input class="form-control" type="tel" pattern="^[0-9]*$" maxlength="20" name="telefonnummer" placeholder="@HtmlEncoder.HtmlAttributeEncode(Translate("Smartpage:Salgsopstilling.Placeholder.Telefon", "Indtast tlf nr."))" value="@HtmlEncoder.HtmlAttributeEncode(user?.Phone)" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PhoneField", "Telefonnummer"))" /> 2728 </div> 2729 </div> 2730 2731 <div class="form-group"> 2732 <label><strong>@Translate("form-tidspunkt", "Tidspunkt")*</strong></label> 2733 <input class="form-control" type="text" name="tidspunkt" placeholder="@HtmlEncoder.HtmlAttributeEncode(Translate("form-tidspunkt", "Tidspunkt"))" required="required" aria-required="true" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.TimeField", "Tidspunkt for fremvisning"))" /> 2734 </div> 2735 <button class="form-control text-left js-collapse-focus" type="button" data-toggle="collapse" data-target="#bookshowing-collapse" aria-expanded="false" aria-controls="bookshowing-collapse" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.AddComment", "Tilføj kommentar"))"> 2736 <strong class="f-12"><i class="fas fa-plus"></i> @Translate("Smartpage:.Skrivenkommentar", "Skriv en kommentar")</strong> 2737 </button> 2738 <div class="collapse" id="bookshowing-collapse"> 2739 <div class="form-group"> 2740 <textarea class="form-control" name="besked" placeholder="@HtmlEncoder.HtmlAttributeEncode(Translate("form-besked", "Besked"))" maxlength="150" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.MessageField", "Besked til mægler"))"></textarea> 2741 </div> 2742 </div> 2743 2744 <div class="form-group"> 2745 <div class="row"> 2746 <div class="col-12"> 2747 <button type="submit" class="btn btn-green btn-block js-showing-btn">@Translate("form-fremvisning-submitbtn", "Bestil fremvisning")</button> 2748 </div> 2749 </div> 2750 </div> 2751 <div class="form-group form-group-terms"> 2752 @string.Format(Translate("Custom.Propertypage.PanelBookShowing.Terms", "Ved at indsende formularen, giver du dit samtykke til, at dine data samles og behandles af RealMæglerne A/S for at kunne kontakte dig.\r\n Du kan til enhver tid tilbagekalde dit samtykke. For at gøre dette skal du blot sende en meddelelse til <a href=\"mailto:{0}\">{0}</a>.\r\n Læs mere på <a href=\"{1}\">privatlivspolitikkerne</a>."), termsMail, settingsPersondatapolitik) 2753 </div> 2754 <input type="hidden" name="kontaktmigok" value="true" /> 2755 <input type="hidden" name="fn" value="bf" /> 2756 <input type="hidden" name="origin" value="" /> 2757 <input type="hidden" name="brugerId" value="@userId" /> 2758 <input type="hidden" name="sagsnr" value="@productId" /> 2759 <input type="hidden" name="productid" value="@productId" /> 2760 <input type="hidden" name="eadresse" value="@HtmlEncoder.HtmlAttributeEncode(GetString("Ecom:Product:Field.xEjendomAdresseAdresseLinie"))" /> 2761 <input type="hidden" name="epostnrby" value="@HtmlEncoder.HtmlAttributeEncode(GetString("Ecom:Product:Field.xEjendomAdressePostAdresseLinie"))" /> 2762 <input type="hidden" name="areaid" value="@Pageview.AreaID" /> 2763 <input type="hidden" name="bnavn" value="@HtmlEncoder.HtmlAttributeEncode(brokerName)" /> 2764 <input type="hidden" name="greenmobility" value="@Converter.ToString(isValidForGreenMobility)" /> 2765 <input class="js-online-showing" type="hidden" name="onlineShowing" value="" /> 2766 <input type="hidden" name="butikId" value="@HtmlEncoder.HtmlAttributeEncode(butikId)" /> 2767 @if (employeeItem != null) 2768 { 2769 2770 <input type="hidden" name="mnavn" value="@HtmlEncoder.HtmlAttributeEncode(propBroker.Employee.Name)" /> 2771 if (!string.IsNullOrEmpty(propBroker.Employee.PhoneMobile) && Converter.ToBoolean(employeeItem["VisMobilNrPaaSager"])) 2772 { 2773 <input type="hidden" name="mtelefonnummer" value="@HtmlEncoder.HtmlAttributeEncode(propBroker.Employee.PhoneMobile)" /> 2774 } 2775 else 2776 { 2777 2778 <input type="hidden" name="mtelefonnummer" value="@HtmlEncoder.HtmlAttributeEncode(propBroker.Broker.Telephone)" /> 2779 } 2780 2781 <input type="hidden" name="memail" value="@RealMaeglerne.Library.Helper.ExtractMaskedEmail(propBroker.Employee.Email)" /> 2782 2783 } 2784 </form> 2785 <div id="book-showing-thanks" style="display:none;" role="status" aria-live="polite" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ThankYouMessage", "Tak besked"))"> 2786 <p>@Translate("form-fremvisning-tak", "Tak for din bestilling af fremvisning. Du vil hurtigst muligt blive kontaktet af din mægler, for at bekræfte jeres aftale. Tak for din interesse.")</p> 2787 </div> 2788 </div> 2789 2790 <div id="panel-sales-documents" class="panel panel-form" role="dialog" aria-modal="true" aria-labelledby="sales-documents-title"> 2791 <button type="button" class="close" data-dismiss="panel-form" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.CloseForm", "Luk formular"))"> 2792 <b></b> 2793 </button> 2794 2795 <h2 id="sales-documents-title">@Translate("form-salgsopstilling-titel", "Bestil Salgsopstilling")</h2> 2796 2797 <p>@Translate("form-salgsopstilling-beskrivelse", "")</p> 2798 <form id="order-sales-documents" method="POST" action="/InboxHandler"> 2799 <div class="form-group"> 2800 <label><strong>@Translate("form-navn", "Navn")*</strong></label> 2801 <input class="form-control" type="text" name="navn" placeholder="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Salgsopstilling.Placeholder.Navn", "Indtast dit navn"))" value="@HtmlEncoder.HtmlAttributeEncode(user?.UserName)" required=required /> 2802 </div> 2803 <div class="form-group"> 2804 <label><strong>@Translate("form-email", "E-mail")*</strong></label> 2805 <input class="form-control" type="email" pattern="[_a-z0-9.%+-]+@[a-z0-9.-]+.[a-z]{2,4}$" name="email" placeholder="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:.Salgsopstilling.Placeholder.Email", "Indtast din e-mail"))" value="@HtmlEncoder.HtmlAttributeEncode(user?.Email)" required=required /> 2806 </div> 2807 <div class="form-group row"> 2808 <div class="col-6"> 2809 <label><strong>@Translate("form-mobile", "Mobil nr.")*</strong></label> 2810 <input class="form-control" type="tel" pattern="^[0-9]*$" maxlength="20" name="mobile" placeholder="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Salgsopstilling.Placeholder.Mobile", "Indtast mobil nr."))" value="@HtmlEncoder.HtmlAttributeEncode(user?.Phone)" required=required /> 2811 </div> 2812 <div class="col-6"> 2813 <label><strong>@Translate("form-telephone", "Telefon nr.")</strong></label> 2814 <input class="form-control" type="tel" pattern="^[0-9]*$" maxlength="20" name="telefonnummer" placeholder="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Salgsopstilling.Placeholder.Telefon", "Indtast tlf nr."))" value="@HtmlEncoder.HtmlAttributeEncode(user?.Phone)" /> 2815 </div> 2816 </div> 2817 <div class="form-group"> 2818 <div class="checkbox"> 2819 <label> 2820 <input type="checkbox" name="kontaktmigok" /> 2821 <span>@Translate("form-contactpermission-real", "Ja tak, RealMæglerne må gerne kontakte mig. *")</span> 2822 </label> 2823 </div> 2824 </div> 2825 <div class="form-group"> 2826 <div class="row"> 2827 <div class="col-12"> 2828 <button type="submit" class="btn btn-green btn-block">@Translate("form-salgsopstilling-submitbtn", "Bestil salgsopstilling")</button> 2829 </div> 2830 </div> 2831 </div> 2832 2833 2834 <div class="form-group form-group-terms"> 2835 @string.Format(Translate("Custom.Propertypage.PanelBookShowing.Terms", "Ved at indsende formularen, giver du dit samtykke til, at dine data samles og behandles af RealMæglerne A/S for at kunne kontakte dig.\r\n Du kan til enhver tid tilbagekalde dit samtykke. For at gøre dette skal du blot sende en meddelelse til <a href=\"mailto:{0}\">{0}</a>.\r\n Læs mere på <a href=\"{1}\">privatlivspolitikkerne</a>."), termsMail, settingsPersondatapolitik) 2836 </div> 2837 <input type="hidden" name="fn" value="bs" /> 2838 <input type="hidden" name="origin" value="" /> 2839 <input type="hidden" name="sagsnr" value="@productId" /> 2840 <input type="hidden" name="brugerId" value="@userId" /> 2841 <input type="hidden" name="areaid" value="@Pageview.AreaID" /> 2842 <input type="hidden" Fname="butikId" value="@HtmlEncoder.HtmlAttributeEncode(butikId)" /> 2843 <input type="hidden" name="productId" value="@productId" /> 2844 </form> 2845 <div id="download-sales-documents" style="display:none;"> 2846 <p>@Translate("form-salgsopstilling-downloadbeskrivelse", "Tak for din interesse")</p> 2847 <br /> 2848 @foreach (var item in edhFiles) 2849 { 2850 if (item.Value.ToLower() == "salgsopstilling") 2851 { 2852 <a href="@item.Key" class="btn btn-primary link" target="_blank">@Translate("form-salgsopstilling-download", "Hent") @item.Value</a> 2853 <br /><br /> 2854 } 2855 } 2856 </div> 2857 </div> 2858 2859 <div id="panel-makeanoffer" class="panel panel-form"> 2860 <button type="button" class="close" data-dismiss="panel-form" aria-label="@HtmlEncoder.HtmlAttributeEncode(@Translate("Custom:Accessiblity.OfferPanel.Close","Luk"))"> 2861 <b></b> 2862 </button> 2863 2864 <h2>@Translate("Smartpage:MakeAnOffer.Title", "Skriv din pris")</h2> 2865 2866 <form id="make-an-offer" method="POST" action="/InboxHandler"> 2867 <p>@Translate("Smartpage:MakeAnOffer.Subtitle", "Giv et uforpligtende bud. Dit bud er ikke bindende for dig, ligesom sælger ikke er forpligtet til at acceptere dit bud.")</p> 2868 <div class="form-group"> 2869 <label><strong>@Translate("Smartpage:MakeAnOffer.Price", "Prisforslag")*</strong></label> 2870 @*checkmark*@ 2871 <input class="form-control js-input-offer" id="form-offer" type="text" name="price" placeholder="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(Translate("Smartpage:MakeAnOffer.Price", "Prisforslag") )" /> 2872 </div> 2873 <div class="form-group"> 2874 <label><strong>@Translate("form-navn", "Navn")*</strong></label> 2875 <input class="form-control" type="text" name="navn" placeholder="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(Translate("form-navn", "Navn") )" value="@HtmlEncoder.HtmlAttributeEncode(user?.UserName)" /> 2876 </div> 2877 <div class="form-group"> 2878 <label><strong>@Translate("form-email", "E-mail")*</strong></label> 2879 <input class="form-control" type="email" pattern="[_a-z0-9.%+-]+@[a-z0-9.-]+.[a-z]{2,4}$" name="email" placeholder="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(Translate("form-email", "E-mail") )" value="@HtmlEncoder.HtmlAttributeEncode(user?.Email)" /> 2880 </div> 2881 <div class="form-group"> 2882 <label><strong>@Translate("form-telephone", "Telefon nr.")*</strong></label> 2883 <input class="form-control" type="tel" pattern="^[0-9]*$" maxlength="20" name="telefonnummer" placeholder="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(Translate("Smartpage:Salgsopstilling.Placeholder.Telefon", "Indtast tlf nr.") )" value="@HtmlEncoder.HtmlAttributeEncode(user?.Phone)" /> 2884 </div> 2885 <div class="form-group"> 2886 <div class="checkbox"> 2887 <label> 2888 <input type="checkbox" name="kontaktmigok" /> 2889 <span>@Translate("form-contactpermission-real", "Ja tak, RealMæglerne må gerne kontakte mig. *")</span> 2890 </label> 2891 </div> 2892 </div> 2893 <div class="form-group"> 2894 <div class="row"> 2895 <div class="col-12"> 2896 <button type="submit" class="btn btn-green btn-block">@Translate("Smartpage:MakeAnOffer.Button.Text", "Send mit bud")</button> 2897 </div> 2898 </div> 2899 </div> 2900 2901 2902 <div class="form-group form-group-terms"> 2903 @Translate("Smartpage:MakeAnOffer.TermsAndConditions", "* Der samles ingen personlige oplysninger uden dit udtrykkelige samtykke. Ved at klikke på denne checkboks giver du dit samtykke til, at dine data samles og behandles af RealMæglerne A/S for at kunne kontakte dig. Du kan til enhver tid tilbagekalde dit samtykke. For at gøre dette skal du blot sende en meddelelse til ") 2904 <a href="mailto:@termsMail">@termsMail</a>. 2905 @Translate("Smartpage:MakeAnOffer.TermsAndConditions.ReadMoreOn", "Læs mere på") <a href="@settingsPersondatapolitik">@Translate("Smartpage:MakeAnOffer.TermsAndConditions.PrivacyPolicy", "privatlivspolitikkerne")</a>. 2906 </div> 2907 <input type="hidden" name="fn" value="skp" /> 2908 <input type="hidden" name="origin" value="" /> 2909 <input type="hidden" name="sagsnr" value="@productId" /> 2910 <input type="hidden" name="brugerId" value="@userId" /> 2911 <input type="hidden" name="areaid" value="@Pageview.AreaID" /> 2912 <input type="hidden" name="butikId" value="@HtmlEncoder.HtmlAttributeEncode(butikId)" /> 2913 </form> 2914 <div class="js-thank-you-message" style="display:none;"> 2915 <p>@Translate("Smartpage:MakeAnOffer.ThankYouMessage", "Tak for dit bud. Du vil hurtigst muligt blive kontaktet af mægler. Tak for din interesse.")</p> 2916 </div> 2917 </div> 2918 2919 <script type="text/javascript" src="/Files/Templates/Designs/rm/assets/dist/bundle.boligside.min.js"></script> 2920 <script> 2921 2922 2923 document.addEventListener("DOMContentLoaded", () => { 2924 checkIfStuck("[propertypage-anchor]"); 2925 initHiddenStickyElements("sticky-sales-assessment-button", "description-section"); 2926 initImageNavigation('.blueprints', { imageSelector: '.blueprints-wrapper img', buttonIdPostFix: '-blueprints', threshold: 1, scrollDirection: 'horizontal' }); 2927 initImageNavigation('.usps', { imageSelector: '.usp-item', buttonIdPostFix: '-usps', threshold: 1, scrollDirection: 'horizontal' }); 2928 syncSelectors('openhouse-selector-desktop', 'openhouse-selector-mobile'); 2929 initSliderObserver('property-slider'); 2930 initMetricsSlider('.js-popular-metrics-wrapper', '.popular-metric'); 2931 }) 2932 2933 function initSliderObserver(sliderElementId) { 2934 2935 const sliderElement = document.getElementById(sliderElementId); 2936 2937 const observer = new IntersectionObserver((entries) => { 2938 entries.forEach(entry => { 2939 if (entry.isIntersecting) { 2940 addSlider(entry); 2941 observer.unobserve(entry.target); 2942 } 2943 }); 2944 }, { 2945 root: null, 2946 threshold: 0.1 2947 }); 2948 2949 // Observe elements 2950 observer.observe(sliderElement); 2951 } 2952 2953 async function addSlider(entry) { 2954 const sliderFeedId = entry.target.dataset.sliderFeed; 2955 2956 if (sliderFeedId != null) { 2957 const params = new URLSearchParams({ ID: sliderFeedId }); 2958 2959 const zipCode = entry.target.dataset.zipCode; 2960 if (zipCode) { 2961 params.set('zipcodefrom', zipCode); 2962 params.set('zipcodeto', zipCode); 2963 } 2964 2965 const propertyCategory = entry.target.dataset.propertyCategory; 2966 if (propertyCategory) { 2967 params.set('propertycategory', propertyCategory); 2968 } 2969 2970 const url = `/Default.aspx?${params}`; 2971 2972 try { 2973 const result = await fetch(url); 2974 if (!result.ok) throw new Error('Network response was not ok'); 2975 const response = await result.text(); 2976 entry.target.innerHTML = response; 2977 } catch (error) { 2978 console.error('Error loading slider:', error); 2979 entry.target.innerHTML = '<p>@Dynamicweb.Core.Encoders.HtmlEncoder.JavaScriptStringEncode(Translate("Custom.Propertypage.PropertySlider.ErrorMessage", "Failed to load content"))</p>'; 2980 } 2981 } 2982 2983 } 2984 2985 function initMetricsSlider(wrapperElement, children) { 2986 document.querySelectorAll(wrapperElement).forEach(wrapper => { 2987 const metrics = wrapper.querySelectorAll(children); 2988 2989 // Skip if only one metric 2990 if (metrics.length <= 1) return; 2991 2992 // Measure widths 2993 const widths = []; 2994 metrics.forEach(metric => { 2995 widths.push(metric.offsetWidth); 2996 }); 2997 2998 // Setup wrapper 2999 wrapper.style.width = widths[0] + 'px'; 3000 wrapper.style.transition = 'width 1s ease-in-out'; 3001 3002 // Setup metrics 3003 metrics.forEach((metric, index) => { 3004 metric.style.position = 'absolute'; 3005 metric.style.top = '0'; 3006 metric.style.left = '0'; 3007 metric.style.transition = 'opacity 1s ease-in-out'; 3008 metric.style.opacity = index === 0 ? '1' : '0'; 3009 }); 3010 3011 // Animation loop 3012 let current = 0; 3013 setInterval(() => { 3014 const next = (current + 1) % metrics.length; 3015 3016 // Fade out current, fade in next 3017 metrics[current].style.opacity = '0'; 3018 metrics[next].style.opacity = '1'; 3019 3020 // Change width 3021 wrapper.style.width = widths[next] + 'px'; 3022 3023 current = next; 3024 }, 4000); 3025 }); 3026 } 3027 3028 function syncSelectors(firstSelectorId, secondSelectorId) { 3029 const select1 = document.getElementById(firstSelectorId); 3030 const select2 = document.getElementById(secondSelectorId); 3031 3032 if (select1 && select2) { 3033 select1.addEventListener('change', function () { 3034 select2.value = this.value; 3035 }); 3036 3037 select2.addEventListener('change', function () { 3038 select1.value = this.value; 3039 }); 3040 } 3041 } 3042 3043 function stopPropagation(event) { 3044 event.stopPropagation(); 3045 } 3046 3047 function fullScreen(elementId) { 3048 const element = document.getElementById(elementId); 3049 3050 if (element) { 3051 3052 if (element.classList.contains('full-screen')) { 3053 element.classList.remove('full-screen'); 3054 } else { 3055 element.classList.add('full-screen'); 3056 } 3057 } 3058 } 3059 3060 function checkIfStuck(stickyElementSelector) { 3061 const stickyElement = document.querySelector(stickyElementSelector); 3062 const stickyTop = parseInt(getComputedStyle(stickyElement).top) || 0; 3063 3064 const observer = new IntersectionObserver( 3065 ([entry]) => { 3066 const targetTop = entry.boundingClientRect.top; 3067 3068 if (targetTop <= stickyTop) { 3069 stickyElement.classList.add('is-stuck'); 3070 } else { 3071 stickyElement.classList.remove('is-stuck'); 3072 } 3073 }, 3074 { 3075 threshold: [1], 3076 rootMargin: `-${stickyTop + 1}px 0px 0px 0px` 3077 } 3078 ); 3079 3080 observer.observe(stickyElement); 3081 } 3082 3083 function initHiddenStickyElements(stickyElementId, triggerElementId) { 3084 const stickyElement = document.getElementById(stickyElementId); 3085 const sentinel = document.getElementById(triggerElementId); 3086 3087 if (stickyElement && sentinel) { 3088 const observer = new IntersectionObserver((entries) => { 3089 entries.forEach(entry => { 3090 if (entry.boundingClientRect.top <= 0) { 3091 stickyElement.classList.add('visible'); 3092 } else { 3093 stickyElement.classList.remove('visible'); 3094 } 3095 }); 3096 }, { 3097 threshold: 1, 3098 rootMargin: '0px' 3099 }); 3100 3101 observer.observe(sentinel); 3102 } 3103 else { 3104 console.debug("Elements not found in initHiddenStickyElements using stickyElementId: ", stickyElementId, " and triggerElementId: ", triggerElementId); 3105 } 3106 } 3107 3108 function shareProperty(event, clickedButton) { 3109 event.preventDefault(); 3110 3111 const shareData = { 3112 title: document.title, 3113 text: clickedButton.dataset.shareText, 3114 url: window.location.href 3115 }; 3116 3117 if (navigator.share && navigator.canShare && navigator.canShare(shareData)) { 3118 navigator.share(shareData); 3119 } else { 3120 navigator.clipboard.writeText(window.location.href).then(() => { 3121 const alertText = clickedButton.dataset.alertText || 'Link copied to clipboard!'; 3122 alert(alertText); 3123 }); 3124 } 3125 } 3126 3127 function scrollToElementById(id, block = "start") { 3128 var element = document.getElementById(id); 3129 if (element) { 3130 element.scrollIntoView({ behavior: "smooth", block: block, container: "nearest" }); 3131 } 3132 } 3133 3134 function initImageNavigation(parentSelector, options = {}) { 3135 // Default configuration 3136 const config = { 3137 imageSelector: 'img', 3138 nextButtonId: 'image-next', 3139 prevButtonId: 'image-prev', 3140 buttonIdPostFix: '', 3141 storageKey: 'currentImageIndex_' + parentSelector, 3142 threshold: 0.8, 3143 scrollBehavior: 'smooth', 3144 scrollDirection: 'vertical', // 'vertical' or 'horizontal' 3145 ...options 3146 }; 3147 3148 // Get parent element 3149 const parent = document.querySelector(parentSelector); 3150 3151 if (!parent) { 3152 console.warn(`Parent element "${parentSelector}" not found`); 3153 return null; 3154 } 3155 3156 // Get images within parent 3157 const images = parent.querySelectorAll(config.imageSelector); 3158 if (images.length === 0) { 3159 console.warn(`No images found in "${parentSelector}"`); 3160 return null; 3161 } 3162 3163 let currentVisibleIndex = 0; 3164 let lastDirection = null; // Track navigation direction: 'forward' or 'backward' 3165 let visibleIndices = new Set(); // Persistent set of all visible image indices 3166 3167 // Set up Intersection Observer 3168 const observer = new IntersectionObserver((entries) => { 3169 // Update the set based on what changed 3170 entries.forEach(entry => { 3171 const index = Array.from(images).indexOf(entry.target); 3172 3173 if (entry.isIntersecting) { 3174 visibleIndices.add(index); 3175 } else { 3176 visibleIndices.delete(index); 3177 } 3178 }); 3179 3180 if (visibleIndices.size > 0) { 3181 const visibleArray = Array.from(visibleIndices); 3182 3183 // Check for boundary cases first 3184 if (visibleIndices.has(images.length - 1)) { 3185 // Last image is visible - set to MIN (prepare for backward movement) 3186 currentVisibleIndex = Math.min(...visibleArray); 3187 lastDirection = 'backward'; 3188 } else if (visibleIndices.has(0)) { 3189 // First image is visible - set to MAX (prepare for forward movement) 3190 currentVisibleIndex = Math.max(...visibleArray); 3191 lastDirection = 'forward'; 3192 } else { 3193 // Middle of the list - use direction logic 3194 if (lastDirection === 'forward') { 3195 currentVisibleIndex = Math.max(...visibleArray); 3196 } else if (lastDirection === 'backward') { 3197 currentVisibleIndex = Math.min(...visibleArray); 3198 } else { 3199 // Default to min when no direction set (initial load) 3200 currentVisibleIndex = Math.min(...visibleArray); 3201 } 3202 } 3203 3204 if (config.storageKey) { 3205 localStorage.setItem(config.storageKey, currentVisibleIndex); 3206 } 3207 3208 updateButtonStates(); 3209 } 3210 }, { 3211 root: null, 3212 threshold: config.threshold 3213 }); 3214 3215 // Observe all images 3216 images.forEach(img => observer.observe(img)); 3217 3218 function updateButtonStates() { 3219 const nextButton = parent.querySelector('#' + config.nextButtonId + config.buttonIdPostFix); 3220 const prevButton = parent.querySelector('#' + config.prevButtonId + config.buttonIdPostFix); 3221 3222 if (nextButton) { 3223 // Disable if last image is visible 3224 if (visibleIndices.has(images.length - 1)) { 3225 nextButton.classList.add('disabled'); 3226 } else { 3227 nextButton.classList.remove('disabled'); 3228 } 3229 } 3230 3231 if (prevButton) { 3232 // Disable if first image is visible 3233 if (visibleIndices.has(0)) { 3234 prevButton.classList.add('disabled'); 3235 } else { 3236 prevButton.classList.remove('disabled'); 3237 } 3238 } 3239 } 3240 3241 // Helper function to scroll to specific image 3242 function scrollToImage(index, direction) { 3243 if (index >= 0 && index < images.length) { 3244 lastDirection = direction; 3245 3246 const scrollOptions = { 3247 behavior: config.scrollBehavior 3248 }; 3249 3250 // Set scroll alignment based on direction 3251 if (config.scrollDirection === 'horizontal') { 3252 scrollOptions.inline = 'start'; 3253 scrollOptions.block = 'nearest'; 3254 } else { 3255 scrollOptions.block = 'start'; 3256 scrollOptions.inline = 'nearest'; 3257 } 3258 3259 images[index].scrollIntoView(scrollOptions); 3260 currentVisibleIndex = index; 3261 3262 if (config.storageKey) { 3263 localStorage.setItem(config.storageKey, index); 3264 } 3265 3266 updateButtonStates(); 3267 } 3268 } 3269 3270 // Set up navigation buttons 3271 const nextButton = parent.querySelector('#' + config.nextButtonId + config.buttonIdPostFix); 3272 const prevButton = parent.querySelector('#' + config.prevButtonId + config.buttonIdPostFix); 3273 3274 const handleNext = () => { 3275 const nextIndex = Math.min(currentVisibleIndex + 1, images.length - 1); 3276 scrollToImage(nextIndex, 'forward'); 3277 }; 3278 3279 const handlePrev = () => { 3280 const prevIndex = Math.max(currentVisibleIndex - 1, 0); 3281 scrollToImage(prevIndex, 'backward'); 3282 }; 3283 3284 if (nextButton) { 3285 nextButton.addEventListener('click', handleNext); 3286 } else { 3287 console.warn(`Next button "${config.nextButtonId}" not found`); 3288 } 3289 3290 if (prevButton) { 3291 prevButton.addEventListener('click', handlePrev); 3292 } else { 3293 console.warn(`Prev button "${config.prevButtonId}" not found`); 3294 } 3295 3296 // Initialize button states 3297 updateButtonStates(); 3298 } 3299 3300 function handleError(img) { 3301 const fallback = img.dataset.fallback; 3302 if (fallback.length) { 3303 img.src = fallback; 3304 } 3305 } 3306 </script>