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.