|
1 | 1 | $(document).ready(function(){
|
2 |
| - let checkboxesContainer = $('#benefits_container'); |
3 |
| - let costLabel = $("#cost_label"); |
4 |
| - let cost = 0; |
| 2 | + const SELECTORS = { |
| 3 | + checkboxesContainer: () => $('#benefits_container'), |
| 4 | + costLabel: () => $("#cost_label"), |
| 5 | + clearFormBtn: () => $("#clear_form_btn"), |
| 6 | + packageInput: () => $("input[name=package]"), |
| 7 | + applicationForm: () => $("#application_form"), |
| 8 | + getPackageInfo: (packageId) => $("#package_benefits_" + packageId), |
| 9 | + getPackageBenefits: (packageId) => SELECTORS.getPackageInfo(packageId).children(), |
| 10 | + benefitsInputs: () => $("input[id^=id_benefits_]"), |
| 11 | + getBenefitLabel: (benefitId) => $('label[benefit_id=' + benefitId + ']'), |
| 12 | + getBenefitInput: (benefitId) => SELECTORS.benefitsInputs().filter('[value=' + benefitId + ']'), |
| 13 | + getBenefitConflicts: (benefitId) => $('#conflicts_with_' + benefitId).children(), |
| 14 | + getSelectedBenefits: () => SELECTORS.benefitsInputs().filter(":checked"), |
| 15 | + } |
5 | 16 |
|
6 |
| - $("#clear_form_btn").click(function(){ |
7 |
| - $("#application_form").trigger("reset"); |
8 |
| - $("#application_form [class=active]").removeClass("active"); |
9 |
| - $("input[name=package]").prop("checked", false); |
10 |
| - checkboxesContainer.find(':checkbox').each(function(){ |
| 17 | + displayPackageCost = (packageId) => { |
| 18 | + let packageInfo = SELECTORS.getPackageInfo(packageId); |
| 19 | + let cost = packageInfo.attr("data-cost"); |
| 20 | + SELECTORS.costLabel().html('Sponsorship cost is $' + cost.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' USD') |
| 21 | + } |
| 22 | + |
| 23 | + |
| 24 | + |
| 25 | + SELECTORS.clearFormBtn().click(function(){ |
| 26 | + SELECTORS.applicationForm().trigger("reset"); |
| 27 | + SELECTORS.applicationForm().find("[class=active]").removeClass("active"); |
| 28 | + SELECTORS.packageInput().prop("checked", false); |
| 29 | + SELECTORS.checkboxesContainer().find(':checkbox').each(function(){ |
11 | 30 | $(this).prop('checked', false);
|
12 | 31 | if ($(this).attr("package_only")) $(this).attr("disabled", true);
|
13 | 32 | });
|
14 |
| - $("#cost_label").html(""); |
| 33 | + SELECTORS.costLabel().html(""); |
15 | 34 | });
|
16 | 35 |
|
17 |
| - $("input[name=package]").change(function(){ |
| 36 | + SELECTORS.packageInput().change(function(){ |
18 | 37 | let package = this.value;
|
19 | 38 | if (package.length == 0) return;
|
20 | 39 |
|
21 |
| - costLabel.html("Updating cost...") |
| 40 | + SELECTORS.costLabel().html("Updating cost...") |
22 | 41 |
|
23 |
| - checkboxesContainer.find(':checkbox').each(function(){ |
| 42 | + SELECTORS.checkboxesContainer().find(':checkbox').each(function(){ |
24 | 43 | $(this).prop('checked', false);
|
25 | 44 | let packageOnlyBenefit = $(this).attr("package_only");
|
26 | 45 | if (packageOnlyBenefit) $(this).attr("disabled", true);
|
27 | 46 | });
|
28 | 47 |
|
29 |
| - let packageInfo = $("#package_benefits_" + package); |
30 |
| - packageInfo.children().each(function(){ |
| 48 | + SELECTORS.getPackageBenefits(package).each(function(){ |
31 | 49 | let benefit = $(this).html()
|
32 |
| - let benefitInput = checkboxesContainer.find('[value=' + benefit + ']'); |
| 50 | + let benefitInput = SELECTORS.getBenefitInput(benefit); |
33 | 51 | let packageOnlyBenefit = benefitInput.attr("package_only");
|
34 | 52 | benefitInput.removeAttr("disabled");
|
35 | 53 | benefitInput.trigger("click");
|
36 | 54 | });
|
37 |
| - |
38 |
| - let url = $("#cost_container").attr("calculate_cost_url"); |
39 |
| - let data = $("form").serialize(); |
40 |
| - |
41 |
| - let cost = packageInfo.attr("data-cost"); |
42 |
| - costLabel.html('Sponsorship cost is $' + cost.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' USD') |
| 55 | + displayPackageCost(package); |
43 | 56 | });
|
44 | 57 |
|
45 |
| - $("input[id^=id_benefits_]").change(function(){ |
| 58 | + SELECTORS.benefitsInputs().change(function(){ |
46 | 59 | let benefit = this.value;
|
47 | 60 | if (benefit.length == 0) return;
|
48 |
| - if (costLabel.html() != "Updating cost...") costLabel.html("Please submit your customized sponsorship package application and we'll contact you within 2 business days."); |
49 | 61 |
|
50 |
| - let active = checkboxesContainer.find('[value=' + benefit + ']').prop("checked"); |
| 62 | + // display package cost if custom benefit change result matches with package's benefits list |
| 63 | + let isChangeFromPackageChange = SELECTORS.costLabel().html() == "Updating cost..." |
| 64 | + if (!isChangeFromPackageChange) { |
| 65 | + let selectedBenefits = SELECTORS.getSelectedBenefits(); |
| 66 | + selectedBenefits = $.map(selectedBenefits, (b) => $(b).val()).sort(); |
| 67 | + let selectedPackageId = SELECTORS.packageInput().filter(":checked").val() |
| 68 | + let packageBenefits = SELECTORS.getPackageBenefits(selectedPackageId); |
| 69 | + packageBenefits = $.map(packageBenefits, (b) => $(b).text()).sort(); |
| 70 | + |
| 71 | + // check same num of benefits and join with string. if same string, both lists have the same benefits |
| 72 | + if (packageBenefits.length == selectedBenefits.length && packageBenefits.join(',') === selectedBenefits.join(',')){ |
| 73 | + displayPackageCost(selectedPackageId); |
| 74 | + } else { |
| 75 | + let msg = "Please submit your customized sponsorship package application and we'll contact you within 2 business days."; |
| 76 | + SELECTORS.costLabel().html(msg); |
| 77 | + } |
| 78 | + } |
| 79 | + |
| 80 | + // updates the input to be active if needed |
| 81 | + let active = SELECTORS.getBenefitInput(benefit).prop("checked"); |
51 | 82 | if (!active) {
|
52 | 83 | return;
|
53 | 84 | } else {
|
54 |
| - $('label[benefit_id=' + benefit + ']').addClass("active"); |
| 85 | + SELECTORS.getBenefitLabel(benefit).addClass("active"); |
55 | 86 | }
|
56 | 87 |
|
57 |
| - |
58 |
| - $('#conflicts_with_' + benefit).children().each(function(){ |
| 88 | + // check and ensure conflicts constraints between checked benefits |
| 89 | + SELECTORS.getBenefitConflicts(benefit).each(function(){ |
59 | 90 | let conflictId = $(this).html();
|
60 |
| - let conflictCheckbox = checkboxesContainer.find('[value=' + conflictId + ']'); |
61 |
| - let checked = conflictCheckbox.prop("checked"); |
| 91 | + let checked = SELECTORS.getBenefitInput(conflictId).prop("checked"); |
62 | 92 | if (checked){
|
63 | 93 | conflictCheckbox.trigger("click");
|
64 | 94 | conflictCheckbox.parent().removeClass("active");
|
|
0 commit comments