PageSourceSearch

https://www.baja-mex.com/buy.js

js baja-mex.com collected 2026-10-08 08:44:08 UTC 55,332 bytes, 1,627 lines download raw bytes

1// Buy Insurance program
2
3
4// date/time picker here:
5// http://www.ama3.com/anytime/
6
7var buy = function() {};
8var pay = function() {};
9
10buy.monthNames = [
11    'January',
12    'February',
13    'March',
14    'April',
15    'May',
16    'June',
17    'July',
18    'August',
19    'September',
20    'October',
21    'November',
22    'December'
23];
24
25buy.modelData = {
26    havePolicy: undefined,
27    haveVIN: undefined,
28    vType: undefined,
29    vYear: undefined,
30    vMake: undefined,
31    vModel: undefined,
32    vValue: undefined,
33    vVin: undefined,
34    power: undefined,
35    carrier: 0,
36    carrierName: '',
37    carrierPolicyNumber: '',
38    carrierPolicyExpires: '',
39    tEnabled: false,
40    tType: undefined,
41    tYear: undefined,
42    tMake: undefined,
43    tValue: undefined,
44    enterMonth: undefined,
45    enterDay: undefined,
46    enterYear: undefined,
47    enterHour: undefined,
48    enterap: undefined,
49    exitMonth: undefined,
50    exitDay: undefined,
51    exitYear: undefined,
52    exitHour: undefined,
53    exitap: undefined,
54    numDays: undefined,
55    policyType: 'maxhigh',
56    firstname: undefined,
57    lastname: undefined,
58    email: undefined,
59    phone2: undefined,
60    address: undefined,
61    address2: undefined,
62    city: undefined,
63    state: undefined,
64    zip: undefined,
65    country: 'US',
66    lEnabled: false,
67    lname: undefined,
68    laddress: undefined,
69    laddress2: undefined,
70    lcity: undefined,
71    lstate: undefined,
72    lzip: undefined,
73    lcountry: undefined,
74    cardType: undefined,
75    cardNumber: undefined,
76    cardMonth: undefined,
77    cardYear: undefined,
78    cardFirstname: undefined,
79    cardLastname: undefined,
80    cardPhone: undefined,
81    cardAddress: undefined,
82    cardAddress2: undefined,
83    cardCity: undefined,
84    cardState: undefined,
85    cardZip: undefined,
86    cardCountry: undefined,
87    eligibleForMaxCoverage: false
88};
89
90buy.vMakeOptions = null;
91buy.vModelOptions = null;
92buy.TOP = 160;
93
94
95buy.rpc = function(args, callback) {
96    var body = $('#body');
97    $.blockUI({ message: 'Please wait...' });
98    $.ajax({
99        type: 'POST',
100        url: '/buy.php',
101        data: args,
102        dataType: 'json',
103        success: function(o, status, xhr) {
104            $.unblockUI();
105            callback && callback(o);
106        },
107        error: function(xhr, status, error) {
108            console.error('Error: ' + error);
109        }
110    });
111};
112
113pay.rpc = function(args, callback) {
114    var body = $('#body');
115    $.blockUI({ message: 'Charging your credit card...<br/>Please allow up to 60 seconds for processing.' });
116    $.ajax({
117        type: 'POST',
118        url: '/Pay.php',
119        data: args,
120        dataType: 'json',
121        timeout: 60000, // 60 second timeout
122        success: function(o, status, xhr) {
123            $.unblockUI();
124            callback && callback(o);
125        },
126        error: function(xhr, status, error) {
127            $.unblockUI();
128            console.error('Payment Error: ' + error);
129            alert('There was a problem processing your payment. Please check your email for a confirmation before trying again, or contact us if you need assistance.');
130        }
131    });
132};
133
134buy.FormField = function(config) {
135    var initialConfig = config;
136
137    var el = $('#'+config.id);
138    var spanEl = $('#'+config.id+'-span');
139    var labelEl = $('#'+config.id+'-label');
140    var reqEl = $('#'+config.id+'-req');
141
142    var methods = {
143        id: config.id,
144        disable: function() {
145            el.attr('disabled', 'disabled');
146            el.addClass('disabled');
147            el.parent().parent().addClass('disabled');
148            labelEl.addClass('disabled');
149            spanEl.addClass('disabled');
150        },
151        enable: function() {
152            el.removeAttr('disabled');
153            el.removeClass('disabled');
154            el.parent().parent().removeClass('disabled');
155            labelEl.removeClass('disabled');
156            spanEl.removeClass('disabled');
157        },
158        getValue: function() {
159            var v = $.trim(el.val());
160            if (v === 'none') {
161                v = undefined;
162            }
163            return v;
164        },
165        setValue: function(v) {
166            el.val(v);
167            var d = $('#'+config.id+' :selected').text();
168            spanEl.text(d);
169        },
170        focus: function() {
171            el.focus();
172        },
173        setOptions: function(html) {
174            el.html(html);
175        },
176        markValid: function(enable) {
177            if (!enable) {
178                labelEl.removeClass('disabled');
179                //el.attr('disabled', 'disabled');
180                //el.addClass('disabled');
181                //spanEl.addClass('disabled');
182            }
183            reqEl.addClass('valid');
184            reqEl.text('');
185        },
186        markConfirmed: function() {
187            reqEl.removeClass('req');
188            reqEl.removeClass('valid');
189            reqEl.addClass('confirmed');
190            reqEl.text('');
191        },
192        markRequired: function(text) {
193            text = text || 'Required';
194            reqEl.removeClass('confirmed');
195            reqEl.removeClass('valid');
196            reqEl.addClass('req');
197            reqEl.text(text);
198        },
199        replaceMarkup: function(html) {
200            labelEl.parent().html(html);
201            el = $('#'+config.id);
202            spanEl = $('#'+config.id+'-span');
203            labelEl = $('#'+config.id+'-label');
204            reqEl = $('#'+config.id+'-req');
205            if (config.listeners) {
206                for (var type in config.listeners) {
207                    el.bind(type, { type: type }, function(e) {
208                        config.listeners[e.data.type] && config.listeners[e.data.type].apply(methods);
209                        return false;
210                    });
211                }
212            }
213        }
214    };
215
216    if (config.methods) {
217        for(var m in config.methods) {
218            methods[m] = function() {
219                var m = arguments.callee.function_name;
220                config.methods[m].apply(this);
221            }
222            methods[m].function_name = m;
223        }
224    }
225
226    if (config.options) {
227        methods.setOptions(config.options);
228    }
229    if (config.value) {
230        methods.setValue(config.value);
231        methods.markValid();
232    }
233
234    if (config.disabled) {
235        methods.disable();
236    }
237    if (config.listeners) {
238        for (var type in config.listeners) {
239            //console.log('binding ' + type + ' to ' + config.id);
240            el.bind(type, { type: type }, function(e) {
241                //console.log(e.data.type + ' ' + config.id);
242                config.listeners[e.data.type] && config.listeners[e.data.type].apply(methods);
243                return false;
244            });
245        }
246    }
247    return methods;
248};
249
250
251// Removes any class containing "step" from #sub-main-content
252buy.cleanSubMainContentClass = function () {
253    $("#sub-main-content").removeClass(function (index, css) {
254        return (css.match (/\bstep\S+/g) || []).join(' '); // removes anything that starts with "step"
255    });
256};
257
258buy.breadcrumb = function(step) {
259    for (s=1; s<step; s++) {
260        $('#breadcrumb-step'+s).removeClass('active-step').addClass('completed-step');
261    }
262    $('#breadcrumb-step'+step).addClass('active-step').removeClass('completed-step');
263    for (s=step+1; s<10; s++) {
264        $('#breadcrumb-step'+s).removeClass('active-step').removeClass('completed-step');
265    }
266};
267
268buy.layout2 = function(step, html) {
269    buy.cleanSubMainContentClass();
270    $('#sub-main-content')
271        .addClass('step-' + step)
272        .html(html);
273    $('#layout-3col').attr('id', 'layout-2col');
274    $('#col3').hide();
275    //PINT.init();
276    buy.breadcrumb(step);
277};
278
279buy.layout3 = function(step, html) {
280    buy.cleanSubMainContentClass();
281    $('#sub-main-content')
282        .addClass('step-' + step)
283        .html(html);
284    $('#layout-2col').attr('id', 'layout-3col');
285    //PINT.init();
286    buy.breadcrumb(step);
287};
288
289buy.initStep = function(step) {
290    $('#enterDate').AnyTime_noPicker();
291    $('#exitDate').AnyTime_noPicker();
292};
293
294buy.step1 = function() {
295    buy.initStep(1);
296    buy.rpc({ method: 'getStepHtml', step: 1 }, function(o) {
297        buy.layout3(1, o.html);
298        $('#col3').show();
299
300        // $('#carrierPolicyExpires').mask('00-00-0000');
301        /*
302        var carrierName = new buy.FormField({
303            id: 'carrierName',
304            disabled: !buy.modelData.carrierName,
305            value: buy.modelData.carrierName,
306            listeners: {
307                change: function() {
308                    buy.modelData.carrierName = this.getValue();
309                    if (buy.modelData.carrierName.length) {
310                        this.markValid();
311                    }
312                    else {
313                        buy.modelData.carrierName = undefined;
314                        this.setValue('');
315                    }
316                },
317                blur: function() {
318                    buy.modelData.carrierName = this.getValue();
319                    if (buy.modelData.carrierName.length) {
320                        this.markValid();
321                    }
322                    else {
323                        buy.modelData.carrierName = undefined;
324                    }
325                }
326            },
327            methods: {
328                activate: function() {
329                    this.enable();
330                }
331            }
332        });
333
334        var carrierPolicyNumber = new buy.FormField({
335            id: 'carrierPolicyNumber',
336            disabled: !buy.modelData.carrierPolicyNumber,
337            value: buy.modelData.carrierPolicyNumber,
338            listeners: {
339                change: function() {
340                    buy.modelData.carrierPolicyNumber = this.getValue();
341                    if (buy.modelData.carrierPolicyNumber.length) {
342                        this.markValid();
343                    }
344                    else {
345                        buy.modelData.carrierPolicyNumber = undefined;
346                        this.setValue('');
347                    }
348                },
349                blur: function() {
350                    buy.modelData.carrierPolicyNumber = this.getValue();
351                    if (buy.modelData.carrierPolicyNumber.length) {
352                        this.markValid();
353                    }
354                    else {
355                        buy.modelData.carrierPolicyNumber = undefined;
356                    }
357                }
358            },
359            methods: {
360                activate: function() {
361                    this.enable();
362                }
363            }
364        });
365
366        var carrierPolicyExpires = new buy.FormField({
367            id: 'carrierPolicyExpires',
368            disabled: !buy.modelData.carrierPolicyExpires,
369            value: buy.modelData.carrierPolicyExpires,
370            listeners: {
371                change: function() {
372                    buy.modelData.carrierPolicyExpires = this.getValue();
373                    if (buy.modelData.carrierPolicyExpires.length) {
374                        this.markValid();
375                    }
376                    else {
377                        buy.modelData.carrierPolicyExpires = undefined;
378                        this.setValue('');
379                    }
380                },
381                blur: function() {
382                    buy.modelData.carrierPolicyExpires = this.getValue();
383                    if (buy.modelData.carrierPolicyExpires.length) {
384                        this.markValid();
385                    }
386                    else {
387                        buy.modelData.carrierPolicyExpires = undefined;
388                    }
389                }
390            },
391            methods: {
392                activate: function() {
393                    this.enable();
394                }
395            }
396        });
397        */
398        var vVin = new buy.FormField({
399            id: 'vVin',
400            disabled: !buy.modelData.vValue,
401            value: buy.modelData.vVin,
402            listeners: {
403                change: function() {
404                    buy.modelData.vVin = this.getValue();
405                    if (buy.modelData.vVin.length) {
406                        this.markValid();
407                    }
408                    else {
409                        buy.modelData.vVin = undefined;
410                        this.setValue('');
411                    }
412                },
413                blur: function() {
414                    buy.modelData.vVin = this.getValue();
415                    if (buy.modelData.vVin.length) {
416                        this.markValid();
417                    }
418                    else {
419                        buy.modelData.vVin = undefined;
420                    }
421                }
422            },
423            methods: {
424                activate: function() {
425                    this.enable();
426                }
427            }
428        });
429
430        var vValue = new buy.FormField({
431            id: 'vValue',
432            disabled: !buy.modelData.vModel,
433            value: buy.modelData.vValue,
434            listeners: {
435                change: function() {
436                    buy.modelData.vValue = this.getValue();
437                    if (buy.modelData.vValue.length) {
438                        this.markValid();
439                        vVin.activate();
440                        vVin.focus();
441                    }
442                    else {
443                        buy.modelData.vValue = undefined;
444                    }
445                }
446            },
447            methods: {
448                activate: function() {
449                    var me = this;
450                    this.enable();
451                }
452            }
453        });
454
455        var vModelO = '';
456        var vModel = new buy.FormField({
457            id: 'vModel',
458            disabled: !buy.modelData.vMake,
459            options: buy.vModelOptions,
460            value: buy.modelData.vModel,
461            listeners: {
462                change: function() {
463                    buy.modelData.vModel = this.getValue();
464                    if (buy.modelData.vModel.length) {
465                        this.markValid();
466                        vValue.activate();
467                        vValue.focus();
468                    }
469                    else {
470                        buy.modelData.vModel = undefined;
471                        this.setValue('');
472                    }
473                }
474            },
475            methods: {
476                activate: function() {
477                    var me = this;
478                    buy.modelData.vModel = undefined;
479                    if (buy.modelData.vType === 'Car') {
480                        buy.rpc({ method: 'getModel', year: buy.modelData.vYear, make: buy.modelData.vMake }, function(o) {
481                            buy.vModelOptions = o.html;
482                            me.setOptions(o.html);
483                            me.enable();
484                        });
485                    }
486                }
487            }
488        });
489
490        var vMakeO = '';
491        var vMake = new buy.FormField({
492            id: 'vMake',
493            disabled: !buy.modelData.vYear,
494            options: buy.vMakeOptions,
495            value: buy.modelData.vMake,
496            listeners: {
497                change: function() {
498                    buy.modelData.vMake = this.getValue();
499                    if (buy.modelData.vMake.length) {
500                        this.markValid();
501                        vModel.activate();
502                        vModel.focus();
503                    }
504                    else {
505                        buy.modelData.vMake = undefined;
506                        this.setValue('');
507                    }
508                }/*,
509                focus: function() {
510                    this.activate();
511                }*/
512            },
513            methods: {
514                activate: function() {
515                    var me = this;
516                    buy.modelData.vMake = undefined;
517                    if (buy.modelData.vType === 'Car') {
518                        buy.rpc({ method: 'getMake', year: buy.modelData.vYear}, function(o) {
519                            buy.vMakeOptions = o.html;
520                            me.setOptions(o.html);
521                            me.enable();
522                            me.focus();
523                        });
524                    }
525                }
526            }
527        });
528
529        var vYear = new buy.FormField({
530            id: 'vYear',
531            disabled: !buy.modelData.vType,
532            value: buy.modelData.vYear,
533            listeners: {
534                change: function() {
535                    buy.modelData.vYear = this.getValue();
536                    if (buy.modelData.vYear.length) {
537                        this.markValid();
538                        vMake.activate();
539                    }
540                    else {
541                        buy.modelData.vYear = undefined;
542                    }
543                }
544            }
545        });
546
547        var haveVIN = new buy.FormField({
548            id: 'haveVIN',
549            value: buy.modelData.haveVIN,
550            disabled: false,
551            listeners: {
552                change: function() {
553                    buy.modelData.haveVIN= this.getValue();
554                    if (buy.modelData.tValue.length) {
555                        this.markValid();
556                    }
557                }
558            }
559        });
560
561        function fixForm() {
562            if (buy.modelData.vType && buy.modelData.vType !== 'Car') {
563
564                vMakeO = vMake;
565                vModelO = vModel;
566
567                vMake.replaceMarkup([
568                    '<label id="vMake-label" for="vMake">Make:</label>',
569                    '<input type="text" id="vMake" name="vMake" value="" />',
570                    '<span id="vMake-req" class="req">Required</span>',
571                ].join('\n'));
572                if (buy.modelData.vMake !== undefined) {
573                    vMake.setValue(buy.modelData.vMake);
574                    vMake.markValid();
575                }
576
577                vModel.replaceMarkup([
578                    '<label id="vModel-label" for="vModel">Model:</label>',
579                    '<input type="text" id="vModel" name="vModel" value="" />',
580                    '<span id="vModel-req" class="req">Required</span>',
581                ].join('\n'));
582                if (buy.modelData.vModel !== undefined) {
583                    vModel.setValue(buy.modelData.vModel);
584                    vModel.markValid();
585                }
586
587                vMake.enable();
588                vModel.enable();
589                vValue.enable();
590                vVin.enable();
591            }
592        }
593        var vType = new buy.FormField({
594            id: 'vType',
595            value: buy.modelData.vType,
596            listeners: {
597                change: function() {
598                    buy.modelData.vType = this.getValue();
599                    if (buy.modelData.vType) {
600                        fixForm();
601                        this.markValid();
602                        vYear.enable();
603                        vYear.focus();
604                    }
605
606                    /*
607                    if (buy.modelData.vType === 'Car') {
608                        buy.rpc({ method: 'getMake', year: 2000}, function(o) {
609                            buy.vMakeOptions = o.html;
610                        });
611                    }
612                    */
613
614                }
615            }
616        });
617        fixForm();
618        vType.focus();
619
620        /*
621        if (buy.modelData.carrier) {
622            $('#carrier').attr('checked', 'checked');
623        }
624        function checkEnabled() {
625            if (buy.modelData.carrier) {
626                carrierName.enable();
627                if (buy.modelData.carrierName.length) {
628                    carrierName.markValid();
629                }
630                else {
631                    carrierName.markRequired();
632                }
633                carrierPolicyNumber.enable();
634                if (buy.modelData.carrierPolicyNumber.length) {
635                    carrierPolicyNumber.markValid();
636                }
637                else {
638                    carrierPolicyNumber.markRequired();
639                }
640                carrierPolicyExpires.enable();
641                if (buy.modelData.carrierPolicyExpires.length) {
642                    carrierPolicyExpires.markValid();
643                }
644                else {
645                    carrierPolicyExpires.markRequired();
646                }
647            }
648            else {
649                buy.modelData.carrierName = '';
650                carrierName.setValue('');
651                carrierName.disable();
652                carrierName.markConfirmed();
653                buy.modelData.carrierPolicyNumber = '';
654                carrierPolicyNumber.setValue('');
655                carrierPolicyNumber.disable();
656                carrierPolicyNumber.markConfirmed();
657                buy.modelData.carrierPolicyExpires = '';
658                carrierPolicyExpires.setValue('');
659                carrierPolicyExpires.disable();
660                carrierPolicyExpires.markConfirmed();
661            }
662        }
663        checkEnabled();
664
665        $('#carrier').change(function() {
666            buy.modelData.carrier = $('#carrier').attr('checked');
667            checkEnabled();
668        });
669        */
670        $('#step1-clear').click(function() {
671            buy.modelData.vType = undefined;
672            buy.modelData.vYear = undefined;
673            buy.modelData.vMake = undefined;
674            buy.modelData.vModel = undefined;
675            buy.modelData.vValue = undefined;
676            buy.modelData.vVin = undefined;
677            // buy.modelData.carrier = 0;
678            buy.step1();
679        });
680
681        $('#step1-continue').click(function() {
682            var emsg = [];
683            function validate(ndx, txt) {
684                if (buy.modelData[ndx] === undefined || buy.modelData[ndx] === '') {
685                    emsg.push('* ' + txt + ' is required');
686                }
687            }
688            validate('vType', 'Vehicle Type');
689            validate('vYear', 'Year');
690            validate('vMake', 'Make');
691            validate('vModel', 'Model');
692            validate('vValue', 'Value');
693            validate('vVin', 'VIN');
694            /*
695            if (buy.modelData.carrier) {
696                validate('carrierName', 'Company Name');
697                validate('carrierPolicyNumber', 'Policy Number');
698                validate('carrierPolicyExpires', 'Policy Expires');
699            }
700            */
701            if (emsg.length) {
702                alert('Please fix these errors before you can continue:\n\n' + emsg.join('\n'));
703                return;
704            }
705            if (buy.modelData.vType === 'Car') {
706                buy.modelData.power = 1;
707            }
708            else if (buy.modelData.vType === 'Motorcycle') {
709                buy.modelData.power = 2;
710            }
711
712            buy.step2();
713        });
714
715        $('#step1-prefill').click(function() {
716            var emsg = [];
717            function validate(ndx, txt) {
718                if (buy.modelData[ndx] === undefined || buy.modelData[ndx] === '') {
719                    emsg.push('* ' + txt + ' is required');
720                }
721            }
722            //validate('havePolicy', 'PolicyId');
723            validate('haveVIN', 'VIN');
724            if (emsg.length) {
725                alert('Please fix these errors before you can continue:\n\n' + emsg.join('\n'));
726                return;
727            }
728
729            buy.step1a();
730
731
732        });
733
734        $(document).scrollTop(buy.TOP);
735    });
736};
737
738buy.step1a = function() {
739
740    buy.rpc({ method: 'getPolicy', havePolicy: buy.modelData.havePolicy, haveVIN: buy.modelData.haveVIN }, function(o) {
741
742    });
743
744};
745
746buy.step2 = function() {
747    buy.initStep(2);
748    buy.rpc({ method: 'getStepHtml', step: 2, vValue: buy.modelData.vValue }, function(o) {
749        buy.layout3(2, o.html);
750        $('#col3').show();
751
752        var tValue = new buy.FormField({
753            id: 'tValue',
754            value: buy.modelData.tValue,
755            disabled: true,
756            listeners: {
757                change: function() {
758                    buy.modelData.tValue= this.getValue();
759                    if (buy.modelData.tValue.length) {
760                        this.markValid();
761                    }
762                }
763            }
764        });
765
766        var tVin = new buy.FormField({
767            id: 'tVin',
768            value: buy.modelData.tVin,
769            disabled: true,
770            listeners: {
771                change: function() {
772                    buy.modelData.tVin = this.getValue();
773                    if (buy.modelData.tVin.length) {
774                        this.markValid();
775                    }
776                    else {
777                        buy.modelData.tVin = undefined;
778                    }
779                },
780                blur: function() {
781                    buy.modelData.tVin = this.getValue();
782                    if (buy.modelData.tVin.length) {
783                        this.markValid();
784                    }
785                    else {
786                        buy.modelData.tVin = undefined;
787                    }
788                }
789            }
790        });
791
792        var tMake = new buy.FormField({
793            id: 'tMake',
794            value: buy.modelData.tMake,
795            disabled: true,
796            listeners: {
797                change: function() {
798                    buy.modelData.tMake = this.getValue();
799                    if (buy.modelData.tMake.length) {
800                        this.markValid();
801                    }
802                    else {
803                        buy.modelData.tMake = undefined;
804                    }
805                },
806                blur: function() {
807                    buy.modelData.tMake = this.getValue();
808                    if (buy.modelData.tMake.length) {
809                        this.markValid();
810                    }
811                    else {
812                        buy.modelData.tMake = undefined;
813                    }
814                }
815            }
816        });
817
818        var tYear = new buy.FormField({
819            id: 'tYear',
820            value: buy.modelData.tYear,
821            disabled: true,
822            listeners: {
823                change: function() {
824                    buy.modelData.tYear = this.getValue();
825                    if (buy.modelData.tYear.length) {
826                        this.markValid();
827                    }
828                }
829            }
830        });
831
832        var tType = new buy.FormField({
833            id: 'tType',
834            value: buy.modelData.tType,
835            disabled: true,
836            listeners: {
837                change: function() {
838                    buy.modelData.tType = this.getValue();
839                    if (buy.modelData.tType.length) {
840                        this.markValid();
841                    }
842                }
843            }
844        });
845
846        function reset() {
847            buy.modelData.tEnabled = false;
848            buy.modelData.tType = undefined;
849            buy.modelData.tYear = undefined;
850            buy.modelData.tMake = undefined;
851            buy.modelData.tValue = undefined;
852            buy.modelData.tVin = undefined;
853            buy.step2();
854        }
855
856        function checkEnabled() {
857            if (buy.modelData.tEnabled) {
858                tType.enable();
859                tType.markRequired();
860                tYear.enable();
861                tYear.markRequired();
862                tMake.enable();
863                tMake.markRequired();
864                tVin.enable();
865                tVin.markRequired();
866                tValue.enable();
867                tValue.markRequired();
868            }
869            else {
870                reset();
871            }
872        }
873
874        $('#tEnabled').change(function() {
875            buy.modelData.tEnabled = $('#tEnabled').attr('checked');
876            checkEnabled();
877        })
878
879        tType.disable();
880        tType.markConfirmed();
881        tYear.disable();
882        tYear.markConfirmed();
883        tMake.disable();
884        tMake.markConfirmed();
885        tVin.disable();
886        tVin.markConfirmed();
887        tValue.disable();
888        tValue.markConfirmed();
889
890        $('#step2-back').click(function() {
891            buy.step1();
892        });
893
894        $('#step2-clear').click(function() {
895            reset();
896        });
897
898        $('#step2-continue').click(function() {
899            if (!buy.modelData.tEnabled) {
900                buy.modelData.tType = undefined;
901                buy.modelData.tYear = undefined;
902                buy.modelData.tMake = undefined;
903                buy.modelData.tValue = undefined;
904                buy.modelData.tVin = undefined;
905                buy.step3();
906                return;
907            }
908            var emsg = [];
909            function validate(ndx, txt) {
910                if (buy.modelData[ndx] === undefined) {
911                    emsg.push('* ' + txt + ' is required');
912                }
913            }
914            validate('tType', 'Trailer Type');
915            validate('tYear', 'Year');
916            validate('tMake', 'Make');
917            validate('vVin', 'VIN');
918            validate('tValue', 'Towed Unit Value');
919            if (emsg.length) {
920                alert('Please fix these errors before you can continue:\n\n' + emsg.join('\n'));
921                return;
922            }
923            buy.step3();
924        });
925        $(document).scrollTop(buy.TOP);
926    });
927};
928
929buy.step3 = function() {
930    buy.initStep(3);
931    function getHour(h, ampm) {
932        return (h < 12 && ampm == 'PM') ? h + 12 : h;
933    }
934    buy.rpc({ method: 'getStepHtml', step: 3 }, function(o) {
935        buy.layout2(3, o.html);
936        $('#col3').hide();
937        var converter = new AnyTime.Converter({ format: '%Y-%m-%d-%h-%p'});
938        var formatter = new AnyTime.Converter({ format: '%W %M %d %Y, %h:00 %p'});
939
940        var today = new Date();
941        var tomorrow = new Date();
942        tomorrow.setDate(tomorrow.getDate()+1);
943        var enterDateVal = today;
944        var exitDateVal = tomorrow;
945        if (buy.modelData.enterDay !== undefined) {
946            enterDateVal = new Date(buy.modelData.enterYear, buy.modelData.enterMonth-1, buy.modelData.enterDay, getHour(buy.modelData.enterHour, buy.modelData.enterap) , 0, 0, 0);
947            exitDateVal = new Date(buy.modelData.exitYear, buy.modelData.exitMonth-1, buy.modelData.exitDay, getHour(buy.modelData.exitHour, buy.modelData.exitap) , 0, 0, 0);
948        }
949        $('#exitDate').AnyTime_noPicker();
950        $('#exitDate').AnyTime_picker({
951            hideInput: true,
952            placement: 'inline',
953            askSecond: false,
954            format: '%Y-%m-%d-%h-%p',
955            earliest: tomorrow,
956            latest: new Date(today.getFullYear()+1, today.getMonth(), today.getDate(), today.getHours(), today.getMinutes(), today.getSeconds(), today.getMilliseconds())
957
958        });
959        updateExitDate();
960        function updateEnterDate() {
961            var newDate = converter.parse($('#enterDate').val());
962            $('#enterDateDisplay').html(formatter.format(newDate));
963            return newDate;
964        }
965        $('#enterDate').change(function() {
966            var newDate = updateEnterDate();
967            // if date is after exit date, make exit date the day after enter date
968            var exitDate = converter.parse($('#exitDate').val());
969            newDate.setDate(newDate.getDate()+1);
970            var maxDate = new Date(newDate);
971            maxDate.setDate(maxDate.getDate()+364);
972            if (exitDate < newDate) {
973                $('#exitDate').val(converter.format(newDate));
974            }
975            $('#exitDate').AnyTime_noPicker();
976            $('#exitDate').AnyTime_picker({
977                hideInput: true,
978                placement: 'inline',
979                askSecond: false,
980                format: '%Y-%m-%d-%h-%p',
981                earliest: newDate,
982                latest: maxDate
983            });
984            updateExitDate();
985        });
986
987        function updateExitDate() {
988            $('#exitDateDisplay').html(formatter.format(converter.parse($('#exitDate').val())));
989        }
990        $('#exitDate').change(updateExitDate);
991
992        function reset() {
993            $('#enterDate').AnyTime_noPicker();
994            $('#enterDate').val(converter.format(enterDateVal));
995            $('#exitDate').val(converter.format(exitDateVal));
996
997            $('#enterDate').AnyTime_picker({
998                hideInput: true,
999                placement: 'inline',
1000                askSecond: false,
1001                format: '%Y-%m-%d-%h-%p',
1002                earliest: today,
1003                latest: new Date(today.getFullYear()+1, today.getMonth(), today.getDate(), today.getHours(), today.getMinutes(), today.getSeconds(), today.getMilliseconds())
1004            });
1005
1006            $('#exitDate').AnyTime_noPicker();
1007            $('#exitDate').AnyTime_picker({
1008                hideInput: true,
1009                placement: 'inline',
1010                askSecond: false,
1011                format: '%Y-%m-%d-%h-%p',
1012                earliest: tomorrow,
1013                latest: new Date(today.getFullYear()+1, today.getMonth(), today.getDate(), today.getHours(), today.getMinutes(), today.getSeconds(), today.getMilliseconds())
1014            });
1015            updateExitDate();
1016            updateEnterDate();
1017
1018        }
1019        reset();
1020        $(document).scrollTop(buy.TOP);
1021        $('#step3-back').click(function() {
1022            buy.step2();
1023        });
1024
1025        $('#step3-clear').click(function() {
1026            enterDateVal = today;
1027            exitDatVal = tomorrow;
1028            reset();
1029        });
1030
1031        $('#step3-continue').click(function() {
1032            var enterDate = $('#enterDate').val().split('-');
1033            buy.modelData.enterYear = parseInt(enterDate[0], 10);
1034            buy.modelData.enterMonth = parseInt(enterDate[1], 10);
1035            buy.modelData.enterDay = parseInt(enterDate[2], 10);
1036            buy.modelData.enterHour = parseInt(enterDate[3], 10);
1037            buy.modelData.enterMinute = 0;
1038            buy.modelData.enterSecond = 0;
1039            buy.modelData.enterap = enterDate[4];
1040            if (buy.modelData.enterap == 'PM') {
1041                if (buy.modelData.enterHour > 12) {
1042                    buy.modelData.enterHour -= 12;
1043                }
1044            }
1045            else if (buy.modelData.enterHour == 12) {
1046                buy.modelData.enterHour = 0;
1047            }
1048            var exitDate = $('#exitDate').val().split('-');
1049            buy.modelData.exitYear = parseInt(exitDate[0], 10);
1050            buy.modelData.exitMonth = parseInt(exitDate[1], 10);
1051            buy.modelData.exitDay = parseInt(exitDate[2], 10);
1052            buy.modelData.exitHour = parseInt(exitDate[3], 10);
1053            buy.modelData.exitMinute = 0;
1054            buy.modelData.exitSecond = 0;
1055            buy.modelData.exitap = exitDate[4];
1056            if (buy.modelData.exitap == 'PM') {
1057                if (buy.modelData.exitHour > 12) {
1058                    buy.modelData.exitHour -= 12;
1059                }
1060            }
1061            else if (buy.modelData.exitHour == 12) {
1062                buy.modelData.exitHour = 0;
1063            }
1064
1065            // validate
1066            var enterDatex = new Date(buy.modelData.enterYear, buy.modelData.enterMonth-1, buy.modelData.enterDay, getHour(buy.modelData.enterHour, buy.modelData.enterap) , 0, 0, 0);
1067            var exitDatex = new Date(buy.modelData.exitYear, buy.modelData.exitMonth-1, buy.modelData.exitDay, getHour(buy.modelData.exitHour, buy.modelData.exitap) , 0, 0, 0);
1068            var numDays = (exitDatex - enterDatex) / 86400000;
1069            if (numDays != parseInt(numDays, 10)) {
1070                numDays += 1;
1071            }
1072            numDays = parseInt(numDays, 10);
1073            if (exitDatex <= enterDatex) {
1074                alert('Date Exiting Mexico must be after Date Entering Mexico.');
1075                return;
1076            }
1077            if (numDays > 365) {
1078                alert('Policies cannot be issued for longer than 365 days.');
1079                return;
1080            }
1081            buy.modelData.enterDate = parseInt(enterDatex.getTime() / 1000, 10);
1082            buy.modelData.exitDate = parseInt(exitDatex.getTime() / 1000, 10);
1083            buy.modelData.numDays = numDays;
1084            buy.step4();
1085             return false;
1086        });
1087        $(document).scrollTop(buy.TOP);
1088    });
1089};
1090
1091buy.step4 = function() {
1092    buy.initStep(4);
1093
1094    buy.rpc({ method: 'getStepHtml', step: 4, model: $.JSON.encode(buy.modelData) }, function(o) {
1095
1096        buy.modelData = o.model;
1097        buy.layout2(4, o.html);
1098        $('#col3').hide();
1099        /*
1100        if (!buy.modelData.carrier) {
1101            if (buy.modelData.policyType === 'maxhigh') {
1102                buy.modelData.policyType = 'liahigh';
1103            }
1104            $('#max-coverage').hide();
1105        }
1106        */
1107
1108        // Hide the Max Coverage options and select Liability High if vehicle is
1109        // not eligible for Max Coverage
1110        if (!buy.modelData.eligibleForMaxCoverage) {
1111            $('#max-coverage').hide();
1112            if (buy.modelData.policyType === 'maxhigh' || buy.modelData.policyType === 'maxlow') {
1113                buy.modelData.policyType = 'liahigh';
1114            }
1115        }
1116
1117        $('#'+buy.modelData.policyType).attr('checked', 'checked');
1118
1119        var enterDate = buy.modelData.enterDate;
1120        var exitDate = buy.modelData.exitDate;
1121        var numDays = buy.modelData.numDays;
1122
1123        var formatter = new AnyTime.Converter({ format: '%M %d %Y, %l:00 %p'});
1124
1125        function updateDates() {
1126            var d = new Date(exitDate*1000);
1127            $('#display-exit-date').html(formatter.format(d));
1128            $('#display-numdays').html(numDays);
1129        }
1130
1131        $('#maxlow').click(function() {
1132            enterDate = buy.modelData.enterDate;
1133            exitDate = buy.modelData.exitDate;
1134            numDays = buy.modelData.numDays;
1135            updateDates();
1136        });
1137        $('#maxhigh').click(function() {
1138            enterDate = buy.modelData.enterDate;
1139            exitDate = buy.modelData.exitDate;
1140            numDays = buy.modelData.numDays;
1141            updateDates();
1142        });
1143        $('#maxlowA').click(function() {
1144            exitDate = enterDate + 365 * 86400;
1145            numDays = 365;
1146            updateDates();
1147        });
1148        $('#maxhighA').click(function() {
1149            exitDate = enterDate + 365 * 86400;
1150            numDays = 365;
1151            updateDates();
1152        });
1153        $('#lialow').click(function() {
1154            enterDate = buy.modelData.enterDate;
1155            exitDate = buy.modelData.exitDate;
1156            numDays = buy.modelData.numDays;
1157            updateDates();
1158        });
1159        $('#liahigh').click(function() {
1160            enterDate = buy.modelData.enterDate;
1161            exitDate = buy.modelData.exitDate;
1162            numDays = buy.modelData.numDays;
1163            updateDates();
1164        });
1165        $('#lialowA').click(function() {
1166            exitDate = enterDate + 365 * 86400;
1167            numDays = 365;
1168            updateDates();
1169        });
1170        $('#liahighA').click(function() {
1171            exitDate = enterDate + 365 * 86400;
1172            numDays = 365;
1173            updateDates();
1174        });
1175        $('#step4-continue').click(function() {
1176            buy.modelData.policyType = $('input:radio[name=group1]:checked').val();
1177
1178            if(buy.modelData.policyType == 'lialowA' || buy.modelData.policyType == 'liahighA' || buy.modelData.policyType == 'maxlowA'
1179                    || buy.modelData.policyType == 'maxhighA' )
1180            {
1181                buy.modelData.fee = buy.modelData.feeA;
1182            }
1183
1184            var d = new Date(exitDate*1000);
1185            buy.modelData.exitDate = exitDate;
1186            buy.modelData.exitYear = d.getFullYear();
1187            buy.modelData.exitMonth = d.getMonth()+1;
1188            buy.modelData.exitDay = d.getDate();
1189            buy.modelData.exitHour = d.getHours();
1190            buy.modelData.exitMinute = 0;
1191            buy.modelData.exitSecond = 0;
1192            buy.modelData.numDays = numDays;
1193
1194            d = new Date(enterDate*1000);
1195            buy.modelData.enterHour = d.getHours();
1196            buy.step5();
1197        });
1198        $('#step4-back').click(function() {
1199            buy.step3();
1200        });
1201        $(document).scrollTop(buy.TOP);
1202        if (parseInt(buy.modelData.power,10) === 2) {
1203            $('.motorcycle').hide();
1204            $('#max-coverage').hide();
1205        }
1206    });
1207};
1208
1209buy.step5 = function() {
1210    buy.initStep(5);
1211    buy.rpc({ method: 'getStepHtml', step: 5, model: $.JSON.encode(buy.modelData) }, function(o) {
1212        buy.layout3(5, o.html);
1213        $('#col3').hide();
1214
1215        var fields = {}, fieldName, fieldNdx;
1216        var requiredFields = ['firstname', 'lastname', 'email', 'phone2', 'address', 'address2', 'city', 'state', 'zip', 'country'];
1217        var optionalFields = ['lname', 'laddress', 'laddress2', 'lcity', 'lstate', 'lzip', 'lcountry'];
1218        var fieldNames = {
1219            firstname: 'First Name',
1220            lastname: 'Last Name',
1221            phone2: 'Phone',
1222            address: 'Address',
1223            city: 'City',
1224            state: 'State',
1225            zip: 'Zip',
1226            country: 'Country',
1227            lname: 'Bank Name',
1228            laddress: 'Bank Address',
1229            lcity: 'Bank City',
1230            lstate: 'Bank State',
1231            lzip: 'Bank Zip',
1232            lcountry: 'Bank Country'
1233        };
1234
1235        for (fieldNdx in requiredFields) {
1236
1237            fieldName = requiredFields[fieldNdx];
1238            fields[fieldName] = new buy.FormField({
1239                id: fieldName,
1240                value: buy.modelData[fieldName],
1241                listeners: {
1242                    change: function() {
1243                        var id = this.id;
1244                        buy.modelData[id]= this.getValue();
1245                        if (buy.modelData[id].length) {
1246                            this.markValid(true);
1247                        }
1248                        else {
1249                            buy.modelData[id] = undefined;
1250                            this.markRequired();
1251                        }
1252                    },
1253                    blur: function() {
1254                        var id = this.id;
1255                        buy.modelData[id] = this.getValue();
1256                        if (buy.modelData[id].length) {
1257                            this.markValid(true);
1258                        }
1259                        else {
1260                            buy.modelData[id] = undefined;
1261                            this.markRequired();
1262                        }
1263                    }
1264
1265                }
1266            });
1267            fields[fieldName].enable();
1268        }
1269
1270        for (fieldNdx in optionalFields) {
1271            fieldName = optionalFields[fieldNdx];
1272            fields[fieldName] = new buy.FormField({
1273                id: fieldName,
1274                disabled: true,
1275                value: buy.modelData[fieldName],
1276                listeners: {
1277                    change: function() {
1278                        var id = this.id;
1279                        buy.modelData[id]= this.getValue();
1280                        if (buy.modelData[id].length) {
1281                            this.markValid(true);
1282                        }
1283                        else {
1284                            buy.modelData[id] = undefined;
1285                            this.markRequired();
1286                        }
1287                    },
1288                    blur: function() {
1289                        var id = this.id;
1290                        buy.modelData[id] = this.getValue();
1291                        if (buy.modelData[id].length) {
1292                            this.markValid(true);
1293                        }
1294                        else {
1295                            buy.modelData[id] = undefined;
1296                            this.markRequired();
1297                        }
1298                    }
1299
1300                }
1301            })
1302        }
1303
1304        function checkEnabled() {
1305            var fieldName, fieldNdx;
1306            if (buy.modelData.lEnabled) {
1307                for (fieldNdx in optionalFields) {
1308                    fieldName = optionalFields[fieldNdx];
1309                    fields[fieldName].enable();
1310                    fields[fieldName].markRequired();
1311                }
1312            }
1313            else {
1314                for (fieldNdx in optionalFields) {
1315                    fieldName = optionalFields[fieldNdx];
1316                    fields[fieldName].setValue('');
1317                    fields[fieldName].disable();
1318                    fields[fieldName].markConfirmed();
1319                }
1320            }
1321        }
1322        checkEnabled();
1323
1324        $('#step5-back').click(function() {
1325            buy.step4();
1326        });
1327
1328        $('#step5-continue').click(function() {
1329            if (!buy.modelData.lEnabled) {
1330                buy.modelData.lname= undefined;
1331                buy.modelData.laddress = undefined;
1332                buy.modelData.laddress2 = undefined;
1333                buy.modelData.lcity = undefined;
1334                buy.modelData.lstate = undefined;
1335                buy.modelData.lzip = undefined;
1336                buy.modelData.lcountry = undefined;
1337            }
1338
1339            var emsg = [];
1340            var fieldNdx, fieldName;
1341
1342            var testFields = requiredFields.concat(buy.modelData.lEnabled ? optionalFields: []);
1343            for (fieldNdx in testFields) {
1344                fieldName = testFields[fieldNdx];
1345                if (fieldNames[fieldName] && buy.modelData[fieldName] === undefined) {
1346                    emsg.push('* ' + fieldNames[fieldName] + ' is required');
1347                }
1348                else if (fieldName === 'state' && buy.modelData.state.length != 2) {
1349                    emsg.push('* only 2 character abbreviations for states allowed, like "CA" for California.');
1350                }
1351            }
1352            if (buy.modelData.email && buy.modelData.email.length) {
1353                var filter  = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
1354                if (!filter.test(buy.modelData.email)) {
1355                    emsg.push('* Please enter a valid email address');
1356                }
1357            }
1358            if (emsg.length) {
1359                alert('Please fix these errors before you can continue:\n\n' + emsg.join('\n'));
1360                return;
1361            }
1362            buy.step6();
1363        });
1364
1365        $('#lEnabled').change(function() {
1366            buy.modelData.lEnabled = $('#lEnabled').attr('checked');
1367            checkEnabled();
1368        });
1369        $(document).scrollTop(buy.TOP);
1370    });
1371};
1372
1373buy.step6 = function() {
1374    buy.initStep(6);
1375    buy.rpc({ method: 'getStepHtml', step: 6, model: $.JSON.encode(buy.modelData) }, function(o) {
1376        buy.layout3(6, o.html);
1377        $('#col3').hide();
1378        $('#step6-continue').click(function() {
1379            buy.step7();
1380        });
1381        $('#step6-back').click(function() {
1382            buy.step5();
1383        });
1384        $(document).scrollTop(buy.TOP);
1385    });
1386};
1387
1388buy.step7 = function() {
1389    buy.initStep(7);
1390    buy.rpc({ method: 'getStepHtml', step: 7 }, function(o) {
1391        buy.layout2(7, o.html);
1392        $('#col3').hide();
1393        $('#step7-continue').click(function() {
1394            if (!$('#step7-agree').attr('checked')) {
1395                alert('You must check the "I agree to terms" checkbox to proceed.');
1396                return;
1397            }
1398            buy.step8();
1399        })
1400        $('#step7-back').click(function() {
1401            buy.step6();
1402        });
1403        $(document).scrollTop(buy.TOP);
1404    });
1405};
1406
1407buy.step8 = function() {
1408    buy.initStep(8);
1409    buy.rpc({ method: 'getStepHtml', step: 8, model: $.JSON.encode(buy.modelData) }, function(o) {
1410        buy.layout3(8, o.html);
1411        $('#col3').hide();
1412
1413        $('#step8-back').click(function() {
1414            buy.step7();
1415        });
1416
1417        var thisYear = new Date().getFullYear();
1418        var thisMonth = new Date().getMonth() + 1;
1419
1420        $.extend(buy.modelData, {
1421            cardType: buy.modelData.cardType || 'Visa',
1422            cardNumber: buy.modelData.cardNumber || undefined,
1423            cardMonth: buy.modelData.cardMonth || undefined,
1424            cardYear: buy.modelData.cardYear || undefined,
1425            cardFirstname: buy.modelData.cardFirstname || buy.modelData.firstname,
1426            cardLastname: buy.modelData.cardLastname || buy.modelData.lastname,
1427            cardPhone: buy.modelData.cardPhone || buy.modelData.phone2,
1428            cardAddress: buy.modelData.cardAddress || buy.modelData.address,
1429            cardAddress2: buy.modelData.cardAddress2 || buy.modelData.address2,
1430            cardCity: buy.modelData.cardCity || buy.modelData.city,
1431            cardState: buy.modelData.cardState || buy.modelData.state,
1432            cardZip: buy.modelData.cardZip || buy.modelData.zip,
1433            cardCountry: buy.modelData.cardCountry || buy.modelData.country
1434        });
1435
1436        var required
1436Fields = [
1437            'cardType',
1438            'cardNumber',
1439            //'cardMonth',
1440            //'cardYear',
1441            'cardFirstname',
1442            'cardLastname',
1443            'cardPhone',
1444            'cardAddress',
1445            'cardAddress2',
1446            'cardCity',
1447            'cardState',
1448            'cardZip',
1449            'cardCountry'
1450        ];
1451        var fieldNames = {
1452            cardType: 'Card Type',
1453            cardNumber: 'Card Number',
1454            //cardMonth: 'Card Expiration',
1455            //cardYear: 'Card Expiration',
1456            cardFirstname: 'First Name',
1457            cardLastname: 'Last Name',
1458            cardPhone: 'Phone',
1459            cardAddress: 'Address',
1460            cardCity: 'City',
1461            cardState: 'State',
1462            cardZip: 'Zip',
1463            cardCountry: 'Country'
1464        };
1465
1466        function validateExipirationDate() {
1467            var month = cardMonth.getValue();
1468            var year = cardYear.getValue();
1469            if (month === undefined || !month.length) {
1470                cardYear.markRequired();
1471                return 'Expiration month is required';
1472            }
1473            if (year === undefined || !year.length) {
1474                cardYear.markRequired();
1475                return 'Expiration year is required';
1476
1477            }
1478            month = parseInt(month, 10);
1479            year = parseInt(year, 10);
1480
1481            if (year === thisYear && month < thisMonth) {
1482                cardYear.markRequired('Expired');
1483                return "Expiration Date is in the past";
1484            }
1485            cardYear.markValid(true);
1486            buy.modelData.cardMonth = month;
1487            buy.modelData.cardYear = year;
1488            return true;
1489        }
1490
1491        var cardMonth = new buy.FormField({
1492            id: 'cardMonth',
1493            value: buy.modelData.cardMonth,
1494            listeners: {
1495                change: validateExipirationDate
1496            }
1497        });
1498        var cardYear = new buy.FormField({
1499            id: 'cardYear',
1500            value: buy.modelData.cardYear,
1501            listeners: {
1502                change: validateExipirationDate
1503            }
1504        });
1505
1506        var fields = {};
1507        var fieldNdx, fieldName;
1508        for (fieldNdx in requiredFields) {
1509            fieldName = requiredFields[fieldNdx];
1510            fields[fieldName] = new buy.FormField({
1511                id: fieldName,
1512                disabled: false,
1513                value: buy.modelData[fieldName],
1514                listeners: {
1515                    change: function() {
1516                        var id = this.id;
1517                        buy.modelData[id]= this.getValue();
1518                        if (buy.modelData[id].length) {
1519                            this.markValid(true);
1520                        }
1521                        else {
1522                            buy.modelData[id] = undefined;
1523                            this.markRequired();
1524                        }
1525                    },
1526                    blur: function() {
1527                        var id = this.id;
1528                        buy.modelData[id] = this.getValue();
1529                        if (buy.modelData[id].length) {
1530                            this.markValid(true);
1531                        }
1532                        else {
1533                            buy.modelData[id] = undefined;
1534                            this.markRequired();
1535                        }
1536                    }
1537
1538                }
1539            });
1540            fields[fieldName].enable();
1541        }
1542
1543        var e = $('#step8-continue');
1544        function submitHandler() {
1545            $('#step8-continue').bind('click', function(){return false;});
1546
1547            var emsg = [];
1548
1549            var msg = validateExipirationDate();
1550            if (msg !== true) {
1551                emsg.push('* ' + msg);
1552            }
1553            for (fieldNdx in requiredFields) {
1554                fieldName = requiredFields[fieldNdx];
1555                if (fieldNames[fieldName] && buy.modelData[fieldName] === undefined) {
1556                    emsg.push('* ' + fieldNames[fieldName] + ' is required');
1557                }
1558            }
1559            if (emsg.length) {
1560                alert('Please fix these errors before you can continue:\n\n' + emsg.join('\n'));
1561                return;
1562            }
1563
1564
1565            pay.rpc({ 
1566                method: 'payment', 
1567                model: $.JSON.encode(buy.modelData),
1568                'cf-turnstile-response': window.cftToken
1569            }, function(o) {
1570                if (!o.success) {
1571                    console.error(o);
1572                    alert(o.message);
1573                    return;
1574                }
1575                var elen = o.errors.length;
1576                var emsg = [];
1577                if (elen == 1) {
1578                    console.error(o);
1579                    emsg.push('There was an error in processing your credit card:\n');
1580                }
1581                else if (elen > 1) {
1582                    console.error(o);
1583                    emsg.push('There were errors in processing your credit card:\n');
1584                }
1585                if (elen) {
1586                    e.bind('click',submitHandler);
1587                    //$('#step8-continue').attr('disabled', false);
1588                    alert(emsg.concat(o.errors).join('\n'));
1589                    return;
1590                }
1591                buy.modelData = o.model;
1592                buy.step9();
1593                //alert(o.message);
1594            });
1595        }
1596        e.bind('click',submitHandler);
1597        $(document).scrollTop(buy.TOP);
1598    });
1599};
1600
1601buy.step9 = function() {
1602    buy.initStep(9);
1603    buy.rpc({ method: 'getStepHtml', step: 9, model: $.JSON.encode(buy.modelData) }, function(o) {
1604        buy.layout3(9, o.html);
1605        $('#col3').hide();
1606        //window.location = '/pdf/' + buy.modelData.policyId + '.pdf';
1607    });
1608};
1609
1610$(document).ready(function() {
1611    // breadcrumb-step
1612    // active-step, completed-step
1613
1614    for (var s=1; s<10; s++) {
1615        $('#breadcrumb-step'+s).click(function() {}); //[s], function(e) {
1616        //  e.preventDefault();
1617        //  //var fn = 'step'+this.id.replace(/breadcrumb-step/, '');
1618        //  //buy[fn] && buy[fn]();
1619        //});
1620    }
1621    //$(window).bind('beforeunload', function() {
1622    //  return 'If you choose to navigate away from this page, you will lose all information you have entered for all steps.';
1623    //});
1624    buy.step1();
1625
1626});
1627

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.