Subversion Repositories Applications.dictionnaire

Rev

Rev 17 | Rev 20 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 17 Rev 19
1
/*
1
/*
2
  Surligneur de mot (glossaire)
2
  Surligneur de mot (glossaire)
3
 
3
 
4
  0) tout d'abord la liste des mots est récupée (getMotsADefinitions) et stockée dans motsAyantDefinition
4
  0) tout d'abord la liste des mots est récupée (getMotsADefinitions) et stockée dans motsAyantDefinition
5
 
5
 
6
  1) chaque mot de la liste subie une transformation progressive en pattern:
6
  1) chaque mot de la liste subie une transformation progressive en pattern:
7
  * les mots de moins de 3 caractères sont inchangés (exemple: "nu")
7
  * les mots de moins de 3 caractères sont inchangés (exemple: "nu")
8
  * les mots finissant en "eux/euse" sont généricisés
8
  * les mots finissant en "eux/euse" sont généricisés
9
  * les autres mots se voit ajoutée la possibilité de matcher sur \\w{0,2}
9
  * les autres mots se voit ajoutée la possibilité de matcher sur \\w{0,2}
10
 
10
 
11
  2) puis plusieurs RegExp sont baties à partir de la liste de pattern préliminaires
11
  2) puis plusieurs RegExp sont baties à partir de la liste de pattern préliminaires
12
  * regexp_complete permet d'assurer que le mot:
12
  * regexp_complete permet d'assurer que le mot:
13
  ** commence en début de ligne
13
  ** commence en début de ligne
14
  ** suit un espace
14
  ** suit un espace
15
  ** ne suit pas un caractère
15
  ** ne suit pas un caractère
16
  [ mais ne s'assure pas que le mot ne suit PAS un caractère accentué, cf notes à propos de \\b et l'UTF-8 ]
16
  [ mais ne s'assure pas que le mot ne suit PAS un caractère accentué, cf notes à propos de \\b et l'UTF-8 ]
17
 
17
 
18
  * regexp_thin permet de s'assurer que le mot:
18
  * regexp_thin permet de s'assurer que le mot:
19
  ** ne se trouve pas déjà encapsulé dans un <span rel="" class="definition_term">X</span>
19
  ** ne se trouve pas déjà encapsulé dans un <span rel="" class="definition_term">X</span>
20
  ** ne se trouve pas comme attribut "rel" d'un <span rel="X" class="definition_term"></span>
20
  ** ne se trouve pas comme attribut "rel" d'un <span rel="X" class="definition_term"></span>
21
  ** n'est pas directement précédé d'un accent (parmis ceux utilisés dans la BDD, cf exclureSpan)
21
  ** n'est pas directement précédé d'un accent (parmis ceux utilisés dans la BDD, cf exclureSpan)
22
  ** n'est pas directement précédé d'un caractère alphabétique
22
  ** n'est pas directement précédé d'un caractère alphabétique
23
  Et tente d'extraire une partie de contexte significative (jusqu'à 24 caractère car initialement le
23
  Et tente d'extraire une partie de contexte significative (jusqu'à 24 caractère car initialement le
24
  test d'inclusion dans .definition_term était faire plus tardivement.
24
  test d'inclusion dans .definition_term était faire plus tardivement.
25
 
25
 
26
  3) remplacerDefinitions() prend la liste des nodes susceptibles de nécessiter un traitement
26
  3) remplacerDefinitions() prend la liste des nodes susceptibles de nécessiter un traitement
27
  et ignore ceux ayant déjà été traités [max_passages] fois (4 par défaut)
27
  et ignore ceux ayant déjà été traités [max_passages] fois (4 par défaut)
28
 
28
 
29
  4) pour chaque node:
29
  4) pour chaque node:
30
  * le compteur de passage est incrémenté
30
  * le compteur de passage est incrémenté
31
  * necessiteSubstitution() est appellé
31
  * necessiteSubstitution() est appellé
32
 
32
 
33
  == necessiteSubstitution() ==:
33
  == necessiteSubstitution() ==:
34
  ** Utilise regexp_thin pour extraire les mots restant à définir ainsi qu'une partie de leur contexte.
34
  ** Utilise regexp_thin pour extraire les mots restant à définir ainsi qu'une partie de leur contexte.
35
  ** Utilise regexp_complete pour extraire les mots au plus proche de leur bodures avec un moindre risque d'erreur
35
  ** Utilise regexp_complete pour extraire les mots au plus proche de leur bodures avec un moindre risque d'erreur
36
  ** exlue les faux positifs possibles de regexp_thin
36
  ** exlue les faux positifs possibles de regexp_thin
37
  ** renvoi les matches de regexp_thin (qui présente plus de contexte)
37
  ** renvoi les matches de regexp_thin (qui présente plus de contexte)
38
  =============================
38
  =============================
39
 
39
 
40
  * pour chaque correspondance retournée par necessiteSubstitution(),
40
  * pour chaque correspondance retournée par necessiteSubstitution(),
41
  le mot d'origine (tel que dans motsAyantDefinition)
41
  le mot d'origine (tel que dans motsAyantDefinition)
42
  est déterminé en utilisant le levenstein (un cache est mis en place, cf texte_to_mot() dans helpers.js).
42
  est déterminé en utilisant le levenstein (un cache est mis en place, cf texte_to_mot() dans helpers.js).
43
 
43
 
44
  * rechercherEtRemplacerMotParDefinition() est appelée pour effectuer la substitution dans le node
44
  * rechercherEtRemplacerMotParDefinition() est appelée pour effectuer la substitution dans le node
45
 
45
 
46
 
46
 
47
  Contraintes rencontrées:
47
  Contraintes rencontrées:
48
  1) exclure les mots déjà défini via la regexp général plutôt qu'au coup par coup.
48
  1) exclure les mots déjà défini via la regexp général plutôt qu'au coup par coup.
49
  2) vérifier les bordures
49
  2) vérifier les bordures
50
  3) vérifier bordure d'accents:
50
  3) vérifier bordure d'accents:
51
  \\b(é) dans une regexp ne peut matcher une chaîne JS UTF-8
51
  \\b(é) dans une regexp ne peut matcher une chaîne JS UTF-8
52
  http://stackoverflow.com/questions/2881445/utf-8-word-boundary-regex-in-javascript
52
  http://stackoverflow.com/questions/2881445/utf-8-word-boundary-regex-in-javascript
53
*/
53
*/
54
 
