Error executing template "Designs/Atag/eCom7/CartV2/Step/AW_CustomerInformation.cshtml" System.NullReferenceException: Object reference not set to an instance of an object. at CompiledRazorTemplates.Dynamic.RazorEngine_1fa54fe5a5c14acc94fc0814110e617e.Execute() in D:\inetpub\wwwroot\www.warmgarant.nl\Files\Templates\Designs\Atag\eCom7\CartV2\Step\AW_CustomerInformation.cshtml:line 12 at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer) at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter) at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @using Warmgarant.Shop.Repository.Helpers 2 @using Warmgarant.Shop.Models.Constants 3 @using Warmgarant.Shop.Models.Enumerations 4 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 5 @{ 6 var areaId = Dynamicweb.Frontend.PageView.Current().AreaID; 7 var currentOrder = OrderHelper.GetCurrentOrder("", areaId); 8 9 var orderTypeValue = GetString("OrderType.Clean"); 10 if (string.IsNullOrWhiteSpace(orderTypeValue)) 11 { 12 orderTypeValue = (string)currentOrder.OrderFieldValues.GetOrderFieldValue(StringConstants.OrderFields.OrderType).Value; 13 } 14 var orderType = OrderType.Unknown; 15 Enum.TryParse(orderTypeValue, out orderType); 16 17 // tramline 18 string currentStation = "YourInfo"; 19 string[] activeStations = new string[] { "YourChoice", "YourInfo" }; 20 string[] tramStations = new string[] { "YourChoice", "YourInfo", "InstallationDate", "Payment", "Confirmation" }; 21 22 var assemblePageId = ""; 23 if (orderType.Equals(OrderType.Rent)) 24 { 25 assemblePageId = AreaHelper.GetAreaItemStringValueBySystemName(StringConstants.WebsiteConfiguration.RentalsAssemblePageId); 26 } 27 else 28 { 29 assemblePageId = AreaHelper.GetAreaItemStringValueBySystemName(StringConstants.WebsiteConfiguration.SalesAssemblePageId); 30 } 31 } 32 <section class="content content--no-bottom-margin tramline background--tint-1"> 33 <div class="content__container tramline__wrapper"> 34 @NavigationHelper.GetBreadCrumb() 35 @using Warmgarant.Shop.Repository.Helpers 36 @using Warmgarant.Shop.Models.Constants 37 @using Warmgarant.Shop.Models.Enumerations 38 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 39 @functions { 40 public string GetStation(string station, int currentStep, Dynamicweb.Ecommerce.Orders.Order currentOrder) 41 { 42 var previousStep = currentStep - 1; 43 var nextStep = currentStep + 1; 44 45 var orderTypeValue = GetString("OrderType.Clean"); 46 47 if (string.IsNullOrWhiteSpace(orderTypeValue)) 48 { 49 orderTypeValue = (string)currentOrder.OrderFieldValues.GetOrderFieldValue(StringConstants.OrderFields.OrderType).Value; 50 } 51 var orderType = OrderType.Unknown; 52 Enum.TryParse(orderTypeValue, out orderType); 53 54 var orderStateName = GetString("Ecom:Order:Orderstate.Name"); 55 56 switch (station) 57 { 58 case "YourChoice": 59 var returnPageId = ""; 60 if (orderType.Equals(OrderType.Rent)) 61 { 62 returnPageId = AreaHelper.GetAreaItemStringValueBySystemName(StringConstants.WebsiteConfiguration.RentalsAssemblePageId); 63 } 64 else 65 { 66 returnPageId = AreaHelper.GetAreaItemStringValueBySystemName(StringConstants.WebsiteConfiguration.SalesAssemblePageId); 67 } 68 if (!string.IsNullOrEmpty(returnPageId) && !Equals(returnPageId, Dynamicweb.Frontend.PageView.Current().Page.ID.ToString()) && !Equals(orderStateName, "Completed")) 69 { 70 return $"<a href=\"/Default.aspx?ID={returnPageId}\">{Translate($"Tramline_{station}", station)}</a>"; 71 } 72 else 73 { 74 return Translate($"Tramline_{station}", station); 75 } 76 case "YourInfo": 77 if (currentStep > 0 && currentStep < 3) 78 { 79 return $"<a href=\"/Default.aspx?ID={Dynamicweb.Frontend.PageView.Current().Page.ID}&CartV2.GotoStep0=true\">{Translate($"Tramline_{station}", station)}</a>"; 80 } 81 else 82 { 83 return Translate($"Tramline_{station}", station); 84 } 85 case "YourQuote": 86 returnPageId = Dynamicweb.Content.Services.Pages.GetPageByNavigationTag(Dynamicweb.Frontend.PageView.Current().AreaID, StringConstants.Navigation.SalesforceQuoteCart)?.ID.ToString() ?? ""; 87 if (!string.IsNullOrEmpty(returnPageId) && !Equals(orderStateName, "Completed")) 88 { 89 return $"<a href=\"/Default.aspx?ID={returnPageId}\">{Translate($"Tramline_{station}", station)}</a>"; 90 } 91 else 92 { 93 return $"{Translate($"Tramline_{station}", station)}"; 94 } 95 case "InstallationDate": 96 if (currentStep == 2) 97 { 98 return $"<a href=\"/Default.aspx?ID={Dynamicweb.Frontend.PageView.Current().Page.ID}&CartV2.GotoStep1=true\">{Translate($"Tramline_{station}", station)}</a>"; 99 } 100 else 101 { 102 return Translate($"Tramline_{station}", station); 103 } 104 case "Payment": 105 return Translate($"Tramline_{station}", station); 106 } 107 108 109 return Translate($"Tramline_{station}", station); 110 } 111 } 112 113 <div class="tramline__items"> 114 115 @{ 116 var currentStep = 0; 117 var currentStepName = GetString("CartV2.CurrentStepButtonName"); 118 if (!string.IsNullOrEmpty(currentStepName)) 119 { 120 int.TryParse(currentStepName.Substring(currentStepName.Length - 1), out currentStep); 121 } 122 } 123 124 @foreach (var station in tramStations) 125 { 126 <div class="tramline__items__item@(activeStations.Contains(station) ? " active" : "")@(currentStation.Equals(station) ? " current" : "")" id="tramline_@station.ToLower()"> 127 <div class="tramline__items__item__text"> 128 @GetStation(station, currentStep, currentOrder) 129 </div> 130 <div class="tramline__items__item__line"> 131 <hr /> 132 <div class="tramline__items__item__line__circle circle"></div> 133 </div> 134 </div> 135 } 136 </div> 137 </div> 138 </section> 139 140 <section class="content cart cart--customer-information content--no-bottom-margin background--tint-3-light"> 141 <div class="content__container cart__wrapper"> 142 143 @if (currentOrder == null) 144 { 145 146 <h1 class="h2">@Translate("Cart_Title_CustomerInformation", "Je gegevens")</h1> 147 <p>@Translate("CartTimeOutNotification", "The order has timed out.")</p> 148 } 149 else 150 { 151 var billingHouseNumber = GetString("Ecom:Order.Customer.HouseNumber"); 152 var billingZip = GetString("Ecom:Order.Customer.Zip"); 153 var billingStreet = GetString("Ecom:Order.Customer.Address"); 154 var billingCity = GetString("Ecom:Order.Customer.City"); 155 156 var showBillingAddress = ( 157 !string.IsNullOrWhiteSpace(billingHouseNumber) || 158 !string.IsNullOrWhiteSpace(billingZip) || 159 !string.IsNullOrWhiteSpace(billingStreet) || 160 !string.IsNullOrWhiteSpace(billingCity)); 161 162 <div id="contentrow"> 163 <div class="cart__content"> 164 <h1 class="h2">@Translate("Cart_Title_CustomerInformation", "Je gegevens")</h1> 165 <form name="ordersubmit" id="ordersubmit" method="post" autocomplete="off" class="cart__content__form"> 166 167 @*INSTALLATIE GEGEVENS*@ 168 <div id="installation-address-container" class="cart__content__form__block"> 169 170 @{ 171 var installationHouseNumber = GetString("Ecom:Order.Delivery.HouseNumber"); 172 var installationZip = GetString("Ecom:Order.Delivery.Zip"); 173 var installationStreet = GetString("Ecom:Order.Delivery.Address"); 174 var installationCity = GetString("Ecom:Order.Delivery.City"); 175 } 176 177 <h6 class="h7">@Translate("Cart_Subtitle_InstallationAddress", "Installatieadres")</h6> 178 179 <div class="input-wrapper"> 180 <input name="EcomOrderDeliveryZip" 181 id="EcomOrderDeliveryZip" 182 value="@installationZip" 183 type="text" 184 required="required" 185 placeholder="@Translate("CartInstallationAddressZip", "Zip").JsEncode()" 186 maxlength="7" 187 autocomplete="nope" /> 188 189 <input name="EcomOrderDeliveryHouseNumber" 190 id="EcomOrderDeliveryHouseNumber" 191 value="@installationHouseNumber" 192 type="text" 193 required="required" 194 placeholder="@Translate("CartInstallationAddressHouseNumber", "Housenumber + addition").JsEncode()" 195 maxlength="15" 196 autocomplete="nope" /> 197 </div> 198 199 <div class="input-wrapper"> 200 <input name="EcomOrderDeliveryAddress" 201 id="EcomOrderDeliveryAddress" 202 value="@installationStreet" 203 type="text" 204 required="required" 205 placeholder="@Translate("CartInstallationAddressStreet", "Street").JsEncode()" 206 maxlength="50" 207 autocomplete="nope" /> 208 </div> 209 210 <div class="input-wrapper"> 211 <input name="EcomOrderDeliveryCity" 212 id="EcomOrderDeliveryCity" 213 value="@installationCity" 214 type="text" 215 required="required" 216 placeholder="@Translate("CartInstallationAddressCity", "City").JsEncode()" 217 maxlength="50" 218 autocomplete="nope" /> 219 </div> 220 </div> 221 222 223 @*JE GEGEVENS*@ 224 <div id="customer-info-container" class="cart__content__form__block"> 225 226 <input type="hidden" name="GoogleAnalyticsClientId" id="GoogleAnalyticsClientId" value="" /> 227 228 @{ 229 var customerFirstName = GetString("Ecom:Order.Customer.FirstName"); 230 var customerSurName = GetString("Ecom:Order.Customer.Surname"); 231 var customerPhone = GetString("Ecom:Order.Customer.Phone"); 232 var customerDateOfBirth = GetString("CustomerDateOfBirth.Clean"); 233 var customerEmail = GetString("Ecom:Order.Customer.Email"); 234 var customerComment = GetString("Ecom:Order.Customer.Comment"); 235 } 236 237 <h6 class="h7">@Translate("Cart_Subtitle_YourInfo", "Je gegevens")</h6> 238 239 <div class="input-wrapper"> 240 <input name="EcomOrderCustomerFirstName" 241 id="EcomOrderCustomerFirstName" 242 value="@customerFirstName" 243 type="text" 244 required="required" 245 placeholder="@Translate("CartCustomerFirstName", "First name").JsEncode()" 246 maxlength="50" 247 autocomplete="nope" /> 248 249 <input name="EcomOrderCustomerSurname" 250 id="EcomOrderCustomerSurname" 251 value="@customerSurName" 252 type="text" 253 required="required" 254 placeholder="@Translate("CartCustomerSurname", "Surname").JsEncode()" 255 maxlength="50" 256 autocomplete="nope" /> 257 </div> 258 259 <div class="input-wrapper"> 260 <input name="EcomOrderCustomerPhone" 261 id="EcomOrderCustomerPhone" 262 value="@customerPhone" 263 type="tel" 264 required="required" 265 placeholder="@Translate("CartCustomerPhone1", "Phone/Mobile 1").JsEncode()" 266 maxlength="13" 267 autocomplete="nope" /> 268 269 @if (orderType.Equals(OrderType.Rent)) 270 { 271 var birthDateInfo = Translate("BirthDateInformation", "Text ..."); 272 <input name="CustomerDateOfBirth" 273 class="datepicker" 274 id="CustomerDateOfBirth" 275 value="@customerDateOfBirth" 276 required="required" 277 placeholder="@Translate("CartCustomerDateOfBirth", "Date of birth").JsEncode()" 278 type="text" /> 279 } 280 </div> 281 282 <div class="input-wrapper"> 283 <input name="EcomOrderCustomerEmail" 284 id="EcomOrderCustomerEmail" 285 value="@customerEmail" 286 type="email" 287 required="required" 288 placeholder="@Translate("CartCustomerEmail", "Email").JsEncode()" 289 maxlength="255" 290 autocomplete="nope" /> 291 </div> 292 293 <div class="input-wrapper"> 294 <textarea id="EcomOrderCustomerComment" 295 name="EcomOrderCustomerComment" 296 placeholder="@Translate("CommentPlaceholder", "Comments").JsEncode()">@customerComment</textarea> 297 </div> 298 299 <div class="input-wrapper" id="billing-address-selector-container"> 300 <label class="checkbox@(showBillingAddress ? " checked" : "")"> 301 <input type="checkbox" name="other-billing-address" id="other-billing-address" @(showBillingAddress ? " checked=checked" : "")> 302 @Translate("CartCustomerInformationOtherBillingAddress", "Other billing address") 303 </label> 304 </div> 305 306 </div> 307 308 @*ANDER FACTUURADRES*@ 309 <div id="billing-address-container" class="cart__content__form__block@(!showBillingAddress ? " hide" : "")"> 310 311 <div class="input-wrapper"> 312 313 <input name="EcomOrderCustomerZip" 314 id="EcomOrderCustomerZip" 315 value="@billingZip" 316 type="text" 317 placeholder="@Translate("CartBillingAddressZip", "Zip").JsEncode()" 318 maxlength="7" /> 319 320 <input name="EcomOrderCustomerHouseNumber" 321 id="EcomOrderCustomerHouseNumber" 322 value="@billingHouseNumber" 323 type="text" 324 placeholder="@Translate("CartBillingAddressHouseNumber", "Housenumber + addition").JsEncode()" 325 maxlength="15" /> 326 </div> 327 328 <div class="input-wrapper"> 329 <input name="EcomOrderCustomerAddress" 330 id="EcomOrderCustomerAddress" 331 value="@billingStreet" 332 type="text" 333 placeholder="@Translate("CartBillingAddressStreet", "Street").JsEncode()" 334 maxlength="50" /> 335 </div> 336 337 <div class="input-wrapper"> 338 <input name="EcomOrderCustomerCity" 339 id="EcomOrderCustomerCity" 340 value="@billingCity" type="text" 341 placeholder="@Translate("CartBillingAddressCity", "City").JsEncode()" 342 maxlength="50" /> 343 </div> 344 345 </div> 346 347 348 <div class="cart__content__form__cart-navigation"> 349 @if (!string.IsNullOrWhiteSpace(assemblePageId)) 350 { 351 <a href="/Default.aspx?ID=@assemblePageId" class="button button--outline">@Translate("Cart_Button_Back", "Vorige")</a> 352 } 353 <button type="submit" name="@GetString("CartV2.NextStepButtonName")" id="NextStepButtonHidden" class="button hidden" /> 354 <button type="button" name="NextStepButton" id="NextStepButton" class="button">@Translate("Cart_Button_ToInstallationDate", "Kies installatiedatum")</button> 355 </div> 356 357 </form> 358 </div> 359 <div class="cart__aside"> 360 <div id="receipt" class="receipt"> 361 <div class="preloader-wrapper small active"> 362 <div class="spinner-layer spinner-layer--sea"> 363 <div class="circle-clipper left"> 364 <div class="circle"></div> 365 </div> 366 <div class="gap-patch"> 367 <div class="circle"></div> 368 </div> 369 <div class="circle-clipper right"> 370 <div class="circle"></div> 371 </div> 372 </div> 373 </div> 374 </div> 375 </div> 376 </div> 377 378 @SnippetStart("HeadContent") 379 <!-- targets all search engine crawlers: tells them to NOT include this page in search results and NOT to follow links on this page --> 380 <meta name="robots" content="noindex, nofollow"> 381 @SnippetEnd("HeadContent") 382 @SnippetStart("JavaScriptBottom") 383 <script> 384 var CheckOut = { 385 reloadReceipt: function () { 386 Cart.ReloadReceipt('@GetGlobalValue("Global:Area.LongLang")', "", @Dynamicweb.Frontend.PageView.Current().AreaID, Cart.InitializeInterest); 387 }, 388 removeURLParameter: function (url, parameter) { 389 var urlparts = url.split('?'); 390 if (urlparts.length >= 2) { 391 392 var prefix = encodeURIComponent(parameter) + '='; 393 var pars = urlparts[1].split(/[&;]/g); 394 395 //reverse iteration as may be destructive 396 for (var i = pars.length; i-- > 0;) { 397 //idiom for string.startsWith 398 if (pars[i].lastIndexOf(prefix, 0) !== -1) { 399 pars.splice(i, 1); 400 } 401 } 402 403 return urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : ''); 404 } 405 return url; 406 }, 407 removeStepFromQueryString: function () { 408 var uri = window.location.href.toString(); 409 if (uri.indexOf("?") > 0) { 410 for (let i = 0; i < 4; i++) { 411 uri = CheckOut.removeURLParameter(uri, 'CartV2.GotoStep' + i); 412 } 413 window.history.replaceState({}, document.title, uri); 414 } 415 }, 416 validateInputs: function (containerId) { 417 418 // validate required items 419 var containerIsValid = true; 420 421 $("input", containerId).not(':input[type=file]').each(function () { 422 var input = $(this); 423 var inputType = input.attr("type").toLowerCase(); 424 var isRequired = input.prop("required"); 425 var value = input.val().trim(); 426 input.val(value); 427 switch (inputType) { 428 case "text": 429 if (isRequired && value == "") { 430 containerIsValid = false; 431 input.addClass("error"); 432 } else { 433 input.removeClass("error"); 434 } 435 break; 436 case "tel": 437 if (isRequired && value == "") { 438 containerIsValid = false; 439 input.addClass("error"); 440 } else if (value != "" && !Cart.ValidateTelephone(value)) { 441 containerIsValid = false; 442 input.addClass("error"); 443 } else { 444 input.removeClass("error"); 445 } 446 break; 447 case "email": 448 if (isRequired && value == "") { 449 containerIsValid = false; 450 input.addClass("error"); 451 } else if (value != "" && !Cart.ValidateEmail(value)) { 452 containerIsValid = false; 453 input.addClass("error"); 454 } else { 455 input.removeClass("error"); 456 } 457 break; 458 case "textarea": 459 if (isRequired && value == "") { 460 containerIsValid = false; 461 input.addClass("error"); 462 } else { 463 input.removeClass("error"); 464 } 465 break; 466 case "checkbox": 467 if (isRequired && !input.is(":checked")) { 468 containerIsValid = false; 469 input.addClass("error"); 470 } else { 471 input.removeClass("error"); 472 } 473 break; 474 default: 475 break; 476 } 477 }); 478 479 $("select", containerId).each(function () { 480 var select = $(this); 481 var isRequired = select.prop("required"); 482 var value = select.val().trim(); 483 if (isRequired && value == "") { 484 containerIsValid = false; 485 } 486 }); 487 488 return containerIsValid; 489 } 490 } 491 </script> 492 <script> 493 494 PersonalData = { 495 HandleBillingAddressChange: function (event) { 496 var checkbox = $(event.target.firstElementChild); // clicked checkbox 497 var checked = checkbox.is(":checked"); // clicked checkbox is checked 498 var billingAddressContainer = $("#billing-address-container"); 499 500 if (checked) { 501 billingAddressContainer.removeClass("hide"); // show billing fields 502 } else { 503 billingAddressContainer.addClass("hide"); // hide billing fields 504 $("#EcomOrderCustomerHouseNumber").val(""); // clear billing fields 505 $("#EcomOrderCustomerZip").val(""); 506 $("#EcomOrderCustomerAddress").val(""); 507 $("#EcomOrderCustomerCity").val(""); 508 } 509 }, 510 Initialize: function () { 511 512 // Remove tramline parameter from querystring 513 CheckOut.removeStepFromQueryString(); 514 515 // Only numbers in telephone fields 516 $("input[type=tel]", "#customer-info-container").numeric(); 517 518 // Initialize show billing address selector 519 $("label.checkbox", "#billing-address-selector-container").innovadisCheckbox({ 520 onAfterChange: PersonalData.HandleBillingAddressChange 521 }); 522 523 // Fix for hiding of datepicker in Chrome73 524 $('.datepicker').on('mousedown',function(event){ 525 event.preventDefault(); 526 }); 527 528 // Initialize birth date selector --- seems to work like shit !!! 529 var maxDate = new Date(); 530 var minYear = parseInt(maxDate.getFullYear() - 115); 531 var minDate = new Date(minYear, 1, 1); 532 if ($(".datepicker")[0]) { 533 $('.datepicker').pickadate({ 534 monthsFull: [ 535 '@Translate("DatePicker_January", "January").JsEncode()', 536 '@Translate("DatePicker_February", "February").JsEncode()', 537 '@Translate("DatePicker_March", "March").JsEncode()', 538 '@Translate("DatePicker_April", "April").JsEncode()', 539 '@Translate("DatePicker_May", "May").JsEncode()', 540 '@Translate("DatePicker_June", "June").JsEncode()', 541 '@Translate("DatePicker_July", "July").JsEncode()', 542 '@Translate("DatePicker_August", "August").JsEncode()', 543 '@Translate("DatePicker_September", "September").JsEncode()', 544 '@Translate("DatePicker_October", "October").JsEncode()', 545 '@Translate("DatePicker_November", "November").JsEncode()', 546 '@Translate("DatePicker_December", "December").JsEncode()'], 547 weekdaysFull: [ 548 '@Translate("DatePicker_Sunday", "Sunday").JsEncode()', 549 '@Translate("DatePicker_Monday", "Monday").JsEncode()', 550 '@Translate("DatePicker_Tuesday", "Tuesday").JsEncode()', 551 '@Translate("DatePicker_Wednesday", "Wednesday").JsEncode()', 552 '@Translate("DatePicker_Thursday", "Thursday").JsEncode()', 553 '@Translate("DatePicker_Friday", "Friday").JsEncode()', 554 '@Translate("DatePicker_Saturday", "Saturday").JsEncode()'], 555 showMonthsShort: false, 556 showWeekdaysFull: true, 557 selectMonths: true, 558 selectYears: 115, 559 today: '@Translate("DatePicker_Today", "Today")', 560 clear: '@Translate("DatePicker_Clear", "Clear")', 561 close: '@Translate("DatePicker_OK", "OK")', 562 format: 'dd-mm-yyyy', 563 closeOnSelect: true, 564 closeOnClear: true, 565 min: minDate, 566 max: maxDate 567 }); 568 } 569 570 var gaClientId = SEO.getClientId(); 571 if (gaClientId === "") { 572 gaClientId = "none"; 573 } 574 $("#GoogleAnalyticsClientId").val(gaClientId); 575 576 // Validate personal data after input change and on page load 577 PersonalData.Validation(); 578 $("input[required=required]", "#customer-info-container") 579 .off("change") 580 .on("change", function () { 581 PersonalData.Validation(); 582 }); 583 584 // Validate personal data after select change 585 $("select[required=required]", "#customer-info-container") 586 .off("change") 587 .on("change", function () { 588 PersonalData.Validation(); 589 }); 590 591 // prefill installation address info 592 $("#EcomOrderDeliveryZip").off("change").on("change", function () { 593 PersonalData.PrefillAddress($("#EcomOrderDeliveryZip"), $("#EcomOrderDeliveryHouseNumber"), $("#EcomOrderDeliveryAddress"), $("#EcomOrderDeliveryCity")); 594 }); 595 $("#EcomOrderDeliveryHouseNumber").off("change").on("change", function () { 596 $(this).removeClass("error"); 597 var houseNumber = $(this).val(); 598 if (houseNumber !== "") { 599 if (!FormHelper.hasNumber(houseNumber)) { 600 $(this).addClass("error"); 601 alert("@Translate("HouseNumberError", "Must contain at least one number")"); 602 } else { 603 PersonalData.PrefillAddress($("#EcomOrderDeliveryZip"), $("#EcomOrderDeliveryHouseNumber"), $("#EcomOrderDeliveryAddress"), $("#EcomOrderDeliveryCity")); 604 } 605 } 606 }); 607 608 // prefill billing address info 609 $("#EcomOrderCustomerZip").off("change").on("change", function () { 610 PersonalData.PrefillAddress($("#EcomOrderCustomerZip"), $("#EcomOrderCustomerHouseNumber"), $("#EcomOrderCustomerAddress"), $("#EcomOrderCustomerCity")); 611 }); 612 $("#EcomOrderCustomerHouseNumber").off("change").on("change", function () { 613 $(this).removeClass("error"); 614 var houseNumber = $(this).val(); 615 if (houseNumber !== "") { 616 if (!FormHelper.hasNumber($(this).val())) { 617 $(this).addClass("error"); 618 alert("@Translate("HouseNumberError", "Must contain at least one number")"); 619 } else { 620 PersonalData.PrefillAddress($("#EcomOrderCustomerZip"), $("#EcomOrderCustomerHouseNumber"), $("#EcomOrderCustomerAddress"), $("#EcomOrderCustomerCity")); 621 } 622 } 623 }); 624 625 // Go to installation date 626 $("#NextStepButton") 627 .off("click") 628 .on("click", function () { 629 630 // save installation address via ajax and update receipt 631 PersonalData.SaveInstallationAddress(); 632 633 $("#NextStepButtonHidden").click(); 634 }); 635 636 // Validate form 637 PersonalData.Validation(); 638 }, 639 PrefillAddress: function ($zipInput, $houseNumberInput, $streetInput, $cityInput) { 640 try { 641 642 // validate input 643 if ($zipInput == null || $houseNumberInput == null || $streetInput == null || $cityInput == null) { 644 console.error("personalDatePrefillAddress error: not all required input fields are filled") 645 return; 646 } 647 648 // get input values 649 var street = $streetInput.val(); 650 var zip = $zipInput.val(); 651 var housenumber = $houseNumberInput.val(); 652 var city = $cityInput.val(); 653 654 // validate input 655 if (zip === "" || housenumber === "") { 656 return; 657 } 658 659 // remove spaces from zip 660 var zip = zip.replace(/\s+/g, '').toUpperCase(); 661 662 // only valid Dutch zips 663 if (zip.length !== 6) { 664 return; 665 } 666 667 // get address and prefill 668 var apiUrl = "/serviceapi/form/getaddress/" + zip + "/" + housenumber; 669 $.ajax(apiUrl).done(function (response) { 670 if (response != null) { 671 $streetInput.val(response.Item1); 672 $cityInput.val(response.Item2); 673 PersonalData.Validation(); 674 } 675 }); 676 677 } 678 catch (err) { 679 console.error("personalDatePrefillAddress, get address Failed: " + err.message); 680 } 681 682 }, 683 SaveInstallationAddress: function () { 684 var installationStreet = $("#EcomOrderDeliveryAddress").val(); 685 var installationHouseNumber = $("#EcomOrderDeliveryHouseNumber").val(); 686 var installationZip = $("#EcomOrderDeliveryZip").val(); 687 var installationCity = $("#EcomOrderDeliveryCity").val(); 688 var areaId = @Dynamicweb.Frontend.PageView.Current().AreaID; 689 Cart.AddInstallationAddress(installationStreet, installationHouseNumber, installationZip, installationCity, areaId); 690 }, 691 Validation: function () { 692 693 // validate personalData 694 var personalDataIsValid = CheckOut.validateInputs("#customer-info-container"); 695 696 // handle validation result 697 var nextButton = $("#NextStepButton"); 698 if (personalDataIsValid) { 699 nextButton.removeClass("disabled"); 700 } else { 701 nextButton.addClass("disabled"); 702 } 703 704 // return validation result 705 return personalDataIsValid; 706 }, 707 } 708 709 $(function () { 710 711 // Load receipt 712 CheckOut.reloadReceipt(); 713 714 // Inital page load 715 PersonalData.Initialize(); 716 717 }); 718 719 </script> 720 @SnippetEnd("JavaScriptBottom") 721 } 722 </div> 723 </section>






