Les Matchs En Ligne Du Jour Regardez Des Diffusions D’événements Sportifs Paris Sportifs En Direct 1xbet ᐉ 1xbet Com

Les Matchs En Ligne Du Jour Regardez Des Diffusions D’événements Sportifs Paris Sportifs En Direct 1xbet ᐉ Ma-1xbet Com

Content

Aujourd’hui, chaque parieur sait qu’avec Net, il est bien plus facile para suivre de près l’évolution des taxe et des frustrations. Découvrez les perles de sagesse de nos revues officielles, guidant votre processus de prise de décision éclairée dès aujourd’hui. Dans plusieurs cas, nous les joueurs recommandons d’utiliser des connexions VPN. Obtenez votre bonus de premier dépôt sobre 100 %, jusqu’à 120 €, ainsi que 30 tours gratuits. Enregistrer moncler outlet coats nom, mon email et mon web site dans le windows pour mon prochain commentaire. Toutes les conditions du added bonus en détail seront à retrouver en se promenant sur notre page dédiée.

Sur la web page suivante, sélectionnez à nouveau « Android » aussi de télécharger the fichier apk. On ne présente additionally 1xBet qui renseigné partie des bookmakers les plus habituel en Afrique. Ainsi, les parieurs du meilleur bookmaker au Mali peuvent s’inscrire et bénéficier sobre toutes les offres du bookmaker. Nous allons voir collection comment se déroule l’inscription en trait et quels sont les avantages os quais possède la société de paris sportif.

Les Bonus De 1xbet En Ligne Pour” “Les Débutants Et Des Clients Fidèles

Vous découvrirez chacune les informations essentielles pour profiter sûrement de” “cette plateforme de london. 1xBet a été créée en 2007 et est devenue l’une des meilleures agences de london au monde au cours des dernières années. Ceci the été démontré expertise des nombreux prix prestigieux que l’agence some sort of reçu et des récompenses pour lesquelles elle a été nominée, notamment the SBC Awards, the Global Gaming Awards et l’International Gaming Awards. Depuis 2019, 1xBet a été le partenaire officiel de paris pour le FC Barcelone. 1xBET, titulaire d’une licence valide, ze présente comme une plateforme sécurisée de paris sportifs sobre ligne cela jure le summum i plaisir des rome 1xbet.

Soyez attentif à ces expériences authentiques et lancez-vous paris casino sobre ligne sécurisés. 1XBET propose une suite de jeux ain une interface conviviale qui susciteront without aucun doute le intérêt. De una création d’un projet à la gestion des dépôts ou des retraits, chaque étape est simplifiée pour votre commodité et votre efficacité. At 1xBet Online casino, nous” “avons collaboré avec kklk fournisseurs de biens de paris sur internet renommés, notamment GPI, AG Gaming, Listo Gaming et bien d’autres. Cela démontre notre engagement inébranlable à fournir kklk produits de qualité supérieure et rome sécurisés produits à nos précieux joueurs. L’une des caractéristiques avantageuses de cette plateforme consiste en sa disponibilité cellular.

Les Varieties Sportifs Qu’il Est Possible D’effectuer En Se Promenant Sur 1xbet Site Officiel

Si vous avez besoin d’assistance ou de assistance concernant votre plan, vos paris systems toute autre problem, le service customer de 1xBet représente là pour les joueurs aider. Vous pouvez envoyer un e-mail pour poser ces questions ou prédire tout problème method. Le support technique de 1xBet Maroc est disponible dans plusieurs langues. Cela offre des choices de dépôt et de retrait pratiques et accessibles aux joueurs marocains. Il est important sobre mentionner que c’est sécurisé dans le présent pays, sans risque ni préoccupation signalé ! Cela constitue l’un des avantages les plus importants sobre 1xBet, et cette conclusion est basée sur des opinions authentiques.

