Télécharger 1xbet Apk 2024 Pour Android Os Et Iphone

Telecharger 1xbet Apk Pour Pc, 1xbet Application Fill Pc

Selon des préférences du parieur, le casino offer des machines à sous bon marché, des jeux de jackpot cumulatifs et des simulateurs de gros joueurs. Contrairement au site Net 1xBet, l’application put Android et iOS ne peut pippo être bloquée para l’extérieur. En téléchargeant le logiciel de jeu, vous devez placer des paris, france librement même sinon le portail web est en panne pour dieses raisons techniques. Il est question de la voie para secours lorsqu’on ne peut pas installation technician ou utiliser l’une des applications mobiles présentées ci-dessus. Elle permet également para pouvoir expérimenter les services 1xBet Android & iOS sans avoir à accompagner une procédure d’installation. L’utilisation des services du bookmaker est aussi possible à partir de un appareil iOS (tablette ou téléphone).

Le” “redémarrage de votre appareil peut aider à effacer les fichiers ou processus temporaires susceptibles d’affecter nos performances. Enfin, assurez vous que la dernière version de l’application est installée, car les variations plus récentes incluent souvent des améliorations de performances et des corrections para bugs. Les parieurs abonnés à l’application 1xBet peuvent observer des performances lentes et des remise. Si vous remarquez que l’application cellular s’exécute lentement ou connaît un décalage, vous pouvez prendre certaines mesures fill iséliorer ses activities.

Où Télécharger L’apk 1xbet Pour Android?

Elle est facile à utiliser, permet aux utilisateurs d’obtenir el accès complet aux sections du web site. Vous pouvez télécharger le programme en déambulant le site officiel du bookmaker.” “[newline]Sur ce portail, vouz pouvez non seulement profiter des paris, france sportifs, mais de même essayer d’autres choices de divertissement. Il suffit de 1xbet pc download fill découvrir le lieu des paris grâce à des règles complètement différentes. L’application 1xbet vous offre el superbe design visuel, avec un mélange de couleurs incolore et bleues 1xbet apk.

Tout d’abord, vérifiez que les joueurs saisissez les infos de connexion correctes (nom d’utilisateur ou mot de passe), sans fautes para frappe ni erreurs. La création d’un nouveau compte nécessite uniquement de soumettre votre pays/région avant-gardiste, votre devise et votre code promotionnel (si disponible). Une fois créé, vous recevrez un nom d’utilisateur et algun mot de cortège pour vous connecter à votre projet. L’utilisateur mobile iOS ne subit pippo les mêmes limitations que les utilisateurs d’Android et peut télécharger l’application 1xBet gratuitement depuis l’App Store et exécuter iOS 11 ou supérieur sur son iPhone. Tout etant donné que le code promotionnel, les bonus donnent des freebets ou permettent d’augmenter ces gains. Le répertoire de cadeaux est impressionnant et about vous conseille sobre vous inscrire au calendrier des bonus pour recevoir em dernières nouvelles.

Conditions Générales Dieses Bonus 1xbet Ci Mobile

1xBet accorde leur grande attention aux besoins des internautes, fournit donc la majorité des conditions nécessaires pour un jeu confortable. Ils aident non seulement à augmenter les gains, mais aussi à améliorer l’expérience dans les paris et les casinos sur internet. Comme su peux le regarder, l’usage d’un code promotionnel est une chose commune à toutes les options d’inscription disponibles sur 1xBet. De plus, vider le cache para l’application des paramètres de votre appareil peut aider à supprimer toutes nos données temporaires susceptibles de provoquer dieses conflits. Redémarrer votre appareil et relancer l’application mobile 1xBet APK peut également aider à cadrer ses ressources ou à éliminer tout problème temporaire. Si le problème persiste, vous pouvez envisager de désinstaller l’application et de los angeles réinstaller à fastidiar d’une source autentico, telle que le web site officiel ou l’App Store.

La liste complète des bonus ainsi que promotions en cours peut être consultée au vues de l’application 1xBet. Consultez la liste des appareils dans the tableau ci-dessous, avec lesquels les 1xBet apps pour iOS, Android et PC sont les bien compatibles. Lorsque votre téléchargement de 1xBet apk pour Google android est terminé, vous le verrez au vues de le gestionnaire de téléchargement de le smartphone.

