49#Octoplus Samsung Tool ✅ANNUAL RENEW ACTIVATIONS-1 Year For Box/Dongle

49#Octoplus Samsung Tool ✅ANNUAL RENEW ACTIVATIONS-1 Year For Box/Dongle

$30.80 / unit $30.80
No reviews yet
Write a review In Stock

Information

Delivery time: 1-5 Minutes
Order type: Server
Type: Server Service
Service type: Digital
Submit to verify allowed: No
Cancellation allowed: No
Order processing: API

Service description

Install the latest version and renew licence for 1 year

14) { imei = imei.substring(0, 14); imeiInput.value = imei; } if (imei.length === 14) { var checkDigit = calculateImeiChecksum(imei); var fullImei = imei + checkDigit; console.log('IMEI:', imei, 'Check:', checkDigit, 'Full:', fullImei); if (lastDigitElement) lastDigitElement.textContent = checkDigit; if (fullImeiElement) fullImeiElement.value = fullImei; return fullImei; } else { if (lastDigitElement) lastDigitElement.textContent = '0'; if (fullImeiElement) fullImeiElement.value = ''; return ''; } } if (imeiInput) { imeiInput.addEventListener('input', updateFullImei); imeiInput.addEventListener('change', updateFullImei); imeiInput.addEventListener('keyup', updateFullImei); } // Form submit handler with double-click protection if (checkoutForm) { var submitBtn = checkoutForm.querySelector('.btn-submit'); var submitBtnOriginalText = submitBtn ? submitBtn.textContent : ''; var isSubmitting = false; checkoutForm.addEventListener('submit', function(e) { // Block if Chimera verification required but not done if (chimeraRequired && !chimeraVerified) { e.preventDefault(); alert('Please verify your account with ChimeraTool before submitting.'); return false; } // Block duplicate submissions if (isSubmitting) { e.preventDefault(); return false; } // Validate IMEI if present if (imeiInput && imeiInput.value.length > 0) { var fullImei = updateFullImei(); if (!fullImei || fullImei.length !== 15) { e.preventDefault(); alert('Please enter a valid 14-digit IMEI'); imeiInput.focus(); return false; } } // Lock the form - prevent double submission isSubmitting = true; if (submitBtn) { submitBtn.disabled = true; submitBtn.innerHTML = ' Submitting...'; } return true; }); } // ===== BULK IMEI HANDLER ===== document.addEventListener('click', function(e) { var addBtn = e.target.closest('.add-to-bulk'); if (!addBtn) return; e.preventDefault(); var inputGroup = addBtn.closest('.imei-input-group'); if (!inputGroup) return; var inputField = inputGroup.querySelector('.imei') || inputGroup.querySelector('.bulk-source-input'); var fullImeiEl = inputGroup.querySelector('.full-imei'); if (!inputField) return; var valueToAppend = fullImeiEl ? fullImeiEl.value : inputField.value.trim(); if (valueToAppend && (!fullImeiEl || valueToAppend.length === 15)) { var bulkArea = document.getElementById('bulk_imei') || document.getElementById('bulk_device_text') || document.querySelector('textarea[name="bulk_device"]'); if (bulkArea) { bulkArea.value = bulkArea.value ? bulkArea.value + '\n' + valueToAppend : valueToAppend; inputField.value = ''; if (fullImeiEl) { fullImeiEl.value = ''; } var lastDigit = inputGroup.querySelector('.imei-last-digit'); if (lastDigit) lastDigit.textContent = '0'; inputField.focus(); } } else if (fullImeiEl) { alert('Please enter a valid 14-digit IMEI'); } }); // Enter key for bulk document.addEventListener('keypress', function(e) { if ((e.target.classList.contains('imei') || e.target.classList.contains('bulk-source-input')) && e.target.classList.contains('no-submit') && e.key === 'Enter') { e.preventDefault(); var addBtn = e.target.closest('.imei-input-group')?.querySelector('.add-to-bulk'); if (addBtn) addBtn.click(); } }); // ===== QUANTITY HANDLER ===== var quantityInput = document.getElementById('quantity'); var totalPriceElement = document.getElementById('totalPrice'); var deviceQuantityInput = document.getElementById('device_quantity'); if (quantityInput && totalPriceElement) { var unitPrice = parseFloat(quantityInput.dataset.unitPrice) || 0; var minQty = parseInt(quantityInput.min) || 1; var maxQty = parseInt(quantityInput.max) || 10000; function updateTotalPrice() { var quantity = parseInt(quantityInput.value) || 0; if (quantity < minQty) quantity = minQty; if (quantity > maxQty) quantity = maxQty; var total = (unitPrice * quantity).toFixed(2); totalPriceElement.textContent = AppCurrency.format(total); if (deviceQuantityInput) deviceQuantityInput.value = quantity; } quantityInput.addEventListener('input', updateTotalPrice); quantityInput.addEventListener('change', updateTotalPrice); updateTotalPrice(); // ===== QUANTITY STEPPER BUTTONS (- / +) ===== var qtyMinusBtn = document.querySelector('.qty-minus'); var qtyPlusBtn = document.querySelector('.qty-plus'); function stepQuantity(delta) { var quantity = parseInt(quantityInput.value) || minQty; quantity += delta; if (quantity < minQty) quantity = minQty; if (quantity > maxQty) quantity = maxQty; quantityInput.value = quantity; quantityInput.dispatchEvent(new Event('input', { bubbles: true })); } if (qtyMinusBtn) qtyMinusBtn.addEventListener('click', function() { stepQuantity(-1); }); if (qtyPlusBtn) qtyPlusBtn.addEventListener('click', function() { stepQuantity(1); }); } // ===== COUPON CODE ===== (function() { var toggleBtn = document.getElementById('couponToggle'); var panel = document.getElementById('couponPanel'); var input = document.getElementById('couponInput'); var applyBtn = document.getElementById('couponApplyBtn'); var feedback = document.getElementById('couponFeedback'); var hiddenField = document.getElementById('couponCodeField'); if (!toggleBtn || !panel || !input || !applyBtn) return; toggleBtn.addEventListener('click', function() { var willShow = panel.hidden; panel.hidden = !willShow; toggleBtn.classList.toggle('active', willShow); if (willShow) input.focus(); }); function setFeedback(text, state) { feedback.textContent = text || ''; feedback.className = 'coupon-feedback' + (state ? ' ' + state : ''); } function applyCoupon() { var code = input.value.trim(); if (!code) { setFeedback('Enter coupon code', 'error'); input.focus(); return; } var csrfToken = document.querySelector('meta[name="csrf-token"]'); if (!csrfToken) { window.location.href = '/login'; return; } applyBtn.disabled = true; applyBtn.classList.add('loading'); applyBtn.textContent = 'Applying...'; setFeedback('', ''); var quantityEl = document.getElementById('quantity'); var body = { coupon_code: code }; if (quantityEl) body.quantity = quantityEl.value; fetch('https://gsmpromax.eu/checkout/coupon/server/83', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken.content, 'Accept': 'application/json' }, body: JSON.stringify(body) }) .then(function(r) { return r.json().then(function(data) { data.__status = r.status; return data; }); }) .then(function(data) { if (data.__status === 401 || data.message === 'Unauthenticated.') { window.location.href = '/login'; return; } if (data.success) { hiddenField.value = code; input.disabled = true; applyBtn.textContent = '✓'; panel.classList.add('coupon-success'); setFeedback((data.message || 'Coupon applied!') + ' −' + data.discount_formatted, 'success'); } else { hiddenField.value = ''; applyBtn.disabled = false; applyBtn.classList.remove('loading'); applyBtn.textContent = 'Apply'; panel.classList.remove('coupon-success'); panel.classList.add('coupon-shake'); setTimeout(function() { panel.classList.remove('coupon-shake'); }, 400); setFeedback(data.message || 'Invalid coupon code.', 'error'); } }) .catch(function() { applyBtn.disabled = false; applyBtn.classList.remove('loading'); applyBtn.textContent = 'Apply'; setFeedback('Network error, please try again.', 'error'); }); } applyBtn.addEventListener('click', applyCoupon); input.addEventListener('keypress', function(e) { if (e.key === 'Enter') { e.preventDefault(); applyCoupon(); } }); input.addEventListener('input', function() { if (hiddenField.value) { hiddenField.value = ''; } }); })(); // ===== REAL-TIME PRICE POLLING (adaptatif) ===== (function() { var pollUrl = 'https://gsmpromax.eu/checkout/price/server/83'; var lastKnownPrice = 30.8; var isQuantityService = true; var lastChangeTs = 0; var pollTimer = null; var normalInterval = 60000; // 60s en temps normal var fastInterval = 10000; // 10s apres un changement detecte var currentInterval = normalInterval; function flashElement(el) { if (!el) return; el.classList.remove('price-changed'); void el.offsetWidth; el.classList.add('price-changed'); el.addEventListener('animationend', function handler() { el.classList.remove('price-changed'); el.removeEventListener('animationend', handler); }); } function updatePriceDisplay(newPriceUsd) { var formatted = AppCurrency.format(newPriceUsd); if (isQuantityService) { var unitPriceEl = document.querySelector('.unit-price'); if (unitPriceEl) { unitPriceEl.childNodes[0].textContent = formatted + ' '; flashElement(unitPriceEl); } var qtyInput = document.getElementById('quantity'); if (qtyInput) { qtyInput.dataset.unitPrice = newPriceUsd; unitPrice = newPriceUsd; updateTotalPrice(); flashElement(document.getElementById('totalPrice')); } } else { var priceBadge = document.querySelector('.service-price-badge'); if (priceBadge) { priceBadge.textContent = formatted; flashElement(priceBadge); } } lastKnownPrice = newPriceUsd; } function pollPrice() { fetch(pollUrl, { method: 'GET', headers: { 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' } }) .then(function(r) { if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); }) .then(function(data) { // Detecter si des prix ont change globalement if (data.t && data.t > lastChangeTs) { lastChangeTs = data.t; // Passer en mode rapide temporairement if (currentInterval !== fastInterval) { currentInterval = fastInterval; restartPolling(); // Revenir au mode normal apres 30s setTimeout(function() { currentInterval = normalInterval; restartPolling(); }, 30000); } } if (data.price !== undefined && Math.abs(data.price - lastKnownPrice) > 0.001) { updatePriceDisplay(data.price); } }) .catch(function(err) { console.warn('Price poll error:', err.message); }); } function restartPolling() { if (pollTimer) clearInterval(pollTimer); pollTimer = setInterval(pollPrice, currentInterval); } function stopPolling() { if (pollTimer) { clearInterval(pollTimer); pollTimer = null; } } document.addEventListener('visibilitychange', function() { if (document.hidden) { stopPolling(); } else { pollPrice(); restartPolling(); } }); restartPolling(); })(); }); // Étoiles cliquables — redirige vers blog/create pour écrire un avis document.querySelectorAll('.checkout-stars .checkout-star').forEach(function(star) { star.addEventListener('click', function() { var val = parseInt(this.getAttribute('data-value')); var container = this.closest('.checkout-stars'); container.setAttribute('data-rating', val); container.querySelectorAll('.checkout-star').forEach(function(s) { s.classList.toggle('active', parseInt(s.getAttribute('data-value')) <= val); }); var sid = container.getAttribute('data-service-id'); var stype = container.getAttribute('data-type'); if (sid && stype) { var reviewServiceType = (stype === 'remote' ? 'file' : stype) + '_service'; setTimeout(function(){ window.location.href = '/blog/create?post_type=review&service_type=' + reviewServiceType + '&service_id=' + sid + '&rating=' + val; }, 350); } }); }); // Hover preview sur les étoiles document.querySelectorAll('.checkout-stars .checkout-star').forEach(function(star) { star.addEventListener('mouseenter', function() { var val = parseInt(this.getAttribute('data-value')); this.closest('.checkout-stars').querySelectorAll('.checkout-star').forEach(function(s) { s.classList.toggle('hover-preview', parseInt(s.getAttribute('data-value')) <= val); }); }); star.addEventListener('mouseleave', function() { this.closest('.checkout-stars').querySelectorAll('.checkout-star').forEach(function(s) { s.classList.remove('hover-preview'); }); }); }); /* ═══════════════════════════════════════════ Like + Quick-rate (checkout page) ═══════════════════════════════════════════ */ function toggleCardLike(event, btn) { event.preventDefault(); event.stopPropagation(); var url = btn.dataset.url; var csrfToken = document.querySelector('meta[name="csrf-token"]'); if (!csrfToken) { window.location.href = '/login'; return; } btn.disabled = true; fetch(url, { method: 'POST', headers: { 'X-CSRF-TOKEN': csrfToken.content, 'Accept': 'application/json' } }) .then(function(r) { return r.json().catch(function() { return {}; }).then(function(data) { data.__status = r.status; return data; }); }) .then(function(data) { if (data.login_required || data.__status === 401 || data.message === 'Unauthenticated.') { window.location.href = '/login'; return; } if (data.success) { var selector = '[data-id="' + btn.dataset.id + '"][data-type="' + btn.dataset.type + '"].qty-fav-btn'; document.querySelectorAll(selector).forEach(function(b) { b.classList.toggle('liked', data.liked); b.setAttribute('aria-label', (data.liked ? 'Unlike' : 'Like') + ' this service'); var lc = b.querySelector('.lc'); if (lc) lc.textContent = data.count > 0 ? data.count : ''; }); } }) .catch(function() {}) .finally(function() { btn.disabled = false; }); } var _rateTarget = null; function openRateModal(event, starsEl) { event.preventDefault(); event.stopPropagation(); _rateTarget = starsEl; var name = starsEl.dataset.name || 'this service'; var current = parseInt(starsEl.dataset.rating) || 0; var overlay = document.createElement('div'); overlay.className = 'qrate-overlay'; overlay.setAttribute('id', 'qrateOverlay'); overlay.innerHTML = [ '