54
 
55
var dictionnaire = new Array();
55
var dictionnaire = new Array();
56
var motsAyantDefinition = null;
56
var motsAyantDefinition = null;
57
var mouseX = null;
57
var mouseX = null;
58
var mouseY = null;
58
var mouseY = null;
59
var active = false;
59
var active = false;
60
var set = '#zone-droite p, #zone-droite span:not(.definition_term), #zone-droite td, #zone-droite pre, #zone-droite div, #zone-droite li';
60
var set = '#zone-droite p, #zone-droite span:not(.definition_term), #zone-droite td, #zone-droite pre, #zone-droite div, #zone-droite li';
61
var urlPage = window.location.href;
61
var urlPage = window.location.href;
62
 
62
 
63
// Note: utiliser \\b plutôt que \\W pour matcher les bordures de mots
63
// Note: utiliser \\b plutôt que \\W pour matcher les bordures de mots
64
// en incluant début et fin de ligne
64
// en incluant début et fin de ligne
65
var regexp_complete = null;
65
var regexp_complete = null;
66
var regexp_thin = null;
66
var regexp_thin = null;
67
 
67
 
68
// nombre maximum de passages de la détection sur un node donné
68
// nombre maximum de passages de la détection sur un node donné
69
var max_passages = 4;
69
var max_passages = 4;
70
 
70
 
71
// echo $(mysql<<<"SELECT cle FROM definitions"|tr "[a-z,-]" o|sed -e 's/o//g' -e "s/\(.\)/\1\n/g"|sort -u)
71
// echo $(mysql<<<"SELECT cle FROM definitions"|tr "[a-z,-]" o|sed -e 's/o//g' -e "s/\(.\)/\1\n/g"|sort -u)
72
// ç é è ê î ï ô (2013/07/03)
72
// ç é è ê î ï ô (2013/07/03)
73
// TODO: http://xregexp.com/plugins/
73
// TODO: http://xregexp.com/plugins/
74
var	exclureSpan = '([^' +
74
var	exclureSpan = '([^' +
75
	'(?:class="definition_term">)' + // mot contextualisé déjà dictionnarisé