Les Paris Sportifs Avec L’application 1xbet

Il” “se révèle être possible d’installer votre programme sur un smartphone ou leur tablette. Pour accéder au site, les joueurs devez entrer cet nom d’utilisateur et votre mot sobre passe dans votre fenêtre spéciale. Avec l’aide de 1xbet application, vous devez gérer votre projet, changer des data, alimenter votre compte de jeu ou retirer de l’argent.

Vous pouvez être sûr que votre travail avec votre portail sera rapide et fasile. En téléchargeant l’apk de l’application 1xbet sn apk, vous aurez accès à kklk paris sur dieses matchs virtuels générés par l’intelligence artificielle, où vous allez pouvoir également gagner ainsi que regarder des conflits. De plus, il reste possible de télécharger d’autres programmes importants sur le internet site. Ce sont leur extension spéciale fill le navigateur (browser) « 1XBROWSER », une program pour MAC OPERATING-SYSTEM et divers solutions VPN. Tout ce fait aidera à obtenir un accès sécurisé à toutes des sections du internet site et à faire des paris confortablement n’importe où.

Bet Software Vs Mobile Website

Vous pouvez donc vous connecter à votre compte employees ou en créer un nouveau si vous n’êtes passing encore inscrit et commencer à parier et à économiser de l’argent réel. L’application 1xBet se révèle être absolument identique à la version man site Web, benjamin n’y an en conséquent aucun problème put s’y habituer. L’interface est travaillée pour une performance agréable et une vivacité rapide sans surcharger avec un design and style graphique lourd.

Il reste impossible de accomplir un pari sobre direct à l’avance, pendant plusieurs an. Dans les paramètres de sécurité, acceptez de télécharger dieses fichiers provenant para sources inconnues. Une application parfaitement optimisée économise votre bande passante et fonctionne efficacement en déplacement. Vous pouvez découvrir les nouveaux reward 1xBet ainsi que conflits à venir grâce à des announcements push pratiques.

Télécharger 1xbet Application Pour Android Et Ios

Vous devez regarder les retransmissions en direct des matchs qui vous intéressent à tout moment et entendu gratuitement en entrant l’application 1x wager. Pour eux, 1xBet a préparé el package de bienvenue allant jusqu’à 1500 $ + one hundred fifty tours gratuits au niveau des machines à sous populaires. Il se révèle être léger et fonctionne parfaitement sur presque tous les cell phones et tablettes modernes. De plus, des utilisateurs Apple peuvent synchroniser leur software 1 xBet Sénégal avec leur montre intelligente.

Fermez toutes nos applications en arrière-plan inutiles qui peuvent s’exécuter simultanément et consommer les ressources de l’appareil. Quand vous finissez de télécharger 1xbet apk et installez le produit dans le mémoire de le téléphone, vous aurez sans doutes envie d’essayer toutes syns fonctionnalités. Vous pouvez installer 1xBet software pour PC fill un accès rapide au jeu en argent réel.

Bet Download For Computer”

Vous pouvez depuis lancer l’application 1xBet, vous connecter à votre compte employees et commencer à parier ou à jouer à dieses jeux de online casino en toute liberté. L’application 1xBet a good une faible configuration requise et fonctionne aussi rapidement la cual possible. Elle offer un ensemble entir d’options qui les joueurs permettent de parier et de pratiquer à des jeux de casino à tout moment ainsi que en tout lieu. Même si vous avez une faible vitesse de intrigue à Internet, vous aurez un accès complet à la ressource. Vous devez seulement 1xbet computer download et cela changera immédiatement le attitude envers l’ensemble des paris en général.

Après l’avoir soumis, vous recevrez un message écrit avec un computer code de vérification pour recevoir vos identifiants de connexion. Les parieurs habitués à parier sur el navigateur seront ravis de voir opinion ces centaines d’opportunités de lignes sobre paris par événement sont regroupées de manière conviviale et facile à naviguer. Le logiciel mobile travaille bien en déambulant android, c’est rapide et il con a la majorité des fonctions nécessaires. Nos parieurs placent leurs mises sur le vainqueur para la rencontre, le nombre de details ou buts, le nombre de cartes jaunes et rouges, le nom i premier sportif quel professionne marque le nevertheless. Quand vous démarrez la version mobile phone du site, les fonctions restent des mêmes mais votre site consomme moins de trafic parce que les icônes et les champs d’affichage sont” “as well as petits. Les habitants de Côte d’Ivoire adorent parier ou passent beaucoup sobre temps en plaçant des paris en allant sur la victoire de leurs équipes favorites.

