[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins / multilang / javascript / multilang.js
1 /**
2 * multilang
3 *
4 * Copyright (c) 2006-2010 Renato Formato (rformato@gmail.com)
5 * Licensed under the GPL License:
6 * http://www.gnu.org/licenses/gpl.html
7 *
8 * Modif Yffic mars 2010
9 * - Correction bug : Fonctionnement incoherent si plusieurs menu dans la meme page (ex : portfolio dans page de
10 * presentation d'un article)
11 * - On ne rajoute pas le menu s'il existe deja (cas d'un retour Ajax)
12 * - On ne rajoute pas le menu dans forms d'upload (par ex vignette d'un doc)
13 */
14
15
16 var multilang_containers={}, //menu containers
17 multilang_forms_fields={};
18
19 /*
20 (?:\[([a-z_]+)\]|^[\s\n]*)
21 [lang] or white space
22
23 ((?:.|\n)*?)
24 all chars not greedy
25
26 (?=\[[a-z_]+\]|$)
27 [lang] or end string
28 */
29
30 /**
31 * Initialisation de différentes variables :
32 *
33 */
34 var multilang_match_multi = /(?:\[([a-z_]+)\]|^[\s\n]*)((?:.|\n|\s)*?)(?=\[[a-z_]+\]|$)/ig;
35 var multilang_jq_root, //root of the search (jQuery object)
36 multilang_root_opt,
37 multilang_fields_selector,
38 multilang_fields_selector_opt,
39 multilang_menu_selector,
40 multilang_containers,
41 multilang_forms_toadd,
42 multilang_forms, //forms to be processed (jQuery object)
43 multilang_menu_lang, //template of the menu (jQuery object)
44 multilang_forms_selector, //selector of the forms to be processed (string)
45 multilang_init = false;
46
47 /**
48 * options is a hash having the following values:
49 * - fields (mandatory): a jQuery selector to set the fields that have to be internationalized.
50 * - page (optional): a string to be searched in the current url. if found the plugin is applied.
51 * - root (optional): the root element of all processing. Default value is 'document'. To speed up search
52 * - forms (optional): a jQuery selector to set the forms that have to be internationalized. Default value is 'form'.
53 * - main_menu (optional): a jQuery selector to set the container for the main menu to control all the selected forms.
54 * - form_menu (optional): a jQuery selector to set the container for the form menus.
55 */
56 function multilang_init_lang(options) {
57 var init_done = options.init_done || multilang_init;
58 //Detect if we're on the right page and if multilinguism is activated. If not return.
59 if((options.page && window.location.search.indexOf(options.page)==-1) || multilang_avail_langs.length<=1) return;
60
61 //set the root element of all processing
62
63 var root = options.root || document;
64 multilang_jq_root = $(root).add($(options.root_opt).parent());
65 multilang_root_opt = options.root_opt;
66
67 /**
68 * set the main menu element
69 * Plus utilisé pour l'instant
70 */
71 multilang_containers = options.main_menu ? $(options.main_menu,multilang_jq_root) : $([]);
72
73 multilang_forms_toadd = $([]);
74
75 /**
76 * On crée le modèle du menu de langue
77 * C'est ce modèle qui est cloné au début de chaque formulaire
78 */
79 multilang_menu_lang = $("<div class='langues'></div>");
80 $.each(multilang_avail_langs,function() {
81 var title = 'multilang_lang.title_lien_multi_'+this;
82 multilang_menu_lang.append($("<a class='change_lang "+this+"' title='"+eval(title)+"'></a>").html("["+this+"]"));
83 });
84 multilang_menu_lang.append($("<a class='recover_lang' href='#'></a>").html("["+multilang_lang.lien_desactiver+"]"));
85
86 //init fields
87 multilang_fields_selector = options.fields;
88 multilang_fields_selector_opt = options.fields_opt;
89
90 //store all the internationalized forms
91 multilang_forms_selector = options.forms || "form";
92
93 if(init_done){
94 multilang_forms_toadd = $(multilang_forms_selector,multilang_jq_root).not($(multilang_forms));
95 }
96 multilang_forms = $(multilang_forms_selector,multilang_jq_root);
97 if(!init_done)
98 multilang_forms_toadd = multilang_forms;
99
100 //create menu lang for the global form
101 if(multilang_containers.size())
102 multilang_make_menu_lang(multilang_containers);
103 multilang_menu_selector = options.form_menu;
104
105 multilang_init = true;
106
107 // Modif Yffic : On va pas plus loin s'il n'y a pas de form
108 if(multilang_forms_toadd.size()) multilang_init_multi();
109
110 }
111
112 /**
113 * Initialisation des champs multi sur les formulaires
114 *
115 * @param options
116 * @return
117 */
118 function multilang_init_multi(options) {
119 var target = options ? options.target : null;
120 var init_forms;
121 //Update the list of form if this is an update
122 if(target) {
123 //Verify the target is really a form to be internationalized (in case of an ajax request fired by onAjaxLoad)
124 if(target==document) return;
125 init_forms = $(target).find('form').in_set($(multilang_forms_selector,multilang_jq_root));
126 if(!init_forms.length) return;
127 multilang_forms.add(init_forms.each(multilang_attach_submit).get());
128 } else {
129 //attach multi processing to submit event
130 init_forms = multilang_forms_toadd;
131 multilang_forms_toadd.each(multilang_attach_submit);
132 }
133
134 multilang_forms_fields = {};
135 multilang_forms_fields["undefined"] = $(multilang_fields_selector,multilang_forms);
136 //init the value of the field to current lang
137 //add a container for the language menu inside the form
138 init_forms.each(function() {
139 /*
140 * Je ne sais pas à quoi cela sert particulièrement, désactivé pour l'instant
141 */
142 //$(this).find('input[type=submit],button').click(function(){
143 //multilang_multi_submit.apply($(this).parents('form').get(0));
144 //$(this).parents('form').submit();
145 //return false;
146 //});
147 this.isfull = false;
148 this.form_lang = multilang_def_lang;
149 var container = multilang_menu_selector ? $(multilang_menu_selector,this) : $(this);
150 // Pas de rajout s'il y en deja un
151 if(!container.find('.menu_multilang').size())
152 container.prepend("<div class='menu_multilang'></div>");
153 });
154
155 /**
156 * Initialisation de chaque input ou textarea
157 * On vérifie si on est dans un formulaire optionnel (dans ce cas on ne prend que
158 * les éléments qui on la class optionnelle) sinon on prend tous les champs qui
159 * matchent
160 */
161 $(multilang_fields_selector,init_forms).each(function(){
162 var me = $(this);
163 if(me.closest(multilang_root_opt).length){
164 if(me.is(multilang_fields_selector_opt))
165 multilang_init_field(this,this.form.form_lang);
166 }else{
167 multilang_init_field(this,this.form.form_lang);
168 }
169 });
170 //create menu for each form. The menu is just before the form
171 $("div.menu_multilang",init_forms).empty().each(function() {
172 //store all form containers to allow menu lang update on each container
173 //when it is triggered by global menu
174 multilang_containers.add(this);
175 multilang_make_menu_lang($(this),$(this).parents("form"));
176 });
177 }
178
179 /**
180 * Création du menu de langue
181 * Liste les langues disponibles et ajoute un lien pour désactiver multilang
182 *
183 * @param container
184 * @param target
185 * @return
186 */
187 function multilang_make_menu_lang(container,target) {
188 target = target || multilang_forms;
189 $(multilang_menu_lang).clone().find("a").click(function() {
190 if($(this).is('.change_lang') && !$(this).is('.on')){
191 $(this).parents('form > .menu_multilang').find('a.on').removeClass('on');
192 $(this).parents('form > .menu_multilang').find('.multilang_message').detach();
193 $(this).parents('form').find('.editer_titre_numero').show();
194 $(this).addClass('on');
195 multilang_change_lang(this,container,target);
196 }else if(!$(this).is('.on') && $(this).is('.recover_lang')){
197 $(this).parents('form > .menu_multilang').find('a.on').removeClass('on');
198 $(this).parents('form > .menu_multilang').append('<div class="multilang_message"><p>'+multilang_lang.champs_readonly+'<\/p><\/div>');
199 $(this).parents('form').find('.editer_titre_numero').hide();
200 $(this).addClass('on');
201 multilang_multi_recover(this,container,target,'submit');
202 }
203 return false;
204 }).end().appendTo(container);
205 $(target).find('.menu_multilang .langues a').eq(0).addClass('on');
206
207 var target_id = multilang_init_target_id(target);
208 multilang_forms_fields[target_id].each(function(){
209 multilang_save_lang(this,this.form.form_lang);
210 });
211 // Maj du menu de langues
212 multilang_mark_empty_langs(container,target);
213 }
214
215 /**
216 * Initialise target_id
217 *
218 * @param target Le formulaire
219 * @return
220 */
221 function multilang_init_target_id(target){
222 var target_id = target != multilang_forms ? jQuery.data(target[0]) : "undefined";
223 multilang_forms_fields[target_id] = $(multilang_fields_selector,target);
224 return(target_id);
225 }
226
227 /**
228 * Affiche le contenu complet du champ
229 * Utilisé lors de la désactivation de multilang et de la validation des formulaires
230 *
231 * @param el Le lien de désactivation
232 * @param container Le container du formulaire
233 * @param target Le formulaire
234 * @return
235 */
236 function multilang_multi_recover(el,container,target,event){
237 if(target[0].isfull){
238 return true;
239 }
240 if(event == 'submit'){
241 lang = 'full';
242 var target_id = multilang_init_target_id(target);
243 target[0].isfull = true;
244 multilang_forms_fields[target_id].each(function(){
245 if(!this.totreat) return ;
246 //save data before submit
247 multilang_save_lang(this,this.form.form_lang);
248 //build the string value
249 multilang_field_set_background(this,lang);
250 if(container && target){
251 multilang_mark_empty_langs(container,target);
252 }
253 var def_value = this.field_lang[multilang_def_lang];
254 if(!this.multi)
255 this.value = (def_value==undefined?"":def_value);
256 else {
257 var value="",count=0;
258 $.each(this.field_lang,function(name){
259 if((name != 'full') && (this.length > 0)){
260 //save default lang value and other lang values if different from the default one
261 if(name == multilang_def_lang){
262 value = "["+name+"]"+this+value;
263 count++;
264 }else if(this!=def_value) {
265 value += "["+name+"]"+this;
266 count++;
267 }
268 }
269 });
270 this.value = (count > 1 ? "<multi>"+value+"</multi>":value.replace(/^\[[a-z_]+\]/,''));
271 }
272 // Add the title number to the final value
273 if(multilang_is_title(this) && ($(this).parents('form').find('#'+this.id+'_numero').val() != '')) {
274 this.value = $(this).parents('form').find('#'+this.id+'_numero').val().replace(/\.|\s+/,'') + ". " + this.value;
275 }
276 });
277 return true;
278 }
279 }
280
281 /**
282 * Défini si un id de champ correspond a un champ "numerotable"
283 *
284 * @param id chaine correspondant a l'id du champ
285 */
286 function multilang_is_title(el) {
287 return (el.id=='titre' || el.id=='champ_titre' || (el.id=='nom_site' && ($(el).parents('#configurer-accueil,.formulaire_configurer_identite,.formulaire_editer_auteur').size() < 1)) || el.id.match(/^titre_document[0-9]+/)!=null || el.name.match(/^content_[a-z0-9_]+_titre/)!=null || el.name.match(/^content_[a-z0-9_-]+nom_/)!=null)
288 }
289
290 /**
291 * Initialisation du script sur un champ
292 *
293 * Récupère les données suivantes
294 * - Le contenu de l'élément du champ
295 * - Le booléen (true/false) multi (est ce un champs déjà multi)
296 * - Les différentes chaines de langue dans un objet :
297 * {fr="texte fr",en="texte en",full="<multi>[fr]texte fr[en]texte en</multi>"}
298 * Si le champ est déjà initialisé, fait un simple return
299 *
300 * @param el Le champ a initialiser
301 * @param lang La langue
302 *
303 */
304 function multilang_init_field(el,lang,force) {
305 if(el.field_lang && !force) return;
306 var langs;
307
308 // On enlève les espaces, retours à la ligne et tabulations de début et de fin de chaine
309 el.value.replace(/(?:^\s+|\s+$)/g, "");
310
311 // Modif Yffic : ne pas considerer comme multi les champs qui contiennent du texte
312 // en dehors des multi sauf un numero (\d+\.\s+)
313 var m = el.value.match(/(\d+\.\s+)?<multi>((?:.|\n|\s)*?)<\/multi>(.|\n*)/);
314 el.field_lang = {};
315 el.field_pre_lang = ""; //this is the 01. part of the string, the will be put outside the <multi>
316 el.titre_el = $("#titre_"+el.id);
317
318 // Init the elements to treat
319 if(m!=null) {
320 if( m.index || (m[3]!=undefined && m[3]!="")){
321 $(el).addClass('multi_lang_broken');
322 el.totreat=false;
323 }
324 else
325 el.totreat=true;
326 if(el.totreat) {
327 el.field_pre_lang = m[1] || "";
328 // Suppress point and spaces
329 el.field_pre_lang = el.field_pre_lang.replace(/\.|\s+/,'') ;
330 el.multi = true;
331 multilang_match_multi.lastIndex=0;
332 el.field_lang['full'] = el.value;
333 while((langs=multilang_match_multi.exec(m[2]))!=null && langs[0] != "") {
334 var text = langs[2].match(/^(\d+\.\s+)((?:.|\n|\s)*)/), value;
335 // Suppression du numero uniquement pour les titres
336 if(multilang_is_title(el) && text!=null) {
337 value = text[2];
338 // Suppress point and spaces
339 el.field_pre_lang = text[1].replace(/\.|\s+/,'') || "";
340 } else {
341 value = langs[2];
342 }
343 el.field_lang[langs[1]||multilang_def_lang] = value;
344 }
345 }
346 } else {
347 el.multi = false;
348 el.totreat=true;
349
350 // Suppression du numero uniquement pour les titres
351 if(multilang_is_title(el)) {
352 var n = el.value.match(/(\d+\.\s+)?(.*)/);
353 el.field_pre_lang = n[1] || "";
354 el.field_pre_lang = el.field_pre_lang.replace(/\.|\s+/,'') ;
355 el.field_lang[multilang_def_lang] = n[2];
356 } else
357 el.field_lang[multilang_def_lang] = el.value;
358 }
359
360 // Put the current lang string only in the field
361 multilang_set_lang(el,lang);
362
363 /**
364 * Si le champ est un titre, on ajoute un champ facultatif "numéro" au formulaire permettant
365 * de traiter le cas où l'on utilise les numéros pour trier les objets
366 * Ajout d'Yffic le 30/03/2010
367 */
368 if(!force && multilang_is_title(el)){
369 numid=el.id+'_numero';
370 /**
371 * Cas des crayons qui n'ont pas toujours de formalisme en ul > li
372 */
373 if(el.name.match(/^content_[a-z0-9_]+_titre/)){
374 if($(el).parent().is('li'))
375 $(el).parent()
376 .before('<li class="editer editer_'+numid+'"><label for="titre_numero">'+multilang_lang.numero+'</label><input id="'+numid+'" name="titre_numero" type="text" value="'+el.field_pre_lang+'" size="4" class="text nomulti" /></li>');
377 else
378 $(el)
379 .before('<div class="editer editer_'+numid+'"><label for="titre_numero">'+multilang_lang.numero+'</label><input id="'+numid+'" name="titre_numero" type="text" value="'+el.field_pre_lang+'" size="4" class="text nomulti" /><br /><br /></div>');
380 }else{
381 /* Le formalisme des formulaires peut etre en li ou en div (SPIP 3.1) mais on a toujours un conteneur .editer */
382 var tag = 'div';
383 if($(el).parent().is('li')) {
384 tag = 'li';
385 }
386 $(el).parent()
387 .before('<'+tag+' class="editer editer_'+numid+'"><label for="titre_numero">'+multilang_lang.numero+'</label><input id="'+numid+'" name="titre_numero" type="text" value="'+el.field_pre_lang+'" size="4" class="text nomulti" /></'+tag+'>');
388 }
389 $('#'+numid).totreat = false;
390 }
391 }
392
393 /**
394 * Action au click sur une langue du menu de langue
395 *
396 * @param el Le lien cliqué sur le menu
397 * @param container Le conteneur du formulaire
398 * @param target Le formulaire lui même
399 *
400 */
401 function multilang_change_lang(el,container,target) {
402 var added_lang="";
403 var target_id = multilang_init_target_id(target);
404 var lang = el.innerHTML;
405
406 lang = lang.slice(1,-1);
407
408 if(target[0].isfull){
409 // Maj du menu de langues avant multilang_init_field
410 multilang_forms_fields[target_id].each(function(){
411 var me = $(this);
412 if(me.parents(multilang_root_opt).size()>0){
413 if(me.is(multilang_fields_selector_opt))
414 multilang_init_field(this,lang,true);
415 }else
416 multilang_init_field(this,lang,true);
417 });
418 target[0].isfull = false;
419 }else{
420 //store the fields inputs for later use (usefull for select)
421 //save the current values
422 multilang_forms_fields[target_id].each(function(){
423 multilang_save_lang(this,this.form.form_lang);
424 });
425 // Maj du menu de langues apres multilang_save_lang
426 }
427
428 //change current lang
429 target.each(function(){this.form_lang = lang});
430
431 //reinit fields to current lang
432 multilang_forms_fields[target_id].each(function(){
433 multilang_set_lang(this,lang);
434 });
435
436 multilang_mark_empty_langs(container,target);
437 }
438
439 /**
440 * Marquer dans le menu des langues, celles pour lesquelles
441 * au moins un champ multi du formulaire n'est pas renseigne
442 *
443 * @param container Le conteneur du formulaire
444 *
445 */
446 function multilang_mark_empty_langs(container,target) {
447 var langs_empty = [];
448 var target_id = multilang_init_target_id(target);
449
450 multilang_forms_fields[target_id].each(function(){
451 var field_langs = [];
452 // Mise sous forme de tableau
453 if(typeof(this.field_lang) != 'undefined'){
454 $.each(this.field_lang,function(name,value){
455 if(value)
456 field_langs.push(name);
457 });
458 }
459 // Trouver les elements non communs entre le tableau des langues availables et pour chaque champ,
460 // celui des langues renseignees, si ce champ est multi
461 // Si la langue d'origine n'est pas remplie (champ texte par exemple, on ne considère donc pas empty)
462 if(this.multi) {
463 // Comparaison des tableaux
464 $.each(multilang_avail_langs,function(i,name){
465 if ((jQuery.inArray(name, field_langs) == -1) && (jQuery.inArray(name, langs_empty) == -1) && (jQuery.inArray(multilang_def_lang, field_langs) != -1))
466 langs_empty.push(name);
467 });
468 }else{
469 // Comparaison des tableaux
470 $.each(multilang_avail_langs,function(i,name){
471 if ((jQuery.inArray(name, field_langs) == -1) && (jQuery.inArray(name, langs_empty) == -1) && (jQuery.inArray(multilang_def_lang, field_langs) != -1))
472 langs_empty.push(name);
473 });
474 }
475 });
476
477 // On indique dans le menu de langue, celles qui ont au moins un champ non renseigne
478 if(container!='') {
479 $.each(multilang_avail_langs,function(i,name){
480 if((jQuery.inArray(name, langs_empty) == -1)){
481 var title = 'multilang_lang.title_lien_multi_'+name;
482 container.find('a[class~='+name+']').removeClass('empty').attr('title',eval(title));
483 }else{
484 var title = 'multilang_lang.title_lien_multi_sans_'+name;
485 container.find('a[class~='+name+']').addClass('empty').attr('title',eval(title));
486 }
487 });
488 }
489 }
490
491 /**
492 * Action au changement de la langue
493 * Lorsque l'on clique sur le menu de langue
494 * On affiche pour le champ "el" son contenu dans la langue "lang"
495 *
496 * @param el Un champ du formulaire (input ou textarea)
497 * @param lang La langue correspondante souhaitée
498 * @return
499 */
500 function multilang_set_lang(el,lang) {
501
502 if(!el.totreat) return;
503
504 //if current lang is not setted use default lang value
505 if(el.field_lang[lang]==undefined) {
506 el.field_lang[lang] = el.field_lang[multilang_def_lang];
507 }
508
509 el.value = (el.field_lang[lang] == undefined ? "" : el.field_lang[lang]);
510
511 el.titre_el.html(el.value);
512
513 multilang_field_set_background(el,lang);
514 }
515
516 /**
517 * Change la class multi_lang_* d'un champ pour indiquer la présence ou non de multis
518 * - multi_lang_(lang) si une langue particulière est disponible
519 * - multi_lang_no_multi si pas de multis pour le champ
520 *
521 * @param el
522 * @param lang
523 * @return
524 */
525 function multilang_field_set_background(el,lang) {
526 if(lang != 'full'){
527 if(el.totreat){
528 $(el).removeAttr('readonly').removeClass('multilang_readonly').removeClass('multilang_ltr').removeClass('multilang_rtl');
529 if(typeof($(el).attr('class')) != 'undefined'){
530 $($(el).attr('class').split(' ')).each(function(){
531 var m = this.match(/^multi_lang_*/);
532 if(m!=null) {
533 $(el).removeClass(m.input).removeClass('multilang_ltr').removeClass('multilang_rtl').addClass('multi_lang_'+lang).addClass('multi_lang_'+multilang_dir_langs[lang]).attr('dir',multilang_dir_langs[lang]);
534 }
535 });
536 }
537 $(el).addClass('multi_lang_'+(el.multi?lang:'no_multi')).addClass('multi_lang_'+multilang_dir_langs[lang]).attr('dir',multilang_dir_langs[lang]);
538 }
539 else{
540 if(typeof($(el).attr('class')) != 'undefined'){
541 $($(el).attr('class').split(' ')).each(function(){
542 var m = this.match(/^multi_lang_*/);
543 if(m!=null)
544 $(el).removeClass(m.input).removeClass('multilang_ltr').removeClass('multilang_rtl');
545 });
546 }
547 align = multilang_dir_langs[lang] ? (multilang_dir_langs[lang] == 'ltr' ? 'right' : 'left') : 'right';
548 $(el).css({"background":"url("+multilang_dir_plugin+"/images/multi_forbidden.png) no-repeat "+align+" top"});
549 }
550 }else{
551 $(el).attr('readonly','readonly').addClass('multilang_readonly').attr('dir','');
552 if(typeof($(el).attr('class')) != 'undefined'){
553 $($(el).attr('class').split(' ')).each(function(){
554 var m = this.match(/^multi_lang_*/);
555 if(m!=null)
556 $(el).removeClass(m.input).removeClass('multilang_ltr').removeClass('multilang_rtl');
557 });
558 }
559 }
560 }
561
562 /**
563 * Garde en mémoire dans l'array de langues du champs la valeur de la langue
564 * sélectionnée
565 *
566 * @param el Le champ du formulaire concerné
567 * @param lang La langue actuelle
568 * @return
569 */
570 function multilang_save_lang(el,lang) {
571
572 if(!el.totreat) return ;
573
574 // Suppression du numero uniquement pour les titres
575 if(multilang_is_title(el)) {
576 var m = el.value.match(/^(\d+\.\s+)((?:.|\n|\s)*)/);
577 if(m!=null) {
578 // Suppress point and spaces
579 el.field_pre_lang = m[1].replace(/\.|\s+/,'');
580 el.value = m[2];
581 }
582 }
583
584 //if the lang value is equal to the def lang do nothing
585 //else save value but if the field is not empty, delete lang value
586 if(el.field_lang[multilang_def_lang]!= el.value) {
587 if(!el.value) {
588 delete el.field_lang[lang];
589 return;
590 }
591 el.multi = true;
592 el.field_lang[lang] = el.value;
593 }else{
594 el.field_lang[lang] = el.field_lang[multilang_def_lang];
595 $.each(el.field_lang,function(index, value){
596 if((index != multilang_def_lang) && (value == el.field_lang[multilang_def_lang])){
597 delete el.field_lang[index];
598 }
599 });
600 }
601 }
602
603 //This func receives the form that is going to be submitted
604 function multilang_multi_submit(params) {
605 if(multilang_avail_langs.length<=1) return;
606 var form = $(this);
607 //remove the current form from the list of forms
608 multilang_forms.not(this);
609 //remove the current menu lang container from the list
610 multilang_containers.not("div.menu_multilang",$(this));
611 //build the input values
612 multilang_multi_recover('','',form,'submit');
613 //save back the params
614 if(params) $.extend(params,$(form).formToArray(false));
615 }
616
617 /**
618 * On attache nos évènements pour la validation du formulaire
619 * - sur le submit pour tous les formulaires
620 * - sur l'évènement 'form-pre-serialize' d'ajaxForms au cas où nous sommes dans
621 * un formulaire ajax
622 *
623 * @return
624 */
625 function multilang_attach_submit() {
626 if($(this).parents('.ajax').size() && $(this).find('input[name=var_ajax]')){
627 $(this).on('form-pre-serialize', multilang_multi_submit);
628 }else if($(this).is('.formulaire_crayon')){
629 cQuery(this).on('form-pre-serialize',function(){multilang_multi_submit.apply(this);});
630 }else{
631 var oldsubmit = this.onsubmit;
632 this.onsubmit = "";
633 if(oldsubmit && oldsubmit != ""){
634 $(this).submit(function(){multilang_multi_submit.apply(this);return oldsubmit.apply(this);});
635 }
636 else if(oldsubmit != "")
637 $(this).submit(multilang_multi_submit);
638 }
639 }
640
641 (function($) {
642 $.extend($.fn, {
643 in_set: function(set) {
644 var elements = this.get();
645 var result = $.grep(set,function(i){
646 var found = false;
647 $.each(elements,function(){
648 if(this==i) found=true;
649 })
650 return found;
651 });
652 return jQuery(result);
653 }
654 });
655 })(jQuery);