Realmæglerne
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&deg;")</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&deg;")</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&deg;")</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&sup2") 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&sup2") 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&sup2")</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&sup2")</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&sup2")</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&sup2")</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&sup2")</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&reg;") 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.%+-]+&#64;[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.%+-]+&#64;[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.%+-]+&#64;[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>
Fandt du ikke det du søgte? - Opret dig som bruger og få mere ud af din boligsøgning
Dit RealMæglerne

Log ind på RealMæglernes Boligagent

Med Mit RealMæglerne er det nemt at følge boligmarkedet. Leder du efter nyt, kan du gemme dine favorit boliger og målrette din søgning ned til mindste detalje. Skal du sælge, kan du løbende følge interessen for din bolig og meget mere.


Kontakt Mægler

Din bolig

* 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 info@realmaeglerne.dk. Læs mere på privatlivspolitikkerne.

Tilmeld til åbent hus

Adresse:
Dato:
Tidspunkt:

Kontakt Mægler

* 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 info@realmaeglerne.dk. Læs mere på privatlivspolitikkerne.

Bestil gratis salgsvurdering

Din bolig

Send salgsvurdering til:

Vælg mægler

* 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 info@realmaeglerne.dk. Læs mere på privatlivspolitikkerne.

Bestil gratis salgsvurdering

Din bolig

Send salgsvurdering til:

Vælg mægler

* 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 info@realmaeglerne.dk. Læs mere på privatlivspolitikkerne.