PageSourceSearch

https://www.oegg.or.at/wp-content/plugins/mec-invoice/assets/js/mec-invoice-booking.js?ver=3.7.0

js oegg.or.at collected 2026-10-02 10:50:56 UTC 8,298 bytes, 236 lines download raw bytes

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.