1(function ($) { 2 'use strict'; 3 4 function escapeHtml(value) { 5 return $('<div>').text(value == null ? '' : String(value)).html(); 6 } 7 8 function isAppleWalletClient() { 9 var ua = navigator.userAgent || ''; 10 if (/iPhone|iPad|iPod/i.test(ua)) { 11 return true; 12 } 13 if (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) { 14 return true; 15 } 16 if (/Macintosh/i.test(ua) && /Safari/i.test(ua) && !/Chrome|Chromium|Edg|OPR|Firefox|FxiOS|CriOS|EdgiOS/i.test(ua)) { 17 return true; 18 } 19 return false; 20 } 21 22 function walletCtaLabel() { 23 var labels = window.MEC_Invoice_Booking || {}; 24 return labels.wallet_label || 'Add to Apple Wallet'; 25 } 26 27 function applyWalletDeviceGate($root) { 28 var apple = isAppleWalletClient(); 29 var $scope = $root && $root.length ? $root : $(document); 30 var $blocks = $scope.find('[data-mec-walletpass]'); 31 32 if ($scope.is('[data-mec-walletpass]')) { 33 $blocks = $blocks.add($scope); 34 } 35 36 $blocks.each(function () { 37 var $block = $(this); 38 $block.children('.mec-apple-wallet-ios-note').remove(); 39 $block.toggleClass('mec-walletpass--apple', apple); 40 $block.toggleClass('mec-walletpass--other', !apple); 41 }); 42 43 $scope.find('.mec-apple-wallet-add').each(function () { 44 var $btn = $(this); 45 var cta = walletCtaLabel(); 46 var $cta = $btn.find('.mec-apple-wallet-cta'); 47 48 if ($cta.length) { 49 $cta.text(cta); 50 } 51 52 $btn.off('click.mecWalletDisabled'); 53 54 if (apple) { 55 $btn.removeClass('mec-apple-wallet-add--disabled').removeAttr('aria-disabled').css('cursor', ''); 56 return; 57 } 58 59 $btn.addClass('mec-apple-wallet-add--disabled').attr('aria-disabled', 'true').css('cursor', 'not-allowed'); 60 61 if ($btn.is('a')) { 62 $btn.on('click.mecWalletDisabled', function (event) { 63 event.preventDefault(); 64 }); 65 } 66 }); 67 } 68 69 function removeLegacyBookingLinks($container) { 70 $container.find('.mec-booking-download-links, .mec-invoice-buttons-container').remove(); 71 $container.children('div').each(function () { 72 var $div = $(this); 73 if ($div.find('.mec-invoice-download, .mec-apple-wallet-add').length && !$div.closest('[data-mec-walletpass]').length) { 74 $div.remove(); 75 } 76 }); 77 $container.find('.mec-invoice-download, .mec-apple-wallet-add').each(function () { 78 var $link = $(this); 79 if (!$link.closest('[data-mec-walletpass]').length) { 80 $link.remove(); 81 } 82 }); 83 } 84 85 function buildWalletButtonHtml(pass, multi, apple) { 86 var url = pass && pass.url ? pass.url : ''; 87 if (!url) { 88 return ''; 89 } 90 91 var cta = walletCtaLabel(); 92 var namedClass = (multi && pass.label) ? ' mec-apple-wallet-add--named' : ''; 93 var disabledClass = apple ? '' : ' mec-apple-wallet-add--disabled'; 94 var tag = apple ? 'a' : 'span'; 95 var openTag = apple 96 ? '<' + tag + ' href="' + escapeHtml(url) + '" class="mec-apple-wallet-add' + namedClass + disabledClass + '">' 97 : '<' + tag + ' class="mec-apple-wallet-add' + namedClass + disabledClass + '" aria-disabled="true" style="cursor:not-allowed;">'; 98 var out = openTag; 99 out += '<span class="mec-apple-wallet-cta">' + escapeHtml(cta) + '</span>'; 100 101 if (multi && pass.label) { 102 out += '<span class="mec-apple-wallet-attendee">' + escapeHtml(pass.label) + '</span>'; 103 } 104 105 out += '</' + tag + '>'; 106 return out; 107 } 108 109 function appendBookingLinks($container, data) { 110 if (!$container.length || !data || !data.data) { 111 return; 112 } 113 114 if ($container.find('[data-mec-walletpass], .mec-booking-download-l
114inks').length) { 115 applyWalletDeviceGate($container); 116 return; 117 } 118 119 var html = data.data.booking_links_html || ''; 120 if (html) { 121 removeLegacyBookingLinks($container); 122 $container.append(html); 123 applyWalletDeviceGate($container); 124 return; 125 } 126 127 var invoiceLink = data.data.invoice_link || ''; 128 var walletLink = data.data.walletpass_link || ''; 129 var passes = $.isArray(data.data.walletpass_passes) ? data.data.walletpass_passes : []; 130 131 if (!invoiceLink && !walletLink && !passes.length) { 132 return; 133 } 134 135 removeLegacyBookingLinks($container); 136 137 var labels = window.MEC_Invoice_Booking || {}; 138 var invoiceLabel = labels.invoice_label || 'Download Invoice'; 139 var hasWallet = passes.length || walletLink; 140 var wrapperClass = (invoiceLink && hasWallet) 141 ? 'mec-booking-download-links mec-booking-download-links--dual' 142 : 'mec-booking-download-links'; 143 144 if (passes.length > 1) { 145 wrapperClass += ' mec-booking-download-links--multi'; 146 } 147 148 var out = '<div class="' + wrapperClass + '">'; 149 150 if (invoiceLink) { 151 out += '<a class="mec-invoice-download" href="' + escapeHtml(invoiceLink) + '">' + escapeHtml(invoiceLabel) + '</a>'; 152 } 153 154 if (hasWallet) { 155 var items = passes.length ? passes : [{ url: walletLink, label: '' }]; 156 // Front UI: one Wallet button only (first ticket). 157 var apple = isAppleWalletClient(); 158 var deviceClass = apple ? 'mec-walletpass--apple' : 'mec-walletpass--other'; 159 160 out += '<div class="mec-booking-walletpass ' + deviceClass + '" data-mec-walletpass="1">'; 161 out += '<div class="mec-booking-walletpass-list">'; 162 out += buildWalletButtonHtml(items[0], false, apple); 163 out += '</div></div>'; 164 } 165 166 out += '</div>'; 167 $container.append(out); 168 applyWalletDeviceGate($container); 169 } 170 171 function isBookingAction(action) { 172 if (!action) { 173 return false; 174 } 175 176 return action.indexOf('mec_do_transaction') === 0 177 || action === 'mec_book_form' 178 || action === 'mec_cart_do_transaction_pay_locally'; 179 } 180 181 function getAjaxAction(settings) { 182 if (typeof settings.data === 'string') { 183 var match = settings.data.match(/(?:^|&)action=([^&]+)/); 184 if (match) { 185 return decodeURIComponent(match[1].replace(/\+/g, ' ')); 186 } 187 } else if (settings.data && settings.data.action) { 188 return settings.data.action; 189 } 190 191 return ''; 192 } 193 194 function handleBookingAjaxResponse(response) { 195 if (!response || !response.success) { 196 return; 197 } 198 199 var selectors = [ 200 '.mec-gateway-message.mec-success:visible', 201 '.mec-success:visible', 202 '[id^="mec_booking"]:visible', 203 '[id^="mec_do_transaction_"][id*="_message"]:visible', 204 '[id^="mec_do_cart_pay_locally_message"]:visible' 205 ]; 206 207 selectors.forEach(function (selector) { 208 $(selector).each(function () { 209 appendBookingLinks($(this), response); 210 }); 211 }); 212 } 213 214 // MEC core appends a single wallet button after ajaxSuccess; run once the DOM settles. 215 $(document).ajaxComplete(function (event, xhr, settings) { 216 var action = getAjaxAction(settings); 217 if (!isBookingAction(action)) { 218 return; 219 } 220 221 var response; 222 try { 223 response = xhr.responseJSON; 224 } catch (error) { 225 return; 226 } 227 228 window.setTimeout(function () { 229 handleBookingAjaxResponse(response); 230 }, 50); 231 }); 232 233 $(function () { 234 applyWalletDeviceGate($(document)); 235 }); 236})(jQuery);
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.