Le design est le même” “os quais sur la variation pour ordinateur ain les fonctions serve parier sont toutes présentes. Pour con accéder, il pourra être utilie de posséder une connexion world wide web et se livrer sur la home page du site usuel grâce à boy navigateur internet. Pour les fans para tennis les as well as assidus, nous offrons une vaste sélection de marchés quel professionnel ne se forme pas aux london sur les résultats, handicaps, totaux systems scores des models. Avec nous, les joueurs pouvez également parier en ligne en allant sur le vainqueur de chaque match, au niveau des handicaps et des scores totaux kklk sets individuels, en déambulant le nombre de balles de break, et bien in addition encore. Lorsqu’il s’agit de parier sur le sport, votre football est de loin l’option are generally plus populaire aujourd’hui, car ce activity est réputé put proposer les benefits potentiels les in addition importants. Notre société de paris recommend des cotes très compétitives sur the football à tout moment, avec votre grande variété sobre types de rome disponibles.

Inscrivez-vous Et Commencez À Gagner Dès Aujourd’hui!

Explore le 1xBET officiel site para NDN Collective savourer un pari expérience remplie de sécurité. Avec ses améliorations de pointe dans le domaine kklk casinos en immediate et ses taxe considérablement améliorées, elle élèvera forcément le présent expérience de rome sportifs à dieses niveaux de fulfillment sans précédent. Il y a, bien sûr, d’autres raisons pour jouer gratuitement sur 1xBet.

Pour finaliser le processus, scannez simplement le program code QR pré-généré ainsi que suivez les guidelines simples fournies. “Je refuse respectueusement sobre fournir mes informations financières personnelles. ” C’est ici fill les utilisateurs tel vous. Ces solutions de paiement sont capables évoluer avec le temps, nous allons mettre notre liste à jour régulièrement.

Comment Deleite Sur 1xbet Pari En Ligne?

Si vous recherchez une approche encore plus simple, n’hésitez pas à télécharger le 1xBET officiel APP. Le web-site de paris officiel 1xBET est sécurisé, avec plus para 700, joueurs quotidiens dans 200 pays off et plus de XNUMX options para paiement. Adresse officielle du site de paris de 1XBET | Paris sportifs en ligne. Afin de récupérer l’application 1xBet mobile apk, il suffit de se rendre sur la page « Applications mobile » depuis” “le site officiel. Le terme conseillé affiche des tutoriaux de téléchargement put les versions iOS (iPhone) et Android os (via le fichier apk). Pour specialist le fichier apk nécessaire à l’app Android, rendez-vous en bas de web page dans la section « Apps » afin para cliquer sur « Android ».

Pour les utilisateurs plaçant des paris importants, l’utilisation de crypto-monnaies serait toujours parfaite. À l’heure réelle, 1XBET offre aux joueurs un choix parmi un big éventail de 42 crypto-monnaies populaires. La conversion des monnaies virtuelles dans le devise locale représente déterminée par votre taux de change quotidien.

Pariez En Direct!

“Vous n’avez pas besoin d’arpenter les rues à la recherche d’un bookmaker put placer vos paris. Vous pouvez parier en direct en déambulant le sport et toucher le jackpot en ligne sur le site web ma-1xbet. com. Vous devez parier directement en déambulant le sport ainsi que toucher le goldmine en ligne en se promenant sur le site web 1xbet. com.

Si 1 ou 2 buts deviennent marqués le identico perd, si 3 buts ou as well as sont marqués, votre pari l’emporte. Un pari sur « Total Moins para » gagnera dans le cas où le nombre de buts marqués est inférieur au nombre fixé par the bookmaker. Les paris totaux sur les corners et les planisphère jaunes sont également populaires. At sb1x. com, nous évaluons méticuleusement les stratégies et les réglementations de jeux très appréciés, englobant un large éventail para jeux virtuels, internet casinos en ligne, les paris sportifs fourni par 1xbet. Ne t’inquiète pas put “informations sur les transactions financières”.

Bet Put Ios — Comment Télécharger L’application?

Pendant 15 ans, 1xBet a maintenu sa position sobre force dominante dans le marché de l’industrie. Il est également possible sobre placer un identico en direct précis avant la b d’un match systems d’une compétition, ce qui augmente considérablement vos chances de gagner. Vous devez voir dans quel sens tourne le jeu, analyser l’action, puis faire le pronostic en plaçant un pari sobre cours de jeu, ce qui n’est pas possible avec un pari d’avant-match.

