1/// <reference path="Base.js" /> 2/// <reference path="Wyvern.js" /> 3/// <reference path="WyvernCore.js" /> 4 5var iid = 0; 6var AutoPopFormDone = false; 7var formPrefix = "1"; 8var tCode = ""; 9var tCodeTypeID = 0; 10var paddingBefore = ""; 11var maxSteps = 0; 12var curStep = 1; 13var isRecaptcha = false; 14var hasPhoneVal = false; 15var phoneValidated = false; 16var phoneValidationRunning = false; 17var hasEmailVal = false; 18var emailValidated = false; 19var c_discountCheckInProgress = false; 20var redirect_callback = ""; 21 22var nextLabel = "Next"; 23var backLabel = "Back"; 24 25var c_marqueeIndex = -1; 26var c_marqueeTotal = 0; 27 28var c_NextStepInterval = -1; 29 30 31$(function () { 32 iid = window.setInterval(function () { 33 AutoPopulate(); 34 }, 500); 35 36 // get trackingCode from url 37 tCode = GetUrlParameter("WYVtc"); 38 if (tCode !== "") { 39 tCode = GetUrlParameter("WYVtc"); 40 tCodeTypeID = GetUrlParameter("WYVtcTypeID"); 41 } 42 43 44 redirect_callback = GetUrlParameter("redirect_callback"); 45 46 47 48 if ($('#main-header').length > 0) { 49 paddingBefore = $('#main-header').css("padding-left"); 50 } 51 52 // header bar at top, make smaller on scroll 53 $(document).scroll(function () { 54 if ($('#main-header').length > 0) { 55 var y = $(this).scrollTop(); 56 if (y > 80) { 57 // reduce top and bottom padding 58 $('#main-header').css("padding", ""); 59 $('#main-header').css("padding", "5px " + paddingBefore); 60 } else { 61 // add back in 62 $('#main-header').css("padding", ""); 63 $('#main-header').css("padding", "20px " + paddingBefore); 64 } 65 } 66 }); 67 68 // add listener for keyboard shortcut to show all pages 69 $("body").on("keydown", function (e) { 70 if (e.shiftKey && e.altKey && e.key == "A") { 71 AdminShowAllPages(); 72 } 73 }); 74}); 75 76 77function AutoPopulate() { 78 if (!AutoPopFormDone) { 79 // var mainForm = $("#FormBuilderFormName_1"); // need another way of getting form? // or just do all? 80 var mainForm = $('[id^=FormBuilderFormName_]'); 81 if (mainForm.length > 0) { 82 AutoPopFormDone = true; 83 window.clearInterval(iid); 84 85 formPrefix = $(mainForm[0]).attr('id').replace("FormBuilderFormName_", ""); 86 87 // now the form is loaded, load recaptcha js 88 // this will find the captcha div in form, and populate accordingly 89 if ($("div.g-recaptcha").length > 0) { 90 GcaptchaSetup(); 91 } 92 93 if ($("div.cf-turnstile").length > 0) { 94 if (window.location.host.endsWith(".de")) { 95 $("div.cf-turnstile").data("language", "de"); 96 } 97 98 TurnstileSetup(); 99 } 100 101 102 103 // hide empty form, and show a progress 104 var urlData = GetUrlParameter("data"); 105 if (urlData !== undefined) { 106 mainForm.hide(); 107 mainForm.before("<div id=\"AutoPopProgress\" class=\"spinning-loader-large\"></div>"); 108 109 // go and get contact info, to fill form 110 AutoPopFillForm(urlData); 111 } 112 // and add tracking code 113 if (tCode !== "") { 114 if ($("#FormBuilderFormName_" + formPrefix + " #TrackingCode").length === 0) { 115 $('<input>').attr({ 116 type: 'hidden', 117 id: 'TrackingCode', 118 name: 'TrackingCode' 119 }).appendTo("#FormBuilderFormName_" + formPrefix); 120 } 121 if ($("#FormBuilderFormName_" + formPrefix + " #TrackingCodeTypeID").length === 0) { 122 $('<input>').attr({ 123 type: 'hidden', 124 id: 'TrackingCodeTypeID', 125 name: 'TrackingCodeTypeID' 126 }).appendTo("#FormBuilderFormName_" + formPrefix); 127 } 128 129 $("#TrackingCodeTypeID").val(tCodeTypeID); 130 $("#TrackingCode").val(tCode); 131 } 132 133 // and callback redirect 134 if (redirect_callback !== "") { 135 if ($("#FormBuilderFormName_" + formPrefix + " #Redirect_Callback").length === 0) { 136 $('<input>').attr({ 137 type: 'hidden', 138 id: 'Redirect_Callback', 139 name: 'Redirect_Callback' 140 }).appendTo("#FormBuilderFormName_" + formPrefix); 141 } 142 143 $("#Redirect_Callback").val(redirect_callback); 144 } 145 146 // do we have any parameters we can auto fill into form? 147 SubFormAutoPopParms(); 148 149 // Setup form progress steps if there are any 150 Formstep_Setup(); 151 152 // any area's we need to hide on display?/// doing it here, mean's we can still see the area in the edit admin screen. If we hid it at that level, we'd never know it was there! 153 HideElementsOnLoad(); 154 155 // discount field? 156 DiscountCodeApply_Setup(); 157 158 // phone validation? 159 PhoneValidation_Setup(); 160 161 // Email validation? 162 EmailValidation_Setup(); 163 164 // check country on load
165 var countryInputs = $("[id$='_CountryID']"); 166 for (var i = 0; i < countryInputs.length; i++) { 167 CountryStateRequired($(countryInputs[i])); 168 } 169 170 // marquee click... will show random one on first click 171 MarqueeNextClick(); 172 173 } else { 174 return; 175 } 176 } 177} 178 179 180function AutoPopFillForm(urlData) { 181 var args = new WyvernAjaxArgsClass(); 182 var params = "Common.cwh?Action=SubscribeAutoPopGetContactInfo"; 183 184 args.parameters.push(new WyvernParameterItemClass("ActionSource", "config")); 185 args.parameters.push(new WyvernParameterItemClass("ActionType", "Membership")); 186 args.parameters.push(new WyvernParameterItemClass("Data", urlData)); 187 188 WyvernAjax(params, function (data) { 189 if (data.Status === 1) { 190 // fill in form 191 for (var property in data.JsonData) { 192 if ($("#Contact_" + formPrefix + "_" + property).length > 0) { 193 $("#Contact_" + formPrefix + "_" + property).val(data.JsonData[property]); 194 } else if ($("#Address_" + formPrefix + "_" + property).length > 0) { 195 $("#Address_" + formPrefix + "_" + property).val(data.JsonData[property]); 196 } else if ($("#ContactData_" + formPrefix + "_" + property).length > 0) { 197 $("#ContactData_" + formPrefix + "_" + property).val(data.JsonData[property]); 198 } 199 200 // company doesn't follow this logic... 201 if (property === "Company") { 202 $("#Company_" + formPrefix + "_Name").val(data.JsonData[property]); 203 } 204 205 // and login name is used for email 206 if (property === "Email") { 207 $("#User_" + formPrefix + "_LoginName").val(data.JsonData[property]); 208 $("#User_" + formPrefix + "_LoginName").trigger('focusout'); 209 $("#User_" + formPrefix + "_LoginName_Clone").val(data.JsonData[property]); 210 } 211 if (property === "DirectLine") { 212 $("#ContactData_" + formPrefix + "_DirectLine").trigger('focusout'); 213 } 214 215 // if we've got an addresssuggester, show address 216 var addressFinderButton = $("#AddressSuggester_Button1_0"); 217 if (addressFinderButton.length > 0) { 218 // get click event, and 'click it'! 219 addressFinderButton.trigger('click'); 220 } 221 } 222 223 // now with added billing address 224 for (var property in data.JsonDataC) { 225 if ($("#Address_" + formPrefix + "_Billing_" + property).length > 0) { 226 $("#Address_" + formPrefix + "_Billing_" + property).val(data.JsonData[property]); 227 } 228 229 // if we've got an addresssuggester, show address 230 var addressFinderButton = $("#AddressSuggester_Button1_1"); 231 if (addressFinderButton.length > 0) { 232 // get click event, and 'click it'! 233 addressFinderButton.trigger('click'); 234 } 235 236 // and also show billing address area with drop down 237 $("#OrderHeaderType_" + formPrefix + "_32797_BillingAddress").val('Y'); 238 $("#OrderHeaderType_" + formPrefix + "_32797_BillingAddress").trigger('change'); 239 } 240 241 // demos are in JsonDataB 242 if (data.JsonDataB != null || data.JsonDataB != undefined) { 243 for (var i = 0; i < data.JsonDataB.length; i++) { 244 // id's look like this for demos; 245 // id = "OrderHeaderType_2_3974_Pleaseindicatethevalueofassetsundermanagementofyourcompany" 246 var demoInput = $("[id$='" + data.JsonDataB[i].FieldName + "']"); 247 if (demoInput.length > 0) { 248 // might need to match on value, or itemid 249 // itemID is probably the 250 var found = false; 251 var optionList = $("#" + $(demoInput).attr('id') + " option"); 252 for (var ii = 0; ii < optionList.length; ii++) { 253 if ($(optionList[ii]).data("itemid") == data.JsonDataB[i].ValueDecimal) { 254 found = true; 255 256 $(optionList[ii]).prop('selected', true); 257 } 258 } 259 260 // if itemID wasn't found, try setting value 261 if (!found) { 262 if ($("#" + $(demoInput).attr('id') + " option[value='" + data.JsonDataB[i].ValueDecimal + "']").length > 0) { 263 $(demoInput).val(data.JsonDataB[i].ValueDecimal); 264 265 } 266 } 267 } 268 } 269 } 270 271 } else { 272 BannerShow(data.ErrorMessage); 273 } 274 275 // show filled in form 276 $("#AutoPopProgress").hide(); 277 $("#FormBuilderFormName_" + formPrefix + "").show(); 278 279 }, args); 280} 281 282 283function GetUrlParameter(paramater) { 284 var urlParameters = window.location.search.substring(1); 285 var urlVariables = urlParameters.split('&'); 286 287 for (var i = 0; i < urlVariables.length; i++) { 288 var parameterName = urlVariables[i].split('='); 289 290 if (parameterName[0] == paramater) { 291 return parameterName[1]; 292 } 293 } 294} 295 296function GcaptchaSetup() { 297 // load script, which will find our div, and put iframe and stuff in 298 299 // can we add a language parameter? 300 if (window.location.host.endsWith(".de")) { 301 $.getScript("https://www.google.com/recaptcha/api.js?hl=de", null); 302 303 } else { 304 $.getScript("https://www.google.com/recaptcha/api.js", null); 305 } 306 307 308 // reset every 30 seconds 309 setInterval(function () { 310 if (grecaptcha !== undefined) { 311 grecaptcha.reset(); 312 } 313 }, 60 * 1000); 314 315 // then remove submit button, and replace with one that will check capture before submitting 316 var submitButton = $("#FormBuilderSubmitButton_" + formPrefix); 317 var captureSubmit = $('<div/>', { 318 id: $(submitButton).attr('id') + "_gcapt", 319 class: $(submitButton).attr('class') + " submit", 320 onclick: 'Gcapture_Submit();', 321 html: '<span>' + $(submitButton).val() + '</span>', 322 style: 'padding-top: 15px;' 323 }).insertBefore("#FormBuilderSubmitButton_" + formPrefix); 324 325 submitButton.hide(); 326 // submitButton.remove(); 327 isRecaptcha = true; 328} 329 330function Gcapture_Submit() { 331 // if valid capture response, submit 332 if ($("#g-recaptcha-response").val() == "") { 333 BannerShow("Please complete re-captcha."); 334 } 335 else { 336 // always check valid first? 337 var valRes = FormStep_CheckValid(); 338 if (!valRes) { 339 return; 340 } 341 342 $("#FormBuilderSubmitButton_" + formPrefix + "_gcapt").after("<div id=\"AutoPopProgress\" class=\"spinning-loader floatright\"></div>"); 343 $("#FormBuilderSubmitButton_" + formPrefix + "_gcapt").hide(); 344 345 // also hide reCaptcha, as it can be confusing when it refeshes as not ticked half way through submit, as it takes a few seconds 346 $(".g-recaptcha").hide(); 347 348 349 $("#FormBuilderFormName_" + formPrefix).submit(); 350 351 } 352} 353 354 355function TurnstileSetup() { 356 // is this a cloudflare turnstile? 357
358 $("head").append('<link rel="preconnect" href="https://challenges.cloudflare.com" />'); 359 $("head").append('<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" ></script> '); 360 361 362 // then remove submit button, and replace with one that will check capture before submitting 363 var submitButton = $("#FormBuilderSubmitButton_" + formPrefix); 364 var captureSubmit = $('<div/>', { 365 id: $(submitButton).attr('id') + "_cfturnsile", 366 class: $(submitButton).attr('class') + " submit", 367 onclick: 'Turnstile_Submit();', 368 html: '<span>' + $(submitButton).val() + '</span>', 369 style: 'padding-top: 15px;' 370 }).insertBefore("#FormBuilderSubmitButton_" + formPrefix); 371 372 submitButton.hide(); 373 // submitButton.remove(); 374 isRecaptcha = true; 375 376} 377 378 379function Turnstile_Submit() { 380 // if valid capture response, submit 381 if ($("#cf-chl-widget-s50aq_response").val() == "") { 382 BannerShow("Please complete re-captcha."); 383 } 384 else { 385 // always check valid first? 386 var valRes = FormStep_CheckValid(); 387 if (!valRes) { 388 return; 389 } 390 391 $("#FormBuilderSubmitButton_" + formPrefix + "_cfturnsile").after("<div id=\"AutoPopProgress\" class=\"spinning-loader floatright\"></div>"); 392 $("#FormBuilderSubmitButton_" + formPrefix + "_cfturnsile").hide(); 393 394 // also hide reCaptcha, as it can be confusing when it refeshes as not ticked half way through submit, as it takes a few seconds 395 $(".cf-turnstile").hide(); 396 397 398 $("#FormBuilderFormName_" + formPrefix).submit(); 399 400 } 401} 402 403 404function DropdownToggleArea_OnChange(e, showValue, showNumber, showNoMatch) { 405 // find areaitems with classes toggleX 406 // hide all, then show the showNumber is showValue matches 407 // if no match, showNoMatch 408 409 // hide all 410 for (var i = 0; i < 10; i++) { 411 $(".formbuilderareaitem.toggle" + i).hide(); 412 413 // do we have any required elements now being hidden? 414 var inputItems = $(".formbuilderareaitem.toggle" + i).find("input"); 415 var selectItems = $(".formbuilderareaitem.toggle" + i).find("select"); 416 for (var ii = 0; ii < selectItems.length; ii++) { 417 inputItems.push(selectItems[ii]); 418 } 419 420 if (inputItems.length > 0) { 421 for (var iii = 0; iii < inputItems.length; iii++) { 422 if ($(inputItems[iii]).prop("required")) { 423 // turn off required, and add class to put it back when it's show below 424 $(inputItems[iii]).prop("required", ""); 425 $(inputItems[iii]).addClass("visiblerequiredtag"); 426 427 // also check if the err and err2 is visible 428 $("#" + $(inputItems[iii]).attr('id') + "ERR").hide(); 429 $("#" + $(inputItems[iii]).attr('id') + "ERR2").hide(); 430 $("#" + $(inputItems[iii]).attr('id') + "REQ").hide(); 431 $("#" + $(inputItems[iii]).attr('id') + "REQ2").hide(); 432 } 433 } 434 } 435 } 436 437 438 var value = $(e).val(); 439 if (value === showValue) { 440 $(".formbuilderareaitem.toggle" + showNumber).show(300); 441 442 // any required elements to set required again? 443 var inputItems = $(".formbuilderareaitem.toggle" + showNumber).find("input"); 444 var selectItems = $(".formbuilderareaitem.toggle" + showNumber).find("select"); 445 for (var ii = 0; ii < selectItems.length; ii++) { 446 inputItems.push(selectItems[ii]); 447 } 448 449 if (inputItems.length > 0) { 450 for (var iii = 0; iii < inputItems.length; iii++) { 451 var thisInput = $(inputItems[iii]); 452 if ($(thisInput[0]).hasClass("visiblerequiredtag")) { 453 // turn on required 454 $(thisInput[0]).prop("required", "required"); 455 } 456 } 457 } 458 459 } else { 460 $(".formbuilderareaitem.toggle" + showNoMatch).show(300); 461 462 // anyy required elements to set required again? 463 var inputItems = $(".formbuilderareaitem.toggle" + showNoMatch).find("input"); 464 var selectItems = $(".formbuilderareaitem.toggle" + showNoMatch).find("select"); 465 for (var ii = 0; ii < selectItems.length; ii++) { 466 inputItems.push(selectItems[ii]); 467 } 468 469 if (inputItems.length > 0) { 470 for (var iii = 0; iii < inputItems.length; iii++) { 471 var thisInput = $(inputItems[iii]); 472 if ($(thisInput[0]).hasClass("visiblerequiredtag")) { 473 // turn on required 474 $(thisInput[0]).prop("required", "required"); 475 } 476 } 477 } 478 479 } 480} 481 482 483function Formstep_Setup() { 484 var formStepsItems = $("#FormBuilderFormName_" + formPrefix + " .formstep"); 485 486 var dataNext = $(formStepsItems[0]).data("next"); 487 var dataBack = $(formStepsItems[0]).data("back"); 488 if (dataNext != undefined) { 489 nextLabel = dataNext; 490 } 491 if (dataBack != undefined) { 492 backLabel = dataBack; 493 } 494 495 // moved 2nd Validation display to ALWAYS happen, as we now have some single page forms/// didn't need to be a serpate function, but it is now 496 SetupValidation2(formPrefix); 497 498 if ($(formStepsItems).length > 0) { 499 // there are some, find how many steps 500 501 for (var i = 1; i < 10; i++) { 502 var stepCheck = $("#FormBuilderFormName_" + formPrefix + " .formstep.step"
502+ i); 503 if ($(stepCheck).length === 0) { 504 break; 505 } else { 506 maxSteps = i; 507 } 508 } 509 510 //// also grab all 'err' reporting hidden divs for validation to show all at end of form, 511 //// as onlly the last page will be visiable when submitted 512 //if ($("#FormBuilderFormName_" + formPrefix + "_val2").length === 0) { 513 // var errItems = $("[id$='ERR']"); // errors 514 // var reqItems = $("[id$='REQ']"); // required validation 515 516 // // add in element beneath submit area 517 // var buttonOuterEl = $("#FormBuilderFormName_" + formPrefix + " div.submit"); 518 // $(buttonOuterEl[0]).after('<div id="FormBuilderFormName_' + formPrefix + '_val2" class="formbuilderareaitem"><div id="FormBuilderFormName_' + formPrefix + '_val2_Inner" class="item wide"></div></div>') 519 520 // // insert all after submit buttons 521 // // so we can then show them if needed 522 // for (var i = 0; i < errItems.length; i++) { 523 // //var e = $('<div/>', { 524 // // id: $(errItems[i]).attr('id') + "2", 525 // // class: $(errItems[i]).attr('class'), 526 // // html: $(errItems[i]).html(), 527 // //}).appendTo 528 529 // $("#FormBuilderFormName_" + formPrefix + "_val2_Inner").append('<div id="' + $(errItems[i]).attr('id') + '2" class="' + $(errItems[i]).attr('class') + '">' + $(errItems[i]).html() + '</div>') 530 // } 531 532 // for (var i = 0; i < reqItems.length; i++) { 533 // var ee = $('<div/>', { 534 // id: $(reqItems[i]).attr('id') + "2", 535 // class: $(reqItems[i]).attr('class') + "2 hide ", // class used it 'requirements2' 536 // html: $(reqItems[i]).html() + ' ' + $(reqItems[i]).data("fieldlabel"), 537 // }).appendTo("#FormBuilderFormName_" + formPrefix + "_val2_Inner"); 538 // } 539 //} 540 541 // now we know how mnay steps we have, and which one we're on 542 FormStep_SetButtons(); 543 FormStep_ShowHideStep(); 544 FormStep_Progress(); 545 } 546} 547 548function SetupValidation2(formPrefix) { 549 // also grab all 'err' reporting hidden divs for validation to show all at end of form, 550 // as only the last page will be visiable when submitted 551 if ($("#FormBuilderFormName_" + formPrefix + "_val2").length === 0) { 552 var errItems = $("[id$='ERR']"); // errors 553 var reqItems = $("[id$='REQ']"); // required validation 554 555 // add in element beneath submit area 556 var buttonOuterEl = $("#FormBuilderFormName_" + formPrefix + " div.submit"); 557 $(buttonOuterEl[0]).after('<div id="FormBuilderFormName_' + formPrefix + '_val2" class="formbuilderareaitem"><div id="FormBuilderFormName_' + formPrefix + '_val2_Inner" class="item wide"></div></div>'); 558 559 // insert all after submit buttons 560 // so we can then show them if needed 561 // can we put them in order, so do the required messages, followed by the corresponding ERR (validation) 562 for (var i = 0; i < reqItems.length; i++) { 563 var ee = $('<div/>', { 564 id: $(reqItems[i]).attr('id') + "2", 565 class: $(reqItems[i]).attr('class') + "2 hide ", // class used it 'requirements2' 566 html: $(reqItems[i]).html() + ' ' + $(reqItems[i]).data("fieldlabel"), 567 }).appendTo("#FormBuilderFormName_" + formPrefix + "_val2_Inner"); 568 569 // find the corresponding err and put tham in next... 570 for (var ii = 0; ii < errItems.length; ii++) { 571 if ($(reqItems[i]).attr('id').replace('REQ', '') == $(errItems[ii]).attr('id').replace('ERR', '')) { 572 $("#FormBuilderFormName_" + formPrefix + "_val2_Inner").append('<div id="' + $(errItems[ii]).attr('id') + '2" class="' + $(errItems[ii]).attr('class') + '">' + $(errItems[ii]).html() + '</div>'); 573 break; 574 } 575 } 576 } 577 578 579 580 581 /* 582 // older 583 for (var i = 0; i < errItems.length; i++) { 584 //var e = $('<div/>', { 585 // id: $(errItems[i]).attr('id') + "2", 586 // class: $(errItems[i]).attr('class'), 587 // html: $(errItems[i]).html(), 588 //}).appendTo 589 590 $("#FormBuilderFormName_" + formPrefix + "_val2_Inner").append('<div id="' + $(errItems[i]).attr('id') + '2" class="' + $(errItems[i]).attr('class') + '">' + $(errItems[i]).html() + '</div>') 591 } 592 593 for (var i = 0; i < reqItems.length; i++) { 594 var ee = $('<div/>', { 595 id: $(reqItems[i]).attr('id') + "2", 596 class: $(reqItems[i]).attr('class') + "2 hide ", // class used it 'requirements2' 597 html: $(reqItems[i]).html() + ' ' + $(reqItems[i]).data("fieldlabel"), 598 }).appendTo("#FormBuilderFormName_" + formPrefix + "_val2_Inner"); 599 } 600 */ 601 602 603 } 604} 605 606 607function FormStep_Next(previousnext) { 608 // run next in interval to check for phone validation complete 609 // but what if the validation fails?.. do we need a 'running' flag? 610 // YES! 611 c_NextStepInterval = window.setInterval(function () { 612 FormStep_Next_Run(previousnext); 613 }, 250); 614} 615 616function FormStep_Next_Run(previousnext) { 617 618 if (hasPhoneVal && phoneValidationRunning) { 619 return; 620 } 621 622 if (c_NextStepInterval > -1) { 623 window.clearInterval(c_NextStepInterval); 624 } 625 626 if (previousnext === undefined) { 627 previousnext = 1; 628 } 629 var confirmValidation = true; 630 // do we also have a 'confirm' input? like email? currentely will change style, and not allow it to submit, but a nicer message here will be nice 631 if ($("#FormBuilderFormName_" + formPrefix + " .formbuilderareaitem.formstep.step"
631+ curStep + " input.confirm").length > 0) { 632 var invalidItems = $("#FormBuilderFormName_" + formPrefix + " .formbuilderareaitem.formstep.step" + curStep + " input.confirm"); 633 634 for (var i = 0; i < invalidItems.length; i++) { 635 636 var validErr2ID = $(invalidItems[i]).attr("ID").replace("_Clone", "ERR2"); 637 638 if ($(invalidItems[i]).hasClass("inputinvalid")) { 639 if ($(invalidItems[i]).attr("ID").endsWith("_Clone")) { 640 var validFieldName = $(invalidItems[i]).prev().html(); 641 642 $("#" + validErr2ID).html("* " + validFieldName); 643 $("#" + validErr2ID).addClass("requirements2"); 644 $("#" + validErr2ID).show(); 645 } 646 647 confirmValidation = false; 648 649 } else { 650 $("#" + validErr2ID).html(""); 651 $("#" + validErr2ID).removeClass("requirements2"); 652 $("#" + validErr2ID).hide(); 653 } 654 } 655 } 656 657 // always check valid first? 658 // unless we're going back 659 if (previousnext > -1) { 660 if (!FormStep_CheckValid()) { 661 return; 662 } 663 } 664 665 if (!confirmValidation) { 666 return; 667 } 668 669 670 curStep = curStep + previousnext; // previous sends -1 671 FormStep_SetButtons(); 672 FormStep_ShowHideStep(); 673 FormStep_Progress(); 674 675 //// scroll back up the page 676 $('html, body').animate({ 677 scrollTop: 0 678 }, 1000); 679} 680 681// added non step validatiaon to it too for one page forms 682function FormStep_CheckValid() { 683 684 var items; 685 var valRes = true; 686 687 if ($("#FormBuilderFormName_" + formPrefix + " .formbuilderareaitem.formstep.step" + curStep + " input").length > 0) { 688 items = $("#FormBuilderFormName_" + formPrefix + " .formbuilderareaitem.formstep.step" + curStep + " input"); 689 var selectItems = $("#FormBuilderFormName_" + formPrefix + " .formbuilderareaitem.formstep.step" + curStep + " select"); 690 for (var i = 0; i < selectItems.length; i++) { 691 items.push(selectItems[i]); 692 } 693 } else { 694 items = $("#FormBuilderFormName_" + formPrefix + " .formbuilderareaitem input"); 695 var selectItems = $("#FormBuilderFormName_" + formPrefix + " .formbuilderareaitem select"); 696 for (var i = 0; i < selectItems.length; i++) { 697 items.push(selectItems[i]); 698 } 699 } 700 701 if (items.length > 0) { 702 703 for (var i = 0; i < items.length; i++) { 704 var thisValRes = $(items[i])[0].checkValidity(); 705 if (thisValRes && $(items[i]).prop("required")) { 706 // sometimes checkValidity come's back true even when empty, so also check value? 707 if ($(items[i]).val() == "") { 708 thisValRes = false; 709 } 710 } 711 if (!thisValRes) { 712 // $(items[i]).addClass("error"); 713 $("#" + $(items[i]).attr('id') + "REQ").show(); 714 $("#" + $(items[i]).attr('id') + "REQ2").show(); 715 valRes = false; 716 } 717 } 718 719 // and multi checkbox groups need to be done here, in it's own funky way 720 var requiredCheckBoxItems = $(".formbuilderareaitem.formstep.step" + curStep + " .formbuildermainareabox .item.requiredcheckbox"); 721 if (requiredCheckBoxItems.length > 0) { 722 for (var i = 0; i < requiredCheckBoxItems.length; i++) { 723 var requiredID = $(requiredCheckBoxItems[i]).data("multicheckboxgroup"); 724 var childCheckBoxes = $(requiredCheckBoxItems[i]).find(" input[type='checkbox']"); 725 var anyChecked = false; 726 for (var ii = 0; ii < childCheckBoxes.length; ii++) { 727 if ($(childCheckBoxes[ii]).is(":checked")) { 728 // all good 729 anyChecked = true; 730 break; 731 } 732 } 733 734 // if non checked, validation fails 735 if (!anyChecked) { 736 $("#" + requiredID + "REQ").show(); 737 $("#" + requiredID + "REQ2").show(); 738 valRes = false; 739 } 740 } 741 } 742 743 // also need to check phoneValidation too now 744 if (hasPhoneVal && !phoneValidated) { 745 $("#ContactData_" + formPrefix + "_DirectLine").addClass("error"); 746 $("#ContactData_" + formPrefix + "_DirectLineREQ").show(); 747 $("#ContactData_" + formPrefix + "_DirectLineREQ2").show(); 748 valRes = false; 749 } 750 751 // and email validation 752 if (hasEmailVal && !emailValidated) { 753 $("#User_" + formPrefix + "_LoginName").addClass("error"); 754 $("#User_" + formPrefix + "_LoginNameREQ").show(); 755 $("#User_" + formPrefix + "_LoginNameREQ2").show(); 756 valRes = false; 757 } 758
759 // scroll to top?... maybe highest error?.. top's simple 760 if (!valRes) { 761 //$('html, body').animate({ 762 // scrollTop: 0 763 //}, 1000); 764 return valRes; 765 } else { 766 return true; 767 } 768 } 769} 770 771function FormStep_SetButtons() { 772 // if we're not on last step, hide submit button 773 var submitButton = $("#FormBuilderSubmitButton_" + formPrefix); 774 if (isRecaptcha) { 775 submitButton = $("#FormBuilderSubmitButton_" + formPrefix + "_gcapt"); 776 } 777 var submitButtonID = $(submitButton).attr('id'); 778 779 if (curStep !== maxSteps) { 780 if ($("#" + submitButtonID + "_Next").length === 0) { 781 782 $("#" + submitButtonID).hide(300); 783 $("#" + submitButtonID).css("float", "right"); 784 785 // and show 'next' button in it's place 786 var nextButton = $('<div/>', { 787 id: submitButtonID + "_Next", 788 class: $(submitButton).attr('class') + " submit", 789 onmouseup: 'FormStep_Next(1);', 790 html: '<span>' + nextLabel + '</span>', 791 style: 'padding-top: 15px;float:right;' 792 }).insertBefore("#" + submitButtonID); 793 794 // also always create a back button, but it will only be shown not on first page 795 var nextButton = $('<div/>', { 796 id: submitButtonID + "_Back", 797 class: $(submitButton).attr('class') + " submit", 798 onmouseup: 'FormStep_Next(-1);', 799 html: '<span>' + backLabel + '</span>', 800 style: 'padding-top: 15px;' 801 }).insertBefore("#" + submitButtonID); 802 803 if (curStep === 1) { 804 $("#" + submitButtonID + "_Back").hide(); 805 } 806 } else { 807 // show next, and check if back is needed 808 $("#" + submitButtonID).hide(300); 809 810 $("#" + submitButtonID + "_Next").show(); 811 if (curStep === 1) { 812 $("#" + submitButtonID + "_Back").hide(); 813 } 814 } 815 } else if (curStep === maxSteps) { 816 $("#" + submitButtonID + "_Next").hide(); 817 $("#" + submitButtonID + "_Back").show(); 818 $("#" + submitButtonID).show(100); 819 } 820} 821 822function FormStep_ShowHideStep() { 823 // hide all step panels. 824 for (var i = 1; i <= maxSteps; i++) { 825 // var stepPanels = $("#FormBuilderFormName_" + formPrefix + " .formstep.step" + i); 826 var stepPanels = $(".formstep.step" + i); 827 for (var ii = 0; ii < stepPanels.length; ii++) { 828 $(stepPanels).hide(300); 829 } 830 } 831 832 // find current panels, and show them 833 // var thisStepPanels = $("#FormBuilderFormName_" + formPrefix + " .formstep.step" + curStep); 834 var thisStepPanels = $(".formstep.step" + curStep); 835 for (var ii = 0; ii < thisStepPanels.length; ii++) { 836 $(thisStepPanels).show(100); 837 } 838} 839 840function FormStep_Progress() { 841 // find progress panel, and set progress bar 842 // var progressOuter = $("#FormBuilderFormName_" + formPrefix + " .formstep.formprogress"); 843 var progressOuter = $(".formstep.formprogress"); 844 var ph = '<div class="outer"><div class="inner" style="width:' + ((curStep / maxSteps) * 100) + '%;"></div>'; 845 progressOuter.html(ph); 846} 847 848 849function SubFormAutoPopParms() { 850 // go through all parms, and autopopulate from raw string 851 var urlParameters = window.location.search.substring(1); 852 var urlVariables = urlParameters.split('&'); 853 854 for (var i = 0; i < urlVariables.length; i++) { 855 var parameterNameAndVal = urlVariables[i].split('='); 856 var pName = parameterNameAndVal[0]; 857 858 // do we have this input? 859 var findParmElement = $("[id$='_" + formPrefix + "_" + pName + "']"); 860 if (findParmElement.length > 0) { 861 $(findParmElement).val(parameterNameAndVal[1]); 862 $(findParmElement).change(); // any events, like apply discount code etc 863 864 // and if discount, trigger that 865 if (pName == "DiscountCode") { 866 DiscountCode_Apply(); 867 } 868 } 869 } 870} 871 872 873function BillingAddressChange(e, billingPrefix, clearValue) { 874 if (billingPrefix === undefined) { 875 billingPrefix = "Billing"; 876 } 877 878 // if the change has the value to clear 879 if ($(e).val() == clearValue) { 880 881 var billingAddressItems = $('[id^=Address_2_' + billingPrefix + '_]'); 882 for (var i = 0; i < billingAddressItems.length; i++) { 883 $(billingAddressItems[i]).val(''); 884 } 885 } 886} 887 888function DiscountCodeApply_Setup() { 889 var discountEl = $("#Object_" + formPrefix + "_DiscountCode"); 890 if (discountEl.length > 0) { 891 // make input smaller
892 $(discountEl).css("width", "50%"); 893 894 // add change event to clear 895 $(discountEl).keyup(function () { 896 $(this).removeClass("discountconfirm"); 897 $("#DiscountCodeApply").show(); 898 $("#Object_" + formPrefix + "_DiscountCode").removeClass("error"); 899 $("#Object_" + formPrefix + "_DiscountCodeERR").hide(); 900 $("#Object_" + formPrefix + "_DiscountCodeERR2").hide(); 901 902 $("#DiscountCheckConfirm").removeClass("failure"); 903 $("#DiscountCheckConfirm").removeClass("applied"); 904 $("#DiscountCheckConfirm span").html(""); 905 }); 906 907 // add button after 908 $(discountEl).after('<div class="submit" style="width:10%;float:right;margin:0;"> <div id=\"DiscountCheckConfirm\" class=\"discountsuccess\"><span></span></div> <div id="DiscountCodeApply" class="submit floatright" onclick="DiscountCode_Apply(' + "'" + $(discountEl).attr('id') + "'" + ');"><span>Apply</span></div></div> '); 909 910 // do we already have a discount value pre-popped?! 911 if ($(discountEl).val().length > 0) { 912 DiscountCode_Apply($(discountEl).attr('id')); 913 } 914 } 915} 916 917function DiscountCode_Apply(dsid) { 918 // drop down fires twice for some reason? 919 if (c_discountCheckInProgress) { 920 return; 921 } 922 c_discountCheckInProgress = true; 923 if (dsid == undefined) { 924 // default to... 925 dsid = "Object_" + formPrefix + "_DiscountCode"; 926 } 927 928 var el = $("#" + dsid); 929 if (el.length > 0) { 930 $("#" + dsid).removeClass("discountconfirm"); 931 $("#" + dsid).removeClass("error"); 932 $("#" + dsid + "ERR").hide(); 933 $("#" + dsid + "ERR2").hide(); 934 $("#DiscountCheckConfirm").removeClass("failure"); 935 $("#DiscountCheckConfirm").removeClass("confirm"); 936 $("#DiscountCheckConfirm span").html(""); 937 938 var dcode = $(el).val(); 939 if (dcode == "") { 940 // nothing entered 941 return; 942 } 943 // show a progress? 944 $("#" + dsid).after("<div id=\"DiscountCheckProgress\" class=\"spinning-loader floatright\"></div>"); 945 946 // find subscription 947 var subID = 0; 948 var subidEl = $("#Subscription_" + formPrefix + "_SubscriptionID"); 949 if (subidEl.length > 0) { 950 subID = $(subidEl).val(); 951 } else { 952 subidEl = $("#Object_" + formPrefix + "_SubscriptionID"); 953 if (subidEl.length > 0) { 954 subID = $(subidEl).val(); 955 } 956 } 957 958 // email? 959 var em = $("#User_" + formPrefix + "_LoginName").val(); 960 if (em == "") { 961 em = $("#ContactData_" + formPrefix + "_Email").val(); 962 } 963 964 // hit code to check discount 965 var params = "Common.mui?Action=SubscriptionFormDiscountCodeCheck"; 966 var args = new WyvernAjaxArgsClass(); 967 968 //args.parameters.push(new WyvernParameterItemClass("ActionSource", "config")); 969 //args.parameters.push(new WyvernParameterItemClass("ActionType", "Membership")); 970 args.parameters.push(new WyvernParameterItemClass("SubscriptionID", subID)); 971 args.parameters.push(new WyvernParameterItemClass("DiscountCode", dcode)); 972 args.parameters.push(new WyvernParameterItemClass("Prefix", formPrefix)); 973 args.parameters.push(new WyvernParameterItemClass("Email", em)); 974 975 WyvernAjax(params, function (data) { 976 $("#DiscountCheckProgress").remove(); 977 978 if (data.Status == 1) { 979 // show some success? 980 $("#" + dsid).addClass("discountconfirm"); 981 $("#DiscountCodeApply").hide(); 982 $("#" + dsid).removeClass("error"); 983 $("#" + dsid + "ERR").hide(); 984 $("#" + dsid + "ERR2").hide(); 985 986 $("#DiscountCheckConfirm span").html("✓"); 987 $("#DiscountCheckConfirm").removeClass("failure"); 988 $("#DiscountCheckConfirm").addClass("applied"); 989 990 // show disount message 991 $("#DiscountMessage").remove(); 992 $("#" + dsid).after('<div class="discountmessage" id="DiscountMessage"><span>' + data.Data + '</span></div>'); 993 994 } 995 else { 996 ValidationShow(data.ValidationList, $("#FormBuilderFormName_" + formPrefix), "", ""); 997 $("#DiscountCodeApply").show(); 998 999 $("#DiscountCheckConfirm span").html("X"); 1000 $("#DiscountCheckConfirm").addClass("failure"); 1001 $("#DiscountCheckConfirm").removeClass("applied"); 1002 } 1003 1004 c_discountCheckInProgress = false; 1005 }, args); 1006 1007 } 1008} 1009 1010function HideElementsOnLoad() { 1011 // find area's and hide
1012 var hideOnLoadItems = $(".formbuilderareaitem.hideonload"); 1013 for (var i = 0; i < hideOnLoadItems.length; i++) { 1014 1015 // do we have any required elements now being hidden? 1016 var inputItems = $(hideOnLoadItems[i]).find("input"); 1017 var selectItems = $(hideOnLoadItems[i]).find("select"); 1018 for (var ii = 0; ii < selectItems.length; ii++) { 1019 inputItems.push(selectItems[ii]); 1020 } 1021 1022 if (inputItems.length > 0) { 1023 for (var iii = 0; iii < inputItems.length; iii++) { 1024 if ($(inputItems[iii]).prop("required")) { 1025 // turn off required, and add class to put it back when it's show below 1026 $(inputItems[iii]).prop("required", ""); 1027 $(inputItems[iii]).addClass("visiblerequiredtag"); 1028 1029 // also check if the err and err2 is visible 1030 $("#" + $(inputItems[iii]).attr('id') + "ERR").hide(); 1031 $("#" + $(inputItems[iii]).attr('id') + "ERR2").hide(); 1032 $("#" + $(inputItems[iii]).attr('id') + "REQ").hide(); 1033 $("#" + $(inputItems[iii]).attr('id') + "REQ2").hide(); 1034 } 1035 } 1036 } 1037 1038 // and hide area 1039 $(hideOnLoadItems[i]).hide(); 1040 } 1041} 1042 1043 1044function CountryStateRequired(e, requiredValue, prefix) { 1045 if (prefix === undefined) { 1046 prefix = ""; 1047 } 1048 if (requiredValue === undefined) { 1049 requiredValue = 295; 1050 } 1051 var selectedVal = $(e).val(); 1052 $("#Address_" + formPrefix + prefix + "_State").val(""); 1053 1054 if (requiredValue == selectedVal) { 1055 // state should be required 1056 1057 $("#Address_" + formPrefix + prefix + "_State").prop("required", "required"); 1058 $("#Address_" + formPrefix + prefix + "_StateREQ").html("* Required - 2 Character state code."); 1059 $("#Address_" + formPrefix + prefix + "_State").prop("maxlength", "2"); 1060 $("#Address_" + formPrefix + prefix + "_StateREQ2").show(); 1061 // $("#Address_" + formPrefix + prefix + "_State").trigger('focusout'); 1062 1063 } else { 1064 // state should not be required 1065 $("#Address_" + formPrefix + prefix + "_State").prop("required", ""); 1066 $("#Address_" + formPrefix + prefix + "_State").removeAttr("maxlength"); 1067 $("#Address_" + formPrefix + prefix + "_StateREQ2").remove(); 1068 } 1069} 1070// a 2nd one was done, as we must have forgotten about the first one 1071function CountryChange(e) { 1072 // if country is US, mark state as required 1073 var v = $(e).val(); 1074 var stateID = $(e).attr("id").replace("_CountryID", "_State"); 1075 if (v == 295) { 1076 $("#" + stateID).prop("required", "required"); 1077 } else { 1078 $("#" + stateID).prop("required", ""); 1079 } 1080} 1081 1082 1083 1084 1085function PhoneValidation_Setup() { 1086 // check to see if this form has a phone number validation hidden field, toactivate that view/function 1087 1088 if ($("#Object_" + formPrefix + "_TelephoneValidation").length > 0) { 1089 var eid = $("#Object_" + formPrefix + "_TelephoneValidation").val(); 1090 1091 if (eid > 0) { 1092 hasPhoneVal = true; 1093 1094 // find telephone element, make slightly shorter, and add validation icon space to the right, like discounts 1095 var phoneEl = $("#ContactData_" + formPrefix + "_DirectLine"); 1096 if (phoneEl.length > 0) { 1097 // $(phoneEl).width($(phoneEl).width() - 75); 1098 1099 // add change event to clear 1100 $(phoneEl).keyup(function () { 1101 $(this).removeClass("discountconfirm"); 1102 1103 $("#ContactData" + formPrefix + "_DirectLine").removeClass("error"); 1104 $("#ContactData" + formPrefix + "_DirectLineERR").hide(); 1105 $("#ContactData" + formPrefix + "_DirectLineERR2").hide(); 1106 1107 $("#PhoneValidConfirm").removeClass("failure"); 1108 $("#PhoneValidConfirm").removeClass("applied"); 1109 $("#PhoneValidConfirm span").html(""); 1110 }); 1111 1112 $(phoneEl).focusout(PhoneValidation_Validate); 1113 1114 // add button after 1115 $(phoneEl).after('<div class="" style="width:45px;height:35px;float:right;margin:0;"><div id=\"PhoneValidConfirm\" class=\"discountsuccess\"><span></span></div></div> '); 1116 } 1117 1118 } 1119 } 1120} 1121 1122function PhoneValidation_Validate() { 1123 var telElName = "Object_" + formPrefix + "_TelephoneValidation"; 1124 var el = $("#" + telElName); 1125 if (el.length > 0) { 1126 $(el).removeClass("discountconfirm"); 1127 $("#ContactData_" + formPrefix + "_DirectLine").removeClass("error"); 1128 $("#ContactData_" + formPrefix + "_DirectLine").prop('invalid', false); 1129 1130 $("#" + telElName + "ERR").hide(); 1131 $("#" + telElName + "ERR2").hide(); 1132 $("#PhoneValidConfirm").removeClass("failure"); 1133 $("#PhoneValidConfirm").removeClass("confirm"); 1134 $("#PhoneValidConfirm span").html(""); 1135 1136 var phone = $("#ContactData_" + formPrefix + "_DirectLine").val(); 1137 if (phone == "") { 1138 // nothing entered 1139 return; 1140 } 1141 // show a progress? 1142 $("#ContactData_" + formPrefix + "_DirectLine").after("<div id=\"PhoneCheckProgress\" class=\"spinning-loader floatright\"></div>"); 1143 1144 // find country 1145 var countryID = 0; 1146 var countryidEl = $("#Address_" + formPrefix + "_CountryID"); 1147 if (countryidEl.length > 0) { 1148 countryID = $(countryidEl).val(); 1149 } else { 1150 countryidEl = $("#Object_" + formPrefix + "_CountryID"); 1151 if (countryidEl.length > 0) { 1152 countryID = $(countryidEl).val(); 1153 } else { 1154 // countryID field not found? 1155 // just validate? 1156 // show success? 1157 // BannerShow("Forced", "Info"); 1158 $("#" + telElName).removeClass("error"); 1159 $("#" + telElName + "ERR").hide(); 1160 $("#" + telElName + "ERR2").hide(); 1161 1162 phoneValidated = true; 1163 1164 return; 1165 } 1166 } 1167 1168 if (countryID == 0 || countryID == null) { 1169 BannerShow("Please complete your address first."); 1170 1171 return; 1172 } 1173 1174 // and externalAPIID 1175 var eid = $("#Object_" + formPrefix + "_TelephoneValidation").val(); 1176 1177 // hit code to check 1178 var params = "Common.wwc?Action=PhoneNumberValidation"; 1179 var args = new WyvernAjaxArgsClass(); 1180 1181 args.parameters.push(new WyvernParameterItemClass("Phone", phone)); 1182 args.parameters.push(new WyvernParameterItemClass("CountryID", countryID)); 1183 args.parameters.push(new WyvernParameterItemClass("Exter
1183nalAPIID", eid)); 1184 args.parameters.push(new WyvernParameterItemClass("Prefix", formPrefix)); 1185 1186 phoneValidationRunning = true; 1187 1188 WyvernAjax(params, function (data) { 1189 $("#PhoneCheckProgress").remove(); 1190 phoneValidationRunning = false; 1191 1192 1193 if (data.Status == 1) { 1194 // show some success? 1195 $("#" + telElName).addClass("discountconfirm"); 1196 1197 $("#" + telElName).removeClass("error"); 1198 $("#" + telElName + "ERR").hide(); 1199 $("#" + telElName + "ERR2").hide(); 1200 1201 $("#PhoneValidConfirm span").html("✓"); 1202 $("#PhoneValidConfirm").removeClass("failure"); 1203 $("#PhoneValidConfirm").addClass("applied"); 1204 1205 phoneValidated = true; 1206 } 1207 else { 1208 ValidationShow(data.ValidationList, $("#FormBuilderFormName_" + formPrefix), "", ""); 1209 1210 $("#PhoneValidConfirm span").html("X"); 1211 $("#PhoneValidConfirm").addClass("failure"); 1212 $("#PhoneValidConfirm").removeClass("applied"); 1213 1214 // mark as invalid 1215 $("#ContactData_" + formPrefix + "_DirectLine").prop('invalid', true); 1216 1217 phoneValidated = false; 1218 } 1219 }, args); 1220 } 1221} 1222 1223function EmailValidation_Setup() { 1224 // check to see if this form has a phone number validation hidden field, toactivate that view/function 1225 1226 if ($("#Object_" + formPrefix + "_EmailValidation").length > 0) { 1227 var eid = $("#Object_" + formPrefix + "_EmailValidation").val(); 1228 1229 if (eid > 0) { 1230 hasEmailVal = true; 1231 1232 // find email element, make slightly shorter, and add validation icon space to the right, like discounts 1233 var emailEl = $("#User_" + formPrefix + "_LoginName"); 1234 if (emailEl.length > 0) { 1235 // $(phoneEl).width($(phoneEl).width() - 75); 1236 1237 // add change event to clear 1238 $(emailEl).keyup(function () { 1239 $(this).removeClass("discountconfirm"); 1240 1241 $("#User_" + formPrefix + "_LoginName").removeClass("error"); 1242 $("#User_" + formPrefix + "_LoginNameERR").hide(); 1243 $("#User_" + formPrefix + "_LoginNameERR2").hide(); 1244 1245 $("#EmailValidConfirm").removeClass("failure"); 1246 $("#EmailValidConfirm").removeClass("applied"); 1247 $("#EmailValidConfirm span").html(""); 1248 }); 1249 1250 $(emailEl).focusout(EmailValidation_Validate); 1251 1252 // add in REQ if not present 1253 if ($("#User_" + formPrefix + "_LoginNameREQ").length == 0) { 1254 $(emailEl).after('<div class="requirements" id="User_' + formPrefix + '_LoginNameREQ">* Valid email required</div>'); 1255 } 1256 if ($("#User_" + formPrefix + "_LoginNameREQ2").length == 0) { 1257 $("#FormBuilderFormName_" + formPrefix + "_val2_Inner").append('<div id="User_' + formPrefix + '_LoginNameREQ2" class="requirements2 hide ">* Valid email required</div>'); 1258 } 1259 1260 // add button after 1261 $(emailEl).after('<div class="" style="width:45px;float:right;margin:0;"><div id=\"EmailValidConfirm\" class=\"discountsuccess\"><span></span></div></div> '); 1262 } 1263 1264 } 1265 } 1266} 1267 1268function EmailValidation_Validate() { 1269 var emailElName = "User_" + formPrefix + "_LoginName"; 1270 var el = $("#" + emailElName); 1271 if (el.length > 0) { 1272 $(el).removeClass("discountconfirm"); 1273 $("#ContactData_" + formPrefix + "_DirectLine").removeClass("error"); 1274 $("#ContactData_" + formPrefix + "_DirectLine").prop('invalid', false); 1275 1276 $("#" + emailElName + "ERR").hide(); 1277 $("#" + emailElName + "ERR2").hide(); 1278 $("#EmailValidConfirm").removeClass("failure"); 1279 $("#EmailValidConfirm").removeClass("confirm"); 1280 $("#EmailValidConfirm span").html(""); 1281 1282 var email = $("#User_" + formPrefix + "_LoginName").val(); 1283 if (email == "") { 1284 // nothing entered 1285 return; 1286 } 1287 // show a progress? 1288 $("#User_" + formPrefix + "_LoginName").after("<div id=\"EmailCheckProgress\" class=\"spinning-loader floatright\"></div>"); 1289 1290 // and externalAPIID 1291 var eid = $("#Object_" + formPrefix + "_EmailValidation").val(); 1292 1293 // hit code to check 1294 var params = "Common.wwc?Action=EmailValidation"; 1295 var args = new WyvernAjaxArgsClass(); 1296 1297 args.parameters.push(new WyvernParameterItemClass("Email", email)); 1298 args.parameters.push(new WyvernParameterItemClass("Exter
1298nalAPIID", eid)); 1299 args.parameters.push(new WyvernParameterItemClass("Prefix", formPrefix)); 1300 1301 1302 WyvernAjax(params, function (data) { 1303 $("#EmailCheckProgress").remove(); 1304 1305 if (data.Status == 1) { 1306 // show some success? 1307 $("#" + emailElName).addClass("discountconfirm"); 1308 1309 $("#" + emailElName).removeClass("error"); 1310 $("#" + emailElName + "ERR").hide(); 1311 $("#" + emailElName + "ERR2").hide(); 1312 1313 $("#" + emailElName + "REQ").hide(); 1314 $("#" + emailElName + "REQ2").hide(); 1315 1316 $("#EmailValidConfirm span").html("✓"); 1317 $("#EmailValidConfirm").removeClass("failure"); 1318 $("#EmailValidConfirm").addClass("applied"); 1319 1320 emailValidated = true; 1321 } 1322 else { 1323 ValidationShow(data.ValidationList, $("#FormBuilderFormName_" + formPrefix), "", ""); 1324 1325 $("#EmailValidConfirm span").html("X"); 1326 $("#EmailValidConfirm").addClass("failure"); 1327 $("#EmailValidConfirm").removeClass("applied"); 1328 1329 $("#" + emailElName + "REQ").html(data.Message).show(); 1330 $("#" + emailElName + "REQ2").html(data.Message).show(); 1331 1332 // mark as invalid 1333 $("#User_" + formPrefix + "_LoginName").prop('invalid', true); 1334 1335 emailValidated = false; 1336 } 1337 }, args); 1338 } 1339} 1340 1341 1342function MarqueeNextClick() { 1343 // do we have any marquee tags... 1344 1345 var marqueeItems = $(".marqueeouter .marqueeitem"); 1346 1347 if (c_marqueeIndex == -1) { 1348 // first run... 1349 c_marqueeIndex = Math.floor(Math.random() * (marqueeItems.length - 1)); // random between 0 and length-1 of items 1350 } else { 1351 c_marqueeIndex++; 1352 } 1353 1354 if (c_marqueeIndex >= marqueeItems.length) { 1355 c_marqueeIndex = 0; 1356 } 1357 1358 if (marqueeItems.length > 0) { 1359 c_marqueeTotal = marqueeItems.length; // set total 1360 // hide all 1361 for (var i = 0; i < marqueeItems.length; i++) { 1362 $(marqueeItems[i]).css({ "display": "none", "opacity": "0" }); 1363 } 1364 1365 // and show the one we want 1366 var itemToShow = $(marqueeItems[c_marqueeIndex]); 1367 $(itemToShow).css({ "display": "block", "opacity": "1"}); 1368 } 1369} 1370 1371function NumbersOnly(e) { 1372 var v = $(e).val(); 1373 v = v.replace(/\D/g, ''); 1374 $(e).val(v); 1375} 1376 1377function AdminShowAllPages() { 1378 $(".formbuilderareaitem .formstep").show(); 1379} 1380 1381 1382 1383
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.