PageSourceSearch

https://www.mascotasalfalfa.com/catalog/view/javascript/paypal/paypal.js?page_code=home

js mascotasalfalfa.com collected 2026-10-04 21:53:41 UTC 33,901 bytes, 938 lines download raw bytes

1var PayPalAPI = (function () {
2	var paypal_data = [];
3	var paypal_script = [];
4	var paypal_sdk = [];
5	var paypal_callback;
6	
7	var showPayPalAlert = function(data) {
8		$('.alert-dismissible').remove();
9		
10		if (data['error'] && data['error']['warning']) {
11			if ($('#paypal_form').length) {
12				$('#paypal_form').prepend('<div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> ' + data['error']['warning'] + ' <button type="button" class="close" data-dismiss="alert">&times;</button></div>');
13			} else {
14				$('#content').parent().before('<div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> ' + data['error']['warning'] + ' <button type="button" class="close" data-dismiss="alert">&times;</button></div>');
15				
16				$('html, body').animate({scrollTop: 0}, 'slow');
17			}
18		}
19	};
20	
21	var getQueryParams = function(url) {
22		const param_arr = url.slice(url.indexOf('?') + 1).split('&');
23		const params = {};
24    
25		param_arr.map(param => {
26			const [key, val] = param.split('=');
27			params[key] = decodeURIComponent(val);
28		})
29		
30		return params;
31	};
32	
33	var updatePayPalData = function() {
34		var params = [];
35		var script_file = document.getElementsByTagName('script');
36		
37		for (var i = 0; i < script_file.length; i++) {
38			if (script_file[i].hasAttribute('src') && (script_file[i].getAttribute('src').indexOf('paypal.js') !== -1)) {
39				params = getQueryParams(script_file[i].getAttribute('src'));
40			
41				break;
42			}
43		}
44		
45		paypal_data = params;
46		
47		if (paypal_data['page_code'] == 'product') {
48			paypal_data['product'] = $('#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea').serialize();
49		}
50				
51		$.ajax({
52			method: 'post',
53			url: 'index.php?route=extension/payment/paypal/getData',
54			data: paypal_data,
55			dataType: 'json',
56			async: false,
57			success: function(json) {						
58				paypal_data = json;
59				
60				showPayPalAlert(json);
61			},
62			error: function(xhr, ajaxOptions, thrownError) {
63				console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
64			}
65		});
66	};
67	
68	var readyPayPalSDK = function() {
69		if (typeof PayPalSDK === 'undefined') {
70			setTimeout(readyPayPalSDK, 100);
71		} else {
72			paypal_sdk[paypal_script.length - 1] = PayPalSDK;
73			
74			initPayPalSDK();
75		}
76	};
77		
78	var loadPayPalSDK = function() {				
79		var html = '';
80		
81		if (paypal_data['components'].includes('buttons')) {
82			if (!$('#paypal_button').length) {
83				if ($(paypal_data['button_insert_tag']).length) {
84					html = '<div id="paypal_button" class="paypal-button clearfix"><div id="paypal_button_container" class="paypal-button-container paypal-spinner"></div></div>';
85			
86					eval("$('" + paypal_data['button_insert_tag'] + "')." + paypal_data['button_insert_type'] + "(html)");
87				}
88			}
89		}
90		
91		if (paypal_data['components'].includes('googlepay')) {
92			if (!$('#googlepay_button').length) {
93				if ($(paypal_data['googlepay_button_insert_tag']).length) {
94					html = '<div id="googlepay_button" class="googlepay-button clearfix"><div id="googlepay_button_container" class="googlepay-button-container paypal-spinner"></div></div>';
95			
96					eval("$('" + paypal_data['googlepay_button_insert_tag'] + "')." + paypal_data['googlepay_button_insert_type'] + "(html)");
97				}
98			}
99		}
100		
101		if (paypal_data['components'].includes('applepay')) {
102			if (!$('#applepay_button').length) {
103				if ($(paypal_data['applepay_button_insert_tag']).length) {
104					html = '<div id="applepay_button" class="applepay-button clearfix"><div id="applepay_button_container" class="applepay-button-container paypal-spinner"></div></div>';
105			
106					eval("$('" + paypal_data['applepay_button_insert_tag'] + "')." + paypal_data['applepay_button_insert_type'] + "(html)");
107				}
108			}
109		}
110				
111		if (paypal_data['components'].includes('messages')) {
112			if (!$('#paypal_message').length) {
113				if ($(paypal_data['message_insert_tag']).length) {
114					html = '<div id="paypal_message" class="paypal-message"><div id="paypal_message_container" class="paypal-message-container paypal-spinner"></div></div>';
115					
116					eval("$('" + paypal_data['message_insert_tag'] + "')." + paypal_data['message_insert_type'] + "(html)");
117				}
118			}
119		}
120		
121		var src_data = {};
122						
123		src_data['components'] = paypal_data['components'].join(',');
124		src_data['client-id'] = paypal_data['client_id'];
125		src_data['merchant-id'] = paypal_data['merchant_id'];
126		src_data['currency'] = paypal_data['currency_code'];
127		src_data['intent'] = paypal_data['transaction_method'];
128				
129		if (paypal_data['button_enable_funding'] && paypal_data['button_enable_funding'].length) {
130			src_data['enable-funding'] = paypal_data['button_enable_funding'].join(',');
131		}
132		
133		if (paypal_data['button_disable_funding'] && paypal_data['button_disable_funding'].length) {
134			src_data['disable-funding'] = paypal_data['button_disable_funding'].join(',');
135		}
136				
137		var src = 'https://www.paypal.com/sdk/js?' + $.param(src_data);
138		var script_count = paypal_script.length;
139		var script_load_status = 0;
140		
141		for (var i = 0; i < script_count; i++) {
142			if (paypal_script[i].src == src) {
143				script_load_status = 1;
144				
145				break;
146			}
147		}
148		
149		if (!script_load_status) {
150			if (typeof PayPalSDK !== 'undefined') {
151				delete PayPalSDK;
152			}
153			
154			paypal_script[script_count] = document.createElement('script');
155			paypal_script[script_count].type = 'text/javascript';
156			paypal_script[script_count].src = src;
157			paypal_script[script_count].setAttribute('data-partner-attribution-id', paypal_data['partner_attribution_id']);
158			paypal_script[script_count].setAttribute('data-client-token', paypal_data['client_token']);
159			paypal_script[script_count].setAttribute('data-namespace', 'PayPalSDK');
160			
161			if (paypal_data['id_token']) {
162				paypal_script[script_count].setAttribute('data-user-id-token', paypal_data['id_token']);
163			}
164
165			paypal_script[script_count].async = false;
166			paypal_script[script_count].onload = readyPayPalSDK();
167			
168			document.querySelector('body').appendChild(paypal_script[script_count]);
169		} else if (paypal_sdk[i]) {
170			PayPalSDK = paypal_sdk[i];
171			
172			initPayPalSDK();
173		}
174	};
175	
176	var initPayPalSDK = function() {
177		if (paypal_data['components'].includes('buttons') && $('#paypal_button').length && !$('#paypal_button_container').html()) {
178			$('#paypal_button').css('text-align', paypal_data['button_align']);
179			
180			if (paypal_data['button_width']) {
181				$('#paypal_button_container').css('display', 'inline-block');
182				$('#paypal_button_container').css('width', paypal_data['button_width']);
183			} else {
184				$('#paypal_button_container').css('display', 'block');
185				$('#paypal_button_container').css('width', 'auto');
186			}
187						
188			try {								
189				var paypal_button_data = {
190					env: paypal_data['environment'],
191					locale: paypal_data['locale'],
192					style: {
193						layout: 'vertical',
194						size: paypal_data['button_size'],
195						color: paypal_data['button_color'],
196						shape: paypal_data['button_shape'],
197						label: paypal_data['button_label'],
198						tagline: 'false'
199					},
200					createOrder: function() {
201						paypal_order_id = false;
202						product_data = false;
203						
204						if (paypal_data['page_code'] == 'product') {
205							product_data = $('#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea').serialize();
206						}
207				
208						$.ajax({
209							method: 'post',
210							url: 'index.php?route=extension/payment/paypal/createOrder',
211							data: {'page_code': paypal_data['page_code'], 'payment_type': 'button', 'product': product_data},
212							dataType: 'json',
213							async: false,
214							success: function(json) {				
215								showPayPalAlert(json);
216								
217								paypal_order_id = json['paypal_order_id'];
218							},
219							error: function(xhr, ajaxOptions, thrownError) {
220								console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
221							}
222						});
223											
224						return paypal_order_id;	
225					},
226					onApprove: function(data) {				
227						$.ajax({
228							method: 'post',
229							url: 'index.php?route=extension/payment/paypal/approveOrder',
230							data: {'page_code': paypal_data['page_code'], 'payment_type': 'button', 'paypal_order_id': data.orderID},
231							dataType: 'json',
232							async: false,
233							success: function(json) {					
234								showPayPalAlert(json);
235							
236								if (json['url']) {
237									location = json['url'];
238								}
239							},
240							error: function(xhr, ajaxOptions, thrownError) {
241								console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
242							}
243						});
244					}
245				};
246				
247				if (paypal_data['button_funding_source']) {
248					paypal_button_data['fundingSource'] = paypal_data['button_funding_source'];
249				}
250				
251				var paypal_button = PayPalSDK.Buttons(paypal_button_data);
252				
253				if (paypal_button.isEligible()) {
254					paypal_button.render('#paypal_button_container');
255				}
256			} catch (error) {
257				console.error('PayPal Express failed during startup', error);
258			}
259						
260			$('#paypal_button_container').removeClass('paypal-spinner');
261		}
262		
263		if (paypal_data['components'].includes('googlepay') && $('#googlepay_button').length && !$('#googlepay_button_container').html()) {
264			if (google && PayPalSDK.Googlepay) {
265				initGooglePaySDK().catch(console.log);
266			} else {
267				$('#googlepay_button').remove();
268				
269				console.log('This device does not support Google Pay');
270			}
271			
272			$('#googlepay_button_container').removeClass('paypal-spinner');
273		}
274		
275		if (paypal_data['components'].includes('applepay') && $('#applepay_button').length && !$('#applepay_button_container').html()) {
276			if (window.ApplePaySession && window.ApplePaySession?.supportsVersion(4) && ApplePaySession.canMakePayments()) {
277				initApplePaySDK().catch(console.log);
278			} else {
279				$('#applepay_button').remove();
280				
281				console.log('This device does not support Apple Pay');
282			}
283		}
284		
285		if (paypal_data['card_customer_tokens'] && $('#paypal_card_tokens').length && !$('#paypal_card_tokens_container').html()) {
286			$('#paypal_card_tokens').css('text-align', paypal_data['card_align']);
287			
288			if (paypal_data['card_width']) {
289				$('#paypal_card_tokens_container').css('display', 'inline-block');
290				$('#paypal_card_tokens_container').css('width', paypal_data['card_width']);
291			} else {
292				$('#paypal_card_tokens_container').css('display', 'block');
293				$('#paypal_card_tokens_container').css('width', 'auto');
294			}
295			
296			$.each(paypal_data['card_customer_tokens'], function(index, card_customer_token) {
297				html = '<div class="paypal-card-token"><div type="button" class="btn card-token-button" index="' + index + '"><i class="card-icon card-icon-' + card_customer_token['card_type'] + '"></i><span class="card-number">' + card_customer_token['card_number'] + '</span></div><div type="button" class="btn card-token-delete-button" index="' + index + '"><i class="fa fal fa-close"></i></div></div></div>';
298					
299				$('#paypal_card_tokens_container').append(html);
300			});
301								
302			$('#paypal_card_tokens_container').delegate('.card-token-button', 'click', function(event) {
303				event.preventDefault();
304	
305				var paypal_card_token = $(this).parents('.paypal-card-token');
306				var card_token_index = $(this).attr('index');
307											
308				paypal_order_id = false;
309									
310				$.ajax({
311					method: 'post',
312					url: 'index.php?route=extension/payment/paypal/createOrder',
313					data: {'page_code': paypal_data['page_code'], 'payment_type': 'card', 'index': card_token_index},
314					dataType: 'json',
315					beforeSend: function() {
316						paypal_card_token.addClass('paypal-spinner');
317					},
318					success: function(json) {							
319						showPayPalAlert(json);
320						
321						if (json['url']) {
322							location = json['url'];
323						}
324					},
325					complete: function() {
326						paypal_card_token.removeClass('paypal-spinner');
327					},
328					error: function(xhr, ajaxOptions, thrownError) {
329						console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
330					}
331				});
332			});
333			
334			$('#paypal_card_tokens_container').delegate('.card-token-delete-button', 'click', function(event) {
335				event.preventDefault();
336						
337				var paypal_card_token = $(this).parents('.paypal-card-token');
338				var card_token_index = $(this).attr('index');
339								
340				$.ajax({
341					method: 'post',
342					url: 'index.php?route=extension/payment/paypal/deleteCustomerToken',
343					data: {'index': card_token_index},
344					dataType: 'json',
345					beforeSend: function() {
346						paypal_card_token.addClass('paypal-spinner');
347					},
348					success: function(json) {							
349						showPayPalAlert(json);
350									
351						if (json['success']) {
352							paypal_card_token.remove();
353						}
354					},
355					error: function(xhr, ajaxOptions, thrownError) {
356						console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
357					},
358					complete: function() {
359						paypal_card_token.removeClass('paypal-spinner');
360					}
361				});
362			});	
363		}
364		
365		if (paypal_data['components'].includes('card-fields') && $('#paypal_card').length && !$('#paypal_card_form').find('iframe').length) {
366			$('#paypal_card').css('text-align', paypal_data['card_align']);
367			
368			if (paypal_data['card_width']) {
369				$('#paypal_card_container').css('display', 'inline-block');
370				$('#paypal_card_container').css('width', paypal_data['card_width']);
371			} else {
372				$('#paypal_card_container').css('display', 'block');
373				$('#paypal_card_container').css('width', 'auto');
374			}
375			
376			try {
377				var paypal_card = PayPalSDK.CardFields({
378					style: {
379						'input': {
380							'font-size': '1rem',
381							'color': '#282c37',
382							'transition': 'color 0.1s',
383							'padding': '0.75rem 0.75rem',
384						}
385					},
386					createOrder: function() {
387						paypal_order_id = false;
388						
389						var card_save = ($('#paypal_card_form #paypal_card_save:checked').length ? $('#paypal_card_form #paypal_card_save:checked').val() : 0);
390					
391						$.ajax({
392							method: 'post',
393							url: 'index.php?route=extension/payment/paypal/createOrder',
394							data: {'page_code': paypal_data['page_code'], 'payment_type': 'card', 'card_save': card_save},
395							dataType: 'json',
396							async: false,
397							success: function(json) {							
398								showPayPalAlert(json);
399									
400								paypal_order_id = json['paypal_order_id'];
401							},
402							error: function(xhr, ajaxOptions, thrownError) {
403								console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
404							}
405						});
406					
407						return paypal_order_id;
408					},
409					onApprove: function(data) {				
410						var card_save = ($('#paypal_card_form #paypal_card_save:checked').length ? $('#paypal_card_form #paypal_card_save:checked').val() : 0);
411						var card_type = $('#paypal_card_form').attr('card_type');
412						var card_nice_type = $('#paypal_card_form').attr('card_nice_type');
413								
414						$.ajax({
415							method: 'post',
416							url: 'index.php?route=extension/payment/paypal/approveOrder',
417							data: {'page_code': paypal_data['page_code'], 'payment_type': 'card', 'card_save': card_save, 'card_type': card_type, 'card_nice_type': card_nice_type, 'paypal_order_id': data.orderID},
418							dataType: 'json',
419							async: false,
420							success: function(json) {				
421								showPayPalAlert(json);
422								
423								if (json['url']) {
424									location = json['url'];
425								}
426							},
427							error: function(xhr, ajaxOptions, thrownError) {
428								console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
429							},
430							complete: function() {
431								$('#paypal_card_container').removeClass('paypal-spinner');
432							}
433						});
434					},
435					inputEvents: {
436						onChange: function(data) {
437							console.log('CCF Event "change", state=' + paypal_card.getState() + ', event=' + data);
438							
439							$('#paypal_card_form').removeClass().addClass('well');
440							$('#paypal_card_form').removeAttr();
441														
442							if (data.cards.length === 1) {
443								$('#paypal_card_form').addClass(data.cards[0].type);
444								$('#paypal_card_form').attr('card_type', data.cards[0].type);
445								$('#paypal_card_form').attr('card_nice_type', data.cards[0].niceType);
446							}
447
448							if (data.isFormValid) {
449								$('#paypal_card_button').addClass('show-button');
450							} else {
451								$('#paypal_card_button').removeClass('show-button');
452							}
453						},
454						onFocus: function(data) {
455							console.log('CCF Event "focus", state=' + paypal_card.getState() + ', event=' + data);
456						},
457						onBlur: function(data) {
458							console.log('CCF Event "blur", state=' + paypal_card.getState() + ', event=' + data);
459						},
460						onInputSubmitRequest: function(data) {
461							console.log('CCF Event "input submit request", state=' + paypal_card.getState() + ', event=' + data);
462								
463							if (data.isFormValid) {
464								$('#paypal_card_button').addClass('show-button');
465							} else {
466								$('#paypal_card_button').removeClass('show-button');
467							}
468						}
469					}
470				});
471				
472				if (paypal_card.isEligible()) {
473					paypal_card.NameField().render('#card_holder_name');
474					paypal_card.NumberField().render('#card_number');
475					paypal_card.ExpiryField().render('#expiration_date');
476					paypal_card.CVVField().render('#cvv');
477					
478					var paypal_card_button = document.querySelector('#paypal_card_button');
479 
480					paypal_card_button.addEventListener('click', function(event) {
481						event.preventDefault();
482						
483						if ($('#paypal_card_button').hasClass('show-button')) {
484							console.log('CCF Event "click", state=' + paypal_card.getState() + ', event=' + event);
485
486							$('#paypal_card_container').addClass('paypal-spinner');
487							
488							paypal_card.submit().then(function() {
489								console.log('PayPal CCF submitted:', paypal_card);
490							}).catch(function(error) {
491								console.error('PayPal CCF submit erred:', error);
492							});
493						}
494					}, false);
495				} else {
496					console.log('Not eligible for CCF');
497				}
498			} catch (error) {
499				console.error('PayPal Card failed during startup', error);
500			}
501						
502			$('#paypal_card_container').removeClass('paypal-spinner');
503		}
504		
505		if (paypal_data['components'].includes('messages') && $('#paypal_message').length && !$('#paypal_message_container').html()) {						
506			var paypal_message = document.createElement('div');
507			
508			paypal_message.setAttribute('data-pp-message', '');
509			
510			if (paypal_data['page_code'] == 'home') {
511				paypal_message.setAttribute('data-pp-placement', 'home');
512			}
513						
514			if (paypal_data['page_code'] == 'product') {
515				paypal_message.setAttribute('data-pp-placement', 'product');
516			}
517			
518			if (paypal_data['page_code'] == 'cart') {
519				paypal_message.setAttribute('data-pp-placement', 'cart');
520			}
521			
522			if (paypal_data['page_code'] == 'checkout') {
523				paypal_message.setAttribute('data-pp-placement', 'payment');
524			}
525			
526			paypal_message.setAttribute('data-pp-amount', paypal_data['message_amount']);
527			paypal_message.setAttribute('data-pp-style-layout', paypal_data['message_layout']);
528			
529			if (paypal_data['message_layout'] == 'text') {
530				paypal_message.setAttribute('data-pp-style-logo-type', paypal_data['message_logo_type']);
531				paypal_message.setAttribute('data-pp-style-logo-position', paypal_data['message_logo_position']);
532				paypal_message.setAttribute('data-pp-style-text-color', paypal_data['message_text_color']);
533				paypal_message.setAttribute('data-pp-style-text-size', paypal_data['message_text_size']);
534			} else {
535				paypal_message.setAttribute('data-pp-style-color', paypal_data['message_flex_color']);
536				paypal_message.setAttribute('data-pp-style-ratio', paypal_data['message_flex_ratio']);
537			}
538			
539			document.querySelector('#paypal_message_container').appendChild(paypal_message);
540						
541			$('#paypal_message_container').removeClass('paypal-spinner');
542			
543			if (paypal_data['page_code'] == 'product') {
544				$('[name^="option"], [name="quantity"]').on('change', function(event) {
545					setTimeout(function() {
546						updatePayPalData();
547		
548						if (paypal_message) {
549							paypal_message.setAttribute('data-pp-amount', paypal_data['message_amount']);
550						}
551					}, 10);
552				});
553			}
554		}
555			
556		if (paypal_callback && typeof paypal_callback == 'function') {
557			paypal_callback();
558		}
559	};
560	
561	var initGooglePaySDK = async function() {
562		const {allowedPaymentMethods, merchantInfo, apiVersion, apiVersionMinor, countryCode} = await PayPalSDK.Googlepay().config();
563		
564		const paymentsClient = new google.payments.api.PaymentsClient({
565			environment: paypal_data['googlepay_environment'],
566			paymentDataCallbacks: {
567				onPaymentAuthorized: function(paymentData) {
568					return new Promise(async function(resolve, reject) {
569						try {
570							paypal_order_id = false;
571							product_data = false;
572						
573							if (paypal_data['page_code'] == 'product') {
574								product_data = $('#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea').serialize();
575							}
576							
577							$.ajax({
578								method: 'post',
579								url: 'index.php?route=extension/payment/paypal/createOrder',
580								data: {'page_code': paypal_data['page_code'], 'payment_type': 'googlepay_button', 'product': product_data},
581								dataType: 'json',
582								async: false,
583								success: function(json) {				
584									showPayPalAlert(json);
585								
586									paypal_order_id = json['paypal_order_id'];
587								},
588								error: function(xhr, ajaxOptions, thrownError) {
589									console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
590								}
591							});
592							
593							const confirmOrderResponse = await PayPalSDK.Googlepay().confirmOrder({
594								orderId: paypal_order_id,
595								paymentMethodData: paymentData.paymentMethodData
596							});
597							
598							if (confirmOrderResponse.status === 'PAYER_ACTION_REQUIRED') {
599								console.log('Confirm Payment Completed Payer Action Required');
600								
601								PayPalSDK.Googlepay().initiatePayerAction({orderId: paypal_order_id}).then(async () => {
602									$.ajax({
603										method: 'post',
604										url: 'index.php?route=extension/payment/paypal/approveOrder',
605										data: {'page_code': paypal_data['page_code'], 'payment_type': 'googlepay_button', 'paypal_order_id': paypal_order_id},
606										dataType: 'json',
607										async: false,
608										success: function(json) {					
609											showPayPalAlert(json);
610													
611											if (json['url']) {
612												location = json['url'];
613											}
614										},
615										error: function(xhr, ajaxOptions, thrownError) {
616											console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
617										}
618									});	
619								});
620								
621								resolve({transactionState: 'SUCCESS'});	
622							} else if (confirmOrderResponse.status === 'APPROVED') {
623								console.log('Confirm Payment Approved');
624								
625								$.ajax({
626									method: 'post',
627									url: 'index.php?route=extension/payment/paypal/approveOrder',
628									data: {'page_code': paypal_data['page_code'], 'payment_type': 'googlepay_button', 'paypal_order_id': paypal_order_id},
629									dataType: 'json',
630									async: false,
631									success: function(json) {					
632										showPayPalAlert(json);
633													
634										if (json['url']) {
635											location = json['url'];
636										}
637									},
638									error: function(xhr, ajaxOptions, thrownError) {
639										console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
640									}
641								});	
642								
643								resolve({transactionState: 'SUCCESS'});	
644							} else {
645								resolve({
646									transactionState: 'ERROR',
647									error: {
648										intent: 'PAYMENT_AUTHORIZATION',
649										message: 'TRANSACTION FAILED',
650									}
651								});
652							}
653						} catch (error) {
654							resolve({
655								transactionState: 'ERROR',
656								error: {
657									intent: 'PAYMENT_AUTHORIZATION',
658									message: error.message,
659								}
660							});
661						}
662					});
663				}
664			}
665		});
666		   		
667		paymentsClient.isReadyToPay({allowedPaymentMethods, apiVersion, apiVersionMinor}).then(function(response) {
668			if (response.result) {							
669				$('#googlepay_button').css('text-align', paypal_data['googlepay_button_align']);
670				
671				var googlepay_button_style = [];
672					
673				if (paypal_data['googlepay_button_width']) {
674					googlepay_button_style.push('display: inline-block');
675					googlepay_button_style.push('width: ' + paypal_data['googlepay_button_width']);
676				} else {
677					googlepay_button_style.push('display: block');
678					googlepay_button_style.push('width: auto');
679				}
680						
681				googlepay_button_style.push('aspect-ratio: 7.5');
682									
683				$('#googlepay_button_container').attr('style', googlepay_button_style.join('; '));
684				
685				if (paypal_data['googlepay_button_shape'] == 'pill') {
686					$('#googlepay_button_container').removeClass('shape-rect');
687					$('#googlepay_button_container').addClass('shape-pill');
688				} else {
689					$('#googlepay_button_container').removeClass('shape-pill');
690					$('#googlepay_button_container').addClass('shape-rect');
691				}
692							
693				const googlepay_button = paymentsClient.createButton({
694					buttonColor: paypal_data['googlepay_button_color'],
695					buttonType: paypal_data['googlepay_button_type'],
696					buttonLocale: paypal_data['locale'].split('_')[0],
697					buttonSizeMode: 'fill',
698					onClick: function() {
699						const paymentDataRequest = Object.assign({}, {apiVersion, apiVersionMinor});
700						
701						paymentDataRequest.allowedPaymentMethods = allowedPaymentMethods;
702						paymentDataRequest.transactionInfo = {
703							countryCode: countryCode,
704							currencyCode: paypal_data['currency_code'],
705							totalPriceStatus: 'FINAL',
706							totalPrice: paypal_data['googlepay_amount'],
707							totalPriceLabel: 'Total'
708						}
709						
710						paymentDataRequest.merchantInfo = merchantInfo;
711
712						paymentDataRequest.callbackIntents = ['PAYMENT_AUTHORIZATION'];
713					
714						paymentsClient.loadPaymentData(paymentDataRequest);
715					}
716				});
717				
718				document.querySelector('#googlepay_button_container').appendChild(googlepay_button);
719			}
720		}).catch(function(error) {
721			console.log(error);
722		});
723	};
724	
725	var initApplePaySDK = async function() {
726		const ApplePaySDK = PayPalSDK.Applepay();
727		const {
728			isEligible,
729			countryCode,
730			currencyCode,
731			merchantCapabilities,
732			supportedNetworks,
733		} = await ApplePaySDK.config();
734
735		if (!isEligible) {
736			$('#applepay_button').remove();
737			
738			throw 'Apple Pay is not eligible';
739		}
740		
741		$('#applepay_button').css('text-align', paypal_data['applepay_button_align']);
742			
743		var applepay_button_style = [];
744			
745		if (paypal_data['applepay_button_width']) {
746			$('#applepay_button_container').css('display', 'inline-block');
747			$('#applepay_button_container').css('width', paypal_data['applepay_button_width']);
748		} else {
749			$('#applepay_button_container').css('display', 'block');
750			$('#applepay_button_container').css('width', 'auto');
751		}
752						
753		var applepay_button = document.createElement('apple-pay-button');
754			
755		applepay_button.setAttribute('id', 'apple-pay-button');
756		applepay_button.setAttribute('buttonstyle', paypal_data['applepay_button_color']);
757		applepay_button.setAttribute('type', paypal_data['applepay_button_type']);
758		applepay_button.setAttribute('locale', paypal_data['locale']);
759						
760		var applepay_button_style = [];
761			
762		applepay_button_style.push('display: inline-block');
763						
764		if (paypal_data['applepay_button_width']) {
765			applepay_button_style.push('--apple-pay-button-width: ' + paypal_data['applepay_button_width']);
766		} else {
767			applepay_button_style.push('--apple-pay-button-width: 100%');
768		}
769						
770		applepay_button_style.push('--apple-pay-button-height: calc(var(--apple-pay-button-width) / 7.5)');
771						
772		if (paypal_data['applepay_button_shape'] == 'pill') {
773			applepay_button_style.push('--apple-pay-button-border-radius: 1000px');
774		} else {
775			applepay_button_style.push('--apple-pay-button-border-radius: 4px');
776		}
777																		
778		applepay_button.setAttribute('style', applepay_button_style.join('; '));
779															
780		document.querySelector('#applepay_button_container').appendChild(applepay_button);
781
782		applepay_button.addEventListener('click', async function (event) {
783			event.preventDefault();
784			
785			const paymentRequest = {
786				countryCode,
787				currencyCode: paypal_data['currency_code'],
788				merchantCapabilities,
789				supportedNetworks,
790				requiredBillingContactFields: ['name', 'phone', 'email', 'postalAddress'],
791				requiredShippingContactFields: [],
792				total: {
793					label: 'Total',
794					amount: paypal_data['applepay_amount'],
795					type: 'final',
796				}
797			};
798					
799			var session = new ApplePaySession(4, paymentRequest);
800			
801			session.onvalidatemerchant = (event) => {
802				ApplePaySDK.validateMerchant({
803					validationUrl: event.validationURL,
804				}).then((payload) => {
805					session.completeMerchantValidation(payload.merchantSession);
806					console.log('Complete Merchant validation Done!', {payload});
807				}).catch((error) => {
808					console.error(error);
809					session.abort();
810				});
811			};
812			
813			session.onpaymentmethodselected = (event) => {
814				console.log('onpaymentmethodselected');
815				console.log(event.paymentMethod); // {type: "credit"}
816
817				session.completePaymentMethodSelection({
818					newTotal: paymentRequest.total
819				});
820			};
821			
822			session.onshippingcontactselected = async (event) => {
823				console.log('Your shipping contacts selected is: ' + event.shippingContact);
824				
825				const shippingContactUpdate = { 
826					newTotal: paymentRequest.total,
827					newLineItems: []
828				};
829				
830				session.completeShippingContactSelection(shippingContactUpdate);
831			};
832			
833			session.onshippingmethodselected = (event) => {
834				console.log('onshippingmethodselected');
835				console.log(JSON.stringify(event.shippingMethod, null, 4));
836				console.log('Your shipping method selected is: ', event.shippingMethod);
837      
838				var shippingMethodUpdate = { 
839					newTotal: paymentRequest.total,
840					newLineItems: []
841				}; 
842				
843				session.completeShippingMethodSelection(shippingMethodUpdate);
844			};
845			
846			session.onpaymentauthorized = async (event) => {
847				try {
848					console.log('onpaymentauthorized');
849					console.log(JSON.stringify(event, null, 4));
850										
851					paypal_order_id = false;
852					product_data = false;
853						
854					if (paypal_data['page_code'] == 'product') {
855						product_data = $('#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea').serialize();
856					}
857						
858					$.ajax({
859						method: 'post',
860						url: 'index.php?route=extension/payment/paypal/createOrder',
861						data: {'page_code': paypal_data['page_code'], 'payment_type': 'applepay_button', 'product': product_data},
862						dataType: 'json',
863						async: false,
864						success: function(json) {				
865							showPayPalAlert(json);
866								
867							paypal_order_id = json['paypal_order_id'];
868						},
869						error: function(xhr, ajaxOptions, thrownError) {
870							console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
871						}
872					});
873																	
874					await ApplePaySDK.confirmOrder({
875						orderId: paypal_order_id, 
876						token: event.payment.token, 
877						billingContact: event.payment.billingContact, 
878						shippingContact: event.payment.shippingContact 
879					});
880				
881					$.ajax({
882						method: 'post',
883						url: 'index.php?route=extension/payment/paypal/approveOrder',
884						data: {'page_code': paypal_data['page_code'], 'payment_type': 'applepay_button', 'paypal_order_id': paypal_order_id},
885						dataType: 'json',
886						async: false,
887						success: function(json) {					
888							showPayPalAlert(json);
889													
890							if (json['url']) {
891								location = json['url'];
892							}
893						},
894						error: function(xhr, ajaxOptions, thrownError) {
895							console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
896						}
897					});
898						
899					session.completePayment({
900						status: window.ApplePaySession.STATUS_SUCCESS
901					});
902				} catch (error) {
903					console.error(error);
904					
905					session.completePayment({
906						status: window.ApplePaySession.STATUS_FAILURE
907					});
908				}
909			};
910			
911			session.oncancel = (event) => {
912				console.log(event);
913				console.log('Apple Pay Cancelled!');
914			}
915
916			session.begin();
917		});
918									
919		$('#applepay_button_container').removeClass('paypal-spinner');
920	};
921	
922	var init = function(callback = '') {
923		updatePayPalData();
924		
925		paypal_callback = callback;
926			
927		loadPayPalSDK();
928	};
929	
930	return {
931		init: init
932	};
933}());
934
935window.addEventListener('load', function () {
936	PayPalAPI.init();
937});
938

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.