75
	'(?:class="definition_term">)' + // mot contextualisé déjà dictionnarisé
76
	'(?:rel=")' + // la valeur du rel="" d'un mot déjà dictionnarisé
76
	'(?:rel=")' + // la valeur du rel="" d'un mot déjà dictionnarisé
77
	'çéèêîïô' + // les accents, non-traités dans la regexp générale et qui ne doivent pas
77
	'çéèêîïô' + // les accents, non-traités dans la regexp générale et qui ne doivent pas
78
	// être pris pour des bordures de mots
78
	// être pris pour des bordures de mots
79
	'\\w' +
79
	'\\w' +
80
	']|^){1,24}';
80
	']|^){1,24}';
-
 
81
 
-
 
82
// sert à filtrer plus rapidement les nodes inutiles pour l'application
-
 
83
// du dictionnaire
81
 
84
var exclureBlancs = new RegExp('^\\s*$');
82
 
85
 
83
function afficherLienDefinitions() {
86
function afficherLienDefinitions() {
84
	html = '<div id="conteneur_activation_definition"><a href="#">rechercher les définitions</a></div>';
87
	html = '<div id="conteneur_activation_definition"><a href="#">rechercher les définitions</a></div>';
85
	$('#conteneur_activation_definition').live('click', function(event) {
88
	$('#conteneur_activation_definition').live('click', function(event) {
86
		event.preventDefault();
89
		event.preventDefault();
87
		//supprimerToutesDefinitions();
90
		//supprimerToutesDefinitions();
88
		if(motsAyantDefinition == null) {
91
		if(motsAyantDefinition == null) {
89
			getMotsADefinitions();
92
			getMotsADefinitions();
90
			ajouterListenerDefinitions();
93
			ajouterListenerDefinitions();
91
		} else {
94
		} else {
92
			$(set).remplacerDefinitions(motsAyantDefinition);
95
			$(set).remplacerDefinitions(motsAyantDefinition);
93
		}
96
		}
94
	});
97
	});
95
	$('body').append(html);
98
	$('body').append(html);
96
}
99
}
97
 
100
 
98
$.fn.remplacerDefinitions = function(mots) {
101
$.fn.remplacerDefinitions = function(mots) {
99
    this.each(function() {
102
    this.each(function() {
100
        $(this).contents().filter(function() {
103
        $(this).contents().filter(function() {
101
        	return (this.nodeType == 3 && ! (($(this).data("count") || 0) > max_passages));
104
        	return (this.nodeType == 3 && ! (($(this).data("count") || 0) > max_passages));
102
        }).each(function() {
105
        }).each(function() {
-
 
106
			// évite les nodes dont le texte est undefined (dumb example <script>)
-
 
107
			if(!$(this).text()) return true;
-
 
108
			// évite les nodes dont le texte est vide ou blanc
-
 
109
			if(exclureBlancs.test(texte)) return true;
-
 
110
 
-
 
111
			// incrémente le compteur de passage
-
 
112
			/* TODO: cette ligne cause un problème à IE-8
-
 
113
			   (peut-être uniquement relié au onChange() en cas de passage sur
-
 
114
			   des composants ajoutés postérieurement au chargement initial de la
-
 
115
			   page via AJAX. à tester. */
103
			$(this).data("count", ($(this).data("count") || 0) + 1);
116
			$(this).data("count", ($(this).data("count") || 0) + 1);
-
 
117
 
104
			ttexte = texte = $(this).text();
118
			ttexte = texte = $(this).text();
105
			matches_list = necessiteSubstitution(texte)[0];
119
			matches_list = necessiteSubstitution(texte)[0];
106
			if(!matches_list) return true; // TODO: data("count") = max_passages ?
120
			if(!matches_list) return true; // TODO: data("count") = max_passages ?
107
 
121
 
108
			for(i in matches_list) {
122
			for(i in matches_list) {
109
				couple = matches_list[i];
123
				couple = matches_list[i];
110
				mot_contextualise = couple[2];
124
				mot_contextualise = couple[2];
111
				cle = texte_to_mot(mot_contextualise);
125
				cle = texte_to_mot(mot_contextualise);
112
 
126
 
113
				if(! (ttexte = rechercherEtRemplacerMotParDefinition(texte, cle, couple))) break;
127
				if(! (ttexte = rechercherEtRemplacerMotParDefinition(texte, cle, couple))) break;
114
				texte = ttexte;
128
				texte = ttexte;
115
			}
129
			}
116
			$(this).replaceWith(texte);
130
			$(this).replaceWith(texte);
117
		});
131
		});
118
	});
132
	});
119
	return this;
133
	return this;
120
}
134
}
121
 
