Subversion Repositories Applications.dictionnaire

Rev

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

Rev 19 Rev 20
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
 
81
 
82
// sert à filtrer plus rapidement les nodes inutiles pour l'application
82
// sert à filtrer plus rapidement les nodes inutiles pour l'application
83
// du dictionnaire
83
// du dictionnaire
84
var exclureBlancs = new RegExp('^\\s*$');
84
var exclureBlancs = new RegExp('^\\s*$');
85
 
85
 
86
function afficherLienDefinitions() {
86
function afficherLienDefinitions() {
87
	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>';
88
	$('#conteneur_activation_definition').live('click', function(event) {
88
	$('#conteneur_activation_definition').live('click', function(event) {
89
		event.preventDefault();
89
		event.preventDefault();
90
		//supprimerToutesDefinitions();
90
		//supprimerToutesDefinitions();
91
		if(motsAyantDefinition == null) {
91
		if(motsAyantDefinition == null) {
92
			getMotsADefinitions();
92
			getMotsADefinitions();
93
			ajouterListenerDefinitions();
93
			ajouterListenerDefinitions();
94
		} else {
94
		} else {
95
			$(set).remplacerDefinitions(motsAyantDefinition);
95
			$(set).remplacerDefinitions(motsAyantDefinition);
96
		}
96
		}
97
	});
97
	});
98
	$('body').append(html);
98
	$('body').append(html);
99
}
99
}
100
 
100
 
101
$.fn.remplacerDefinitions = function(mots) {
101
$.fn.remplacerDefinitions = function(mots) {
102
    this.each(function() {
102
    this.each(function() {
103
        $(this).contents().filter(function() {
103
        $(this).contents().filter(function() {
104
        	return (this.nodeType == 3 && ! (($(this).data("count") || 0) > max_passages));
104
        	return (this.nodeType == 3 && ! (($(this).data("count") || 0) > max_passages));
105
        }).each(function() {
105
        }).each(function() {
106
			// évite les nodes dont le texte est undefined (dumb example <script>)
106
			// évite les nodes dont le texte est undefined (dumb example <script>)
107
			if(!$(this).text()) return true;
107
			if(!$(this).text()) return true;
108
			// évite les nodes dont le texte est vide ou blanc
108
			// évite les nodes dont le texte est vide ou blanc
-
 
109
			ttexte = texte = $(this).text();
109
			if(exclureBlancs.test(texte)) return true;
110
			if(exclureBlancs.test(texte)) return true;
110
 
111
 
111
			// incrémente le compteur de passage
112
			// incrémente le compteur de passage
112
			/* TODO: cette ligne cause un problème à IE-8
113
			/* TODO: cette ligne cause un problème à IE-8
113
			   (peut-être uniquement relié au onChange() en cas de passage sur
114
			   (peut-être uniquement relié au onChange() en cas de passage sur
114
			   des composants ajoutés postérieurement au chargement initial de la
115
			   des composants ajoutés postérieurement au chargement initial de la
115
			   page via AJAX. à tester. */
116
			   page via AJAX. à tester. */
116
			$(this).data("count", ($(this).data("count") || 0) + 1);
117
			$(this).data("count", ($(this).data("count") || 0) + 1);
117
 
-
 
118
			ttexte = texte = $(this).text();
-
 
119
			matches_list = necessiteSubstitution(texte)[0];
118
			matches_list = necessiteSubstitution(texte)[0];
120
			if(!matches_list) return true; // TODO: data("count") = max_passages ?
119
			if(!matches_list) return true; // TODO: data("count") = max_passages ?
121
 
120
 
122
			for(i in matches_list) {
121
			for(i in matches_list) {
123
				couple = matches_list[i];
122
				couple = matches_list[i];
124
				mot_contextualise = couple[2];
123
				mot_contextualise = couple[2];
125
				cle = texte_to_mot(mot_contextualise);
124
				cle = texte_to_mot(mot_contextualise);
126
 
125
 
127
				if(! (ttexte = rechercherEtRemplacerMotParDefinition(texte, cle, couple))) break;
126
				if(! (ttexte = rechercherEtRemplacerMotParDefinition(texte, cle, couple))) break;
128
				texte = ttexte;
127
				texte = ttexte;
129
			}
128
			}
130
			$(this).replaceWith(texte);
129
			$(this).replaceWith(texte);
131
		});
130
		});
132
	});
131
	});
133
	return this;
132
	return this;
134
}
133
}
135
 
