X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fprive%2Fjavascript%2Fmultilang.js;fp=www%2Fprive%2Fjavascript%2Fmultilang.js;h=c0b5e17128e3989c01e747de0fad5fe2527d6e63;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/prive/javascript/multilang.js b/www/prive/javascript/multilang.js new file mode 100644 index 0000000..c0b5e17 --- /dev/null +++ b/www/prive/javascript/multilang.js @@ -0,0 +1,238 @@ +/* + * multilang + * + * Copyright (c) 2006-2010 Renato Formato (rformato@gmail.com) + * Licensed under the GPL License: + * http://www.gnu.org/licenses/gpl.html + * + */ + +var multilang_containers={}, //menu containers + forms_fields={}, + multilang_forms, //forms to be processed (jQuery object) + multilang_menu_lang; //template of the menu (jQuery object) +/* +(?:\[([a-z_]+)\]|^[\s\n]*) +[lang] or white space + +((?:.|\n)*?) +all chars not greedy + +(?=\[[a-z_]+\]|$) +[lang] or end string +*/ +var match_multi = /(?:\[([a-z_]+)\]|^[\s\n]*)((?:.|\n|\s)*?)(?=\[[a-z_]+\]|$)/ig; +var multilang_css_link, + multilang_css_cur_link={}, + multilang_root, //root of the search (jQuery object) + multilang_fields_selector, + multilang_menu_selector, + multilang_forms_selector; //selector of the forms to be processed (string) +multilang_css_link = {"cursor":"pointer","margin":"2px 5px","float":"left"}; +$.extend(multilang_css_cur_link,multilang_css_link,{fontWeight:"bold"}); + +/* options is a hash having the following values: + * - fields (mandatory): a jQuery selector to set the fields that have to be internationalized. + * - page (optional): a string to be searched in the current url. if found the plugin is applied. + * - root (optional): the root element of all processing. Default value is 'document'. To speed up search + * - forms (optional): a jQuery selector to set the forms that have to be internationalized. Default value is 'form'. + * - main_menu (optional): a jQuery selector to set the container for the main menu to control all the selected forms. + * - form_menu (optional): a jQuery selector to set the container for the form menus. + */ +function multilang_init_lang(options) { + //Detect if we're on the right page and if multilinguism is activated. If not return. + if((options.page && window.location.search.indexOf(options.page)==-1) || multilang_avail_langs.length<=1) return; + //set the root element of all processing + var root = options.root || document; + multilang_root = $(root); + //set the main menu element + multilang_containers = options.main_menu ? $(options.main_menu,multilang_root) : $([]); + //create menu lang template + multilang_menu_lang =$("
"); + $.each(multilang_avail_langs,function() { + multilang_menu_lang.append($("").html("["+this+"]").css(this==multilang_def_lang?multilang_css_cur_link:multilang_css_link)[0]); + }); + //store all the internationalized forms + multilang_forms_selector = options.forms || "form"; + multilang_forms = $(multilang_forms_selector,multilang_root); + //create menu lang for the global form + if(multilang_containers.size()) forms_make_menu_lang(multilang_containers); + //init fields + multilang_fields_selector = options.fields; + multilang_menu_selector = options.form_menu; + forms_init_multi(); +} + +function forms_make_menu_lang(container,target) { + target = target || multilang_forms; + $(multilang_menu_lang).clone().find("a").click(function() {forms_change_lang(this,container,target)}).end(). + append("
").appendTo(container); +} + +function forms_change_lang(el,container,target) { + var lang = el.innerHTML; + container = container || multilang_containers; + //update lang menu with current selection + container.find("a").each(function(){ + $(this).css("fontWeight",lang==this.innerHTML?"bold":"normal"); + }).end(); + lang = lang.slice(1,-1); + //store the fields inputs for later use (usefull for select) + var target_id = target!=multilang_forms?jQuery.data(target[0]):"undefined"; + if(!forms_fields[target_id]) forms_fields[target_id] = $(multilang_fields_selector,target); + //save the current values + forms_fields[target_id].each(function(){ + forms_save_lang(this,this.form.form_lang); + }); + //change current lang + target.each(function(){this.form_lang = lang}); + //reinit fields to current lang + forms_fields[target_id].each(function(){forms_set_lang(this,lang)}); +} + +function forms_init_multi(options) { + var target = options?options.target:null; + var init_forms; + //Update the list of form if this is an update + if(target) { + //Verify the target is really a form to be internationalized (in case of an ajax request fired by onAjaxLoad) + if(target==document) return; + init_forms = $(target).find('form').in_set($(multilang_forms_selector,multilang_root)); + if(!init_forms.length) return; + multilang_forms.add(init_forms.each(forms_attach_submit).get()); + } else { + //attach multi processing to submit event + init_forms = multilang_forms; + multilang_forms.each(forms_attach_submit); + } + forms_fields = {}; + forms_fields["undefined"] = $(multilang_fields_selector,multilang_forms); + //init the value of the field to current lang + //add a container for the language menu inside the form + init_forms.each(function() { + this.form_lang = multilang_def_lang; + var container = multilang_menu_selector ? $(multilang_menu_selector,this) : $(this); + container.prepend("