Realmæglerne
Error executing template "Designs/rm/eCom/Product/Boligvisning.cshtml"
System.InvalidOperationException: Sequence contains no elements
   at System.Linq.ThrowHelper.ThrowNoElementsException()
   at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
   at CompiledRazorTemplates.Dynamic.RazorEngine_6634c8f98bd044ec96d3f57213e60260.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; 1126 1127 var primaryImage = images.First(); 1128 images = images.Skip(1).ToList(); 1129 1130 1131 string primaryVideo = string.Empty; 1132 1133 if (hasVideos) 1134 { 1135 primaryVideo = bolig.Videos.First(); 1136 } 1137 } 1138 1139 <section class="container image-section pt-3 pb-3" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ImageGallery", "Billedegalleri"))"> 1140 1141 <div class="image-wrapper position-relative h-100 w-100"> 1142 <div class="main-image position-relative"> 1143 @if (!string.IsNullOrEmpty(primaryVideo)) 1144 { 1145 <video height="100%" autoplay="autoplay" muted loop preload="auto" poster="@primaryImage.ImageMd" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyVideo", "Ejendomsvideo for")) @GetString("Ecom:Product:Field.xEjendomAdresseAdresseLinie")"> 1146 <source src="@primaryVideo" type="video/mp4" /> 1147 @Translate("Custom:Accessibility.VideoNotSupported", "Din browser understøtter ikke HTML5 video.") 1148 </video> 1149 } 1150 else 1151 { 1152 <img class="img-fluid w-100" src="@primaryImage.ImageLg" alt="@Translate("Custom.Propertypage.PrimaryImage.AltTag", "Image of realestate")" /> 1153 } 1154 </div> 1155 1156 @{ 1157 var imageCount = 0; 1158 } 1159 1160 @foreach (var image in images.Take(2)) 1161 { 1162 <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(); }"> 1163 <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)" /> 1164 @if (imageCount == 1) 1165 { 1166 <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"))"> 1167 @string.Format(Translate("Custom:Propertypage.AssetsModal.Button.Mobile.Open", "+ {0} billeder"), images.Count()) 1168 </button> 1169 1170 <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"))"> 1171 <img src="@(iconPath + "icon-images.svg")" alt="" aria-hidden="true" /> 1172 @string.Format(Translate("Custom:Propertypage.AssetsModal.Button.Desktop.Open", "Se alle {0} billeder"), images.Count()) 1173 </button> 1174 } 1175 @if (bolig.AabentHus && imageCount == 0) 1176 { 1177 var upcomingOpenHouses = boligManager.KommendeAabnehuse(bolig); 1178 1179 <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"))"> 1180 <div class="section-header semi-bold mb-0"> 1181 @Translate("Custom.Propertypage.OpenHouseSection.Header", "Åbent hus") 1182 </div> 1183 <div class="open-house-dates d-flex align-items-center"> 1184 @if (upcomingOpenHouses.Count() > 1) 1185 { 1186 <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"))"> 1187 @foreach (var openHouse in upcomingOpenHouses) 1188 { 1189 var json = System.Text.Json.JsonSerializer.Serialize(openHouse); 1190 1191 <option class="open-house-selector__option" data-aabent-hus="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(json)"> 1192 @openHouse.Dato.ToString("d. MMM", Pageview.Area.CultureInfo) kl. @openHouse.FraKlokken.Substring(0, 5) 1193 </option> 1194 } 1195 </select> 1196 } 1197 else 1198 { 1199 var primaryOpenHouse = upcomingOpenHouses.First(); 1200 var json = System.Text.Json.JsonSerializer.Serialize(primaryOpenHouse); 1201 1202 <div class="open-house-text"> 1203 <span class="js-aabenthus-date-val">@primaryOpenHouse.Dato.ToString("d. MMM", Pageview.Area.CultureInfo)</span> 1204 1205 @if (!string.IsNullOrEmpty(primaryOpenHouse.TidspunktFormateret)) 1206 { 1207 <div class="d-inline-block js-aabenthus-time-val js-primary-open-house" data-aabent-hus="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(json)"> 1208 @Translate("Custom.Propertypage.OpenHouseSection.Kl", "kl.") @primaryOpenHouse.FraKlokken.Substring(0, 5)@(" - ")@primaryOpenHouse.TilKlokken.Substring(0, 5) 1209 </div> 1210 } 1211 </div> 1212 } 1213 @if (upcomingOpenHouses.Any(oh => oh.Tilmelding)) 1214 { 1215 <a class="btn btn-orange" href="javascript:panelAabenthus('@origin');"> 1216 @Translate("Custom.Propertypage.OpenHouseSection.SignupButton.Label", "Tilmeld") 1217 </a> 1218 } 1219 </div> 1220 </div> 1221 } 1222 @if (popularityMetrics.Any() && imageCount == 0) 1223 { 1224 <div class="popular position-absolute d-none d-md-flex" role="region" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PopularityMetrics", "Popularitetsmålinger"))"> 1225 <div class="popular-header"> 1226 @Translate("Custom.Propertypage.PopularSection.Header", "Populær") 1227 </div> 1228 <div class="popular-metrics-wrapper js-popular-metrics-wrapper"> 1229 @foreach (var metric in popularityMetrics) 1230 { 1231 1232 <div class="popular-metric d-inline-flex align-items-center"> 1233 <div class="bold">@metric.Value</div> 1234 <div class="popular-metric-label">@Translate($"Custom.Propertypage.PopularSection.{metric.Key}.Label", "har interageret med denne bolig")</div> 1235 </div> 1236 } 1237 </div> 1238 </div> 1239 } 1240 </div> 1241 imageCount++; 1242 } 1243 1244 </div> 1245 <div class="image-wrapper__subtext d-md-block d-none"> 1246 @if (propBroker != null) 1247 { 1248 <span>@Translate("Custom:Propertypage.Images.Subtext.Label", "Har du nogle spørgsmål?")</span> 1249 <span class="font-weight-normal">@Translate("Custom:Propertypage.Images.Subtext.Text", "Vi er klar til at hjælpe på telefon")</span> 1250 <span class="font-weight-normal">@(!string.IsNullOrEmpty(propBroker.Employee?.PhoneMobile) ? propBroker.Employee.PhoneMobile : propBroker.Broker.Telephone)</span> 1251 } 1252 1253 </div> 1254 1255 1256 <div class="modal fade images-modal" id="images-modal" tabindex="-1" aria-labelledby="images-modal-label" aria-hidden="true" aria-modal="true"> 1257 <div class="modal-dialog"> 1258 <div class="modal-content"> 1259 <div class="position-absolute d-flex flex-column images-navigation"> 1260 <button type="button" class="close-round mb-5" data-dismiss="modal" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.CloseModal", "Luk vindue"))"> 1261 <img src="@(iconPath + "icon-minimize.svg")" alt="" aria-hidden="true" /> 1262 </button> 1263 <div class="d-flex flex-column"> 1264 <button id="image-prev-images-modal" type="button" class="close-round mb-2" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PreviousImage", "Forrige billede"))"> 1265 <img src="@(iconPath + "icon-arrow-narrow-up.svg")" alt="" aria-hidden="true" /> 1266 </button> 1267 <button id="image-next-images-modal" type="button" class="close-round" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.NextImage", "Næste billede"))"> 1268 <img src="@(iconPath + "icon-arrow-narrow-down.svg")" alt="" aria-hidden="true" /> 1269 </button> 1270 </div> 1271 </div> 1272 <div class="image-gallery large-images"> 1273 @{ 1274 int largeImageCounter = 0; 1275 } 1276 1277 @foreach (var image in images) 1278 { 1279 var largeImageId = "image_large_" + largeImageCounter; 1280 <img id="@largeImageId" class="img-fluid" src="@fallbackImage" data-src="@image.ImageXl" /> 1281 largeImageCounter++; 1282 } 1283 </div> 1284 </div> 1285 </div> 1286 </div> 1287 1288 <div class="modal fade" id="assets-modal" tabindex="-1" aria-labelledby="assets-modal-label" aria-hidden="true" aria-modal="true" role="dialog"> 1289 <div class="modal-dialog"> 1290 <div class="modal-content h-100 mh-100"> 1291 1292 @if (hasVideos || hasSlideShow) 1293 { 1294 <input type="radio" id="video" name="category" class="category-radio" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.SelectVideoCategory", "Vælg video kategori"))"> 1295 } 1296 1297 <input type="radio" id="images" name="category" class="category-radio" checked aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.SelectImagesCategory", "Vælg billeder kategori"))"> 1298 1299 @if (hasBlueprints) 1300 { 1301 <input type="radio" id="blueprint" name="category" class="category-radio" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.SelectBlueprintCategory", "Vælg plantegning kategori"))"> 1302 } 1303 1304 @if (hasMapCoordinates) 1305 { 1306 <input type="radio" id="mapradio" name="category" class="category-radio" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.SelectMapCategory", "Vælg kort kategori"))"> 1307 } 1308 1309 @if (hasPanorama) 1310 { 1311 <input type="radio" id="view360" name="category" class="category-radio" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.Select360Category", "Vælg 360 graders visning kategori"))"> 1312 } 1313 1314 <div class="modal-header"> 1315 1316 <div class="nav-wrapper"> 1317 <div class="category-scroll"> 1318 <div class="category-buttons"> 1319 @if (hasVideos || hasSlideShow) 1320 { 1321 <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(); }"> 1322 <span class="category-icon icon-video" aria-hidden="true"></span> 1323 <span>@Translate("Custom.Propertypage.AssetsModal.Category.Video", "Video")</span> 1324 </label> 1325 } 1326 1327 <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(); }"> 1328 <span class="category-icon icon-image" aria-hidden="true"></span> 1329 <span>@Translate("Custom.Propertypage.AssetsModal.Category.Images", "Billeder")</span> 1330 </label> 1331 1332 @if (hasBlueprints) 1333 { 1334 <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(); }"> 1335 <span class="category-icon icon-plan" aria-hidden="true"></span> 1336 <span>@Translate("Custom.Propertypage.AssetsModal.Category.Plan", "Plantegning")</span> 1337 </label> 1338 } 1339 1340 @if (hasMapCoordinates) 1341 { 1342 <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(); }"> 1343 <span class="category-icon icon-map" aria-hidden="true"></span> 1344 <span>@Translate("Custom.Propertypage.AssetsModal.Category.Map", "Vis på kort")</span> 1345 </label> 1346 } 1347 1348 @if (hasPanorama) 1349 { 1350 <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(); }"> 1351 <span class="category-icon icon-360" aria-hidden="true"></span> 1352 <span>@Translate("Custom.Propertypage.AssetsModal.Category.Panorama", "360&deg;")</span> 1353 </label> 1354 } 1355 </div> 1356 <div class="d-none d-md-block"> 1357 <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> 1358 </div> 1359 </div> 1360 </div> 1361 <button type="button" class="close" data-dismiss="modal" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.CloseAssetModal", "Luk medie vindue"))"> 1362 @*Mobile*@ 1363 <div class="d-md-none d-block" aria-hidden="true"> 1364 <img src="@(iconPath + "icon-modal-close.svg")" alt="" aria-hidden="true" /> 1365 </div> 1366 <div class="d-md-none d-block pb-2" aria-hidden="true">@Translate("Custom:Propertypage.AssetsModal.Button.Close.Mobile", "Luk")</div> 1367 @*Desktop*@ 1368 <div class="d-none d-md-block pb-2" aria-hidden="true">@Translate("Custom:Propertypage.AssetsModal.Button.Close.Desktop", "Luk vindue")</div> 1369 <div class="d-none d-md-block" aria-hidden="true"> 1370 <img src="@(iconPath + "icon-modal-close-small.svg")" alt="" aria-hidden="true" /> 1371 </div> 1372 </button> 1373 </div> 1374 <div class="modal-body"> 1375 <!-- Video Content --> 1376 @if (hasVideos || hasSlideShow) 1377 { 1378 <div class="content-section video-content"> 1379 <div class="image-gallery"> 1380 @foreach (var video in bolig.Videos) 1381 { 1382 <video width="100%" controls="controls" muted loop preload="auto"> 1383 <source src="@video" type="video/mp4" /> 1384 Your browser does not support HTML5 video. 1385 </video> 1386 } 1387 @foreach (var slide in bolig.EsoftAssets.ActiveSlideShows) 1388 { 1389 <div class="slide-show">@slide.EmbedAssets[0].EmbedCode.Replace("http://", "https://")</div> 1390 } 1391 </div> 1392 </div> 1393 } 1394 1395 <!-- Billeder (Images) Content --> 1396 <div class="content-section images-content"> 1397 <div class="image-gallery"> 1398 @{ 1399 int imageCounter = 0; 1400 } 1401 1402 @foreach (var image in images) 1403 { 1404 var imageId = "image_" + imageCounter; 1405 <img id="@imageId" class="img-fluid" src="@fallbackImage" data-src="@image.ImageLg" /> 1406 imageCounter++; 1407 } 1408 </div> 1409 <div class="d-md-flex d-none flex-column"> 1410 <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' })"> 1411 <div class="pb-2" aria-hidden="true">@Translate("Custom:Propertypage.AssetsModal.Button.LargeImages", "Vis som store billeder")</div> 1412 <div aria-hidden="true"> 1413 <img src="@(iconPath + "icon-expand.svg")" alt="" aria-hidden="true" /> 1414 </div> 1415 </button> 1416 <div class="image-thumbnails"> 1417 @{ 1418 int imageThumbnailCounter = 0; 1419 } 1420 1421 @foreach (var image in images) 1422 { 1423 var imageId = "image_" + imageThumbnailCounter; 1424 <label class="thumbnail-radio" onclick="scrollToElementById('@imageId');"> 1425 <input type="radio" id="@(imageId)_thumbnail" name="thumbnailradio" class="d-none" checked="@(imageThumbnailCounter == 0)" /> 1426 <img class="img-fluid" src="@fallbackImage" data-src="@image.ImageSm" /> 1427 </label> 1428 1429 imageThumbnailCounter++; 1430 } 1431 </div> 1432 </div> 1433 </div> 1434 1435 <!-- Plantegning (Floor Plan) Content --> 1436 @if (hasBlueprints) 1437 { 1438 <div class="content-section blueprint-content"> 1439 <div class="image-gallery"> 1440 @foreach (var plan in bolig.Plantegninger) 1441 { 1442 <img class="img-fluid" src="@fallbackImage" data-src="@plan.ImageXl" /> 1443 } 1444 </div> 1445 </div> 1446 } 1447 1448 <!-- Kort (Map) Content --> 1449 @if (hasMapCoordinates) 1450 { 1451 var mapFeedPageId = Converter.ToString(GetPageIdByNavigationTag("MapFeed")); 1452 string mapMarkerUrl = "Files/Templates/Designs/rm/assets/images/map-pin-real-maeglerne.svg"; 1453 int mapMarkerHeight = 32; 1454 int mapMarkerWidth = 32; 1455 1456 <div class="content-section map-content"> 1457 <div class="image-gallery"> 1458 <div class="map js-map" data-map-feed="@mapFeedPageId"> 1459 <div class="renderMap" id="map"></div> 1460 </div> 1461 </div> 1462 </div> 1463 1464 <input type="hidden" class="js-hasmapcoordinates" value="true" /> 1465 <input type="hidden" class="js-mapLng" value="@mapLng" /> 1466 <input type="hidden" class="js-mapLat" value="@mapLat" /> 1467 <input type="hidden" class="js-mapMarkerWidth" value="@mapMarkerWidth" /> 1468 <input type="hidden" class="js-mapMarkerHeight" value="@mapMarkerHeight" /> 1469 <input type="hidden" class="js-mapMarkerUrl" value="@mapMarkerUrl" /> 1470 1471 <link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.4/dist/leaflet.css" integrity="sha512-puBpdR0798OZvTTbP4A8Ix/l+A4dHDD0DGqYW6RQ+9jxkRFclaxxQb/SJAWZfWAkuyeQUytO7+7N4QKrDh+drA==" crossorigin="" /> 1472 <script src="https://unpkg.com/leaflet@1.3.4/dist/leaflet.js" integrity="sha512-nMMmRyTVoLYqjP9hrbed9S+FzjZHW5gY1TWCHA5ckwXZBadntCNs8kEqAWdrb9O7rxbCaA4lKTIWjDXZxflOcA==" crossorigin=""> 1473 </script> 1474 1475 } 1476 1477 <!-- 360 View Content --> 1478 @if (hasPanorama) 1479 { 1480 <div class="content-section view360-content"> 1481 <div class="image-gallery"> 1482 @{ 1483 string largeThumbnail = string.Empty; 1484 1485 foreach (var thumbnail in panoramas.First().Assets) 1486 { 1487 if (thumbnail.Width == "1920") 1488 { 1489 largeThumbnail = thumbnail.SecureUrl; 1490 } 1491 } 1492 <div class="panorama"> 1493 <div class="renderMap position-relative"> 1494 <img class="panorama-thumbnail" src="@largeThumbnail" /> 1495 <div class="js-clickme clickme"> 1496 <img src="@(iconPath + "icon-360.svg")" /> 1497 <span>@Translate("Custom.Propertypage.AssetsModal.ShowPanorama", "Vis 360&deg;")</span> 1498 </div> 1499 <span class="js-panorama-encoded" style="display:none">@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlEncode(panoramas.First().EmbedAssets[0].EmbedCode.Replace("http://", "https://"))</span> 1500 </div> 1501 </div> 1502 } 1503 </div> 1504 </div> 1505 } 1506 </div> 1507 </div> 1508 </div> 1509 </div> 1510 </section> 1511 </div> 1512 1513 <div propertypage-anchor> 1514 @*SECTION: Subpage Navigation*@ 1515 @{ 1516 bool homePresentationOn = Converter.ToBoolean(GetString("Ecom:Product:Field.SpHomePresentationOn")); 1517 bool inspiireON = Converter.ToBoolean(GetString("Ecom:Product:Field.SPInspiireON")); 1518 } 1519 <section class="container subpage-navigation pb-0" role="navigation" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyNavigation", "Ejendomsnavigation"))"> 1520 <div class="subpage-links"> 1521 @if (hasVideos || hasSlideShow) 1522 { 1523 <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(); }"> 1524 <img src="@(iconPath + "icon-video.svg")" alt="" aria-hidden="true" /> 1525 <span>@Translate("Custom.Propertypage.SubpageLink.Video", "Video")</span> 1526 </label> 1527 } 1528 1529 @if (images.Any()) 1530 { 1531 <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(); }"> 1532 <img src="@(iconPath + "icon-images.svg")" alt="" aria-hidden="true" /> 1533 <span>@Translate("Custom.Propertypage.SubpageLink.Images", "Billeder")</span> 1534 </label> 1535 } 1536 1537 <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')"> 1538 <img src="@(iconPath + "icon-house.svg")" alt="" aria-hidden="true" /> 1539 <span>@Translate("Custom.Propertypage.SubpageLink.Information", "Boligfakta")</span> 1540 </a> 1541 1542 @if (hasBlueprints) 1543 { 1544 <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(); }"> 1545 <img src="@(iconPath + "icon-blueprint.svg")" alt="" aria-hidden="true" /> 1546 <span>@Translate("Custom.Propertypage.SubpageLink.Blueprint", "Plantegning")</span> 1547 </label> 1548 } 1549 1550 @if (hasMapCoordinates) 1551 { 1552 <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(); }"> 1553 <img src="@(iconPath + "icon-map.svg")" alt="" aria-hidden="true" /> 1554 <span>@Translate("Custom.Propertypage.SubpageLink.Map", "Kort")</span> 1555 </label> 1556 } 1557 1558 @if (hasPanorama) 1559 { 1560 <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(); }"> 1561 <img src="@(iconPath + "icon-360.svg")" alt="" aria-hidden="true" /> 1562 <span>@Translate("Custom.Propertypage.SubpageLink.360view", "360&deg;")</span> 1563 </label> 1564 } 1565 1566 @if (homePresentationOn) 1567 { 1568 string homePresentationLink = GetString("Ecom:Product:Field.SpHomePresentationLink"); 1569 1570 @if (!string.IsNullOrEmpty(homePresentationLink)) 1571 { 1572 <a class="subpage-link order-4 order-md-6" href="@homePresentationLink" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewPresentation", "Se boligpræsentation"))"> 1573 <img src="@(iconPath + "icon-presentation.svg")" alt="" aria-hidden="true" /> 1574 <span>@Translate("Custom.Propertypage.SubpageLink.Presentation", "Boligpræsentation")</span> 1575 </a> 1576 } 1577 } 1578 else if (inspiireON) 1579 { 1580 string inspiireLink = GetString("Ecom:Product:Field.SPInspiireLink"); 1581 1582 @if (!string.IsNullOrEmpty(inspiireLink)) 1583 { 1584 <a class="subpage-link order-4 order-md-6" href="@inspiireLink" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ViewInspiire", "Se Inspiire præsentation"))"> 1585 <img src="@(iconPath + "icon-presentation.svg")" alt="" aria-hidden="true" /> 1586 <span>@Translate("Custom.Propertypage.SubpageLink.Inspiire", "Inspiire")</span> 1587 </a> 1588 } 1589 } 1590 </div> 1591 <div class="broker-card d-none d-md-flex align-items-center" role="complementary" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.BrokerInfo", "Mæglerinformation"))"> 1592 @if (employeeItem != null) 1593 { 1594 string image = Converter.ToString(employeeItem["BilledeUrl"]); 1595 <img src="@image" alt="@Translate("Custom:Accessibility.BrokerImage", "Billede af mægler") @propBroker.Employee.Name" /> 1596 } 1597 <div class="d-flex flex-column justify-content-around"> 1598 @if (!string.IsNullOrEmpty(propBroker?.Employee?.Name)) 1599 { 1600 <div class="bold">@propBroker.Employee.Name</div> 1601 } 1602 else if (!string.IsNullOrEmpty(propBroker?.Broker?.Name)) 1603 { 1604 <div class="bold">@propBroker.Broker.Name</div> 1605 } 1606 @if (!string.IsNullOrEmpty(propBroker?.Employee?.JobTitle)) 1607 { 1608 <div class="regular">@propBroker.Employee.JobTitle</div> 1609 } 1610 else if (!string.IsNullOrEmpty(propBroker?.Broker?.JobTitle)) 1611 { 1612 <div class="regular">@propBroker.Broker.JobTitle</div> 1613 } 1614 @if (!string.IsNullOrEmpty(propBroker?.Employee?.PhoneMobile) && Converter.ToBoolean(employeeItem["VisMobilNrPaaSager"])) 1615 { 1616 <div class="regular">@Translate("Custom.Propertypage.BrokerCard.Call", "Ring på")<span class="pl-1">@RealMaeglerne.Library.Helper.FormatPhoneNumber(propBroker.Employee.PhoneMobile)</span></div> 1617 } 1618 else if (!string.IsNullOrEmpty(propBroker?.Broker?.Telephone)) 1619 { 1620 <div class="regular">@Translate("Custom.Propertypage.BrokerCard.Call", "Ring på")<span class="pl-1">@RealMaeglerne.Library.Helper.FormatPhoneNumber(propBroker.Broker.Telephone)</span></div> 1621 } 1622 </div> 1623 <div class="divider-blue__vertical mx-4" aria-hidden="true"></div> 1624 <div class="broker-interactions" aria-hidden="true"> 1625 <a class="btn btn-orange" aria-hidden="true" href="javascript:panelFremvisning('@origin');">@Translate("Custom.Propertypage.AssetsModal.Header.Showing.ButtonLabel", "Bestil fremvisning")</a> 1626 </div> 1627 </div> 1628 @*SECTION: Open house/Popular section*@ 1629 @if (bolig.AabentHus || popularityMetrics.Any()) 1630 { 1631 <section class="container open-house-popular-section p-0 pt-3 d-block d-md-none"> 1632 <div class="open-house-popular-wrapper"> 1633 @if (bolig.AabentHus) 1634 { 1635 var upcomingOpenHouses = boligManager.KommendeAabnehuse(bolig); 1636 1637 <div class="open-house w-50 @(!popularityMetrics.Any() ? "w-100" : "")"> 1638 <h2 class="section-header section-header-md semi-bold mb-0"> 1639 @Translate("Custom.Propertypage.OpenHouseSection.Header", "Åbent hus") 1640 </h2> 1641 <div class="open-house-dates"> 1642 @if (upcomingOpenHouses.Count() > 1) 1643 { 1644 <select id="openhouse-selector-mobile" class="open-house-selector js-aabenthus-liste-val"> 1645 @foreach (var openHouse in upcomingOpenHouses) 1646 { 1647 var json = System.Text.Json.JsonSerializer.Serialize(openHouse); 1648 1649 <option class="open-house-selector__option" data-aabent-hus="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(json)"> 1650 @openHouse.Dato.ToString("d. MMM", Pageview.Area.CultureInfo) kl. @openHouse.FraKlokken.Substring(0, 5) 1651 </option> 1652 } 1653 </select> 1654 } 1655 else 1656 { 1657 var primaryOpenHouse = upcomingOpenHouses.First(); 1658 var json = System.Text.Json.JsonSerializer.Serialize(primaryOpenHouse); 1659 1660 <div class="open-house-text"> 1661 <span class="js-aabenthus-date-val">@primaryOpenHouse.Dato.ToString("d. MMM", Pageview.Area.CultureInfo)</span> 1662 1663 @if (!string.IsNullOrEmpty(primaryOpenHouse.TidspunktFormateret)) 1664 { 1665 <div class="d-inline-block js-aabenthus-time-val js-primary-open-house" data-aabent-hus="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(json)"> 1666 @Translate("Custom.Propertypage.OpenHouseSection.Kl", "kl.") @primaryOpenHouse.FraKlokken.Substring(0, 5)@(" - ")@primaryOpenHouse.TilKlokken.Substring(0, 5) 1667 </div> 1668 } 1669 </div> 1670 } 1671 </div> 1672 @if (upcomingOpenHouses.Any(oh => oh.Tilmelding)) 1673 { 1674 <a class="btn btn-orange" href="javascript:panelAabenthus('@origin');" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.SignUpOpenHouse", "Tilmeld til åbent hus"))"> 1675 @Translate("Custom.Propertypage.OpenHouseSection.SignupButton.Label", "Tilmeld") 1676 </a> 1677 } 1678 </div> 1679 } 1680 @if (popularityMetrics.Any()) 1681 { 1682 <div class="popular w-50 @(!bolig.AabentHus ? "w-100" : "")"> 1683 <div class="section-header section-header-md semi-bold mb-0"> 1684 @Translate("Custom.Propertypage.PopularSection.Header", "Populær") 1685 </div> 1686 <div class="divider-orange ml-auto mr-auto"></div> 1687 <div class="popular-metrics-wrapper"> 1688 @foreach (var metric in popularityMetrics) 1689 { 1690 <div class="popular-metric d-flex flex-column align-items-center justify-content-between"> 1691 <div class="bold">@metric.Value</div> 1692 <div>@Translate($"Custom.Propertypage.PopularSection.{metric.Key}.Label", "har interageret med denne bolig")</div> 1693 </div> 1694 } 1695 </div> 1696 </div> 1697 } 1698 </div> 1699 </section> 1700 } 1701 1702 @*SECTION: ADDRESS SECTION*@ 1703 <section class="container address-section p-0 pt-3 pb-3" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.AddressSection", "Adresse og pris information"))"> 1704 <div class="address-wrapper"> 1705 <h2 class="address-header d-flex align-items-center justify-content-between w-100 order-0"> 1706 <div class="d-flex flex-column"> 1707 <div class="js-aabenthus-address-val">@GetString("Ecom:Product:Field.xEjendomAdresseAdresseLinie")</div> 1708 <div class="js-aabenthus-zip-city-val">@GetString("Ecom:Product:Field.xEjendomAdressePostAdresseLinie")</div> 1709 </div> 1710 @{ 1711 var (cssColor, translationKey, defaultText) = bolig switch 1712 { 1713 { Solgt: true, UdbudsForm: "Leje" } => ("red", "Custom.Propertypage.Leased", "Udlejet"), 1714 { Solgt: true } => ("red", "Custom.Propertypage.Sold", "Solgt"), 1715 { PurchaseAgreementSigned: true } => ("blue", "Custom.Propertypage.PurchaseAgreementSigned", "Købsaftale underskrevet"), 1716 { Nyhed: true } => ("orange", "Custom.Propertypage.New", "Nyhed"), 1717 { NyPris: true } => ("orange", "Custom.Propertypage.NewPrice", "Ny pris"), 1718 _ => (null, null, null) 1719 }; 1720 1721 if (translationKey != null) 1722 { 1723 <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> 1724 } 1725 } 1726 </h2> 1727 <div class="divider-orange d-none d-md-block" aria-hidden="true"></div> 1728 <div class="address-price d-none d-md-flex flex-column w-100"> 1729 @if (bolig.Solgt || bolig.PurchaseAgreementSigned) 1730 { 1731 //Do Nothing 1732 } 1733 else 1734 { 1735 @if (isRental) 1736 { 1737 <div class="d-flex align-items-center justify-content-between"> 1738 <div>@Translate("Custom.Propertypage.Financing.RentPerMonth", "Leje pr. måned")</div> 1739 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningLejeMaaned.Value.Clean"))</div> 1740 </div> 1741 1742 int usagePerMonth = GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVarmeMaaned.Value.Clean") + GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVandMaaned.Value.Clean") + GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcontoForbrugFri01Beloeb.Value.Clean"); 1743 1744 if (usagePerMonth > 0) 1745 { 1746 <div class="d-flex align-items-center justify-content-between address-price-small"> 1747 <div>@Translate("Custom.Propertypage.Financing.UsagePerMonth", "Forbrugsudgift pr. md.")</div> 1748 <div>@FormatPrice(usagePerMonth)</div> 1749 </div> 1750 } 1751 } 1752 else 1753 { 1754 <div class="d-flex align-items-center justify-content-between"> 1755 @if (propCategory == "Andelsbolig") 1756 { 1757 <div>@Translate("Custom.Propertypage.Financing.Table.Deposit", "Indskud")</div> 1758 } 1759 else 1760 { 1761 <div>@Translate("Custom.Propertypage.Financing.Table.Price", "Kontantpris")</div> 1762 } 1763 <div>@FormatPrice(GetInteger("Ecom:Product.DBPrice"))</div> 1764 </div> 1765 <div class="d-flex align-items-center justify-content-between address-price-small"> 1766 <div>@Translate("Custom.Propertypage.Financing.Table.OwnerCost", "Ejerudgift")</div> 1767 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomEjerudgifterMaanedSum"))</div> 1768 </div> 1769 } 1770 } 1771 </div> 1772 <div class="address-info d-flex flex-wrap d-md-none align-items-center order-1"> 1773 @if (!string.IsNullOrEmpty(propTypeDisplay)) 1774 { 1775 <div class="address-info-item"> 1776 @propTypeDisplay 1777 </div> 1778 } 1779 @if (GetInteger("Ecom:Product:Field.xEjendomArealerBoligAreal") > 0) 1780 { 1781 <div class="address-info-item"> 1782 @GetString("Ecom:Product:Field.xEjendomArealerBoligAreal") @Translate("Custom.Propertypage.Units.SquareMeters", "m&sup2") 1783 </div> 1784 } 1785 @if (bolig.Solgt || bolig.PurchaseAgreementSigned) 1786 { 1787 //Do Nothing 1788 } 1789 else 1790 { 1791 <div class="address-info-item"> 1792 @if (isRental) 1793 { 1794 @GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningLejeMaaned.Value.Clean").ToString("#,##0") @Translate("Custom.Propertypage.RentPerMonth", "pr. md.") 1795 } 1796 else 1797 { 1798 @FormatPrice(GetInteger("Ecom:Product.DBPrice"), true) 1799 } 1800 </div> 1801 } 1802 @if (!string.IsNullOrEmpty(GetString("Ecom:Product:Field.xEjendomEnergiklassifikation")) || !isRental) 1803 { 1804 <div class="address-info-item d-flex align-items-center"> 1805 1806 @{ 1807 var scenarioNumber = GetString("Ecom:Product:Field.EnergyLabelScenarioNumber"); 1808 var savings = GetInteger("Ecom:Product:Field.EnergyLabelSavings"); 1809 var energyLink = GetString("Ecom:Product:Field.EnergyLabelLink"); 1810 } 1811 1812 <div @(scenarioNumber == "3" ? "id='energi-kontrol-address-mobile'" : "")> 1813 @Translate("Custom.Propertypage.Information.Energy", "Energimærke") 1814 </div> 1815 1816 <div class="energylabel @(scenarioNumber == "2" ? "energy__hover" : "")" 1817 data-energylabel="@HtmlEncoder.HtmlAttributeEncode(GetString("Ecom:Product:Field.xEjendomEnergiklassifikation"))"> 1818 @if (scenarioNumber == "2") 1819 { 1820 <span id="energi-testgruppe-address-mobile" class="tooltiptext"> 1821 @if (savings > 0) 1822 { 1823 @string.Format(Translate("Smartpage:Boligvisning.Energimærketekst1-1", "OBS: du kan spare {0} årligt ved at renovere denne bolig - {1}"), savings.ToString("#,##0"), "") 1824 <a target="_blank" href="@(energyLink)&utm_source=realmaeglerne&utm_medium=energimaerke&utm_campaign=testgruppe1">@Translate("Custom.Propertypage.EnergyLabel.Tooltip.Linktext", "klik her")</a> 1825 } 1826 else 1827 { 1828 @string.Format(Translate("Smartpage:Boligvisning.Energimærketekst1-2", "OBS: du kan energi renovere denne bolig {0}"), "") 1829 <a target="_blank" href="@(energyLink)&utm_source=realmaeglerne&utm_medium=energimaerke&utm_campaign=testgruppe1">@Translate("Custom.Propertypage.EnergyLabel.Tooltip.Linktext", "klik her")</a> 1830 } 1831 </span> 1832 } 1833 </div> 1834 </div> 1835 } 1836 </div> 1837 @if (bolig.BudOenskes) 1838 { 1839 <div class="divider-blue order-2" aria-hidden="true"></div> 1840 <div class="address-offer d-flex align-items-center order-3"> 1841 <div> 1842 @Translate("Custom.Propertypage.Address.Offerlink.label", "Har du et bud i tankerne?") 1843 </div> 1844 <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> 1845 <img height="12px" width="12px" src="@(iconPath + "icon-arrow-narrow-down-white.svg")" alt="" aria-hidden="true" /> 1846 </div> 1847 <div class="divider-blue order-4" aria-hidden="true"></div> 1848 } 1849 1850 @if (bolig.Solgt || bolig.PurchaseAgreementSigned) 1851 { 1852 <div class="w-100 btn btn-light order-5 cursor-default"> 1853 @Translate(translationKey, defaultText) 1854 </div> 1855 } 1856 else 1857 { 1858 <a class="btn btn-orange w-100 order-6" href="javascript:panelFremvisning('@origin');" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.BookViewing", "Bestil fremvisning"))"> 1859 @Translate("Custom.Propertypage.AssetsModal.Header.Showing.ButtonLabel", "Bestil fremvisning") 1860 </a> 1861 1862 <div class="d-flex align-items-center justify-content-between flex-wrap order-7"> 1863 @if (edhFiles.Any()) 1864 { 1865 <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> 1866 } 1867 1868 <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> 1869 </div> 1870 } 1871 </div> 1872 <div class="address-info d-none d-md-flex"> 1873 @if (!string.IsNullOrEmpty(propTypeDisplay)) 1874 { 1875 <div class="address-info-item d-flex align-items-center justify-content-between"> 1876 <div> 1877 @Translate("Custom.Propertypage.Address.PropertyType", "Type") 1878 </div> 1879 <div> 1880 @propTypeDisplay 1881 </div> 1882 </div> 1883 } 1884 @if (GetInteger("Ecom:Product:Field.xEjendomArealerBoligAreal") > 0) 1885 { 1886 <div class="address-info-item d-flex align-items-center justify-content-between"> 1887 <div> 1888 @Translate("Custom.Propertypage.Address.PropertyArea", "Boligareal") 1889 </div> 1890 <div> 1891 @GetString("Ecom:Product:Field.xEjendomArealerBoligAreal") @Translate("Custom.Propertypage.Units.SquareMeters", "m&sup2") 1892 </div> 1893 </div> 1894 } 1895 @if (GetInteger("Ecom:Product:Field.xEjendomArealerVaerelser") != 0) 1896 { 1897 <div class="address-info-item d-md-flex justify-content-between"> 1898 <div>@Translate("Custom.Propertypage.Address.Rooms", "Rum")</div> 1899 <div>@GetString("Ecom:Product:Field.xEjendomArealerVaerelser")</div> 1900 </div> 1901 } 1902 @if (!string.IsNullOrEmpty(GetString("Ecom:Product:Field.xEjendomEnergiklassifikation")) || !isRental) 1903 { 1904 <div class="address-info-item d-flex justify-content-between align-items-center"> 1905 @{ 1906 var scenarioNumber = GetString("Ecom:Product:Field.EnergyLabelScenarioNumber"); 1907 var savings = GetInteger("Ecom:Product:Field.EnergyLabelSavings"); 1908 var energyLink = GetString("Ecom:Product:Field.EnergyLabelLink"); 1909 } 1910 1911 <div @(scenarioNumber == "3" ? "id='energi-kontrol-address-desktop'" : "")> 1912 @Translate("Custom.Propertypage.Information.Energy", "Energimærke") 1913 </div> 1914 1915 <div class="energylabel @(scenarioNumber == "2" ? "energy__hover" : "")" 1916 data-energylabel="@HtmlEncoder.HtmlAttributeEncode(GetString("Ecom:Product:Field.xEjendomEnergiklassifikation"))"> 1917 @if (scenarioNumber == "2") 1918 { 1919 <span id="energi-testgruppe-address-desktop" class="tooltiptext"> 1920 @if (savings > 0) 1921 { 1922 @string.Format(Translate("Smartpage:Boligvisning.Energimærketekst1-1", "OBS: du kan spare {0} årligt ved at renovere denne bolig - {1}"), savings.ToString("#,##0"), "") 1923 <a target="_blank" href="@(energyLink)&utm_source=realmaeglerne&utm_medium=energimaerke&utm_campaign=testgruppe1">@Translate("Custom.Propertypage.EnergyLabel.Tooltip.Linktext", "klik her")</a> 1924 } 1925 else 1926 { 1927 @string.Format(Translate("Smartpage:Boligvisning.Energimærketekst1-2", "OBS: du kan energi renovere denne bolig {0}"), "") 1928 <a target="_blank" href="@(energyLink)&utm_source=realmaeglerne&utm_medium=energimaerke&utm_campaign=testgruppe1">@Translate("Custom.Propertypage.EnergyLabel.Tooltip.Linktext", "klik her")</a> 1929 } 1930 </span> 1931 } 1932 </div> 1933 </div> 1934 } 1935 <div class="d-flex align-items-center"> 1936 <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> 1937 <img class="ml-1" height="12px" width="12px" src="@(iconPath + "icon-arrow-narrow-down.svg")" alt="" aria-hidden="true" /> 1938 </div> 1939 </div> 1940 </section> 1941 </section> 1942 </div> 1943 1944 <div propertypage-light> 1945 1946 @*SECTION USPs TODO*@ 1947 @{ 1948 bool hasUSPs = false; 1949 } 1950 @if (hasUSPs) 1951 { 1952 <section class="container usp-section"> 1953 <div class="usps d-flex position-relative"> 1954 <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"))"> 1955 </button> 1956 <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"))"> 1957 </button> 1958 <h2 class="usps-header d-flex flex-column align-items-start justify-content-center"> 1959 <div class="usps-header-number"> 1960 6 1961 </div> 1962 <div class="usps-header-text d-block d-md-none"> 1963 @Translate("Custom.Propertypage.USPSection.Header.Mobile", "gode grunde til at købe") 1964 </div> 1965 <div class="usps-header-text d-none d-md-block"> 1966 @Translate("Custom.Propertypage.USPSection.Header.Desktop", "gode grunde til at købe denne bolig") 1967 </div> 1968 <div class="divider-orange d-none d-md-block"></div> 1969 </h2> 1970 <div class="usps-wrapper d-flex"> 1971 <div class="usps-items d-flex"> 1972 <div class="usp-item d-flex flex-column"> 1973 <div class="circle-orange"> 1974 <img src="@(iconPath + "icon-check-small.svg")" /> 1975 </div> 1976 <div class="usp-text"> 1977 Her får du et trygt fundament for familien med både god plads og et roligt nabolag. 1978 </div> 1979 </div> 1980 <div class="divider-blue__vertical"></div> 1981 <div class="usp-item d-flex flex-column"> 1982 <div class="circle-orange"> 1983 <img src="@(iconPath + "icon-check-small.svg")" /> 1984 </div> 1985 <div class="usp-text"> 1986 Du får en bolig med lavt energiforbrug, hvilket både gavner økonomien og miljøet. Lorem ipsum dolor est. 1987 </div> 1988 </div> 1989 <div class="divider-blue__vertical"></div> 1990 <div class="usp-item d-flex flex-column"> 1991 <div class="circle-orange"> 1992 <img src="@(iconPath + "icon-check-small.svg")" /> 1993 </div> 1994 <div class="usp-text"> 1995 Dette hjem har de detaljer, som mange købere efterspørger – lys og luft. 1996 </div> 1997 </div> 1998 <div class="divider-blue__vertical"></div> 1999 <div class="usp-item d-flex flex-column"> 2000 <div class="circle-orange"> 2001 <img src="@(iconPath + "icon-check-small.svg")" /> 2002 </div> 2003 <div class="usp-text"> 2004 Her får du et trygt fundament for familien med både god plads og et roligt nabolag. 2005 </div> 2006 </div> 2007 <div class="divider-blue__vertical"></div> 2008 <div class="usp-item d-flex flex-column"> 2009 <div class="circle-orange"> 2010 <img src="@(iconPath + "icon-check-small.svg")" /> 2011 </div> 2012 <div class="usp-text"> 2013 Du får en bolig med lavt energiforbrug, hvilket både gavner økonomien og miljøet. Lorem ipsum dolor est. 2014 </div> 2015 </div> 2016 <div class="divider-blue__vertical"></div> 2017 <div class="usp-item d-flex flex-column"> 2018 <div class="circle-orange"> 2019 <img src="@(iconPath + "icon-check-small.svg")" /> 2020 </div> 2021 <div class="usp-text"> 2022 Dette hjem har de detaljer, som mange købere efterspørger – lys og luft. 2023 </div> 2024 </div> 2025 </div> 2026 </div> 2027 </div> 2028 </section> 2029 } 2030 @*SECTION: Description*@ 2031 <section id="description-section" class="container description-section" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyDescription", "Ejendomsbeskrivelse"))"> 2032 <div class="description js-description"> 2033 @{ 2034 string shortDesc = GetString("Ecom:Product.ShortDescription.Raw"); 2035 string longDesc = GetString("Ecom:Product.LongDescription"); 2036 2037 // Replace uplifted numbers with markup (the characters doesn't exist in the current font) 2038 shortDesc = shortDesc.Replace("²", "<sup>2</sup>").Replace("³", "<sup>3</sup>"); 2039 longDesc = longDesc.Replace("²", "<sup>2</sup>").Replace("³", "<sup>3</sup>"); 2040 } 2041 2042 <h2 class="display-sm semi-bold m-0">@shortDesc</h2> 2043 2044 @if (longDesc.Length > 300) 2045 { 2046 <div class="text-wrapper"> 2047 <div class="text-full @(hasUSPs ? "has-buying-reasons" : "")"> 2048 @longDesc 2049 </div> 2050 <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> 2051 <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> 2052 </div> 2053 } 2054 else 2055 { 2056 <div>@longDesc</div> 2057 } 2058 </div> 2059 2060 </section> 2061 @*SECTION: BLueprints*@ 2062 @if (hasBlueprints) 2063 { 2064 <section class="container blueprint-section"> 2065 <div class="blueprints position-relative"> 2066 <h2 class="section-header semi-bold">@Translate("Custom.Propertypage.Blueprints.Header", "Plantegning")</h2> 2067 <div class="divider-orange mb-3 mb-md-5"></div> 2068 <div class="blueprints-wrapper"> 2069 @foreach (var blueprint in bolig.Plantegninger) 2070 { 2071 <img class="blueprint img-fluid" src="@blueprint.ImageLg" /> 2072 } 2073 </div> 2074 <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"))"> 2075 </button> 2076 <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"))"> 2077 </button> 2078 </div> 2079 </section> 2080 } 2081 2082 @if (hasMapCoordinates) 2083 { 2084 <section class="container map-mobile-section d-md-none d-block js-init-map-onload" data-map-container="map-mobile" data-map-pois="false"> 2085 <h2 class="section-header semi-bold">@Translate("Custom.Propertypage.MobileMap.Header", "Kort")</h2> 2086 <div class="divider-orange mb-3" aria-hidden="true"></div> 2087 <div id="map-mobile" class="map-mobile"> 2088 <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')"> 2089 <div class="pb-2">@Translate("Custom:Propertypage.MobileMap.Button.FullScreen", "Fuld skærm")</div> 2090 <div> 2091 <img src="@(iconPath + "icon-expand.svg")" alt="" aria-hidden="true" /> 2092 </div> 2093 </button> 2094 <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"))"> 2095 <div class="renderMap" id="map-mobile"></div> 2096 </div> 2097 </div> 2098 </section> 2099 } 2100 2101 @*SECTION: Broker mobile*@ 2102 <section class="container broker-mobile d-block d-md-none"> 2103 <div class="broker-card d-flex align-items-center"> 2104 <div class="broker-info"> 2105 @if (employeeItem != null) 2106 { 2107 string image = Converter.ToString(employeeItem["BilledeUrl"]); 2108 <img src="@image" /> 2109 } 2110 <div class="d-flex flex-column justify-content-around"> 2111 @if (!string.IsNullOrEmpty(propBroker?.Employee?.Name)) 2112 { 2113 <div class="bold">@propBroker.Employee.Name</div> 2114 } 2115 else if (!string.IsNullOrEmpty(propBroker?.Broker?.Name)) 2116 { 2117 <div class="bold">@propBroker.Broker.Name</div> 2118 } 2119 @if (!string.IsNullOrEmpty(propBroker?.Employee?.JobTitle)) 2120 { 2121 <div class="regular">@propBroker.Employee.JobTitle</div> 2122 } 2123 else if (!string.IsNullOrEmpty(propBroker?.Broker?.JobTitle)) 2124 { 2125 <div class="regular">@propBroker.Broker.JobTitle</div> 2126 } 2127 </div> 2128 </div> 2129 <div class="broker-interactions"> 2130 <a class="btn btn-orange" href="javascript:panelFremvisning('@origin');">@Translate("Custom.Propertypage.AssetsModal.Header.Showing.ButtonLabel", "Bestil fremvisning")</a> 2131 @if (!string.IsNullOrEmpty(propBroker?.Employee?.PhoneMobile) && Converter.ToBoolean(employeeItem["VisMobilNrPaaSager"])) 2132 { 2133 <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> 2134 } 2135 else if (!string.IsNullOrEmpty(propBroker?.Broker?.Telephone)) 2136 { 2137 <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> 2138 } 2139 </div> 2140 </div> 2141 </section> 2142 2143 @*SECTION: Information*@ 2144 <section id="information-section" class="container information-section" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyFactsSection", "Fakta om boligen"))"> 2145 @{ 2146 int garageArea = GetInteger("Ecom:Product:Field.xEjendomArealerHovedbygningIntegreredeArealerGarage"); 2147 int carportArea = GetInteger("Ecom:Product:Field.xEjendomArealerHovedbygningIntegreredeArealerCarport.Value"); 2148 bool altan = GetBoolean("Ecom:Product:Field.xEjendomFaciliteterAltan"); 2149 } 2150 <div class="information"> 2151 <h2 class="information-header semi-bold">@Translate("Custom.Propertypage.Information.Header", "Fakta om boligen")</h2> 2152 <div class="d-none d-md-block divider-orange mb-4" aria-hidden="true"></div> 2153 <div class="table-wrapper" role="table" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyFactsTable", "Boligfakta tabel"))"> 2154 <div class="table-item d-flex justify-content-between" role="row"> 2155 <div role="cell">@Translate("Custom.Propertypage.Information.Case", "Sagsnummer")</div> 2156 <div role="cell" class="js-sagsnr-val" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.CaseNumber", "Sagsnummer")) @productId">@productId</div> 2157 </div> 2158 @if (!string.IsNullOrEmpty(propTypeDisplay)) 2159 { 2160 <div class="table-item d-flex justify-content-between" role="row"> 2161 <div role="cell">@Translate("Custom.Propertypage.Information.PropertyType", "Boligtype")</div> 2162 <div role="cell" tabindex="0" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.PropertyType", "Boligtype")) @propTypeDisplay">@propTypeDisplay</div> 2163 </div> 2164 } 2165 @if (GetInteger("Ecom:Product:Field.xEjendomArealerBoligAreal") > 0) 2166 { 2167 <div class="table-item d-flex justify-content-between" role="row"> 2168 <div role="cell">@Translate("Custom.Propertypage.Information.Residentialrea", "Boligareal")</div> 2169 <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> 2170 </div> 2171 } 2172 @if (GetInteger("Ecom:Product:Field.xEjendomArealerGrundAreal") > 0) 2173 { 2174 <div class="table-item d-flex justify-content-between" role="row"> 2175 <div role="cell">@Translate("Custom.Propertypage.Information.Landarea", "Grundareal")</div> 2176 <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> 2177 </div> 2178 } 2179 else if (GetInteger("Ecom:Product:Field.xEjendomArealerGrundArealHA") > 0) 2180 { 2181 <div class="table-item d-flex justify-content-between" role="row"> 2182 <div role="cell">@Translate("Custom.Propertypage.Information.Landarea", "Grundareal")</div> 2183 <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> 2184 </div> 2185 } 2186 2187 2188 @if (garageArea > 0 || carportArea > 0) 2189 { 2190 if (garageArea > 0 && carportArea > 0) 2191 { 2192 <div class="table-item d-flex justify-content-between"> 2193 <div>@Translate("Custom.Propertypage.Information.GarageCarport", "Garage/Carport")</div> 2194 <div>@garageArea/@carportArea @Translate("Custom.Propertypage.Units.SquareMeters", "m&sup2")</div> 2195 </div> 2196 } 2197 else if (garageArea > 0 && carportArea <= 0) 2198 { 2199 <div class="table-item d-flex justify-content-between"> 2200 <div>@Translate("Custom.Propertypage.Information.Garage", "Garage")</div> 2201 <div>@garageArea @Translate("Custom.Propertypage.Units.SquareMeters", "m&sup2")</div> 2202 </div> 2203 } 2204 else 2205 { 2206 <div class="table-item d-flex justify-content-between"> 2207 <div>@Translate("Custom.Propertypage.Information.Carport", "Carport")</div> 2208 <div>@carportArea @Translate("Custom.Propertypage.Units.SquareMeters", "m&sup2")</div> 2209 </div> 2210 } 2211 } 2212 @if (altan) 2213 { 2214 <div class="table-item d-flex justify-content-between" role="row"> 2215 <div role="cell">@Translate("Custom.Propertypage.Information.Balkony", "Altan")</div> 2216 <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> 2217 </div> 2218 } 2219 @if (GetInteger("Ecom:Product:Field.xEjendomOpfoertAar") != 0) 2220 { 2221 <div class="table-item d-flex justify-content-between" role="row"> 2222 <div role="cell">@Translate("Custom.Propertypage.Information.BuildRebuild", "Bygget/ombygget")</div> 2223 <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> 2224 </div> 2225 } 2226 @if (GetInteger("Ecom:Product:Field.xEjendomArealerVaerelser") != 0) 2227 { 2228 <div class="table-item d-flex justify-content-between" role="row"> 2229 <div role="cell">@Translate("Custom.Propertypage.Information.Rooms", "Antal rum")</div> 2230 <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> 2231 </div> 2232 } 2233 @if (GetInteger("Ecom:Product:Field.xEjendomArealerEtager") != 0 && (propType != "Ejerlejlighed" && propType != "Andelsbolig")) 2234 { 2235 <div class="table-item d-flex justify-content-between" role="row"> 2236 <div role="cell">@Translate("Custom.Propertypage.Information.Stories", "Etager")</div> 2237 <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> 2238 </div> 2239 } 2240 @if (!string.IsNullOrEmpty(GetString("Ecom:Product:Field.xEjendomEnergiklassifikation"))) 2241 { 2242 <div class="table-item d-flex justify-content-between align-items-center"> 2243 @{ 2244 var scenarioNumber = GetString("Ecom:Product:Field.EnergyLabelScenarioNumber"); 2245 var savings = GetInteger("Ecom:Product:Field.EnergyLabelSavings"); 2246 var energyLink = GetString("Ecom:Product:Field.EnergyLabelLink"); 2247 } 2248 2249 <div @(scenarioNumber == "3" ? "id='energi-kontrol-information'" : "")> 2250 @Translate("Custom.Propertypage.Information.Energy", "Energimærke") 2251 </div> 2252 2253 <div class="energylabel @(scenarioNumber == "2" ? "energy__hover" : "")" 2254 data-energylabel="@HtmlEncoder.HtmlAttributeEncode(GetString("Ecom:Product:Field.xEjendomEnergiklassifikation"))"> 2255 @if (scenarioNumber == "2") 2256 { 2257 <span id="energi-testgruppe-information" class="tooltiptext"> 2258 @if (savings > 0) 2259 { 2260 @string.Format(Translate("Smartpage:Boligvisning.Energimærketekst1-1", "OBS: du kan spare {0} årligt ved at renovere denne bolig - {1}"), savings.ToString("#,##0"), "") 2261 <a target="_blank" href="@(energyLink)&utm_source=realmaeglerne&utm_medium=energimaerke&utm_campaign=testgruppe1">@Translate("Custom.Propertypage.EnergyLabel.Tooltip.Linktext", "klik her")</a> 2262 } 2263 else 2264 { 2265 @string.Format(Translate("Smartpage:Boligvisning.Energimærketekst1-2", "OBS: du kan energi renovere denne bolig {0}"), "") 2266 <a target="_blank" href="@(energyLink)&utm_source=realmaeglerne&utm_medium=energimaerke&utm_campaign=testgruppe1">@Translate("Custom.Propertypage.EnergyLabel.Tooltip.Linktext", "klik her")</a> 2267 } 2268 </span> 2269 } 2270 </div> 2271 </div> 2272 } 2273 </div> 2274 @if (edhFiles.Any()) 2275 { 2276 <div class="table-item"> 2277 <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> 2278 </div> 2279 } 2280 </div> 2281 </section> 2282 @*SECTION: Finance*@ 2283 @if (!bolig.Solgt) 2284 { 2285 2286 string status = GetString("Ecom:Product:Field.xStatus"); 2287 string statusCode = !string.IsNullOrEmpty(status) ? status.Substring(0, 1).ToUpper() : ""; 2288 2289 string brfQuery = $"price={GetInteger("Ecom:Product.DBPrice")}"; 2290 2291 if (propCategory != null) 2292 { 2293 if (propCategory.Contains("Ejerlejlighed", StringComparison.InvariantCultureIgnoreCase)) 2294 { 2295 brfQuery += "&housingType=ejerlejlighed"; 2296 } 2297 else if (propCategory.Contains("Villa", StringComparison.InvariantCultureIgnoreCase) || 2298 propCategory.Contains("Boliglandbrug", StringComparison.InvariantCultureIgnoreCase)) 2299 { 2300 brfQuery += "&housingType=parcelhus"; 2301 } 2302 } 2303 2304 brfQuery += "&partnerID=REM100"; 2305 2306 2307 <section id="finance-section" class="container financing-section"> 2308 <div class="financing d-flex flex-column flex-md-row"> 2309 <div class="financing-bank d-flex flex-column justify-content-center"> 2310 <img src="@(imagePath + "Jyske_Bank_logo1.png")" class="img-fluid logo" /> 2311 <h2 class="section-header mb-0"> 2312 @Translate("Custom.Propertypage.Financing.Bank.Header", "Find den finansiering, der passer dig. Få din drømmebolig til at blive virkelighed") 2313 </h2> 2314 <div class="d-none d-md-block divider-orange mb-4"></div> 2315 <div> 2316 @Translate("Custom.Propertypage.Financing.Bank.SubHeader", "Med en hurtig online vurdering kender du bedre dine muligheder") 2317 </div> 2318 @if (propCategory == "Andelsbolig") 2319 { 2320 <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> 2321 } 2322 else 2323 { 2324 <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> 2325 } 2326 </div> 2327 <div class="financing-table d-flex flex-column"> 2328 <div class="section-header semi-bold mb-0"> 2329 @Translate("Custom.Propertypage.Financing.Table.Header", "Økonomi og boliglån") 2330 </div> 2331 <div class="d-none d-md-block divider-orange mb-4"></div> 2332 <div class="table-wrapper w-100"> 2333 @if (isRental) 2334 { 2335 <div class="table-item d-flex justify-content-between"> 2336 <div>@Translate("Custom.Propertypage.Financing.RentPerMonth", "Leje pr. måned")</div> 2337 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningLejeMaaned.Value.Clean"))</div> 2338 </div> 2339 2340 int usagePerMonth = GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVarmeMaaned.Value.Clean") + GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVandMaaned.Value.Clean") + GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcontoForbrugFri01Beloeb.Value.Clean"); 2341 2342 if (usagePerMonth > 0) 2343 { 2344 <div class="table-item d-flex justify-content-between"> 2345 <div>@Translate("Custom.Propertypage.Financing.UsagePerMonth", "Forbrugsudgift pr. md.")</div> 2346 <div>@FormatPrice(usagePerMonth)</div> 2347 </div> 2348 } 2349 2350 if (GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVarmeMaaned.Value.Clean") > 0) 2351 { 2352 <div class="table-item d-flex justify-content-between"> 2353 <div>@Translate("Custom.Propertypage.Financing.AcontoHeat", "Aconto varme pr. md.")</div> 2354 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVarmeMaaned.Value.Clean"))</div> 2355 </div> 2356 } 2357 2358 if (GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVandMaaned.Value.Clean") > 0) 2359 { 2360 <div class="table-item d-flex justify-content-between"> 2361 <div>@Translate("Custom.Propertypage.Financing.AcontoWater", "Aconto vand pr. md.")</div> 2362 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningAcVandMaaned.Value.Clean"))</div> 2363 </div> 2364 } 2365 2366 if (GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningDepositum") > 0) 2367 { 2368 <div class="table-item d-flex justify-content-between"> 2369 <div>@Translate("Custom.Propertypage.Financing.Deposit", "Depositum")</div> 2370 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningDepositum"))</div> 2371 </div> 2372 } 2373 2374 if (GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningForudbetaltLeje") > 0) 2375 { 2376 <div class="table-item d-flex justify-content-between"> 2377 <div>@Translate("Custom.Propertypage.Financing.Prepayment", "Forudbetalt leje")</div> 2378 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomBoligUdlejningForudbetaltLeje"))</div> 2379 </div> 2380 } 2381 } 2382 else 2383 { 2384 <div class="table-item d-flex justify-content-between"> 2385 @if (propCategory == "Andelsbolig") 2386 { 2387 <div>@Translate("Custom.Propertypage.Financing.Table.Deposit", "Indskud")</div> 2388 } 2389 else 2390 { 2391 <div>@Translate("Custom.Propertypage.Financing.Table.Price", "Kontantpris")</div> 2392 } 2393 <div>@FormatPrice(GetInteger("Ecom:Product.DBPrice"))</div> 2394 </div> 2395 <div class="table-item d-flex justify-content-between"> 2396 <div>@Translate("Custom.Propertypage.Financing.Table.OwnerCost", "Ejerudgift")</div> 2397 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xEjendomEjerudgifterMaanedSum"))</div> 2398 </div> 2399 @if (propCategory != "Andelsbolig") 2400 { 2401 <div class="table-item d-flex justify-content-between"> 2402 <div>@Translate("Custom.Propertypage.Financing.Table.Payout", "Udbetaling")</div> 2403 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xFinansieringUdbetaling"))</div> 2404 </div> 2405 } 2406 <div class="table-item d-flex justify-content-between"> 2407 <div>@Translate("Custom.Propertypage.Financing.Table.Brutto", "Brutto ekskl. ejerudgift")</div> 2408 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xFinansieringBruttoMaaned"))</div> 2409 </div> 2410 <div class="table-item d-flex justify-content-between"> 2411 <div>@Translate("Custom.Propertypage.Financing.Table.Netto", "Netto ekskl. ejerudgift")</div> 2412 <div>@FormatPrice(GetInteger("Ecom:Product:Field.xFinansieringNettoMaaned"))</div> 2413 </div> 2414 } 2415 </div> 2416 </div> 2417 </div> 2418 </section> 2419 } 2420 2421 @*SECTION: Offer*@ 2422 @if (bolig.BudOenskes) 2423 { 2424 <section id="offer-section" class="container offer-section"> 2425 <div class="offer"> 2426 <div class="offer-wrapper d-flex flex-column text-center"> 2427 <h2 class="section-header semi-bold"> 2428 @Translate("Custom.Propertypage.OfferSection.Header", "Har du et bud i tankerne?") 2429 </h2> 2430 <div class="divider-orange d-none d-md-block mx-auto mb-4"></div> 2431 <div class="offer-text d-block d-md-none"> 2432 @Translate("Custom.Propertypage.OfferSection.Text.Mobile", "Jeg vil gerne byde:") 2433 </div> 2434 <div class="offer-container"> 2435 <div class="offer-text d-none d-md-block"> 2436 @Translate("Custom.Propertypage.OfferSection.Text.Desktop", "Jeg byder") 2437 </div> 2438 <input class="form-control js-input-offer text-right" id="offer-input" type="text" /> 2439 <a class="btn btn-orange js-send-offer-to-form" href="javascript:panelMakeAnOffer('@origin');"> 2440 @Translate("Custom.Propertypage.OfferSection.Button.Send", "Send bud") 2441 <img height="20px" width="20px" src="@(iconPath + "icon-arrow-right.svg")" /> 2442 </a> 2443 </div> 2444 <div class="offer-subtext"> 2445 @Translate("Custom.Propertypage.OfferSection.Subtext", "Dit bud er helt uforpligtende") 2446 </div> 2447 </div> 2448 <img class="img-fluid d-none d-md-block" src="@(imagePath + "skriv_din_pris.jpg")" data-fallback="@fallbackImage" onerror="handleImageError(this)" /> 2449 </div> 2450 </section> 2451 } 2452 2453 @*SECTION: Map with filter*@ 2454 @if (hasMapCoordinates) 2455 { 2456 <section class="container map-filter-section js-init-map-onload" data-map-container="map-filter" data-map-pois="true"> 2457 <div class="map-filter-wrapper"> 2458 <h2 class="section-header semi-bold">@Translate("Custom.Propertypage.FilterMap.Header", "Hvor finder jeg?")</h2> 2459 <div class="divider-orange mb-3 d-none d-md-block"></div> 2460 <div class="map-filters d-flex flex-wrap"> 2461 <label class="mapfilter-btn"> 2462 <input type="checkbox" id="shopping" name="mapfilter" class="mapfilter-checkbox" onchange="toggleMapCategory(this.id, this)" checked> 2463 <span>@Translate("Custom.Propertypage.MapFilter.Filter.Shopping", "Indkøb")</span> 2464 </label> 2465 <label class="mapfilter-btn"> 2466 <input type="checkbox" id="schools" name="mapfilter" class="mapfilter-checkbox" onchange="toggleMapCategory(this.id, this)" checked> 2467 <span>@Translate("Custom.Propertypage.MapFilter.Filter.Schools", "Dagtilbud")</span> 2468 </label> 2469 <label class="mapfilter-btn"> 2470 <input type="checkbox" id="health" name="mapfilter" class="mapfilter-checkbox" onchange="toggleMapCategory(this.id, this)" checked> 2471 <span>@Translate("Custom.Propertypage.MapFilter.Filter.Health", "Helbred")</span> 2472 </label> 2473 <label class="mapfilter-btn"> 2474 <input type="checkbox" id="nature" name="mapfilter" class="mapfilter-checkbox" onchange="toggleMapCategory(this.id, this)" checked> 2475 <span>@Translate("Custom.Propertypage.MapFilter.Filter.Nature", "Natur")</span> 2476 </label> 2477 <label class="mapfilter-btn"> 2478 <input type="checkbox" id="transportation" name="mapfilter" class="mapfilter-checkbox" onchange="toggleMapCategory(this.id, this)" checked> 2479 <span>@Translate("Custom.Propertypage.MapFilter.Filter.Transportation", "Transport")</span> 2480 </label> 2481 </div> 2482 </div> 2483 <div id="map-filter-container" class="map-filter"> 2484 <button type="button" class="btn btn-link" onclick="fullScreen('map-filter-container')"> 2485 <div class="pb-2">@Translate("Custom:Propertypage.MobileMap.Button.FullScreen", "Fuld skærm")</div> 2486 <div> 2487 <img src="@(iconPath + "icon-expand.svg")" /> 2488 </div> 2489 </button> 2490 <div class="map h-100 w-100 js-map" data-map-feed="@Converter.ToString(GetPageIdByNavigationTag("MapFeed"))"> 2491 <div class="renderMap" id="map-filter"></div> 2492 </div> 2493 </div> 2494 </section> 2495 } 2496 2497 @*SECTION: Broker*@ 2498 @{ 2499 string brokerUrl = "/" + Converter.ToString(brokerItem["CBMedlemsnummer"]).Substring(1); 2500 string brokerAddress = GetFullAddress(propBroker.Broker); 2501 } 2502 2503 @if (employeeItem != null) 2504 { 2505 <input type="hidden" class="js-hasEmployee" value="true" /> 2506 <section class="container broker-section"> 2507 <div class="broker d-flex flex-column flex-md-row"> 2508 <div class="broker-wrapper d-flex flex-column"> 2509 <h2 class="section-header semi-bold mb-md-0"> 2510 @string.Format(Translate("Custom.Propertypage.BrokerSection.Header", "Har du spørgsmål? Spørg {0}"), propBroker.Employee.FirstName) 2511 </h2> 2512 <div class="divider-orange d-none d-md-block"></div> 2513 <img class="img-fluid d-block d-md-none" src="@employeeItem["BilledeUrl"]" data-fallback="@fallbackImage" onerror="handleImageError(this)" /> 2514 <div class="employee-info d-flex flex-column"> 2515 @if (!string.IsNullOrEmpty(propBroker?.Employee?.Name)) 2516 { 2517 <div class="bold js-maegler-employee-name-val">@propBroker.Employee.Name</div> 2518 } 2519 @if (!string.IsNullOrEmpty(propBroker?.Employee?.JobTitle)) 2520 { 2521 <div class="regular js-maegler-employee-title-val">@propBroker.Employee.JobTitle</div> 2522 } 2523 @if (!string.IsNullOrEmpty(propBroker?.Employee?.Email)) 2524 { 2525 <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> 2526 } 2527 @if (!string.IsNullOrEmpty(propBroker?.Employee?.PhoneMobile) && Converter.ToBoolean(employeeItem["VisMobilNrPaaSager"])) 2528 { 2529 <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> 2530 } 2531 else if (!string.IsNullOrEmpty(propBroker?.Broker?.Telephone)) 2532 { 2533 <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> 2534 } 2535 </div> 2536 <div class="divider-grey"></div> 2537 2538 @if (brokerItem != null) 2539 { 2540 var brokerEmail = Converter.ToString(brokerItem["Email"]); 2541 2542 <div class="broker-info"> 2543 @if (!string.IsNullOrEmpty(propBroker?.Broker?.CompanyName)) 2544 { 2545 <div class="bold js-maegler-name-val">@propBroker.Broker.CompanyName</div> 2546 } 2547 else if (!string.IsNullOrEmpty(propBroker?.Broker?.Name)) 2548 { 2549 <div class="bold js-maegler-name-val">@propBroker.Broker.Name</div> 2550 } 2551 @if (!string.IsNullOrEmpty(brokerAddress)) 2552 { 2553 <div class="regular">@brokerAddress</div> 2554 } 2555 @if (!string.IsNullOrEmpty(brokerEmail)) 2556 { 2557 <div class="regular">@Translate("Custom.Propertypage.BrokerSection.EmployeeInfo.Emailprefix", "Mail:") <a class="btn-link regular" href="mailto:@brokerEmail">@brokerEmail</a></div> 2558 } 2559 @if (!string.IsNullOrEmpty(propBroker?.Broker?.Telephone)) 2560 { 2561 <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> 2562 } 2563 </div> 2564 <span class="js-butikId d-none">@Converter.ToString(employeeItem["CBMedlemsnummer"])</span> 2565 <span class="js-maegler-address-val d-none">@propBroker.Broker.Address</span> 2566 <span class="js-maegler-zip-city-val d-none">@propBroker.Broker.ZipCode @propBroker.Broker.City</span> 2567 } 2568 2569 <div class="broker-buttons d-flex flex-column flex-md-row"> 2570 <a href="@brokerUrl" class="btn btn-blue w-100"> 2571 @Translate("Custom.Propertypage.BrokerSection.BrokerLink.Label", "Vis mæglerens side") 2572 <img height="20px" width="20px" src="@(iconPath + "icon-arrow-right.svg")" /> 2573 </a> 2574 <a class="btn btn-orange w-100" href="javascript:panelFremvisning('@origin');"> 2575 @Translate("Custom.Propertypage.AssetsModal.Header.Showing.ButtonLabel", "Bestil fremvisning") 2576 <img height="20px" width="20px" src="@(iconPath + "icon-arrow-right.svg")" /> 2577 </a> 2578 </div> 2579 </div> 2580 <img class="img-fluid d-none d-md-block" src="@employeeItem["BilledeUrl"]" data-fallback="@fallbackImage" onerror="handleImageError(this)" /> 2581 </div> 2582 </section> 2583 } 2584 2585 @*SECTION: Silmilar properties*@ 2586 @{ 2587 int sliderFeedPageId = GetPageIdByNavigationTag("PropertySlider"); 2588 } 2589 @if (sliderFeedPageId > 0) 2590 { 2591 <section class="container property-slider-section"> 2592 <div class="d-flex flex-column justify-content-center align-content-center"> 2593 <h2 class="property-slider-header">@Translate("Custom.PropertySlider.Header", "Se lignende boliger")</h2> 2594 <div class="property-slider-subheader">@Translate("Custom.PropertySlider.Subheader", "- måske gemmer din drømmebolig sig her?")</div> 2595 </div> 2596 <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"> 2597 <div class="property-slider-skeleton"> 2598 </div> 2599 </div> 2600 </section> 2601 } 2602 @*SECTION: Goldbuyer*@ 2603 @{ 2604 var becomeGoldBuyerLink = Dynamicweb.Frontend.PageView.Current().AreaSettings.GetRawValueString("BecomeGoldBuyerLink", ""); 2605 } 2606 2607 @if (!string.IsNullOrEmpty(becomeGoldBuyerLink)) 2608 { 2609 <section class="container goldbuyer-section"> 2610 <div class="goldbuyer"> 2611 <div class="goldbuyer-wrapper d-flex flex-column"> 2612 <h2 class="section-header semi-bold text-left mb-md-0"> 2613 @Translate("Custom.Propertypage.GoldBuyerSection.Header", "Guldkøber&reg;") 2614 </h2> 2615 <div class="divider-orange d-none d-md-block"></div> 2616 <div class="section-usps"> 2617 <div class="d-flex"> 2618 <img class="circle-gold mr-2" height="24px" width="24px" src="@(iconPath + "icon-check.svg")" /> 2619 @Translate("Custom.Propertypage.GoldBuyerSection.Usp1", "Få besked, når en bolig matcher dine ønsker.") 2620 </div> 2621 <div class="d-flex"> 2622 <img class="circle-gold mr-2" height="24px" width="24px" src="@(iconPath + "icon-check.svg")" /> 2623 @Translate("Custom.Propertypage.GoldBuyerSection.Usp2", "Vi overvåger markedet for dig.") 2624 </div> 2625 <div class="d-flex"> 2626 <img class="circle-gold mr-2" height="24px" width="24px" src="@(iconPath + "icon-check.svg")" /> 2627 @Translate("Custom.Propertypage.GoldBuyerSection.Usp3", "Få et nemt køb.") 2628 </div> 2629 </div> 2630 <a class="btn btn-gold align-self-center align-self-md-start" href="/Default.aspx?ID=@becomeGoldBuyerLink"> 2631 @Translate("Custom.Propertypage.GoldBuyerSection.ButtonLabel", "Bliv guldkøber") 2632 <img height="20px" width="20px" src="@(iconPath + "icon-arrow-right.svg")" /> 2633 </a> 2634 </div> 2635 <img class="img-fluid d-none d-md-block" src="@(imagePath + "goldbuyer.jpg")" data-fallback="@fallbackImage" onerror="handleImageError(this)" /> 2636 </div> 2637 </section> 2638 } 2639 2640 @*SECTION: Buyer Advice*@ 2641 @{ 2642 var rmBuyingAdvicePageId = Dynamicweb.Frontend.PageView.Current().AreaSettings.GetRawValueString("RMBuyingAdviceMasterPageID", ""); 2643 } 2644 2645 @if (!string.IsNullOrEmpty(rmBuyingAdvicePageId)) 2646 { 2647 <section class="container buyeradvice-section"> 2648 <div class="buyeradvice"> 2649 <img class="img-fluid d-none d-md-block" src="@(imagePath + "buyeradvice.jpg")" data-fallback="@fallbackImage" onerror="handleImageError(this)" /> 2650 <div class="buyeradvice-wrapper d-flex flex-column"> 2651 <h2 class="section-header semi-bold text-left mb-md-0"> 2652 @Translate("Custom.Propertypage.BuyerAdviceSection.Header", "Køber du hos anden mægler? Få ærlig køberrådgivning") 2653 </h2> 2654 <div class="divider-orange d-none d-md-block"></div> 2655 <div class="section-usps"> 2656 <div class="d-flex"> 2657 <img class="circle-blue mr-2" height="24px" width="24px" src="@(iconPath + "icon-check.svg")" /> 2658 @Translate("Custom.Propertypage.BuyerAdviceSection.Usp1", "Vi gennemgår købsaftale, skøde og finansiering, så du undgår skjulte faldgruber og dyre fejl.") 2659 </div> 2660 <div class="d-flex"> 2661 <img class="circle-blue mr-2" height="24px" width="24px" src="@(iconPath + "icon-check.svg")" /> 2662 @Translate("Custom.Propertypage.BuyerAdviceSection.Usp2", "Du får en dedikeret køberrådgiver, som kun arbejder for dig – ikke sælger.") 2663 </div> 2664 <div class="d-flex"> 2665 <img class="circle-blue mr-2" height="24px" width="24px" src="@(iconPath + "icon-check.svg")" /> 2666 @Translate("Custom.Propertypage.BuyerAdviceSection.Usp3", "Vi kan forhandle på dine vegne og ofte skaffe bedre pris, vilkår eller overtagelsesdato.") 2667 </div> 2668 </div> 2669 <a class="btn btn-blue align-self-center align-self-md-start" href="/Default.aspx?ID=@rmBuyingAdvicePageId"> 2670 @Translate("Custom.Propertypage.BuyerAdviceSection.ButtonLabel", "Sådan hjælper køberrådgivning dig") 2671 <img height="20px" width="20px" src="@(iconPath + "icon-arrow-right.svg")" /> 2672 </a> 2673 </div> 2674 </div> 2675 </section> 2676 } 2677 <div id="sticky-sales-assessment-button" class="sales-assessment-mobile d-block d-md-none"> 2678 <a class="btn btn-blue" href="javascript:panelSalgsvurdering('@origin');">@Translate("Custom.Propertypage.SalesAssessment.ButtonLabel", "Bestil salgsvurdering")</a> 2679 </div> 2680 </div> 2681 <!--PANELS--> 2682 @{ 2683 var settingsPersondatapolitik = settingsItem != null ? settingsItem["Persondatapolitik"] : ""; 2684 var termsMail = Dynamicweb.Frontend.PageView.Current().AreaSettings.GetRawValueString("TermsEmail", ""); 2685 var userId = Dynamicweb.Security.UserManagement.UserContext.Current.UserId; 2686 var user = Dynamicweb.Security.UserManagement.UserContext.Current.User; 2687 string brokerName = !string.IsNullOrEmpty(propBroker?.Broker?.CompanyName) ? propBroker.Broker.CompanyName : propBroker.Broker.Name; 2688 } 2689 2690 <div id="panel-book-showing" class="panel panel-form" role="dialog" aria-modal="true" aria-labelledby="book-showing-title"> 2691 <button type="button" class="close" data-dismiss="panel-form" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.CloseForm", "Luk formular"))"> 2692 <b></b> 2693 </button> 2694 <h2 id="book-showing-title" class="js-showing-header">@Translate("form-fremvisning-titel", "Bestil fremvisning")</h2> 2695 <p>@Translate("form-fremvisning-beskrivelse", "")</p> 2696 <form id="book-showing" method="POST" action="/InboxHandler"> 2697 <div class="form-group"> 2698 <label><strong>@Translate("form-navn", "Navn")*</strong></label> 2699 <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"))" /> 2700 </div> 2701 <div class="form-group"> 2702 <label><strong>@Translate("form-email", "E-mail")*</strong></label> 2703 <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"))" /> 2704 </div> 2705 <div class="form-group row"> 2706 <div class="col-6"> 2707 <label><strong>@Translate("form-mobile", "Mobil nr.")*</strong></label> 2708 <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"))" /> 2709 </div> 2710 <div class="col-6"> 2711 <label><strong>@Translate("form-telephone", "Telefon nr.")</strong></label> 2712 <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"))" /> 2713 </div> 2714 </div> 2715 2716 <div class="form-group"> 2717 <label><strong>@Translate("form-tidspunkt", "Tidspunkt")*</strong></label> 2718 <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"))" /> 2719 </div> 2720 <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"))"> 2721 <strong class="f-12"><i class="fas fa-plus"></i> @Translate("Smartpage:.Skrivenkommentar", "Skriv en kommentar")</strong> 2722 </button> 2723 <div class="collapse" id="bookshowing-collapse"> 2724 <div class="form-group"> 2725 <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> 2726 </div> 2727 </div> 2728 2729 <div class="form-group"> 2730 <div class="row"> 2731 <div class="col-12"> 2732 <button type="submit" class="btn btn-green btn-block js-showing-btn">@Translate("form-fremvisning-submitbtn", "Bestil fremvisning")</button> 2733 </div> 2734 </div> 2735 </div> 2736 <div class="form-group form-group-terms"> 2737 @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) 2738 </div> 2739 <input type="hidden" name="kontaktmigok" value="true" /> 2740 <input type="hidden" name="fn" value="bf" /> 2741 <input type="hidden" name="origin" value="" /> 2742 <input type="hidden" name="brugerId" value="@userId" /> 2743 <input type="hidden" name="sagsnr" value="@productId" /> 2744 <input type="hidden" name="productid" value="@productId" /> 2745 <input type="hidden" name="eadresse" value="@HtmlEncoder.HtmlAttributeEncode(GetString("Ecom:Product:Field.xEjendomAdresseAdresseLinie"))" /> 2746 <input type="hidden" name="epostnrby" value="@HtmlEncoder.HtmlAttributeEncode(GetString("Ecom:Product:Field.xEjendomAdressePostAdresseLinie"))" /> 2747 <input type="hidden" name="areaid" value="@Pageview.AreaID" /> 2748 <input type="hidden" name="bnavn" value="@HtmlEncoder.HtmlAttributeEncode(brokerName)" /> 2749 <input type="hidden" name="greenmobility" value="@Converter.ToString(isValidForGreenMobility)" /> 2750 <input class="js-online-showing" type="hidden" name="onlineShowing" value="" /> 2751 @if (employeeItem != null) 2752 { 2753 <input type="hidden" name="butikId" value="@HtmlEncoder.HtmlAttributeEncode(Converter.ToString(employeeItem["CBMedlemsnummer"]))" /> 2754 2755 <input type="hidden" name="mnavn" value="@HtmlEncoder.HtmlAttributeEncode(propBroker.Employee.Name)" /> 2756 if (!string.IsNullOrEmpty(propBroker.Employee.PhoneMobile) && Converter.ToBoolean(employeeItem["VisMobilNrPaaSager"])) 2757 { 2758 <input type="hidden" name="mtelefonnummer" value="@HtmlEncoder.HtmlAttributeEncode(propBroker.Employee.PhoneMobile)" /> 2759 } 2760 else 2761 { 2762 2763 <input type="hidden" name="mtelefonnummer" value="@HtmlEncoder.HtmlAttributeEncode(propBroker.Broker.Telephone)" /> 2764 } 2765 2766 <input type="hidden" name="memail" value="@RealMaeglerne.Library.Helper.ExtractMaskedEmail(propBroker.Employee.Email)" /> 2767 2768 } 2769 </form> 2770 <div id="book-showing-thanks" style="display:none;" role="status" aria-live="polite" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.ThankYouMessage", "Tak besked"))"> 2771 <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> 2772 </div> 2773 </div> 2774 2775 <div id="panel-sales-documents" class="panel panel-form" role="dialog" aria-modal="true" aria-labelledby="sales-documents-title"> 2776 <button type="button" class="close" data-dismiss="panel-form" aria-label="@HtmlEncoder.HtmlAttributeEncode(Translate("Custom:Accessibility.CloseForm", "Luk formular"))"> 2777 <b></b> 2778 </button> 2779 2780 <h2 id="sales-documents-title">@Translate("form-salgsopstilling-titel", "Bestil Salgsopstilling")</h2> 2781 2782 <p>@Translate("form-salgsopstilling-beskrivelse", "")</p> 2783 <form id="order-sales-documents" method="POST" action="/InboxHandler"> 2784 <div class="form-group"> 2785 <label><strong>@Translate("form-navn", "Navn")*</strong></label> 2786 <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 /> 2787 </div> 2788 <div class="form-group"> 2789 <label><strong>@Translate("form-email", "E-mail")*</strong></label> 2790 <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 /> 2791 </div> 2792 <div class="form-group row"> 2793 <div class="col-6"> 2794 <label><strong>@Translate("form-mobile", "Mobil nr.")*</strong></label> 2795 <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 /> 2796 </div> 2797 <div class="col-6"> 2798 <label><strong>@Translate("form-telephone", "Telefon nr.")</strong></label> 2799 <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)" /> 2800 </div> 2801 </div> 2802 <div class="form-group"> 2803 <div class="checkbox"> 2804 <label> 2805 <input type="checkbox" name="kontaktmigok" /> 2806 <span>@Translate("form-contactpermission-real", "Ja tak, RealMæglerne må gerne kontakte mig. *")</span> 2807 </label> 2808 </div> 2809 </div> 2810 <div class="form-group"> 2811 <div class="row"> 2812 <div class="col-12"> 2813 <button type="submit" class="btn btn-green btn-block">@Translate("form-salgsopstilling-submitbtn", "Bestil salgsopstilling")</button> 2814 </div> 2815 </div> 2816 </div> 2817 2818 2819 <div class="form-group form-group-terms"> 2820 @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) 2821 </div> 2822 <input type="hidden" name="fn" value="bs" /> 2823 <input type="hidden" name="origin" value="" /> 2824 <input type="hidden" name="sagsnr" value="@productId" /> 2825 <input type="hidden" name="brugerId" value="@userId" /> 2826 <input type="hidden" name="areaid" value="@Pageview.AreaID" /> 2827 <input type="hidden" name="butikId" value="@HtmlEncoder.HtmlAttributeEncode(Converter.ToString(employeeItem["CBMedlemsnummer"]))" /> 2828 <input type="hidden" name="productId" value="@productId" /> 2829 </form> 2830 <div id="download-sales-documents" style="display:none;"> 2831 <p>@Translate("form-salgsopstilling-downloadbeskrivelse", "Tak for din interesse")</p> 2832 <br /> 2833 @foreach (var item in edhFiles) 2834 { 2835 if (item.Value.ToLower() == "salgsopstilling") 2836 { 2837 <a href="@item.Key" class="btn btn-primary link" target="_blank">@Translate("form-salgsopstilling-download", "Hent") @item.Value</a> 2838 <br /><br /> 2839 } 2840 } 2841 </div> 2842 </div> 2843 2844 <div id="panel-makeanoffer" class="panel panel-form"> 2845 <button type="button" class="close" data-dismiss="panel-form" aria-label="@HtmlEncoder.HtmlAttributeEncode(@Translate("Custom:Accessiblity.OfferPanel.Close","Luk"))"> 2846 <b></b> 2847 </button> 2848 2849 <h2>@Translate("Smartpage:MakeAnOffer.Title", "Skriv din pris")</h2> 2850 2851 <form id="make-an-offer" method="POST" action="/InboxHandler"> 2852 <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> 2853 <div class="form-group"> 2854 <label><strong>@Translate("Smartpage:MakeAnOffer.Price", "Prisforslag")*</strong></label> 2855 @*checkmark*@ 2856 <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") )" /> 2857 </div> 2858 <div class="form-group"> 2859 <label><strong>@Translate("form-navn", "Navn")*</strong></label> 2860 <input class="form-control" type="text" name="navn" placeholder="@Dynamicweb.Core.Encoders.HtmlEncoder.HtmlAttributeEncode(Translate("form-navn", "Navn") )" value="@HtmlEncoder.HtmlAttributeEncode(user?.UserName)" /> 2861 </div> 2862 <div class="form-group"> 2863 <label><strong>@Translate("form-email", "E-mail")*</strong></label> 2864 <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)" /> 2865 </div> 2866 <div class="form-group"> 2867 <label><strong>@Translate("form-telephone", "Telefon nr.")*</strong></label> 2868 <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)" /> 2869 </div> 2870 <div class="form-group"> 2871 <div class="checkbox"> 2872 <label> 2873 <input type="checkbox" name="kontaktmigok" /> 2874 <span>@Translate("form-contactpermission-real", "Ja tak, RealMæglerne må gerne kontakte mig. *")</span> 2875 </label> 2876 </div> 2877 </div> 2878 <div class="form-group"> 2879 <div class="row"> 2880 <div class="col-12"> 2881 <button type="submit" class="btn btn-green btn-block">@Translate("Smartpage:MakeAnOffer.Button.Text", "Send mit bud")</button> 2882 </div> 2883 </div> 2884 </div> 2885 2886 2887 <div class="form-group form-group-terms"> 2888 @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 ") 2889 <a href="mailto:@termsMail">@termsMail</a>. 2890 @Translate("Smartpage:MakeAnOffer.TermsAndConditions.ReadMoreOn", "Læs mere på") <a href="@settingsPersondatapolitik">@Translate("Smartpage:MakeAnOffer.TermsAndConditions.PrivacyPolicy", "privatlivspolitikkerne")</a>. 2891 </div> 2892 <input type="hidden" name="fn" value="skp" /> 2893 <input type="hidden" name="origin" value="" /> 2894 <input type="hidden" name="sagsnr" value="@productId" /> 2895 <input type="hidden" name="brugerId" value="@userId" /> 2896 <input type="hidden" name="areaid" value="@Pageview.AreaID" /> 2897 <input type="hidden" name="butikId" value="@HtmlEncoder.HtmlAttributeEncode(Converter.ToString(employeeItem["CBMedlemsnummer"]))" /> 2898 </form> 2899 <div class="js-thank-you-message" style="display:none;"> 2900 <p>@Translate("Smartpage:MakeAnOffer.ThankYouMessage", "Tak for dit bud. Du vil hurtigst muligt blive kontaktet af mægler. Tak for din interesse.")</p> 2901 </div> 2902 </div> 2903 2904 <script type="text/javascript" src="/Files/Templates/Designs/rm/assets/dist/bundle.boligside.min.js"></script> 2905 <script> 2906 2907 2908 document.addEventListener("DOMContentLoaded", () => { 2909 checkIfStuck("[propertypage-anchor]"); 2910 initHiddenStickyElements("sticky-sales-assessment-button", "description-section"); 2911 initImageNavigation('.blueprints', { imageSelector: '.blueprints-wrapper img', buttonIdPostFix: '-blueprints', threshold: 1, scrollDirection: 'horizontal' }); 2912 initImageNavigation('.usps', { imageSelector: '.usp-item', buttonIdPostFix: '-usps', threshold: 1, scrollDirection: 'horizontal' }); 2913 syncSelectors('openhouse-selector-desktop', 'openhouse-selector-mobile'); 2914 initSliderObserver('property-slider'); 2915 initMetricsSlider('.js-popular-metrics-wrapper', '.popular-metric'); 2916 }) 2917 2918 function initSliderObserver(sliderElementId) { 2919 2920 const sliderElement = document.getElementById(sliderElementId); 2921 2922 const observer = new IntersectionObserver((entries) => { 2923 entries.forEach(entry => { 2924 if (entry.isIntersecting) { 2925 addSlider(entry); 2926 observer.unobserve(entry.target); 2927 } 2928 }); 2929 }, { 2930 root: null, 2931 threshold: 0.1 2932 }); 2933 2934 // Observe elements 2935 observer.observe(sliderElement); 2936 } 2937 2938 async function addSlider(entry) { 2939 const sliderFeedId = entry.target.dataset.sliderFeed; 2940 2941 if (sliderFeedId != null) { 2942 const params = new URLSearchParams({ ID: sliderFeedId }); 2943 2944 const zipCode = entry.target.dataset.zipCode; 2945 if (zipCode) { 2946 params.set('zipcodefrom', zipCode); 2947 params.set('zipcodeto', zipCode); 2948 } 2949 2950 const propertyCategory = entry.target.dataset.propertyCategory; 2951 if (propertyCategory) { 2952 params.set('propertycategory', propertyCategory); 2953 } 2954 2955 const url = `/Default.aspx?${params}`; 2956 2957 try { 2958 const result = await fetch(url); 2959 if (!result.ok) throw new Error('Network response was not ok'); 2960 const response = await result.text(); 2961 entry.target.innerHTML = response; 2962 } catch (error) { 2963 console.error('Error loading slider:', error); 2964 entry.target.innerHTML = '<p>@Dynamicweb.Core.Encoders.HtmlEncoder.JavaScriptStringEncode(Translate("Custom.Propertypage.PropertySlider.ErrorMessage", "Failed to load content"))</p>'; 2965 } 2966 } 2967 2968 } 2969 2970 function initMetricsSlider(wrapperElement, children) { 2971 document.querySelectorAll(wrapperElement).forEach(wrapper => { 2972 const metrics = wrapper.querySelectorAll(children); 2973 2974 // Skip if only one metric 2975 if (metrics.length <= 1) return; 2976 2977 // Measure widths 2978 const widths = []; 2979 metrics.forEach(metric => { 2980 widths.push(metric.offsetWidth); 2981 }); 2982 2983 // Setup wrapper 2984 wrapper.style.width = widths[0] + 'px'; 2985 wrapper.style.transition = 'width 1s ease-in-out'; 2986 2987 // Setup metrics 2988 metrics.forEach((metric, index) => { 2989 metric.style.position = 'absolute'; 2990 metric.style.top = '0'; 2991 metric.style.left = '0'; 2992 metric.style.transition = 'opacity 1s ease-in-out'; 2993 metric.style.opacity = index === 0 ? '1' : '0'; 2994 }); 2995 2996 // Animation loop 2997 let current = 0; 2998 setInterval(() => { 2999 const next = (current + 1) % metrics.length; 3000 3001 // Fade out current, fade in next 3002 metrics[current].style.opacity = '0'; 3003 metrics[next].style.opacity = '1'; 3004 3005 // Change width 3006 wrapper.style.width = widths[next] + 'px'; 3007 3008 current = next; 3009 }, 4000); 3010 }); 3011 } 3012 3013 function syncSelectors(firstSelectorId, secondSelectorId) { 3014 const select1 = document.getElementById(firstSelectorId); 3015 const select2 = document.getElementById(secondSelectorId); 3016 3017 if (select1 && select2) { 3018 select1.addEventListener('change', function () { 3019 select2.value = this.value; 3020 }); 3021 3022 select2.addEventListener('change', function () { 3023 select1.value = this.value; 3024 }); 3025 } 3026 } 3027 3028 function stopPropagation(event) { 3029 event.stopPropagation(); 3030 } 3031 3032 function fullScreen(elementId) { 3033 const element = document.getElementById(elementId); 3034 3035 if (element) { 3036 3037 if (element.classList.contains('full-screen')) { 3038 element.classList.remove('full-screen'); 3039 } else { 3040 element.classList.add('full-screen'); 3041 } 3042 } 3043 } 3044 3045 function checkIfStuck(stickyElementSelector) { 3046 const stickyElement = document.querySelector(stickyElementSelector); 3047 const stickyTop = parseInt(getComputedStyle(stickyElement).top) || 0; 3048 3049 const observer = new IntersectionObserver( 3050 ([entry]) => { 3051 const targetTop = entry.boundingClientRect.top; 3052 3053 if (targetTop <= stickyTop) { 3054 stickyElement.classList.add('is-stuck'); 3055 } else { 3056 stickyElement.classList.remove('is-stuck'); 3057 } 3058 }, 3059 { 3060 threshold: [1], 3061 rootMargin: `-${stickyTop + 1}px 0px 0px 0px` 3062 } 3063 ); 3064 3065 observer.observe(stickyElement); 3066 } 3067 3068 function initHiddenStickyElements(stickyElementId, triggerElementId) { 3069 const stickyElement = document.getElementById(stickyElementId); 3070 const sentinel = document.getElementById(triggerElementId); 3071 3072 if (stickyElement && sentinel) { 3073 const observer = new IntersectionObserver((entries) => { 3074 entries.forEach(entry => { 3075 if (entry.boundingClientRect.top <= 0) { 3076 stickyElement.classList.add('visible'); 3077 } else { 3078 stickyElement.classList.remove('visible'); 3079 } 3080 }); 3081 }, { 3082 threshold: 1, 3083 rootMargin: '0px' 3084 }); 3085 3086 observer.observe(sentinel); 3087 } 3088 else { 3089 console.debug("Elements not found in initHiddenStickyElements using stickyElementId: ", stickyElementId, " and triggerElementId: ", triggerElementId); 3090 } 3091 } 3092 3093 function shareProperty(event, clickedButton) { 3094 event.preventDefault(); 3095 3096 const shareData = { 3097 title: document.title, 3098 text: clickedButton.dataset.shareText, 3099 url: window.location.href 3100 }; 3101 3102 if (navigator.share && navigator.canShare && navigator.canShare(shareData)) { 3103 navigator.share(shareData); 3104 } else { 3105 navigator.clipboard.writeText(window.location.href).then(() => { 3106 const alertText = clickedButton.dataset.alertText || 'Link copied to clipboard!'; 3107 alert(alertText); 3108 }); 3109 } 3110 } 3111 3112 function scrollToElementById(id, block = "start") { 3113 var element = document.getElementById(id); 3114 if (element) { 3115 element.scrollIntoView({ behavior: "smooth", block: block, container: "nearest" }); 3116 } 3117 } 3118 3119 function initImageNavigation(parentSelector, options = {}) { 3120 // Default configuration 3121 const config = { 3122 imageSelector: 'img', 3123 nextButtonId: 'image-next', 3124 prevButtonId: 'image-prev', 3125 buttonIdPostFix: '', 3126 storageKey: 'currentImageIndex_' + parentSelector, 3127 threshold: 0.8, 3128 scrollBehavior: 'smooth', 3129 scrollDirection: 'vertical', // 'vertical' or 'horizontal' 3130 ...options 3131 }; 3132 3133 // Get parent element 3134 const parent = document.querySelector(parentSelector); 3135 3136 if (!parent) { 3137 console.warn(`Parent element "${parentSelector}" not found`); 3138 return null; 3139 } 3140 3141 // Get images within parent 3142 const images = parent.querySelectorAll(config.imageSelector); 3143 if (images.length === 0) { 3144 console.warn(`No images found in "${parentSelector}"`); 3145 return null; 3146 } 3147 3148 let currentVisibleIndex = 0; 3149 let lastDirection = null; // Track navigation direction: 'forward' or 'backward' 3150 let visibleIndices = new Set(); // Persistent set of all visible image indices 3151 3152 // Set up Intersection Observer 3153 const observer = new IntersectionObserver((entries) => { 3154 // Update the set based on what changed 3155 entries.forEach(entry => { 3156 const index = Array.from(images).indexOf(entry.target); 3157 3158 if (entry.isIntersecting) { 3159 visibleIndices.add(index); 3160 } else { 3161 visibleIndices.delete(index); 3162 } 3163 }); 3164 3165 if (visibleIndices.size > 0) { 3166 const visibleArray = Array.from(visibleIndices); 3167 3168 // Check for boundary cases first 3169 if (visibleIndices.has(images.length - 1)) { 3170 // Last image is visible - set to MIN (prepare for backward movement) 3171 currentVisibleIndex = Math.min(...visibleArray); 3172 lastDirection = 'backward'; 3173 } else if (visibleIndices.has(0)) { 3174 // First image is visible - set to MAX (prepare for forward movement) 3175 currentVisibleIndex = Math.max(...visibleArray); 3176 lastDirection = 'forward'; 3177 } else { 3178 // Middle of the list - use direction logic 3179 if (lastDirection === 'forward') { 3180 currentVisibleIndex = Math.max(...visibleArray); 3181 } else if (lastDirection === 'backward') { 3182 currentVisibleIndex = Math.min(...visibleArray); 3183 } else { 3184 // Default to min when no direction set (initial load) 3185 currentVisibleIndex = Math.min(...visibleArray); 3186 } 3187 } 3188 3189 if (config.storageKey) { 3190 localStorage.setItem(config.storageKey, currentVisibleIndex); 3191 } 3192 3193 updateButtonStates(); 3194 } 3195 }, { 3196 root: null, 3197 threshold: config.threshold 3198 }); 3199 3200 // Observe all images 3201 images.forEach(img => observer.observe(img)); 3202 3203 function updateButtonStates() { 3204 const nextButton = parent.querySelector('#' + config.nextButtonId + config.buttonIdPostFix); 3205 const prevButton = parent.querySelector('#' + config.prevButtonId + config.buttonIdPostFix); 3206 3207 if (nextButton) { 3208 // Disable if last image is visible 3209 if (visibleIndices.has(images.length - 1)) { 3210 nextButton.classList.add('disabled'); 3211 } else { 3212 nextButton.classList.remove('disabled'); 3213 } 3214 } 3215 3216 if (prevButton) { 3217 // Disable if first image is visible 3218 if (visibleIndices.has(0)) { 3219 prevButton.classList.add('disabled'); 3220 } else { 3221 prevButton.classList.remove('disabled'); 3222 } 3223 } 3224 } 3225 3226 // Helper function to scroll to specific image 3227 function scrollToImage(index, direction) { 3228 if (index >= 0 && index < images.length) { 3229 lastDirection = direction; 3230 3231 const scrollOptions = { 3232 behavior: config.scrollBehavior 3233 }; 3234 3235 // Set scroll alignment based on direction 3236 if (config.scrollDirection === 'horizontal') { 3237 scrollOptions.inline = 'start'; 3238 scrollOptions.block = 'nearest'; 3239 } else { 3240 scrollOptions.block = 'start'; 3241 scrollOptions.inline = 'nearest'; 3242 } 3243 3244 images[index].scrollIntoView(scrollOptions); 3245 currentVisibleIndex = index; 3246 3247 if (config.storageKey) { 3248 localStorage.setItem(config.storageKey, index); 3249 } 3250 3251 updateButtonStates(); 3252 } 3253 } 3254 3255 // Set up navigation buttons 3256 const nextButton = parent.querySelector('#' + config.nextButtonId + config.buttonIdPostFix); 3257 const prevButton = parent.querySelector('#' + config.prevButtonId + config.buttonIdPostFix); 3258 3259 const handleNext = () => { 3260 const nextIndex = Math.min(currentVisibleIndex + 1, images.length - 1); 3261 scrollToImage(nextIndex, 'forward'); 3262 }; 3263 3264 const handlePrev = () => { 3265 const prevIndex = Math.max(currentVisibleIndex - 1, 0); 3266 scrollToImage(prevIndex, 'backward'); 3267 }; 3268 3269 if (nextButton) { 3270 nextButton.addEventListener('click', handleNext); 3271 } else { 3272 console.warn(`Next button "${config.nextButtonId}" not found`); 3273 } 3274 3275 if (prevButton) { 3276 prevButton.addEventListener('click', handlePrev); 3277 } else { 3278 console.warn(`Prev button "${config.prevButtonId}" not found`); 3279 } 3280 3281 // Initialize button states 3282 updateButtonStates(); 3283 } 3284 3285 function handleError(img) { 3286 const fallback = img.dataset.fallback; 3287 if (fallback.length) { 3288 img.src = fallback; 3289 } 3290 } 3291 </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.