135
 
122
function rechercherEtRemplacerMotParDefinition(texte, mot, couple) {
136
function rechercherEtRemplacerMotParDefinition(texte, mot, couple) {
123
	var full_contexte = couple[0],
137
	var full_contexte = couple[0],
124
	prefix_solo = couple[1],
138
	prefix_solo = couple[1],
125
	mot_contextualise = couple[2];
139
	mot_contextualise = couple[2];
126
 
140
 
127
	// cf exclureSpan
141
	// cf exclureSpan
128
	if(new RegExp('((?:class="definition_term">)|(?:rel=")|(?:[çéèêîïô]))(' + mot + "\\w{0,2}" + ')' + "\\b", "ig").test(full_contexte)) return;
142
	if(new RegExp('((?:class="definition_term">)|(?:rel=")|(?:[çéèêîïô]))(' + mot + "\\w{0,2}" + ')' + "\\b", "ig").test(full_contexte)) return;
129
 
143
 
130
	templateMotADefinition = formaterTemplateMotADefinition(mot_contextualise, mot);
144
	templateMotADefinition = formaterTemplateMotADefinition(mot_contextualise, mot);
131
	bloc_replace = full_contexte.replace(mot_contextualise, templateMotADefinition);
145
	bloc_replace = full_contexte.replace(mot_contextualise, templateMotADefinition);
132
	return texte.replace(full_contexte, bloc_replace);
146
	return texte.replace(full_contexte, bloc_replace);
133
}
147
}
134
 
148
 
135
 
149
 
136
function necessiteSubstitution(texte) {
150
function necessiteSubstitution(texte) {
137
	var liste = [], liste_complete = [];
151
	var liste = [], liste_complete = [];
138
 
152
 
139
	// regexp d'extraction du contexte, sans limite aux bords de "mot",
153
	// regexp d'extraction du contexte, sans limite aux bords de "mot",
140
	// peu amener des faux positifs, et notamment ne pas matcher au mieux.
154
	// peu amener des faux positifs, et notamment ne pas matcher au mieux.
141
	// Eg: subsessiles match "sessile" et non "subsessile".
155
	// Eg: subsessiles match "sessile" et non "subsessile".
142
	while( (matches_c = regexp_thin.exec(texte)) ) liste.push(matches_c);
156
	while( (matches_c = regexp_thin.exec(texte)) ) liste.push(matches_c);
143
	if(liste.length == 0) return [null];
157
	if(liste.length == 0) return [null];
144
 
158
 
145
	// regexp de validation des bordure de mots, ne conserve que des matches correct
159
	// regexp de validation des bordure de mots, ne conserve que des matches correct
146
	// vis-à-vis de la bordure gauche
160
	// vis-à-vis de la bordure gauche
147
	while( (matches_c = regexp_complete.exec(texte)) ) liste_complete.push(matches_c[1]);
161
	while( (matches_c = regexp_complete.exec(texte)) ) liste_complete.push(matches_c[1]);
148
 
162
 
149
	// si une match n'est pas dans le tableau des mots autorisés (indexOf)
163
	// si une match n'est pas dans le tableau des mots autorisés (indexOf)
150
	for(var i = 0; i < liste.length; i++) {
164
	for(var i = 0; i < liste.length; i++) {
151
		if($.inArray(liste[i][2], liste_complete) == -1) liste.splice(i, 1);
165
		if($.inArray(liste[i][2], liste_complete) == -1) liste.splice(i, 1);
152
	}
166
	}
153
 
167
 
154
	return [liste, liste_complete]
168
	return [liste, liste_complete]
155
}
169
}
156
 