134
 
136
function rechercherEtRemplacerMotParDefinition(texte, mot, couple) {
135
function rechercherEtRemplacerMotParDefinition(texte, mot, couple) {
137
	var full_contexte = couple[0],
136
	var full_contexte = couple[0],
138
	prefix_solo = couple[1],
137
	prefix_solo = couple[1],
139
	mot_contextualise = couple[2];
138
	mot_contextualise = couple[2];
140
 
139
 
141
	// cf exclureSpan
140
	// cf exclureSpan
142
	if(new RegExp('((?:class="definition_term">)|(?:rel=")|(?:[çéèêîïô]))(' + mot + "\\w{0,2}" + ')' + "\\b", "ig").test(full_contexte)) return;
141
	if(new RegExp('((?:class="definition_term">)|(?:rel=")|(?:[çéèêîïô]))(' + mot + "\\w{0,2}" + ')' + "\\b", "ig").test(full_contexte)) return;
143
 
142
 
144
	templateMotADefinition = formaterTemplateMotADefinition(mot_contextualise, mot);
143
	templateMotADefinition = formaterTemplateMotADefinition(mot_contextualise, mot);
145
	bloc_replace = full_contexte.replace(mot_contextualise, templateMotADefinition);
144
	bloc_replace = full_contexte.replace(mot_contextualise, templateMotADefinition);
146
	return texte.replace(full_contexte, bloc_replace);
145
	return texte.replace(full_contexte, bloc_replace);
147
}
146
}
148
 
147
 
149
 
148
 
150
function necessiteSubstitution(texte) {
149
function necessiteSubstitution(texte) {
151
	var liste = [], liste_complete = [];
150
	var liste = [], liste_complete = [];
152
 
151
 
153
	// regexp d'extraction du contexte, sans limite aux bords de "mot",
152
	// regexp d'extraction du contexte, sans limite aux bords de "mot",
154
	// peu amener des faux positifs, et notamment ne pas matcher au mieux.
153
	// peu amener des faux positifs, et notamment ne pas matcher au mieux.
155
	// Eg: subsessiles match "sessile" et non "subsessile".
154
	// Eg: subsessiles match "sessile" et non "subsessile".
156
	while( (matches_c = regexp_thin.exec(texte)) ) liste.push(matches_c);
155
	while( (matches_c = regexp_thin.exec(texte)) ) liste.push(matches_c);
157
	if(liste.length == 0) return [null];
156
	if(liste.length == 0) return [null];
158
 
157
 
159
	// regexp de validation des bordure de mots, ne conserve que des matches correct
158
	// regexp de validation des bordure de mots, ne conserve que des matches correct
160
	// vis-à-vis de la bordure gauche
159
	// vis-à-vis de la bordure gauche
161
	while( (matches_c = regexp_complete.exec(texte)) ) liste_complete.push(matches_c[1]);
160
	while( (matches_c = regexp_complete.exec(texte)) ) liste_complete.push(matches_c[1]);
162
 
161
 
163
	// si une match n'est pas dans le tableau des mots autorisés (indexOf)
162
	// si une match n'est pas dans le tableau des mots autorisés (indexOf)
164
	for(var i = 0; i < liste.length; i++) {
163
	for(var i = 0; i < liste.length; i++) {
165
		if($.inArray(liste[i][2], liste_complete) == -1) liste.splice(i, 1);
164
		if($.inArray(liste[i][2], liste_complete) == -1) liste.splice(i, 1);
166
	}
165
	}
167
 
166
 
168
	return [liste, liste_complete]
167
	return [liste, liste_complete]
169
}
168
}
170
 
169
 