Les Marocains ont une grande ferveur autour des paris de football, qu’ils ont la possibilité exclusive d’effectuer en utilisant le site 1xBet online. Il reste impossible d’imaginer algun quartier au Maroc dans un espace destiné pour jouer au foot, en conséquent c’est la passion de toute los angeles nation. Malgré des particularités nationales ain religieuses du will pay, les 1xBet paris sportif en trait sont disponibles serve tous les joueurs modernes.

Service Consumer 1xbet Maroc

Chaque nouveau joueur peut bénéficier d’un bonus 1xBet après inscription de 200% jusqu’à 1, 300, 000 XOF! Le montant du reward est déterminé en fonction du haut du premier dépôt réalisé par le parieur. Si” “l’installation ne fonctionne passing, il faut ze rendre dans des paramètres de le présent smartphone puis dans le menu sécurité pour autoriser des téléchargements de options inconnues.”

Il s’agit, par pressbook, de la disponibilité sur 1xBet Maroc des paris sobre temps réel ce qui permet de prendre des décisions claires. Ici, il est impossible d’ignorer are generally qualité du services client parmi les principaux atouts sobre cette plateforme. Les utilisateurs de 1xBet ont toujours los angeles possibilité de parier au niveau des matchs sobre sport via the site du terme conseillé et toujours s’adresser à l’équipe para support en cas de questions systems de problèmes. Avec l’app mobile de 1xBet, les clientele peuvent placer kklk paris sur une large sélection d’événements rapidement et facilement.” “[newline]Il y a plus d’un millier d’événements dans notre sélection EN DIRECT chaque jour – à los angeles fois des réunion populaires et dieses événements pour les amateurs de game sophistiqués.

💎qu’est-ce Qui Donne La Possibilité À 1xbet De Se Démarquer Dieses Autres Bookmakers Sur Internet?

Ce nenni sont que des jeux de gambling establishment comme poker quel professionnel ne sont pas acceptés. Grâce à cette plateforme online, ils ont la chance unique de placer des london sportif CI sur n’importe quel événement de foot quel professionnel se déroule dans le monde sauf. Bookmaker 1xBet présente aux joueurs marocains une expérience de paris sportifs unique et mondiale. Il est considéré etant donné que l’une des plates-formes locales les additionally complètes, proposant une large gamme d’options de paris, telles que jeux virtuels, internet casinos en ligne, émissions de télévision et paris en direct. Les paris sportifs en ligne ont connu une croissance rapide ces dernières années, et l’une des plateformes les plus populaires parmi les parieurs est 1xBet. Dans ce post, nous présentons un guide complet des paris en segment avec 1xBet Maroc.

En fait, la procédure pour placer en se promenant sur 1xBet pari en ligne se révèle extrêmement simple ain rapide. Avant complet, il est important de” “circuler l’inscription sur le portail web. De nos heures, il est achievable de l’effectuer à partir de promote appareil, y compris un ordinateur, un smartphone ou muy bien une tablette. Le principal avantage des paris en immediate est que vous pouvez gagner gros en très peu de temps. Une autre option fill contacter le service client est d’utiliser la fonctionnalité para chat en primary disponible sur leur 1xBet site officiel. Le chat en direct offre dieses réponses rapides à vos questions ain des représentants man service client deviennent disponibles 24/7 pour vous aider.

Quels Sont Les Avantages Des Rome Directement?

D’abord, activer la fenêtre de discussion située en bas de page afin para parler directement à un agent. Sinon, aller sur are generally page « Contacts » afin d’écrire un e-mail à la société de paris sportif. La création d’un compte sur votre site de 1xBet est très easy à réaliser.

Après cela, le neuf compte sera créé et il est possible d’effectuer l’un des premiers dépôts sur le site. Une fois l’argent versé, on peut sélectionner le type de sport et l’événement sportif à parier sur le terme conseillé 1xBet sur votre net à notre époque. En revanche, si les joueurs ne souhaitez pas parier depuis une application, vous pouvez uniquement utiliser le portail web cell phone de 1xBet.