Comment J’installe 1xbet Apk?

Ce processus offre la possibilité de savoir in addition sur le potentiel de développement ainsi que de le faire encore plus bon pour les utilisateurs. Un échec para téléchargement peut être dû à los angeles perte d’une union Internet stable. Vérifiez votre réseau mobile ou WIFI et cliquez sur «Répéter la mise à jour ». Si l’échec se reproduit, essayez de télécharger la mise à jour à hacer la cusqui du site Net. Nous avons conçu la version du site Web mobile phone pour permettre l’ensemble des dépôts ainsi que retraits directs, une course-plotting simplifiée sur la plateforme et un accès régulier à l’historique des paris personnels.

Il convient à una fois aux modules mobiles Android (5. 0+) et iOS (12. 0 systems supérieur), et faible importe la grosseur de l’écran de votre appareil – le programme s’y adaptera automatiquement. L’application 1xbet fonctionnera parfaitement même si votre appareil mobile est obsolète. Les utilisateurs d’Android seront agréablement surpris, car le fichier 1xbet apk ne nécessite que 80 Mo d’espace libre. Vous devez ouvrir les paramètres du téléphone, cliquer en allant sur la version i programme, après quoi le système d’exploitation vous proposera sobre mettre à lumière l’application. Si une mise à jour n’est pas nécessaire, une notification apparaîtra à l’écran indiquant que la dernière version de 1xbet est installée sur le système d’exploitation Android.

Télécharger 1xbet Pour Apple Iphone Au Sénégal

Je viens de télécharger à mon mobile, le design me personally plaît ainsi que emploi sont les mêmes que dans le site. Ce kind” “para jeux est réservé aux personnes ayant des connaissances approfondies de la self-control sportive et un bon sens para stratégie car des cotes sont fluides et changent très souvent pendant votre match. Toutes nos informations pratiques, règles et conseils seront publiés dans una rubrique « Bouts et Conditions » que nous vous conseillons d’étudier. 1xbet au Côte d’Ivoire est actif depuis une longue période et an attiré un très grand groupe de parieurs.

Il est possible de effectuer 1xbet with regard to pc download à tout moment, automobile les professionnels deviennent toujours prêts à saluer les nouveaux clients et à offrir les conditions de jeu les plus favorables. Pour pouvoir effectuer tes opérations de coup sur 1xbet partout au Sénégal, on te propose d’installer l’application mobile du bookmaker. Dans cet article, toute la procédure permettant de réaliser cela est présentée, notamment l’obtention et l’installation 1xBet APK si tu because un Android, mais aussi comment télécharger 1xBet Sénégal si tu as un apple iphone. Après vous avez installé le programme sur le tool, vous devez appréhender toutes les fonctions.

Faq: Foire Aux Questions Sur L’application Mobile 1xbet

L’application elle-même a great un design actuelle, une navigation simple et une management pratique. Vous devez vous connecter à votre compte à l’aide du bouton « Connexion » qui se révèle être situé dans votre coin supérieur équitable. De nombreux utilisateurs font l’erreur sobre se réinscrire après ils ont” “installés 1xbet application fill PC. Lancez the téléchargement de 1xBet et après plusieurs secondes, l’application est automatiquement installée sur votre appareil. Une fois l’installation terminée, l’icône 1xBet apparaîtra dans le menus de l’appareil iOS.

Vous pouvez télécharger gratuitement l’application 1xBet CI APK” “pour votre téléphone. Pour les utilisateurs quel professionne préfèrent les paris, france mobiles, c’est los angeles meilleure option. Le téléchargement de l’application 1xBet CI apk donne aux utilisateurs iOS et Android une chance sobre recevoir un reward de bienvenue. Le montant du paiement est déterminé par la taille man premier dépôt ou équivaut à 100 % du montant. L’inscription 1xBet garantit algun bonus maximum de 130 euros sans entrer de réduction. Le joueur peut déposer de l’argent en utilisant 1xBet sur Android ou iOS.

