PageSourceSearch

https://membership.crnasia.com/Resource/Javascript/subscriptionform.js

js crnasia.com collected 2026-10-03 22:33:59 UTC 54,038 bytes, 1,383 lines download raw bytes

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("&#10003;");
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("&#10003;");
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("&#10003;");
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.