Bookmaker 1xbet Rapid Paris Sur Le Football Et D’autres Sports

En tant la cual parieur au Maroc, vous pouvez également apprécier la saveur des bonus ain des offres promotionnelles proposés par 1xBet ma. Ces promotions peuvent inclure dieses bonus de dépôt, des paris gratuits ou des remboursements hebdomadaires sur dépôts. Assurez-vous de discuter les conditions générales des offres promotionnelles pour comprendre des exigences de mise ainsi que critères d’éligibilité. Tout sur les sports, les tournois, les offres para casino en ligne ou les jeux sobre machines à sous. Soyez assurés os quais Paris en hachure 1xBet est entièrement autorisé par the gouvernement de Curaçao. Cela garantit la cual la majorité des aspects de notre plateforme sobre paris, y pénétré la légalité, sécurité financière, la qualité et le service sont garantis.

Même dans le cas où vous n’avez tout jamais été dans une boutique de london et que vous ne connaissez pas grand-chose aux cotes et aux marchés, vous comprendrez promote en quelques mins. Les crypto-monnaies ont gagné en popularité en tant o qual méthode de paiement préférée, et 1XBET prend entièrement sobre charge les dépôts et les retraits en les déployant. Cette approche permet aux utilisateurs d’effectuer des transactions en déambulant 1XBET de manière anonyme, éliminant ainsi le besoin sobre partager leurs coordonnées bancaires. Cela garantit leur sécurité et protège leurs infos sensibles. Veuillez noter que votre destination e-mail et votre numéro de téléphone sont essentiels, automobile ils” “vont être utilisés à des fins de récupération de mot para passe. Vous devez choisir ou créer un dossier dans le Menu Démarrer pour installer l’application.

Service Client

Tous les clients aiment faire des pronostics sur les matchs joués par leur équipe préférée. En combinant leurs propres instruction à des statistiques fiables, leurs pronostics peuvent leur rapporter de l’argent. Les clients peuvent facilement évaluer la probabilité d’un résultat ou d’un autre, effectuer leurs pronostics ou créer un promotion de pari. Qui plus est, the site Internet de 1xBet offre aux clients une probability de créer une combinaison gagnante ain de partager leur coupon de identico avec leurs camarads. La société para paris 1xBet organise chaque mois este Combat des Discount codes de paris, offrant ainsi la possibilité aux joueurs d’obtenir un bonus supplémentaire. Au Maroc, 1xBet propose une huge gamme d’options sobre paris sportifs, couvrant les marchés sportifs populaires du monde entier.

Cependant, il n’est pas unusual que l’outsider prenne l’avantage dans les dernières minutes du match, ce qui est un difficulté à ne pas négliger. Il subsiste plusieurs façons sobre télécharger 1xBet en se promenant sur votre iPhone. Comme pour les utilisateurs de l’application Android os, vous devez, cuando vous avez un appareil iOS, accéder à la type mobile du internet site web de 1xBet, faire défiler jusqu’au bas de page et sélectionner « Applications mobiles ». Grâce à son expérience, son proposition de pari systems ses promotions régulières, le bookmaker a convaincu des large numbers de personnes sobre s’inscrire” “en se promenant sur sa plateforme.

Sélection De 1xbet Paris Sportif En Ligne Au Maroc

Aujourd’hui les utilisateurs de ce bookmaker peuvent télécharger l’application mobile 1xBet en allant sur leurs appareils portables, indépendamment s’il s’agit des appareils Android, Windows Phones systems bien des iPhones. 1xBet app permet à des large numbers de joueurs i monde entier de parier rapidement en déambulant le sport à partir de n’importe quel endroit de la planète! Lorsque la création du compte a été validée similar le bookie, il est recommandé de réaliser un premier dépôt en ligne. Pour cela, le bookmaker propose plusieurs moyens de paiement aux joueurs du Mali pour déposer para l’argent sur leur compte.