171
function getMotsADefinitions() {
170
function getMotsADefinitions() {
172
	$.ajax({
171
	$.ajax({
173
		url: URL_BASE_SERVICE+'mots/', // provient de dictionnaire.config.js
172
		url: URL_BASE_SERVICE+'mots/', // provient de dictionnaire.config.js
174
		success: function(data) {
173
		success: function(data) {
175
			motsAyantDefinition = data;
174
			motsAyantDefinition = data;
176
			batirRegexp(motsAyantDefinition);
175
			batirRegexp(motsAyantDefinition);
177
			$(set).remplacerDefinitions(motsAyantDefinition);
176
			$(set).remplacerDefinitions(motsAyantDefinition);
178
		},
177
		},
179
		dataType: "JSON",
178
		dataType: "JSON",
180
		global: false
179
		global: false
181
	});
180
	});
182
}
181
}
183
 
182
 
184
function getMotsADefinitionsEtRemplacer() {
183
function getMotsADefinitionsEtRemplacer() {
185
	if(motsAyantDefinition == null) {
184
	if(motsAyantDefinition == null) {
186
		getMotsADefinitions();
185
		getMotsADefinitions();
187
	} else {
186
	} else {
188
		if(regexp_complete == null || regexp_thin == null) {
187
		if(regexp_complete == null || regexp_thin == null) {
189
			batirRegexp(motsAyantDefinition);
188
			batirRegexp(motsAyantDefinition);
190
		}
189
		}
191
		$(set).remplacerDefinitions(motsAyantDefinition);
190
		$(set).remplacerDefinitions(motsAyantDefinition);
192
	}
191
	}
193
}
192
}
194
 
193
 
195
// update definitions set cle = trim(cle);
194
// update definitions set cle = trim(cle);
196
// select cle from definitions where cle like '%é' COLLATE 'utf8_bin';
195
// select cle from definitions where cle like '%é' COLLATE 'utf8_bin';
197
// select cle from definitions where cle like '% ou %' COLLATE 'utf8_bin';
196
// select cle from definitions where cle like '% ou %' COLLATE 'utf8_bin';
198
function batirRegexp(mots) {
197
function batirRegexp(mots) {
199
	var restr = '';
198
	var restr = '';
200
	$.each(mots, function(index, mot) {
199
	$.each(mots, function(index, mot) {
201
		if(restr != '') restr += '|';
200
		if(restr != '') restr += '|';
202
 
201
 
203
		if(mot == 'ph') {
202
		if(mot == 'ph') {
204
			restr += 'ph[^.]';
203
			restr += 'ph[^.]';
205
		}
204
		}
206
		else if(mot.length < 3) {
205
		else if(mot.length < 3) {
207
			restr += mot;
206
			restr += mot;
208
		}
207
		}
209
		// confluent => confluentes
208
		// confluent => confluentes
210
		else if(mot.substr(-2) == 'ts') {
209
		else if(mot.substr(-2) == 'ts') {
211
			restr += mot.slice(0, -1) + "e?s?";
210
			restr += mot.slice(0, -1) + "e?s?";
212
		}
211
		}
213
		else if(mot.substr(-3) == 'ore') {
212
		else if(mot.substr(-3) == 'ore') {
214
			restr += mot + "s?";
213
			restr += mot + "s?";
215
		}
214
		}
216
		// gestion masculin/féminin en "eux/euse"
215
		// gestion masculin/féminin en "eux/euse"
217
		else if(mot.substr(-1) == 'x') {
216
		else if(mot.substr(-1) == 'x') {
218
			restr += mot.slice(0, -1) + "(?:x|se|ses)";
217
			restr += mot.slice(0, -1) + "(?:x|se|ses)";
219
		}
218
		}
220
		else if(mot.substr(-4) == 'euse') { // TODO: fix DB
219
		else if(mot.substr(-4) == 'euse') { // TODO: fix DB
221
			restr += mot.slice(0, -2) + "(?:x|se|ses)";
220
			restr += mot.slice(0, -2) + "(?:x|se|ses)";
222
		}
221
		}
223
		else if(mot.substr(-2) == 'ée') {
222
		else if(mot.substr(-2) == 'ée') {
224
			restr += mot.slice(0, -1) + "e?s?";
223
			restr += mot.slice(0, -1) + "e?s?";
225
		}
224
		}
226
		else if(mot.substr(-1) == 'é') {
225
		else if(mot.substr(-1) == 'é') {
227
			restr += mot + "e?s?";
226
			restr += mot + "e?s?";
228
		}
227
		}
229
		// verbe vs nom
228
		// verbe vs nom
230
		else if(mot.substr(-4) == 'orme') {
229
		else if(mot.substr(-4) == 'orme') {
231
			restr += mot + "s?";
230
			restr += mot + "s?";
232
		}
231
		}
233
		// verbe 3è p.pluriel en DB: ne devraient pas exister
232
		// verbe 3è p.pluriel en DB: ne devraient pas exister
234
		// mais rampant => rampante
233
		// mais rampant => rampante
235
		else if(mot.substr(-2) == 'nt') {
234
		else if(mot.substr(-2) == 'nt') {
236
			restr += mot + "e?s?";
235
			restr += mot + "e?s?";
237
		}
236
		}
238
		else {
237
		else {
239
			// moins de faux positifs:
238
			// moins de faux positifs:
240
			// restr += mot + "(?:[ées]){0,2}";
239
			// restr += mot + "(?:[ées]){0,2}";
241
			// autrement:
240
			// autrement:
242
			restr += mot + "\\w{0,2}";
241
			restr += mot + "\\w{0,2}";
243
		}
242
		}
244
	});
243
	});
245
 
244
 
246
	regexp_complete = new RegExp("(?:\\s|^|\\W)(" + restr + ")\\b", "ig"); // accents
245
	regexp_complete = new RegExp("(?:\\s|^|\\W)(" + restr + ")\\b", "ig"); // accents
247
	regexp_thin = new RegExp(exclureSpan + "(" + restr + ")\\b", "ig");
246
	regexp_thin = new RegExp(exclureSpan + "(" + restr + ")\\b", "ig");
248
}
247
}
249
 