170
 
157
function getMotsADefinitions() {
171
function getMotsADefinitions() {
158
	$.ajax({
172
	$.ajax({
159
		url: URL_BASE_SERVICE+'mots/', // provient de dictionnaire.config.js
173
		url: URL_BASE_SERVICE+'mots/', // provient de dictionnaire.config.js
160
		success: function(data) {
174
		success: function(data) {
161
			motsAyantDefinition = data;
175
			motsAyantDefinition = data;
162
			batirRegexp(motsAyantDefinition);
176
			batirRegexp(motsAyantDefinition);
163
			$(set).remplacerDefinitions(motsAyantDefinition);
177
			$(set).remplacerDefinitions(motsAyantDefinition);
164
		},
178
		},
165
		dataType: "JSON",
179
		dataType: "JSON",
166
		global: false
180
		global: false
167
	});
181
	});
168
}
182
}
169
 
183
 
170
function getMotsADefinitionsEtRemplacer() {
184
function getMotsADefinitionsEtRemplacer() {
171
	if(motsAyantDefinition == null) {
185
	if(motsAyantDefinition == null) {
172
		getMotsADefinitions();
186
		getMotsADefinitions();
173
	} else {
187
	} else {
174
		if(regexp_complete == null || regexp_thin == null) {
188
		if(regexp_complete == null || regexp_thin == null) {
175
			batirRegexp(motsAyantDefinition);
189
			batirRegexp(motsAyantDefinition);
176
		}
190
		}
177
		$(set).remplacerDefinitions(motsAyantDefinition);
191
		$(set).remplacerDefinitions(motsAyantDefinition);
178
	}
192
	}
179
}
193
}
180
 
194
 