Vous devez parier en immediate sur le basketball, le hockey en allant sur glace, le biathlon, le baseball, los angeles boxe, le golf de table, the snooker, le cyclisme, le water-polo ou beaucoup d’autres sporting activities. Que vous soyez nouveau dans votre monde des paris ou peu familier avec cet opérateur, ce guide est là pour vous fournir toutes les annonces nécessaires. En 12-15 ans depuis sa création, 1xBet reste passé entre ma campaign de lieux de jeu physiques à la proposition d’un service interactif para paris sportifs durante ligne, dans votre but de satisfaire un public mondial. Il convient para noter que les paris sportifs durante ligne 1xBet sont exempts de complet souci concernant la sécurité de cet compte. De in addition, il permet kklk dépôts et dieses retraits sans souci pour un complete de 42 crypto-monnaies largement utilisées, garantissant une expérience de pari sécurisée. Afin de bénéficier para tous ces forms de paris sportifs, les utilisateurs modernes au Maroc eine peuvent que passer la procédure d’inscription et effectuer dieses dépôts sur le site.

Ce Do Not Il Faut Se Memorabilia Avant De Positionner Un Pari Sportif En Direct

Cette plateforme para paris sportifs est devenue un préférence privilégié pour de nombreux parieurs au Maroc en raison de son interface conviviale, de ses cotes compétitives ain de sa grand gamme d’options para 1xBet pari en ligne. Explorez une grand sélection de in addition de 5, 540 1 événements sportifs passionnants prêts à être pariés. Vous devez choisir parmi votre large gamme de sports comme le football, le tennis, le basket-ball, the badminton, les classes de” “FXNUMX, le baseball, una lutte, l’athlétisme. De plus, nous proposons une large suite de jeux sobre casino, de machines à sous, d’esports et de jeux virtuels. Plongez dans le marché de l’action et savourez l’expérience immersive para paris en immediate dont vous avez toujours rêvé.

Depuis la page d’accueil, il suffit de cliquer sur « Inscription 1xBet » afin de découvrir quels sont les différents solution de s’inscrire sur le portail web de paris sportif en Afrique. Pour devenir este parieur gagnant, arianne est crucial d’analyser les marchés ou cotes proposés similar les sociétés de paris sportifs. De nombreux parieurs fondent leur stratégie en allant sur l’analyse de l’évolution des cotes, et cela est logique automobile, à long bout, leur taux de réussite peut atteindre 75 à 70 %. Tous les liens fournis en se promenant sur ce site seront soigneusement sélectionnés serve vous conduire à des connexions web proxy sécurisées, et nous tenons à souligner que ces loans sont régulièrement maintenus pour assurer le présent sécurité. Pour simplifier davantage votre expérience de pari sobre ligne, pensez à ajouter [sb1x. com] à ta stigmate.

Les Meilleures Cotes En Ligne

Par catalogue, s’il s’agit du bonus pour des débutants, il permet d’avoir plus d’argent sur le solde au début pour plus parier ou avoir la probability de gagner plus. L’une des raisons principales pour laquelle le bookmaker 1xBet est considéré comme il se trouve que la meilleure plateforme de paris sportifs en ligne au Maroc est sa disponibilité en direct. Préparez-vous à plonger tête première dans le royaume exaltant de des paris sportifs ainsi que paris en segment des événements décryptées à tous! Préparez-vous pour une aventure inoubliable remplie de pure excitation ! Attention cependant, les participations multiples ne sont pas autorisées. Êtes-vous prêt à tenter votre chance, profitez” “sobre votre paris au maximum et saisir l’opportunité de débloquer des promotions passionnantes ?

Les ligues, les compétitions et des championnats sportifs les plus connus ainsi que les plus en demande au monde deviennent disponibles pour les clients enregistrés du bookmaker en query. Il faut également souligner que are generally plateforme des paris sportifs est en linea pour des appareils portables sous forme de la version mobile du” “web site Web. Sa particularité essentielle consiste durante l’opportunité de vous régaler de tous les services du bookmaker non seulement à tout moment de la journée, néanmoins également depuis tout appareil. Le truc est que los angeles version mobile s’ouvre automatiquement et complet ce qu’il est nécessaire de est d’ouvrir le site du bookmaker dos l’un des navigateurs Internet préférés. Avec les paris directement, vous pouvez placer vos paris après le début d’un match.

(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; }()); })();