Registration And Login To Be Able To The 1xbet App

Pour apprendre les résultats du dernier match ou fill étudier les statistiques il peut être utile de ouvrir des sections portant” “votre même nom. La version logicielle para 1xBet pour COMPUTER et PC contient de nombreux avantages. Pendant son utilisation le joueur économise considérablement le clientèle Internet.

Afin d’installer l’application 1xBet sur votre mobile phone, vous devez d’abord faire un télécharger 1xBet apk pour Android. Nous avons préparé des guidelines détaillées sur the 1xBet apk get. Le client logiciel de ce bookmaker 1xBet logiciel pour PC s’occupe kklk travaux sur toutes les versions des systèmes d’exploitation Windows, quelle que soit leur résolution.

Sommaire Derrière 1xbet Pc

Enregistrer wednesday nom, mon email et mon web site web dans le navigateur pour mon prochain commentaire. Ne manquez pas l’occasion de coopérer avec les professionnels et gagnez régulièrement grâce à votre carré savoir. Il reste possible de télécharger la version complète et rejoindre les leaders du marché à tout moment. Notre portail se révèle être une bonne opportunité d’essayer un nouveau type de get. L’option “en direct” an une période beaucoup plus mandement pour les rome – le lumière présent ou the futur le in addition proche.

Dans les captures d’écran ci-dessous, vous devez voir l’interface de l’application 1xBet put comprendre le processus de jeu. Tout d’abord, vous pouvez autoriser l’installation de fichiers provenant de sources inconnues dans les paramètres de votre appareil. Ensuite, après le téléchargement, confirmez l’installation sobre 1xBet et démarrez le logiciel. Les développeurs surveillent toutes les tendances actuelles dans le domaine de la sécurité sobre l’information et l’ensemble des mettent en œuvre avec succès dans l’application. L’application a good un code sobre programme complexe, elle est protégée par une protection anti-virus de haute qualité.

Installer 1xbet Sur Pc

Oui, l’application est disponible sobre téléchargement gratuit sur les appareils mobiles avec les systèmes Android ainsi que iOS. Vous pouvez télécharger et installer l’apk sur le site Web 1xBet dans le marché de la section dieses applications. Il est nécessaire de a tout second mettre l’application mobile 1xbet apk à jour parce la cual 1XBET améliore constamment leurs applications ainsi que utilise toutes des capacités des modules mobiles modernes.

C’est en réalit.é une agréable question, et fill y répondre, nous-mêmes souhaitons vous présenter une comparaison no meio de la version du site mobile ou une version de l’application 1xbet. Vous pouvez faire vos paris à l’avance sur n’importe quel tournoi ou parier sur une large sélection de marchés disponibles pendant le match en un clic sur the programme mobile 1xbet sn. Le terme conseillé ne recommande pippo de le faire, car de cette façon, vous devez télécharger des logiciels malveillants. Les fichiers sur le portail web administratif ont été vérifiés et ne présentent aucun danger pour votre appareil. Bien que 1xBet admettons, légal au Sénégal, vous pouvez télécharger une application cell phone, créer votre plan et parier sans problème. Vous pourriez rencontrer des problèmes potentiels en essayant de retirer kklk fonds.

Bet Mobile Apk Au Sénégal: Comment Télécharger Et Installer

La société de paris 1xBet est très demandée et fait autorité parmi les fans de paris sportifs dans le monde. L’opérateur a gagné la reconnaissance kklk joueurs grâce à sa fiabilité, à ses coefficients élevés, à sa importante liste et à l’introduction de systèmes” “innovants dans le point de vue de ses solutions. Notre revue choisira des instructions au sein de façon d’installer 1xBet sur PC, de ce fait qu’un aperçu sobre l’utilité et des fonctions du plan 1xBet pour PC.

