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_4a5eb08edf984ca0b9f0b57b26e665ab.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
379 @SnippetStart("JavaScriptBottom")
380 <script>
381 var CheckOut = {
382 reloadReceipt: function () {
383 Cart.ReloadReceipt('@GetGlobalValue("Global:Area.LongLang")', "", @Dynamicweb.Frontend.PageView.Current().AreaID, Cart.InitializeInterest);
384 },
385 removeURLParameter: function (url, parameter) {
386 var urlparts = url.split('?');
387 if (urlparts.length >= 2) {
388
389 var prefix = encodeURIComponent(parameter) + '=';
390 var pars = urlparts[1].split(/[&;]/g);
391
392 //reverse iteration as may be destructive
393 for (var i = pars.length; i-- > 0;) {
394 //idiom for string.startsWith
395 if (pars[i].lastIndexOf(prefix, 0) !== -1) {
396 pars.splice(i, 1);
397 }
398 }
399
400 return urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : '');
401 }
402 return url;
403 },
404 removeStepFromQueryString: function () {
405 var uri = window.location.href.toString();
406 if (uri.indexOf("?") > 0) {
407 for (let i = 0; i < 4; i++) {
408 uri = CheckOut.removeURLParameter(uri, 'CartV2.GotoStep' + i);
409 }
410 window.history.replaceState({}, document.title, uri);
411 }
412 },
413 validateInputs: function (containerId) {
414
415 // validate required items
416 var containerIsValid = true;
417
418 $("input", containerId).not(':input[type=file]').each(function () {
419 var input = $(this);
420 var inputType = input.attr("type").toLowerCase();
421 var isRequired = input.prop("required");
422 var value = input.val().trim();
423 input.val(value);
424 switch (inputType) {
425 case "text":
426 if (isRequired && value == "") {
427 containerIsValid = false;
428 input.addClass("error");
429 } else {
430 input.removeClass("error");
431 }
432 break;
433 case "tel":
434 if (isRequired && value == "") {
435 containerIsValid = false;
436 input.addClass("error");
437 } else if (value != "" && !Cart.ValidateTelephone(value)) {
438 containerIsValid = false;
439 input.addClass("error");
440 } else {
441 input.removeClass("error");
442 }
443 break;
444 case "email":
445 if (isRequired && value == "") {
446 containerIsValid = false;
447 input.addClass("error");
448 } else if (value != "" && !Cart.ValidateEmail(value)) {
449 containerIsValid = false;
450 input.addClass("error");
451 } else {
452 input.removeClass("error");
453 }
454 break;
455 case "textarea":
456 if (isRequired && value == "") {
457 containerIsValid = false;
458 input.addClass("error");
459 } else {
460 input.removeClass("error");
461 }
462 break;
463 case "checkbox":
464 if (isRequired && !input.is(":checked")) {
465 containerIsValid = false;
466 input.addClass("error");
467 } else {
468 input.removeClass("error");
469 }
470 break;
471 default:
472 break;
473 }
474 });
475
476 $("select", containerId).each(function () {
477 var select = $(this);
478 var isRequired = select.prop("required");
479 var value = select.val().trim();
480 if (isRequired && value == "") {
481 containerIsValid = false;
482 }
483 });
484
485 return containerIsValid;
486 }
487 }
488 </script>
489 <script>
490
491 PersonalData = {
492 HandleBillingAddressChange: function (event) {
493 var checkbox = $(event.target.firstElementChild); // clicked checkbox
494 var checked = checkbox.is(":checked"); // clicked checkbox is checked
495 var billingAddressContainer = $("#billing-address-container");
496
497 if (checked) {
498 billingAddressContainer.removeClass("hide"); // show billing fields
499 } else {
500 billingAddressContainer.addClass("hide"); // hide billing fields
501 $("#EcomOrderCustomerHouseNumber").val(""); // clear billing fields
502 $("#EcomOrderCustomerZip").val("");
503 $("#EcomOrderCustomerAddress").val("");
504 $("#EcomOrderCustomerCity").val("");
505 }
506 },
507 Initialize: function () {
508
509 // Remove tramline parameter from querystring
510 CheckOut.removeStepFromQueryString();
511
512 // Only numbers in telephone fields
513 $("input[type=tel]", "#customer-info-container").numeric();
514
515 // Initialize show billing address selector
516 $("label.checkbox", "#billing-address-selector-container").innovadisCheckbox({
517 onAfterChange: PersonalData.HandleBillingAddressChange
518 });
519
520 // Fix for hiding of datepicker in Chrome73
521 $('.datepicker').on('mousedown',function(event){
522 event.preventDefault();
523 });
524
525 // Initialize birth date selector --- seems to work like shit !!!
526 var maxDate = new Date();
527 var minYear = parseInt(maxDate.getFullYear() - 115);
528 var minDate = new Date(minYear, 1, 1);
529 if ($(".datepicker")[0]) {
530 $('.datepicker').pickadate({
531 monthsFull: [
532 '@Translate("DatePicker_January", "January").JsEncode()',
533 '@Translate("DatePicker_February", "February").JsEncode()',
534 '@Translate("DatePicker_March", "March").JsEncode()',
535 '@Translate("DatePicker_April", "April").JsEncode()',
536 '@Translate("DatePicker_May", "May").JsEncode()',
537 '@Translate("DatePicker_June", "June").JsEncode()',
538 '@Translate("DatePicker_July", "July").JsEncode()',
539 '@Translate("DatePicker_August", "August").JsEncode()',
540 '@Translate("DatePicker_September", "September").JsEncode()',
541 '@Translate("DatePicker_October", "October").JsEncode()',
542 '@Translate("DatePicker_November", "November").JsEncode()',
543 '@Translate("DatePicker_December", "December").JsEncode()'],
544 weekdaysFull: [
545 '@Translate("DatePicker_Sunday", "Sunday").JsEncode()',
546 '@Translate("DatePicker_Monday", "Monday").JsEncode()',
547 '@Translate("DatePicker_Tuesday", "Tuesday").JsEncode()',
548 '@Translate("DatePicker_Wednesday", "Wednesday").JsEncode()',
549 '@Translate("DatePicker_Thursday", "Thursday").JsEncode()',
550 '@Translate("DatePicker_Friday", "Friday").JsEncode()',
551 '@Translate("DatePicker_Saturday", "Saturday").JsEncode()'],
552 showMonthsShort: false,
553 showWeekdaysFull: true,
554 selectMonths: true,
555 selectYears: 115,
556 today: '@Translate("DatePicker_Today", "Today")',
557 clear: '@Translate("DatePicker_Clear", "Clear")',
558 close: '@Translate("DatePicker_OK", "OK")',
559 format: 'dd-mm-yyyy',
560 closeOnSelect: true,
561 closeOnClear: true,
562 min: minDate,
563 max: maxDate
564 });
565 }
566
567 var gaClientId = SEO.getClientId();
568 if (gaClientId === "") {
569 gaClientId = "none";
570 }
571 $("#GoogleAnalyticsClientId").val(gaClientId);
572
573 // Validate personal data after input change and on page load
574 PersonalData.Validation();
575 $("input[required=required]", "#customer-info-container")
576 .off("change")
577 .on("change", function () {
578 PersonalData.Validation();
579 });
580
581 // Validate personal data after select change
582 $("select[required=required]", "#customer-info-container")
583 .off("change")
584 .on("change", function () {
585 PersonalData.Validation();
586 });
587
588 // prefill installation address info
589 $("#EcomOrderDeliveryZip").off("change").on("change", function () {
590 PersonalData.PrefillAddress($("#EcomOrderDeliveryZip"), $("#EcomOrderDeliveryHouseNumber"), $("#EcomOrderDeliveryAddress"), $("#EcomOrderDeliveryCity"));
591 });
592 $("#EcomOrderDeliveryHouseNumber").off("change").on("change", function () {
593 $(this).removeClass("error");
594 var houseNumber = $(this).val();
595 if (houseNumber !== "") {
596 if (!FormHelper.hasNumber(houseNumber)) {
597 $(this).addClass("error");
598 alert("@Translate("HouseNumberError", "Must contain at least one number")");
599 } else {
600 PersonalData.PrefillAddress($("#EcomOrderDeliveryZip"), $("#EcomOrderDeliveryHouseNumber"), $("#EcomOrderDeliveryAddress"), $("#EcomOrderDeliveryCity"));
601 }
602 }
603 });
604
605 // prefill billing address info
606 $("#EcomOrderCustomerZip").off("change").on("change", function () {
607 PersonalData.PrefillAddress($("#EcomOrderCustomerZip"), $("#EcomOrderCustomerHouseNumber"), $("#EcomOrderCustomerAddress"), $("#EcomOrderCustomerCity"));
608 });
609 $("#EcomOrderCustomerHouseNumber").off("change").on("change", function () {
610 $(this).removeClass("error");
611 var houseNumber = $(this).val();
612 if (houseNumber !== "") {
613 if (!FormHelper.hasNumber($(this).val())) {
614 $(this).addClass("error");
615 alert("@Translate("HouseNumberError", "Must contain at least one number")");
616 } else {
617 PersonalData.PrefillAddress($("#EcomOrderCustomerZip"), $("#EcomOrderCustomerHouseNumber"), $("#EcomOrderCustomerAddress"), $("#EcomOrderCustomerCity"));
618 }
619 }
620 });
621
622 // Go to installation date
623 $("#NextStepButton")
624 .off("click")
625 .on("click", function () {
626
627 // save installation address via ajax and update receipt
628 PersonalData.SaveInstallationAddress();
629
630 $("#NextStepButtonHidden").click();
631 });
632
633 // Validate form
634 PersonalData.Validation();
635 },
636 PrefillAddress: function ($zipInput, $houseNumberInput, $streetInput, $cityInput) {
637 try {
638
639 // validate input
640 if ($zipInput == null || $houseNumberInput == null || $streetInput == null || $cityInput == null) {
641 console.error("personalDatePrefillAddress error: not all required input fields are filled")
642 return;
643 }
644
645 // get input values
646 var street = $streetInput.val();
647 var zip = $zipInput.val();
648 var housenumber = $houseNumberInput.val();
649 var city = $cityInput.val();
650
651 // validate input
652 if (zip === "" || housenumber === "") {
653 return;
654 }
655
656 // remove spaces from zip
657 var zip = zip.replace(/\s+/g, '').toUpperCase();
658
659 // only valid Dutch zips
660 if (zip.length !== 6) {
661 return;
662 }
663
664 // get address and prefill
665 var apiUrl = "/serviceapi/form/getaddress/" + zip + "/" + housenumber;
666 $.ajax(apiUrl).done(function (response) {
667 if (response != null) {
668 $streetInput.val(response.Item1);
669 $cityInput.val(response.Item2);
670 PersonalData.Validation();
671 }
672 });
673
674 }
675 catch (err) {
676 console.error("personalDatePrefillAddress, get address Failed: " + err.message);
677 }
678
679 },
680 SaveInstallationAddress: function () {
681 var installationStreet = $("#EcomOrderDeliveryAddress").val();
682 var installationHouseNumber = $("#EcomOrderDeliveryHouseNumber").val();
683 var installationZip = $("#EcomOrderDeliveryZip").val();
684 var installationCity = $("#EcomOrderDeliveryCity").val();
685 var areaId = @Dynamicweb.Frontend.PageView.Current().AreaID;
686 Cart.AddInstallationAddress(installationStreet, installationHouseNumber, installationZip, installationCity, areaId);
687 },
688 Validation: function () {
689
690 // validate personalData
691 var personalDataIsValid = CheckOut.validateInputs("#customer-info-container");
692
693 // handle validation result
694 var nextButton = $("#NextStepButton");
695 if (personalDataIsValid) {
696 nextButton.removeClass("disabled");
697 } else {
698 nextButton.addClass("disabled");
699 }
700
701 // return validation result
702 return personalDataIsValid;
703 },
704 }
705
706 $(function () {
707
708 // Load receipt
709 CheckOut.reloadReceipt();
710
711 // Inital page load
712 PersonalData.Initialize();
713
714 });
715
716 </script>
717 @SnippetEnd("JavaScriptBottom")
718 }
719 </div>
720 </section>