PageSourceSearch

https://cdn.elwatan.dz/wp-content/plugins/td-satim-payment/assets/js/satim-frontend.js?ver=1785763223

js elwatan.dz collected 2026-10-02 09:57:29 UTC 18,473 bytes, 423 lines download raw bytes

1(function($) {
2    $(document).ready(function() {
3        function isAllowedClientSide() {
4            if (!window.tdsSatimData) {
5                return true;
6            }
7            if (window.tdsSatimData.allowed === false) {
8                return false;
9            }
10            if (!window.tdsSatimData.testMode) {
11                return true;
12            }
13            var list = (window.tdsSatimData.allowEmails || '').toLowerCase().split(';').map(function(item) {
14                return item.trim();
15            }).filter(Boolean);
16            if (!list.length) {
17                return true;
18            }
19            var email = (window.tdsSatimData.currentUserEmail || '').toLowerCase().trim();
20            if (!email) {
21                return false;
22            }
23            return list.indexOf(email) !== -1;
24        }
25
26        function removeSatimOptionForDisallowed() {
27            var $satimInput = $('.tds-billing-payment-method[value="satim"]');
28            if ($satimInput.length) {
29                $satimInput.closest('.tds-spm-custom-payment, .tds-s-form-group').remove();
30            }
31            var $satimWrap = $('.tds-spm-satim').first();
32            if ($satimWrap.length) {
33                $satimWrap.remove();
34            }
35            var $checked = $('.tds-billing-payment-method:checked');
36            if ($checked.length && $checked.val() === 'satim') {
37                var $first = $('.tds-billing-payment-method').not('[value="satim"]').first();
38                if ($first.length) {
39                    $first.prop('checked', true).trigger('change');
40                }
41            }
42        }
43
44        function ensureRecaptchaRender($root) {
45            var $widget = ($root || $(document)).find('.tds-satim-captcha .g-recaptcha').first();
46            if (!$widget.length || $widget.data('rendered')) {
47                return;
48            }
49            if (typeof grecaptcha !== 'undefined' && grecaptcha.render) {
50                var siteKey = $widget.data('sitekey');
51                if (siteKey) {
52                    grecaptcha.render($widget[0], { sitekey: siteKey });
53                    $widget.data('rendered', true);
54                }
55            }
56        }
57
58        window.tdsSatimRecaptchaOnload = function() {
59            ensureRecaptchaRender();
60        };
61
62        function setupSatimUi() {
63            var $satimWrap = $('.tds-spm-satim').first();
64            if (!isAllowedClientSide()) {
65                // Remove Satim payment option (fallback when server renders it)
66                removeSatimOptionForDisallowed();
67
68                // Remove Satim price suffix from plan price blocks
69                if (window.tdsSatimData && window.tdsSatimData.formatted) {
70                    $('.tds-plans-price .td-pp-price-txt').each(function() {
71                        var text = $(this).text();
72                        Object.values(window.tdsSatimData.formatted).forEach(function(priceText) {
73                            if (priceText && text.indexOf(priceText) !== -1) {
74                                text = text.replace(' / ' + priceText, '').replace(priceText, '').trim();
75                            }
76                        });
77                        $(this).text(text);
78                    });
79                }
80                return;
81            }
82
83            if (!$satimWrap.length) {
84                return;
85            }
86
87            if (window.tdsSatimData && window.tdsSatimData.labelHtml) {
88                var $title = $satimWrap.find('.tds-s-fc-title').first();
89                if ($title.length) {
90                    $title.html(window.tdsSatimData.labelHtml);
91                }
92            }
93
94            var $content = $satimWrap.find('.tds-spm-content').first();
95            if (!$content.length) {
96                return;
97            }
98
99            var termsUrl = (window.tdsSatimData && window.tdsSatimData.termsUrl) ? window.tdsSatimData.termsUrl : '';
100            var termsRequired = !!(window.tdsSatimData && window.tdsSatimData.termsRequired);
101            if (termsRequired && !$content.find('.tds-satim-terms').length) {
102                var labelText = 'J\u2019accepte les conditions de paiement';
103                if (termsUrl) {
104                    labelText = 'J\u2019accepte les <a href=\"' + termsUrl + '\" target=\"_blank\" rel=\"noopener noreferrer\">conditions de paiement</a>';
105                }
106                var $terms = $('<div class=\"tds-satim-terms\">' +
107                    '<label>' +
108                    '<input type=\"checkbox\" id=\"tds-satim-terms\" class=\"tds-satim-terms-checkbox\" name=\"tds_satim_terms\">' +
109                    '<span>' + labelText + '</span>' +
110                    '</label>' +
111                    '</div>');
112                $content.append($terms);
113            }
114
115            var recaptchaSiteKey = (window.tdsSatimData && window.tdsSatimData.recaptchaSiteKey) ? window.tdsSatimData.recaptchaSiteKey : '';
116            if (recaptchaSiteKey && !$content.find('.tds-satim-captcha').length) {
117                var $captchaWrap = $('<div class=\"tds-satim-captcha\"><div class=\"g-recaptcha\" data-sitekey=\"' + recaptchaSiteKey + '\"></div></div>');
118                $content.append($captchaWrap);
119                ensureRecaptchaRender($content);
120            }
121        }
122
123        function clearFieldError($input) {
124            var $group = $input.closest('.tds-s-form-group');
125            $group.removeClass('tds-s-fg-error');
126            $group.find('.tds-s-fg-error-msg').remove();
127        }
128
129        function setFieldError($input, message) {
130            var $group = $input.closest('.tds-s-form-group');
131            $group.addClass('tds-s-fg-error');
132            if (!$group.find('.tds-s-fg-error-msg').length) {
133                $('<span class="tds-s-fg-error-msg"></span>').text(message).appendTo($group);
134            }
135        }
136
137        function validateBillingFields() {
138            var requiredFields = [
139                { id: '#tds-billing-first-name', label: 'Prénom' },
140                { id: '#tds-billing-last-name', label: 'Nom' },
141                { id: '#tds-billing-email', label: 'Courriel' },
142                { id: '#tds-billing-address', label: 'Adresse' },
143                { id: '#tds-billing-city', label: 'Ville' },
144                { id: '#tds-billing-country', label: 'Pays' },
145                { id: '#tds-billing-postcode', label: 'Code postal' }
146            ];
147
148            var hasErrors = false;
149            requiredFields.forEach(function(field) {
150                var $input = $(field.id);
151                if (!$input.length) {
152                    return;
153                }
154                var value = ($input.val() || '').trim();
155                if (!value) {
156                    setFieldError($input, 'Champ requis.');
157                    hasErrors = true;
158                } else {
159                    clearFieldError($input);
160                }
161            });
162
163            return !hasErrors;
164        }
165
166        $(document).on('input change', '#tds-billing-first-name, #tds-billing-last-name, #tds-billing-email, #tds-billing-address, #tds-billing-city, #tds-billing-country, #tds-billing-postcode', function() {
167            clearFieldError($(this));
168        });
169
170        setupSatimUi();
171        if (!isAllowedClientSide()) {
172            var tries = 0;
173            var intervalId = setInterval(function() {
174                removeSatimOptionForDisallowed();
175                tries += 1;
176                if (tries >= 20) {
177                    clearInterval(intervalId);
178                }
179            }, 250);
180        }
181
182        // Insert hidden Satim price for current plan if available
183        if (window.tdsSatimData && (window.tdsSatimData.prices || window.tdsSatimData.formatted)) {
184            var planId = $('#tds-subscription-plan-id').val();
185            if (planId) {
186                var satimValue = '';
187                if (window.tdsSatimData.formatted && typeof window.tdsSatimData.formatted[planId] !== 'undefined') {
188                    satimValue = window.tdsSatimData.formatted[planId];
189                } else if (window.tdsSatimData.prices && typeof window.tdsSatimData.prices[planId] !== 'undefined') {
190                    satimValue = window.tdsSatimData.prices[planId];
191                }
192
193                if (satimValue !== '') {
194                    $('<input>', {
195                        type: 'hidden',
196                        id: 'tds-satim-price',
197                        value: satimValue
198                    }).appendTo('.tds-payment-sidebar');
199                }
200            }
201        }
202
203        // Cache sidebar and summary price elements and original text
204        var $sidebarPrice = $('.tds-payment-sidebar .tds-s-page-ss-info-row').eq(1).find('.tds-s-page-ss-info-value');
205        var originalPriceText = $sidebarPrice.text();
206        var $summaryTotal = $('.tds-s-subscr-summary-total .tds-s-sst-val');
207        var originalSummaryText = $summaryTotal.text();
208        var $hiddenPriceInput = $('#tds-discounted-price');
209        if (!$hiddenPriceInput.length) {
210            $hiddenPriceInput = $('#tds-initial-price');
211        }
212        var originalHiddenPrice = $hiddenPriceInput.length ? $hiddenPriceInput.val() : null;
213
214        // Update sidebar price when payment method changes
215        $(document).on('change', '.tds-billing-payment-method', function () {
216            $('.tds-satim-error-msg').remove();
217            var method = $('.tds-billing-payment-method:checked').val();
218            var satimPrice = $('#tds-satim-price').val();
219            var $priceInput = $('#tds-discounted-price');
220            if (!$priceInput.length) {
221                $priceInput = $('#tds-initial-price');
222            }
223            var $totalWrap = $('.tds-s-subscr-summary-total').add('.tds-s-page-ss-info-row');
224
225            if (method === 'satim') {
226                if (satimPrice) {
227                    $sidebarPrice.text(satimPrice);
228                    $summaryTotal.text(satimPrice);
229                    if ($priceInput.length) {
230                        $priceInput.val(satimPrice);
231                    }
232                }
233                $totalWrap.addClass('tds-satim-total-emphasis');
234            } else {
235                $sidebarPrice.text(originalPriceText);
236                $summaryTotal.text(originalSummaryText);
237                if ($priceInput.length && originalHiddenPrice !== null) {
238                    $priceInput.val(originalHiddenPrice);
239                }
240                $totalWrap.removeClass('tds-satim-total-emphasis');
241            }
242        });
243
244        // Update Satim payment button label with logo when available
245        if (window.tdsSatimData && window.tdsSatimData.labelHtml) {
246            var $satimButton = $('.tds-cp-satim');
247            if ($satimButton.length) {
248                $satimButton.html(window.tdsSatimData.labelHtml);
249            }
250        }
251
252        // Make Satim the default payment method when available
253        $(window).on('load', function() {
254            var $satimRadio = $('.tds-billing-custom-payment-method[value="satim"]');
255            if (!isAllowedClientSide()) {
256                removeSatimOptionForDisallowed();
257                return;
258            }
259            if ($satimRadio.length) {
260                if (!$satimRadio.is(':checked')) {
261                    $satimRadio.prop('checked', true);
262                }
263                $satimRadio.trigger('change');
264            }
265        });
266
267        // Listen for Satim payment button click
268        $(document).on('click', '.tds-cp-satim', function(e) {
269            e.preventDefault();
270            var $btn = $(this);
271            var $activeMethod = $('.tds-billing-payment-method:checked').val();
272            var $termsCheckboxes = $('.tds-satim-terms-checkbox');
273            if ($activeMethod) {
274                var $activeWrap = $('.tds-spm-' + $activeMethod);
275                if ($activeWrap.length) {
276                    $termsCheckboxes = $activeWrap.find('.tds-satim-terms-checkbox');
277                }
278            }
279            var $captchaInput = $('.g-recaptcha');
280
281            // Clear old messages
282            $('.tds-satim-error-msg').remove();
283
284            if (!validateBillingFields()) {
285                return;
286            }
287
288            if ($termsCheckboxes.length && $termsCheckboxes.filter(':checked').length === 0) {
289                $('<div class="tds-satim-error-msg">Veuillez accepter les conditions de paiement.</div>').insertBefore($btn);
290                return;
291            }
292
293            if ($captchaInput.length && typeof grecaptcha !== 'undefined') {
294                var captchaResponse = grecaptcha.getResponse();
295                if (!captchaResponse) {
296                    $('<div class="tds-satim-error-msg">
296Veuillez compléter le captcha.</div>').insertBefore($btn);
297                    return;
298                }
299            }
300
301            $btn.addClass('tds-s-btn-saving').attr('disabled', 'disabled');
302
303            // Collect data from the form (adjust selectors as needed)
304            var userId = $('#tds-subscription-user-id').val();
305            var planId = $('#tds-subscription-plan-id').val();
306            var couponId = $('#tds-coupon-id').val();
307            var billingFirstName = $('#tds-billing-first-name').val() || '';
308            var billingLastName = $('#tds-billing-last-name').val() || '';
309            var billingEmail = $('#tds-billing-email').val() || '';
310            var billingPhone = $('#tds-billing-phone').val() || '';
311            var billingAddress = $('#tds-billing-address').val() || '';
312            var billingCity = $('#tds-billing-city').val() || '';
313            var billingCountry = $('#tds-billing-country').val() || '';
314            var billingPostcode = $('#tds-billing-postcode').val() || '';
315            var billingCompanyName = $('#tds-billing-company-name').val() || '';
316            var billingVatNumber = $('#tds-billing-vat').val() || '';
317            var donationCustomAmount = $('#tds-donation-custom-amount').val() || '';
318
319            // Prepare data for AJAX
320            var requestData = {
321                user_id: userId,
322                plan_id: planId,
323                coupon_id: couponId,
324                billing_first_name: billingFirstName,
325                billing_last_name: billingLastName,
326                billing_email: billingEmail,
327                billing_phone: billingPhone,
328                billing_address: billingAddress,
329                billing_city: billingCity,
330                billing_country: billingCountry,
331                billing_postcode: billingPostcode,
332                billing_company_name: billingCompanyName,
333                billing_vat_number: billingVatNumber,
334                donation_custom_amount: donationCustomAmount,
335                terms_accepted: $termsCheckboxes.length ? ($termsCheckboxes.is(':checked') ? 1 : 0) : 1
336            };
337
338            // Optionally add nonce if needed for REST
339            if (window.tds_js_globals && window.tds_js_globals.wpRestNonce) {
340                requestData._wpnonce = window.tds_js_globals.wpRestNonce;
341            }
342            if (typeof grecaptcha !== 'undefined') {
343                requestData.recaptcha_token = grecaptcha.getResponse();
344            }
345
346            // Make AJAX request to backend REST endpoint
347            var apiUrl = (window.tds_js_globals && window.tds_js_globals.wpRestUrl)
348                ? window.tds_js_globals.wpRestUrl + 'tds/v1/satim_start_payment'
349                : '/wp-json/tds/v1/satim_start_payment';
350            $.ajax({
351                url: apiUrl,
352                method: 'POST',
353                data: requestData,
354                dataType: 'json',
355                success: function(response) {
356                    $btn.removeClass('tds-s-btn-saving').removeAttr('disabled');
357                    if (response && response.formUrl) {
358                        if (/Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent)) {
359                            window.open(response.formUrl, '_blank', 'noopener');
360                        } else {
361                            window.location.href = response.formUrl;
362                        }
363                    } else if (response && response.error) {
364                        alert(response.error);
365                    } else {
366                        alert('Une erreur inconnue est survenue.');
367                    }
368                },
369                error: function() {
370                    $btn.removeClass('tds-s-btn-saving').removeAttr('disabled');
371                    alert('Échec du démarrage du paiement SATIM. Veuillez réessayer.');
372                }
373            });
374        });
375
376        // Receipt email handler
377        $(document).on('click', '.tds-satim-email-btn', function() {
378            var $btn = $(this);
379            var $wrap = $btn.closest('.tds-satim-email-form');
380            var email = $wrap.find('.tds-satim-email').val();
381            var orderId = $btn.data('order');
382            var token = $btn.data('token');
383            var endpoint = $btn.data('endpoint');
384
385            if (!email) {
386                alert('Veuillez fournir une adresse courriel.');
387                return;
388            }
389
390            var initialText = $btn.text();
391            $btn.prop('disabled', true).text('Envoi en cours…');
392
393            $.ajax({
394                url: endpoint,
395                method: 'POST',
396                dataType: 'json',
397                data: {
398                    orderId: orderId,
399                    token: token,
400                    email: email
401                },
402                success: function(response) {
403                    $btn.prop('disabled', false).text(initialText);
404                    if (response && response.success) {
405                        alert(response.message || 'Le reçu a été envoyé par courriel.');
406                    } else if (response && response.message) {
407                        alert(response.message);
408                    } else {
409                        alert('Échec de l’envoi du reçu.');
410                    }
411                },
412                error: function(xhr) {
413                    $btn.prop('disabled', false).text(initialText);
414                    var message = xhr.responseJSON && xhr.responseJSON.message
415                        ? xhr.responseJSON.message
416                        : 'Échec de l’envoi du reçu. Vérifiez la configuration de messagerie du serveur.';
417                    alert(message);
418                }
419            });
420        });
421
422    });
423})(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.