Bien o qual le jeu through un téléphone cellular – est un format pratique ou a de innombrable autres avantages, beaucoup d’utilisateurs choisissent constamment une fonctionnalité complète. En pratique, cela signifie qu’il reste possible de retrouver des options intéressantes de pari en quelques secondes. C’est pourquoi de nombreux utilisateurs veulent 1xbet pc download pour acceder au jeu 24 heures par lumière et profiter avec des professionnels. En téléchargeant la dernière version de 1xbet sn apk, les joueurs bénéficierez d’excellents added bonus, d’un large préférence de méthodes sobre paiement, ainsi que d’un style visuel ou d’un flux sobre travail agréables. Nous vous assurons que vous pouvez obtenir la meilleure expérience possible en téléchargeant l’application 1xbe apk pour les appareils mobiles Android ou iOS.

Paris Sportifs Virtuels

Si le téléchargement est facile à faire, l’installation de l’application 1xBet Sénégal sur ton téléphone le sera également. Dans cette section, on lo présente les différentes étapes qui lo permettront d’y arriver en quelques clics. Toutes les sections du site deviennent disponibles dans votre fenêtre spéciale quel professionnel se trouve à gauche de l’écran.

Sur des téléphones ou nos tablettes, l’optimisation mobile est disponible equal footing défaut, mais à partir de un PC, les joueurs ne pouvez con basculer que manuellement. Pour cela, descendez en bas de la page primario et cliquez en allant sur le bouton approprié dans la famille « Utile ». Sélectionnez un fichier APK pour le appareil, cliquez dessus” “ainsi que attendez que le téléchargement soit terminé. Ouvrez la page principale du site officiel et cliquez sur l’icône du téléphone.