' ].join(''); document.body.appendChild(overlay); overlay.addEventListener('click', function(e) { if (e.target === overlay) closeRateModal(); }); var selected = current || 0; var stars = overlay.querySelectorAll('.qrate-star'); stars.forEach(function(s) { s.addEventListener('mouseover', function() { var v = parseInt(s.dataset.val); stars.forEach(function(x) { x.classList.toggle('active', parseInt(x.dataset.val) <= v); }); }); s.addEventListener('click', function() { selected = parseInt(s.dataset.val); stars.forEach(function(x) { x.classList.toggle('active', parseInt(x.dataset.val) <= selected); }); }); }); overlay.querySelector('.qrate-stars').addEventListener('mouseleave', function() { stars.forEach(function(x) { x.classList.toggle('active', parseInt(x.dataset.val) <= selected); }); }); document.getElementById('qrateSubmit').addEventListener('click', function() { if (!selected) { showQrateMsg('Please select a rating', 'err'); return; } submitRating(starsEl, selected); }); overlay.querySelector('.qrate-submit').focus(); } function closeRateModal() { var o = document.getElementById('qrateOverlay'); if (o) o.remove(); } function showQrateMsg(text, type) { var el = document.getElementById('qrateMsg'); if (el) { el.textContent = text; el.className = 'qrate-msg ' + (type || ''); } } function submitRating(starsEl, rating) { var url = starsEl.dataset.url; var csrf = document.querySelector('meta[name="csrf-token"]'); if (!csrf) { window.location.href = '/login'; return; } var btn = document.getElementById('qrateSubmit'); if (btn) { btn.disabled = true; btn.textContent = '...'; } fetch(url, { method: 'POST', headers: { 'X-CSRF-TOKEN': csrf.content, 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify({ rating: rating }) }) .then(function(r) { return r.json().catch(function() { return {}; }).then(function(data) { data.__status = r.status; return data; }); }) .then(function(data) { if (data.login_required || data.__status === 401 || data.message === 'Unauthenticated.') { window.location.href = '/login'; return; } if (data.success) { starsEl.dataset.rating = data.avg; var starEls = starsEl.querySelectorAll('.checkout-star, .card-star'); var rounded = Math.round(data.avg); starEls.forEach(function(s) { s.classList.toggle('active', parseInt(s.dataset.value) <= rounded); }); showQrateMsg('Thank you for your rating!', 'ok'); setTimeout(closeRateModal, 1200); } else { showQrateMsg(data.error || 'Error', 'err'); if (btn) { btn.disabled = false; btn.textContent = 'Rate'; } } }) .catch(function() { showQrateMsg('Network error', 'err'); if (btn) { btn.disabled = false; btn.textContent = 'Rate'; } }); } function escHtml(s) { return String(s).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); } /* === Searchable select for long option lists (countries, apps, etc.) ========= Wraps any stays in the DOM (form submission works as before) — we just sync .value when the user clicks an option. Options can carry data-img="https://..." to render a 20×15 image (flags, app logos) prefixed before the label. */ (function initSearchableSelects(){ function build(select){ // Always remove any prior wrapper attached to THIS select (idempotent) if (select.__sselWrap && select.__sselWrap.parentNode) { select.__sselWrap.parentNode.removeChild(select.__sselWrap); select.__sselWrap = null; } var placeholder = select.dataset.placeholder || 'Search...'; var options = Array.prototype.slice.call(select.options).filter(function(o){return o.value;}); var wrap = document.createElement('div'); wrap.className = 'ssel-wrap'; wrap.style.cssText = 'position:relative;width:100%'; var trigger = document.createElement('button'); trigger.type = 'button'; trigger.className = 'form-control ssel-trigger'; trigger.style.cssText = 'text-align:left;display:flex;justify-content:space-between;align-items:center;width:100%;background:#fff;cursor:pointer;min-height:42px'; trigger.innerHTML = '' + escHtml(placeholder) + ''; var panel = document.createElement('div'); panel.className = 'ssel-panel'; panel.style.cssText = 'display:none;position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:50;background:#fff;border:1px solid #e5e7eb;border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.12);max-height:320px;overflow:hidden;flex-direction:column'; var input = document.createElement('input'); input.type = 'text'; input.placeholder = 'Type to filter ' + options.length + ' options...'; input.style.cssText = 'border:none;border-bottom:1px solid #e5e7eb;padding:10px 12px;font-size:14px;outline:none'; var list = document.createElement('div'); list.style.cssText = 'overflow-y:auto;max-height:270px'; function imageEl(src){ if (!src) return null; var img = document.createElement('img'); img.src = src; img.style.cssText = 'width:20px;height:15px;object-fit:contain;border-radius:2px;background:#f3f4f6;flex-shrink:0'; img.loading = 'lazy'; img.onerror = function(){ this.style.display='none'; }; return img; } function setTriggerSelected(opt){ var lbl = trigger.querySelector('.ssel-label'); lbl.innerHTML = ''; lbl.style.color = '#1f2937'; var img = imageEl(opt.getAttribute('data-img')); if (img) lbl.appendChild(img); var txt = document.createElement('span'); txt.textContent = opt.textContent || opt.text; lbl.appendChild(txt); } function renderList(filter){ list.innerHTML = ''; var f = (filter || '').toLowerCase(); var shown = 0; options.forEach(function(o){ if (f && o.text.toLowerCase().indexOf(f) === -1) return; shown++; if (shown > 300) return; var item = document.createElement('div'); item.style.cssText = 'padding:8px 14px;cursor:pointer;font-size:14px;color:#1f2937;display:flex;align-items:center;gap:10px'; var img = imageEl(o.getAttribute('data-img')); if (img) item.appendChild(img); var txt = document.createElement('span'); txt.textContent = o.text; item.appendChild(txt); item.onmouseenter = function(){ item.style.background = '#f3f4f6'; }; item.onmouseleave = function(){ item.style.background = ''; }; item.onclick = function(){ select.value = o.value; setTriggerSelected(o); panel.style.display = 'none'; select.dispatchEvent(new Event('change', {bubbles:true})); }; list.appendChild(item); }); if (!shown){ var empty = document.createElement('div'); empty.textContent = 'No match'; empty.style.cssText = 'padding:14px;color:#9ca3af;font-size:13px;text-align:center'; list.appendChild(empty); } } trigger.onclick = function(){ var open = panel.style.display === 'flex'; panel.style.display = open ? 'none' : 'flex'; if (!open){ input.value = ''; renderList(''); setTimeout(function(){input.focus();}, 10); } }; input.oninput = function(){ renderList(input.value); }; document.addEventListener('click', function(e){ if (!wrap.contains(e.target)) panel.style.display = 'none'; }); panel.appendChild(input); panel.appendChild(list); wrap.appendChild(trigger); wrap.appendChild(panel); // Hide the native select but keep it in the form for submission select.style.display = 'none'; select.parentNode.insertBefore(wrap, select.nextSibling); select.__sselWrap = wrap; // Sync if the select already has a value if (select.value){ var match = options.find(function(o){return o.value === select.value;}); if (match) setTriggerSelected(match); } } function initAll(){ document.querySelectorAll('select.js-searchable-select').forEach(build); } // Expose so dynamically-loaded selects (OTP catalog) can be (re)wrapped window.__buildSearchableSelect = build; if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', initAll); else initAll(); })();