181
// update definitions set cle = trim(cle);
195
// update definitions set cle = trim(cle);
182
// select cle from definitions where cle like '%é' COLLATE 'utf8_bin';
196
// select cle from definitions where cle like '%é' COLLATE 'utf8_bin';
183
// select cle from definitions where cle like '% ou %' COLLATE 'utf8_bin';
197
// select cle from definitions where cle like '% ou %' COLLATE 'utf8_bin';
184
function batirRegexp(mots) {
198
function batirRegexp(mots) {
185
	var restr = '';
199
	var restr = '';
186
	$.each(mots, function(index, mot) {
200
	$.each(mots, function(index, mot) {
187
		if(restr != '') restr += '|';
201
		if(restr != '') restr += '|';
188
 
202
 
189
		if(mot == 'ph') {
203
		if(mot == 'ph') {
190
			restr += 'ph[^.]';
204
			restr += 'ph[^.]';
191
		}
205
		}
192
		else if(mot.length < 3) {
206
		else if(mot.length < 3) {
193
			restr += mot;
207
			restr += mot;
194
		}
208
		}
195
		// confluent => confluentes
209
		// confluent => confluentes
196
		else if(mot.substr(-2) == 'ts') {
210
		else if(mot.substr(-2) == 'ts') {
197
			restr += mot.slice(0, -1) + "e?s?";
211
			restr += mot.slice(0, -1) + "e?s?";
198
		}
212
		}
199
		else if(mot.substr(-3) == 'ore') {
213
		else if(mot.substr(-3) == 'ore') {
200
			restr += mot + "s?";
214
			restr += mot + "s?";
201
		}
215
		}
202
		// gestion masculin/féminin en "eux/euse"
216
		// gestion masculin/féminin en "eux/euse"
203
		else if(mot.substr(-1) == 'x') {
217
		else if(mot.substr(-1) == 'x') {
204
			restr += mot.slice(0, -1) + "(?:x|se|ses)";
218
			restr += mot.slice(0, -1) + "(?:x|se|ses)";
205
		}
219
		}
206
		else if(mot.substr(-4) == 'euse') { // TODO: fix DB
220
		else if(mot.substr(-4) == 'euse') { // TODO: fix DB
207
			restr += mot.slice(0, -2) + "(?:x|se|ses)";
221
			restr += mot.slice(0, -2) + "(?:x|se|ses)";
208
		}
222
		}
209
		else if(mot.substr(-2) == 'ée') {
223
		else if(mot.substr(-2) == 'ée') {
210
			restr += mot.slice(0, -1) + "e?s?";
224
			restr += mot.slice(0, -1) + "e?s?";
211
		}
225
		}
212
		else if(mot.substr(-1) == 'é') {
226
		else if(mot.substr(-1) == 'é') {
213
			restr += mot + "e?s?";
227
			restr += mot + "e?s?";
214
		}
228
		}
215
		// verbe vs nom
229
		// verbe vs nom
216
		else if(mot.substr(-4) == 'orme') {
230
		else if(mot.substr(-4) == 'orme') {
217
			restr += mot + "s?";
231
			restr += mot + "s?";
218
		}
232
		}
219
		// verbe 3è p.pluriel en DB: ne devraient pas exister
233
		// verbe 3è p.pluriel en DB: ne devraient pas exister
220
		// mais rampant => rampante
234
		// mais rampant => rampante
221
		else if(mot.substr(-2) == 'nt') {
235
		else if(mot.substr(-2) == 'nt') {
222
			restr += mot + "e?s?";
236
			restr += mot + "e?s?";
223
		}
237
		}
224
		else {
238
		else {
225
			// moins de faux positifs:
239
			// moins de faux positifs:
226
			// restr += mot + "(?:[ées]){0,2}";
240
			// restr += mot + "(?:[ées]){0,2}";
227
			// autrement:
241
			// autrement:
228
			restr += mot + "\\w{0,2}";
242
			restr += mot + "\\w{0,2}";
229
		}
243
		}
230
	});
244
	});
231
 
245
 
232
	regexp_complete = new RegExp("(?:\\s|^|\\W)(" + restr + ")\\b", "ig"); // accents
246
	regexp_complete = new RegExp("(?:\\s|^|\\W)(" + restr + ")\\b", "ig"); // accents
233
	regexp_thin = new RegExp(exclureSpan + "(" + restr + ")\\b", "ig");
247
	regexp_thin = new RegExp(exclureSpan + "(" + restr + ")\\b", "ig");
234
}
248
}
235
 
249
 
236
function formaterTemplateMotADefinition(motOriginal, motSimplifie) {
250
function formaterTemplateMotADefinition(motOriginal, motSimplifie) {
237
	definitionHtml = '<span rel="'+motSimplifie+'" class="definition_term">'
251
	definitionHtml = '<span rel="'+motSimplifie+'" class="definition_term">'
238
		+motOriginal+
252
		+motOriginal+
239
		'</span>';
253
		'</span>';
240
	return definitionHtml;
254
	return definitionHtml;
241
}
255
}
242
 
256
 
243
function ajouterListenerDefinitions() {
257
function ajouterListenerDefinitions() {
244
	$('.definition_term').live('mouseover mouseout', function(event) {
258
	$('.definition_term').live('mouseover mouseout', function(event) {
245
		if (event.type == 'mouseover') {
259
		if (event.type == 'mouseover') {
246
			event.preventDefault();
260
			event.preventDefault();
247
			afficherDefinition($(this));
261
			afficherDefinition($(this));
248
		} else {
262
		} else {
249
			cacherPopupsDefinitions();
263
			cacherPopupsDefinitions();
250
		}
264
		}
251
	});
265
	});
252
}
266
}
253
 
267
 
254
function afficherDefinition(element) {
268
function afficherDefinition(element) {
255
	mot = element.attr('rel');
269
	mot = element.attr('rel');
256
	if(dictionnaire[mot] != null) {
270
	if(dictionnaire[mot] != null) {
257
		element.after(formaterDefinition(element));
271
		element.after(formaterDefinition(element));
258
		afficherPopupDefinition();
272
		afficherPopupDefinition();
259
	} else {
273
	} else {
260
		chargerDefinitionDistante(element);
274
		chargerDefinitionDistante(element);
261
	}
275
	}
262
}
276
}
263
 
