Søg bolig
0 Boliger til salg
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°")</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°")</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°")</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²") 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²") 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²")</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²")</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²")</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²")</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²")</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®") 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.%+-]+@[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.%+-]+@[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.%+-]+@[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>