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