277
 
264
function chargerDefinitionDistante(element) {
278
function chargerDefinitionDistante(element) {
265
	date = new Date();
279
	date = new Date();
266
	mot = element.attr('rel');
280
	mot = element.attr('rel');
267
	$.ajax({
281
	$.ajax({
268
		url: URL_BASE_SERVICE+'def/'+mot, // provient de dictionnaire.config.js
282
		url: URL_BASE_SERVICE+'def/'+mot, // provient de dictionnaire.config.js
269
		success: function(data) {
283
		success: function(data) {
270
			retour = data;
284
			retour = data;
271
			definition = retour.valeur;
285
			definition = retour.valeur;
272
			dictionnaire[mot] = definition;
286
			dictionnaire[mot] = definition;
273
			element.after(formaterDefinition(element));
287
			element.after(formaterDefinition(element));
274
			afficherPopupDefinition();
288
			afficherPopupDefinition();
275
		},
289
		},
276
		dataType: "JSON",
290
		dataType: "JSON",
277
		global: false,
291
		global: false,
278
		async: false
292
		async: false
279
	});
293
	});
280
}
294
}
281
 
295
 
282
function afficherPopupDefinition() {
296
function afficherPopupDefinition() {
283
	$(".definition_container").css({'top':mouseY + 20,'left':mouseX - 10}).fadeIn('slow');
297
	$(".definition_container").css({'top':mouseY + 20,'left':mouseX - 10}).fadeIn('slow');
284
}
298
}
285
 
299
 
286
function cacherPopupsDefinitions() {
300
function cacherPopupsDefinitions() {
287
	$(".definition_container").remove();
301
	$(".definition_container").remove();
288
}
302
}
289
 
303
 
290
function formaterDefinition(element) {	
304
function formaterDefinition(element) {	
291
	mot = element.attr('rel');
305
	mot = element.attr('rel');
292
	data = dictionnaire[mot];
306
	data = dictionnaire[mot];
293
	defHtml = '<div class="definition_container">'+
307
	defHtml = '<div class="definition_container">'+
294
		'<span class="definition_container_fleche"></span>'+
308
		'<span class="definition_container_fleche"></span>'+
295
		'<span class="definition">'+data+'</span>'+
309
		'<span class="definition">'+data+'</span>'+
296
		'</div>';
310
		'</div>';
297
	return defHtml;
311
	return defHtml;
298
}
312
}
299
 
313
 
300
function supprimerToutesDefinitions() {
314
function supprimerToutesDefinitions() {
301
	$('.definition_term').each(function() {
315
	$('.definition_term').each(function() {
302
		$(this).replaceWith($(this).html());
316
		$(this).replaceWith($(this).html());
303
	});
317
	});
304
	cacherPopupsDefinitions();
318
	cacherPopupsDefinitions();
305
}
319
}
306
 
320
 
307
$(document).bind('mousemove', function(e){
321
$(document).bind('mousemove', function(e){
308
	mouseX = e.pageX;
322
	mouseX = e.pageX;
309
    mouseY = e.pageY - $(window).scrollTop();
323
    mouseY = e.pageY - $(window).scrollTop();
310
});
324
});
311
 
325
 
312
$(document).ajaxStop(function() {
326
$(document).ajaxStop(function() {
313
	urlPage = $(this)[0].URL;
327
	urlPage = $(this)[0].URL;
314
	getMotsADefinitionsEtRemplacer();
328
	getMotsADefinitionsEtRemplacer();
315
});
329
});
316
 
330
 
317
$(document).ready(function() {
331
$(document).ready(function() {
318
	$.ajax({
332
	$.ajax({
319
		url: URL_BASE_SERVICE + "../../../scripts/helpers.js",
333
		url: URL_BASE_SERVICE + "../../../scripts/helpers.js",
320
		dataType: "script",
334
		dataType: "script",
321
		global: false
335
		global: false
322
	});
336
	});
323
	getMotsADefinitionsEtRemplacer();
337
	getMotsADefinitionsEtRemplacer();
324
	ajouterListenerDefinitions();
338
	ajouterListenerDefinitions();
325
});
339
});