(function () { var searchreplace = (function () { 'use strict'; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; var clone = function () { return Cell(get()); }; return { get: get, set: set, clone: clone }; }; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); function isContentEditableFalse(node) { return node && node.nodeType === 1 && node.contentEditable === 'false'; } function findAndReplaceDOMText(regex, node, replacementNode, captureGroup, schema) { var m; var matches = []; var text, count = 0, doc; var blockElementsMap, hiddenTextElementsMap, shortEndedElementsMap; doc = node.ownerDocument; blockElementsMap = schema.getBlockElements(); hiddenTextElementsMap = schema.getWhiteSpaceElements(); shortEndedElementsMap = schema.getShortEndedElements(); function getMatchIndexes(m, captureGroup) { captureGroup = captureGroup || 0; if (!m[0]) { throw new Error('findAndReplaceDOMText cannot handle zero-length matches'); } var index = m.index; if (captureGroup > 0) { var cg = m[captureGroup]; if (!cg) { throw new Error('Invalid capture group'); } index += m[0].indexOf(cg); m[0] = cg; } return [ index, index + m[0].length, [m[0]] ]; } function getText(node) { var txt; if (node.nodeType === 3) { return node.data; } if (hiddenTextElementsMap[node.nodeName] && !blockElementsMap[node.nodeName]) { return ''; } txt = ''; if (isContentEditableFalse(node)) { return '\n'; } if (blockElementsMap[node.nodeName] || shortEndedElementsMap[node.nodeName]) { txt += '\n'; } if (node = node.firstChild) { do { txt += getText(node); } while (node = node.nextSibling); } return txt; } function stepThroughMatches(node, matches, replaceFn) { var startNode, endNode, startNodeIndex, endNodeIndex, innerNodes = [], atIndex = 0, curNode = node, matchLocation = matches.shift(), matchIndex = 0; out: while (true) { if (blockElementsMap[curNode.nodeName] || shortEndedElementsMap[curNode.nodeName] || isContentEditableFalse(curNode)) { atIndex++; } if (curNode.nodeType === 3) { if (!endNode && curNode.length + atIndex >= matchLocation[1]) { endNode = curNode; endNodeIndex = matchLocation[1] - atIndex; } else if (startNode) { innerNodes.push(curNode); } if (!startNode && curNode.length + atIndex > matchLocation[0]) { startNode = curNode; startNodeIndex = matchLocation[0] - atIndex; } atIndex += curNode.length; } if (startNode && endNode) { curNode = replaceFn({ startNode: startNode, startNodeIndex: startNodeIndex, endNode: endNode, endNodeIndex: endNodeIndex, innerNodes: innerNodes, match: matchLocation[2], matchIndex: matchIndex }); atIndex -= endNode.length - endNodeIndex; startNode = null; endNode = null; innerNodes = []; matchLocation = matches.shift(); matchIndex++; if (!matchLocation) { break; } } else if ((!hiddenTextElementsMap[curNode.nodeName] || blockElementsMap[curNode.nodeName]) && curNode.firstChild) { if (!isContentEditableFalse(curNode)) { curNode = curNode.firstChild; continue; } } else if (curNode.nextSibling) { curNode = curNode.nextSibling; continue; } while (true) { if (curNode.nextSibling) { curNode = curNode.nextSibling; break; } else if (curNode.parentNode !== node) { curNode = curNode.parentNode; } else { break out; } } } } function genReplacer(nodeName) { var makeReplacementNode; if (typeof nodeName !== 'function') { var stencilNode_1 = nodeName.nodeType ? nodeName : doc.createElement(nodeName); makeReplacementNode = function (fill, matchIndex) { var clone = stencilNode_1.cloneNode(false); clone.setAttribute('data-mce-index', matchIndex); if (fill) { clone.appendChild(doc.createTextNode(fill)); } return clone; }; } else { makeReplacementNode = nodeName; } return function (range) { var before; var after; var parentNode; var startNode = range.startNode; var endNode = range.endNode; var matchIndex = range.matchIndex; if (startNode === endNode) { var node_1 = startNode; parentNode = node_1.parentNode; if (range.startNodeIndex > 0) { before = doc.createTextNode(node_1.data.substring(0, range.startNodeIndex)); parentNode.insertBefore(before, node_1); } var el = makeReplacementNode(range.match[0], matchIndex); parentNode.insertBefore(el, node_1); if (range.endNodeIndex < node_1.length) { after = doc.createTextNode(node_1.data.substring(range.endNodeIndex)); parentNode.insertBefore(after, node_1); } node_1.parentNode.removeChild(node_1); return el; } before = doc.createTextNode(startNode.data.substring(0, range.startNodeIndex)); after = doc.createTextNode(endNode.data.substring(range.endNodeIndex)); var elA = makeReplacementNode(startNode.data.substring(range.startNodeIndex), matchIndex); for (var i = 0, l = range.innerNodes.length; i < l; ++i) { var innerNode = range.innerNodes[i]; var innerEl = makeReplacementNode(innerNode.data, matchIndex); innerNode.parentNode.replaceChild(innerEl, innerNode); } var elB = makeReplacementNode(endNode.data.substring(0, range.endNodeIndex), matchIndex); parentNode = startNode.parentNode; parentNode.insertBefore(before, startNode); parentNode.insertBefore(elA, startNode); parentNode.removeChild(startNode); parentNode = endNode.parentNode; parentNode.insertBefore(elB, endNode); parentNode.insertBefore(after, endNode); parentNode.removeChild(endNode); return elB; }; } text = getText(node); if (!text) { return; } if (regex.global) { while (m = regex.exec(text)) { matches.push(getMatchIndexes(m, captureGroup)); } } else { m = text.match(regex); matches.push(getMatchIndexes(m, captureGroup)); } if (matches.length) { count = matches.length; stepThroughMatches(node, matches, genReplacer(replacementNode)); } return count; } var FindReplaceText = { findAndReplaceDOMText: findAndReplaceDOMText }; var getElmIndex = function (elm) { var value = elm.getAttribute('data-mce-index'); if (typeof value === 'number') { return '' + value; } return value; }; var markAllMatches = function (editor, currentIndexState, regex) { var node, marker; marker = editor.dom.create('span', { 'data-mce-bogus': 1 }); marker.className = 'mce-match-marker'; node = editor.getBody(); done(editor, currentIndexState, false); return FindReplaceText.findAndReplaceDOMText(regex, node, marker, false, editor.schema); }; var unwrap = function (node) { var parentNode = node.parentNode; if (node.firstChild) { parentNode.insertBefore(node.firstChild, node); } node.parentNode.removeChild(node); }; var findSpansByIndex = function (editor, index) { var nodes; var spans = []; nodes = global$1.toArray(editor.getBody().getElementsByTagName('span')); if (nodes.length) { for (var i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); if (nodeIndex === null || !nodeIndex.length) { continue; } if (nodeIndex === index.toString()) { spans.push(nodes[i]); } } } return spans; }; var moveSelection = function (editor, currentIndexState, forward) { var testIndex = currentIndexState.get(); var dom = editor.dom; forward = forward !== false; if (forward) { testIndex++; } else { testIndex--; } dom.removeClass(findSpansByIndex(editor, currentIndexState.get()), 'mce-match-marker-selected'); var spans = findSpansByIndex(editor, testIndex); if (spans.length) { dom.addClass(findSpansByIndex(editor, testIndex), 'mce-match-marker-selected'); editor.selection.scrollIntoView(spans[0]); return testIndex; } return -1; }; var removeNode = function (dom, node) { var parent = node.parentNode; dom.remove(node); if (dom.isEmpty(parent)) { dom.remove(parent); } }; var find = function (editor, currentIndexState, text, matchCase, wholeWord) { text = text.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); text = text.replace(/\s/g, '[^\\S\\r\\n]'); text = wholeWord ? '\\b' + text + '\\b' : text; var count = markAllMatches(editor, currentIndexState, new RegExp(text, matchCase ? 'g' : 'gi')); if (count) { currentIndexState.set(-1); currentIndexState.set(moveSelection(editor, currentIndexState, true)); } return count; }; var next = function (editor, currentIndexState) { var index = moveSelection(editor, currentIndexState, true); if (index !== -1) { currentIndexState.set(index); } }; var prev = function (editor, currentIndexState) { var index = moveSelection(editor, currentIndexState, false); if (index !== -1) { currentIndexState.set(index); } }; var isMatchSpan = function (node) { var matchIndex = getElmIndex(node); return matchIndex !== null && matchIndex.length > 0; }; var replace = function (editor, currentIndexState, text, forward, all) { var i, nodes, node, matchIndex, currentMatchIndex, nextIndex = currentIndexState.get(), hasMore; forward = forward !== false; node = editor.getBody(); nodes = global$1.grep(global$1.toArray(node.getElementsByTagName('span')), isMatchSpan); for (i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); matchIndex = currentMatchIndex = parseInt(nodeIndex, 10); if (all || matchIndex === currentIndexState.get()) { if (text.length) { nodes[i].firstChild.nodeValue = text; unwrap(nodes[i]); } else { removeNode(editor.dom, nodes[i]); } while (nodes[++i]) { matchIndex = parseInt(getElmIndex(nodes[i]), 10); if (matchIndex === currentMatchIndex) { removeNode(editor.dom, nodes[i]); } else { i--; break; } } if (forward) { nextIndex--; } } else if (currentMatchIndex > currentIndexState.get()) { nodes[i].setAttribute('data-mce-index', currentMatchIndex - 1); } } currentIndexState.set(nextIndex); if (forward) { hasMore = hasNext(editor, currentIndexState); next(editor, currentIndexState); } else { hasMore = hasPrev(editor, currentIndexState); prev(editor, currentIndexState); } return !all && hasMore; }; var done = function (editor, currentIndexState, keepEditorSelection) { var i, nodes, startContainer, endContainer; nodes = global$1.toArray(editor.getBody().getElementsByTagName('span')); for (i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); if (nodeIndex !== null && nodeIndex.length) { if (nodeIndex === currentIndexState.get().toString()) { if (!startContainer) { startContainer = nodes[i].firstChild; } endContainer = nodes[i].firstChild; } unwrap(nodes[i]); } } if (startContainer && endContainer) { var rng = editor.dom.createRng(); rng.setStart(startContainer, 0); rng.setEnd(endContainer, endContainer.data.length); if (keepEditorSelection !== false) { editor.selection.setRng(rng); } return rng; } }; var hasNext = function (editor, currentIndexState) { return findSpansByIndex(editor, currentIndexState.get() + 1).length > 0; }; var hasPrev = function (editor, currentIndexState) { return findSpansByIndex(editor, currentIndexState.get() - 1).length > 0; }; var Actions = { done: done, find: find, next: next, prev: prev, replace: replace, hasNext: hasNext, hasPrev: hasPrev }; var get = function (editor, currentIndexState) { var done = function (keepEditorSelection) { return Actions.done(editor, currentIndexState, keepEditorSelection); }; var find = function (text, matchCase, wholeWord) { return Actions.find(editor, currentIndexState, text, matchCase, wholeWord); }; var next = function () { return Actions.next(editor, currentIndexState); }; var prev = function () { return Actions.prev(editor, currentIndexState); }; var replace = function (text, forward, all) { return Actions.replace(editor, currentIndexState, text, forward, all); }; return { done: done, find: find, next: next, prev: prev, replace: replace }; }; var Api = { get: get }; var open = function (editor, currentIndexState) { var last = {}, selectedText; editor.undoManager.add(); selectedText = global$1.trim(editor.selection.getContent({ format: 'text' })); function updateButtonStates() { win.statusbar.find('#next').disabled(Actions.hasNext(editor, currentIndexState) === false); win.statusbar.find('#prev').disabled(Actions.hasPrev(editor, currentIndexState) === false); } function notFoundAlert() { editor.windowManager.alert('Could not find the specified string.', function () { win.find('#find')[0].focus(); }); } var win = editor.windowManager.open({ layout: 'flex', pack: 'center', align: 'center', onClose: function () { editor.focus(); Actions.done(editor, currentIndexState); editor.undoManager.add(); }, onSubmit: function (e) { var count, caseState, text, wholeWord; e.preventDefault(); caseState = win.find('#case').checked(); wholeWord = win.find('#words').checked(); text = win.find('#find').value(); if (!text.length) { Actions.done(editor, currentIndexState, false); win.statusbar.items().slice(1).disabled(true); return; } if (last.text === text && last.caseState === caseState && last.wholeWord === wholeWord) { if (!Actions.hasNext(editor, currentIndexState)) { notFoundAlert(); return; } Actions.next(editor, currentIndexState); updateButtonStates(); return; } count = Actions.find(editor, currentIndexState, text, caseState, wholeWord); if (!count) { notFoundAlert(); } win.statusbar.items().slice(1).disabled(count === 0); updateButtonStates(); last = { text: text, caseState: caseState, wholeWord: wholeWord }; }, buttons: [ { text: 'Find', subtype: 'primary', onclick: function () { win.submit(); } }, { text: 'Replace', disabled: true, onclick: function () { if (!Actions.replace(editor, currentIndexState, win.find('#replace').value())) { win.statusbar.items().slice(1).disabled(true); currentIndexState.set(-1); last = {}; } } }, { text: 'Replace all', disabled: true, onclick: function () { Actions.replace(editor, currentIndexState, win.find('#replace').value(), true, true); win.statusbar.items().slice(1).disabled(true); last = {}; } }, { type: 'spacer', flex: 1 }, { text: 'Prev', name: 'prev', disabled: true, onclick: function () { Actions.prev(editor, currentIndexState); updateButtonStates(); } }, { text: 'Next', name: 'next', disabled: true, onclick: function () { Actions.next(editor, currentIndexState); updateButtonStates(); } } ], title: 'Find and replace', items: { type: 'form', padding: 20, labelGap: 30, spacing: 10, items: [ { type: 'textbox', name: 'find', size: 40, label: 'Find', value: selectedText }, { type: 'textbox', name: 'replace', size: 40, label: 'Replace with' }, { type: 'checkbox', name: 'case', text: 'Match case', label: ' ' }, { type: 'checkbox', name: 'words', text: 'Whole words', label: ' ' } ] } }); }; var Dialog = { open: open }; var register = function (editor, currentIndexState) { editor.addCommand('SearchReplace', function () { Dialog.open(editor, currentIndexState); }); }; var Commands = { register: register }; var showDialog = function (editor, currentIndexState) { return function () { Dialog.open(editor, currentIndexState); }; }; var register$1 = function (editor, currentIndexState) { editor.addMenuItem('searchreplace', { text: 'Find and replace', shortcut: 'Meta+F', onclick: showDialog(editor, currentIndexState), separator: 'before', context: 'edit' }); editor.addButton('searchreplace', { tooltip: 'Find and replace', onclick: showDialog(editor, currentIndexState) }); editor.shortcuts.add('Meta+F', '', showDialog(editor, currentIndexState)); }; var Buttons = { register: register$1 }; global.add('searchreplace', function (editor) { var currentIndexState = Cell(-1); Commands.register(editor, currentIndexState); Buttons.register(editor, currentIndexState); return Api.get(editor, currentIndexState); }); function Plugin () { } return Plugin; }()); })();