1 2//var PassHolderInfo = { 3// name: string, 4// email: string, 5//} 6 7//class CartItem { 8// constructor(SeasonPassConfigurationID, PassHolders) { 9// this.SeasonPassConfigurationID = SeasonPassConfigurationID, 10// this.PassHolders = PassHolders 11// } 12 13//} 14 15function readCart() { 16 let cartCacheEntryJson = localStorage.getItem(eventlink.organizationID + "-cart"); 17 if (!cartCacheEntryJson) { 18 return []; 19 } 20 21 let cartCacheEntry = JSON.parse(cartCacheEntryJson); 22 let cutOffDate = new Date(); 23 cutOffDate.setDate(cutOffDate.getDate() - 3); 24 if (!cartCacheEntry.lastWrite || new Date(cartCacheEntry.lastWrite) < cutOffDate) { 25 return []; 26 } 27 28 return cartCacheEntry.cart; 29} 30 31function writeCart(cartValue) { 32 let cartCacheEntry = { 33 lastWrite: new Date(), 34 cart: cartValue 35 }; 36 localStorage.setItem(eventlink.organizationID + "-cart", JSON.stringify(cartCacheEntry)); 37 updateCartCount(); 38} 39 40function clearCart() { 41 writeCart([]); 42 updateCartCount(); 43} 44 45function updateCartCount() { 46 let $cartButton = $("#pass-cart-button"); 47 let cartCount = readCart().length; 48 let cartText = "Cart"; 49 if (cartCount > 0) { 50 cartText += " (" + cartCount + ")"; 51 } 52 $cartButton.text(cartText); 53} 54 55function addToCart(passFormID, passConfigurationID, passTitle, passPriceDollars) { 56 let $form = $("#" + passFormID); 57 let $errorText = $(".pass-form-error-text", $form); 58 $errorText.hide(); 59 60 function showFormError(message) { 61 $errorText.text(message).show(); 62 } 63 64 if ($form.length) { 65 let passHolders = []; 66 let $rows = $(".pass-holder-row", $form); 67 68 // Map form inputs to objects 69 for (let i = 0; i < $rows.length; i++) { 70 let $row = $($rows[i]); 71 $row.removeClass("bg-danger"); 72 let name = $(".pass-holder-name", $row).val(); 73 let email = $(".pass-holder-email", $row).val(); 74 75 if (name || email) { 76 passHolders.push({ 77 name, 78 email, 79 $sourceRow: $row 80 }); 81 } 82 } 83 84 // Validate the list of objects 85 if (!passHolders.length) { 86 if ($rows.length > 1) { 87 showFormError("At least one pass holder name is required."); 88 } else { 89 showFormError("Pass holder name is required."); 90 } 91 92 return; 93 } 94 95 for (let i = 0; i < passHolders.length; i++) { 96 let pass = passHolders[i]; 97 if (pass.email && !pass.name) { 98 pass.$sourceRow.addClass("bg-danger"); 99 showFormError("Pass holder name is required.") 100 return; 101 } 102 103 if (pass.email && pass.email.indexOf("@") < 0) { 104 pass.$sourceRow.addClass("bg-danger"); 105 showFormError("Pass holder email is not a valid email address.") 106 return; 107 } 108 } 109 110 // Add the list of passes to the cart 111 let cart = readCart(); 112 for (let i = 0; i < passHolders.length; i++) 113 { 114 delete passHolders[i].$sourceRow; 115 } 116 cart.push({ 117 passConfigurationID, 118 passTitle, 119 passPriceDollars, 120 passHolders 121 }) 122 writeCart(cart); 123 124 // Reset form state 125 $("input", $form).val(""); 126 127 // Open confirmation modal 128 $("#addedToCartModal").modal('show'); 129 } 130} 131 132function removeCartPassHolder(passIndex, holderIndex) {
133 let cart = readCart(); 134 let pass = cart[passIndex]; 135 136 if (pass.passHolders.length === 1) { 137 cart.splice(passIndex, 1); 138 } else { 139 pass.passHolders.splice(holderIndex, 1); 140 } 141 142 writeCart(cart); 143}
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.