248
 
250
function formaterTemplateMotADefinition(motOriginal, motSimplifie) {
249
function formaterTemplateMotADefinition(motOriginal, motSimplifie) {
251
	definitionHtml = '<span rel="'+motSimplifie+'" class="definition_term">'
250
	definitionHtml = '<span rel="'+motSimplifie+'" class="definition_term">'
252
		+motOriginal+
251
		+motOriginal+
253
		'</span>';
252
		'</span>';
254
	return definitionHtml;
253
	return definitionHtml;
255
}
254
}
256
 
255
 
257
function ajouterListenerDefinitions() {
256
function ajouterListenerDefinitions() {
258
	$('.definition_term').live('mouseover mouseout', function(event) {
257
	$('.definition_term').live('mouseover mouseout', function(event) {
259
		if (event.type == 'mouseover') {
258
		if (event.type == 'mouseover') {
260
			event.preventDefault();
259
			event.preventDefault();
261
			afficherDefinition($(this));
260
			afficherDefinition($(this));
262
		} else {
261
		} else {
263
			cacherPopupsDefinitions();
262
			cacherPopupsDefinitions();
264
		}
263
		}
265
	});
264
	});
266
}
265
}
267
 
266
 
268
function afficherDefinition(element) {
267
function afficherDefinition(element) {
269
	mot = element.attr('rel');
268
	mot = element.attr('rel');
270
	if(dictionnaire[mot] != null) {
269
	if(dictionnaire[mot] != null) {
271
		element.after(formaterDefinition(element));
270
		element.after(formaterDefinition(element));
272
		afficherPopupDefinition();
271
		afficherPopupDefinition();
273
	} else {
272
	} else {
274
		chargerDefinitionDistante(element);
273
		chargerDefinitionDistante(element);
275
	}
274
	}
276
}
275
}
277
 
276
 
278
function chargerDefinitionDistante(element) {
277
function chargerDefinitionDistante(element) {
279
	date = new Date();
278
	date = new Date();
280
	mot = element.attr('rel');
279
	mot = element.attr('rel');
281
	$.ajax({
280
	$.ajax({
282
		url: URL_BASE_SERVICE+'def/'+mot, // provient de dictionnaire.config.js
281
		url: URL_BASE_SERVICE+'def/'+mot, // provient de dictionnaire.config.js
283
		success: function(data) {
282
		success: function(data) {
284
			retour = data;
283
			retour = data;
285
			definition = retour.valeur;
284
			definition = retour.valeur;
286
			dictionnaire[mot] = definition;
285
			dictionnaire[mot] = definition;
287
			element.after(formaterDefinition(element));
286
			element.after(formaterDefinition(element));
288
			afficherPopupDefinition();
287
			afficherPopupDefinition();
289
		},
288
		},
290
		dataType: "JSON",
289
		dataType: "JSON",
291
		global: false,
290
		global: false,
292
		async: false
291
		async: false
293
	});
292
	});
294
}
293
}
295
 
294
 
296
function afficherPopupDefinition() {
295
function afficherPopupDefinition() {
297
	$(".definition_container").css({'top':mouseY + 20,'left':mouseX - 10}).fadeIn('slow');
296
	$(".definition_container").css({'top':mouseY + 20,'left':mouseX - 10}).fadeIn('slow');
298
}
297
}
299
 
298
 
300
function cacherPopupsDefinitions() {
299
function cacherPopupsDefinitions() {
301
	$(".definition_container").remove();
300
	$(".definition_container").remove();
302
}
301
}
303
 
302
 
304
function formaterDefinition(element) {	
303
function formaterDefinition(element) {	
305
	mot = element.attr('rel');
304
	mot = element.attr('rel');
306
	data = dictionnaire[mot];
305
	data = dictionnaire[mot];
307
	defHtml = '<div class="definition_container">'+
306
	defHtml = '<div class="definition_container">'+
308
		'<span class="definition_container_fleche"></span>'+
307
		'<span class="definition_container_fleche"></span>'+
309
		'<span class="definition">'+data+'</span>'+
308
		'<span class="definition">'+data+'</span>'+
310
		'</div>';
309
		'</div>';
311
	return defHtml;
310
	return defHtml;
312
}
311
}
313
 
312
 
314
function supprimerToutesDefinitions() {
313
function supprimerToutesDefinitions() {
315
	$('.definition_term').each(function() {
314
	$('.definition_term').each(function() {
316
		$(this).replaceWith($(this).html());
315
		$(this).replaceWith($(this).html());
317
	});
316
	});
318
	cacherPopupsDefinitions();
317
	cacherPopupsDefinitions();
319
}
318
}
320
 
319
 
321
$(document).bind('mousemove', function(e){
320
$(document).bind('mousemove', function(e){
322
	mouseX = e.pageX;
321
	mouseX = e.pageX;
323
    mouseY = e.pageY - $(window).scrollTop();
322
    mouseY = e.pageY - $(window).scrollTop();
324
});
323
});
325
 
324
 
326
$(document).ajaxStop(function() {
325
$(document).ajaxStop(function() {
327
	urlPage = $(this)[0].URL;
326
	urlPage = $(this)[0].URL;
328
	getMotsADefinitionsEtRemplacer();
327
	getMotsADefinitionsEtRemplacer();
329
});
328
});
330
 
329
 
331
$(document).ready(function() {
330
$(document).ready(function() {
332
	$.ajax({
331
	$.ajax({
333
		url: URL_BASE_SERVICE + "../../../scripts/helpers.js",
332
		url: URL_BASE_SERVICE + "../../../scripts/helpers.js",
334
		dataType: "script",
333
		dataType: "script",
335
		global: false
334
		global: false
336
	});
335
	});
337
	getMotsADefinitionsEtRemplacer();
336
	getMotsADefinitionsEtRemplacer();
338
	ajouterListenerDefinitions();
337
	ajouterListenerDefinitions();
339
});
338
});