function mod_formulaire(sForm, sMod) {
	if (sMod.substring(0, 3) == 'eff') {
		$(sForm).find('input:text').attr('readonly', 'readonly');
	}
}

function select(o, mode, bMultiple) {
	if( $is_true(bMultiple, false)) {
		o.multiple = true;
	}
	$.each( o, function(i) {
		this.selected = ( mode == 'toggle' ? !this.selected : $is_true(mode, true));
	});
}

var disableForm = {
	show : function(opt) {
		var s = $.extend({
				titre: _lg("Formulaire en cours d'envoi"),
				text: _lg("Les données sont en cours d'envoi, veuillez patientez..."),
				fermer: false
			}, opt),
			sHtml = '<div class="ajaxloading_disableForm">' + s.text + '</div>';

		if( ! $id('dialog_disableForm')) {
			$('<div id="dialog_disableForm"></div>').dialog({
				autoOpen: false,
				resizable: false,
				closeText: _lg('Fermer'),
				draggable: false,
				width: 500,
				modal: true,
				open: function(){
					if( ! $.data(this, 'fermer')) {
						$(this).dialog('widget').find('a.ui-dialog-titlebar-close').remove();
					}
				}
			});
		}
		$('#dialog_disableForm').data('fermer', s.fermer).html(sHtml).dialog('option', {
			title: s.titre,
			closeOnEscape: s.fermer
		}).dialog('open');
	},
	hide : function() {
		$('#dialog_disableForm').dialog('close');
	}
};

function countCar() {
	$('textarea.jsCountCar').each(function() {
		var idCpt = this.id + '-maxlength';
		if( $id(idCpt) && ! $.data(this, 'countCar')) {
			var m = this.className.match(/jsMaxlength:(\d+)/);
			this.maxVal = $.isArray(m) ? m[1] : 0;
			this.idCpt = this.id + '-maxlength';
			$(this).bind('keyup keypress', function() {
				var t = this,
					len = t.value.length,
					s = t.value.replace(/\r\n/g,'--').replace(/\n/g,'--'), // retour chariot = 2car
					r = s.length - len;
				if( (len + r) > t.maxVal) {
					t.value = t.value.substring(0, t.maxVal - r);
				}
				var iLng = t.maxVal - t.value.length - r;
				$('#' + t.idCpt).html( ' : ' +
					sprintf(
						pluriel(
							_lg("<strong>%s</strong> caractère restant"),
							_lg("<strong>%s</strong> caractères restants"),
							iLng),
						_lgNombre(iLng)
					)
				);
			}).data('countCar', true).trigger('keyup');
		}
	});
}
$( function() { countCar(); });

// @#$ ne marche pas dans le domReady
function disabledAutoComplete() {
	$('input:password').attr('autocomplete', 'off');
}

// test
$.validator.addMethod('emailing', function(value, element, param) {
	var bValide = true,
		aMails = value.replace(/\s+/g,'').split(';'),
		iLen = aMails.length;
	for (var i = 0; i < iLen; i++) {
		if( ! /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test( $.trim(aMails[i])) ) {
			bValide = false;
			break;
		}
	}
	return this.optional(element) || bValide;
}, $.validator.messages.email);
// same as url, but TLD is optional
$.validator.addMethod('url2', function(value, element, param) {
	return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( $.trim(value));
}, $.validator.messages.url);
// même que url2, mais avec ancre
$.validator.addMethod('urlancre', function(value, element, param) {
	return this.optional(element) || /^#.*$|^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( $.trim(value));
}, $.validator.messages.url);
$.validator.addMethod('urlsansancre', function(value, element, param) {
	return this.optional(element) || /^#.*$|^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?$/i.test( $.trim(value));
}, _lg('Veuillez entrer une URL sans ANCRE.'));

$.validator.addMethod('entier', function(value, element, param) {
	return this.optional(element) || /^-?\d+$/.test( $.trim(value));
}, _lg('Nombre entier non valide'));
$.validator.addMethod('reel', function(value, element, param) { // ne prends pas en compte le spérateur des milliers. sep dec : en .; europe ,; asie/rabe \u066B
	var dec_sep = i18n.decimal_sep == '.' ? '\\.' : '[.' + i18n.decimal_sep + ']';
	return this.optional(element) || new RegExp( eval("/^-?\\d+(?:(" + dec_sep + ")\\d+)?$/")).test( $.trim(value));
}, _lg('Nombre décimal non valide (séparateur : ' + i18n.decimal_sep + ')'));
$.validator.addMethod('precision', function(value, element, param) { // à partir de 1 chiffre après la ,
	var dec_sep = i18n.decimal_sep == '.' ? '\\.' : '[.' + i18n.decimal_sep + ']';
	return this.optional(element) || new RegExp( eval("/^-?\\d+(?:" + dec_sep + "\\d{1," + param + "})?$/")).test( $.trim(value));
}, ( _lg('Nombre maximum de chiffres décimaux : {0}') ));

$.validator.addMethod('ape', function(value, element, param) {
	return this.optional(element) || /^\d{3}[a-z]$/i.test( $.trim(value));
}, _lg('Code ape non valide'));
$.validator.addMethod('tel', function(value, element, param) {
	return this.optional(element) || /^((\d).?){10}$/.test( $.trim(value));
}, _lg('Téléphone non valide'));
$.validator.addMethod('cp', function(value, element, param) {
	return this.optional(element) || /^(\d{1,2}|2[AB])\s*\d{3}$/i.test( $.trim(value));
}, _lg('Code postal non valide'));
$.validator.addMethod('couleurhexa', function(value, element, param) {
	return this.optional(element) || /^[a-f0-9]{6}$/i.test( $.trim(value));
}, _lg('Code couleur non valide. Ex: CC00FF'));

$.validator.addMethod('maxfilesize', function(value, element, param) {
	return this.optional(element) || ( parseInt( param[0]) <= parseInt( param[1]));
}, $.validator.format( _lg('Le poids total ne doit pas dépasser « {2} »') ));

// unique
$.validator.addMethod('uniquelist', function(value, element, param) {
	var bDoublon, i, j, k = 0, aTab = [], iLen = element.options.length;
	for( i = 0; i < iLen; i++) {
		bDoublon = false;
		for(j = 0; j < k && !bDoublon; j++) {
			if(element.options[i].value === aTab[j]) {
				bDoublon = true;
			}
		}
		if( !bDoublon) {
			aTab[k++] = element.options[i].value;
		} else {
			break;
		}
	}

	return this.optional(element) || !bDoublon;
}, $.validator.format('Les valeurs doivent être uniques'));

// date
$.validator.addMethod('date2', function(value, element, param) {
	var sValide;
	if ($.datepicker.regional[LANGUE_META_SITE]) {
		var sFormat = $.datepicker.regional[LANGUE_META_SITE].dateFormat,
			re = new RegExp('^' + sFormat.replace(/[dm]/gi, '\\d').replace(/(yy)/gi, '\\d{4}') + '(\\s\\d\\d.\\d\\d(.\\d\\d)?)?$','g');
		sValide = re.test( value);
	} else {
		sValide = !/Invalid|NaN/.test(new Date( value));
	}
	return this.optional(element) || sValide;
}, $.validator.messages.date);
$.validator.addMethod('daterange', function(value, element, param) {
	if ($.datepicker.regional[LANGUE_META_SITE]) {
		var sFormat = $.datepicker.regional[LANGUE_META_SITE].dateFormat + + ' hh nn ss';
		return date2timestamp( sFormat, value) >= date2timestamp( sFormat, param[0]) && date2timestamp( sFormat, value) <= date2timestamp( sFormat, param[1]);
	} else {
		return this.optional(element);
	}
}, $.validator.format( _lg('Saisissez une date comprise entre « {0} » et « {1} » inclus') ));
$.validator.addMethod('datemin', function(value, element, param) {
	if ($.datepicker.regional[LANGUE_META_SITE]) {
		var sFormat = $.datepicker.regional[LANGUE_META_SITE].dateFormat + ' hh nn ss';
		return date2timestamp( sFormat, value) <= date2timestamp( sFormat, param);
	} else {
		return this.optional(element);
	}
}, $.validator.format( _lg('Saisissez une date inférieur ou égale à « {0} »') ));
$.validator.addMethod('datemax', function(value, element, param) {
	if ($.datepicker.regional[LANGUE_META_SITE]) {
		var sFormat = $.datepicker.regional[LANGUE_META_SITE].dateFormat + ' hh nn ss';
		return date2timestamp( sFormat, value) >= date2timestamp( sFormat, param);
	} else {
		return this.optional(element);
	}
}, $.validator.format( _lg('Saisissez une date supérieure ou égale à « {0} »') ));

// comparaison entre 2 champs ou valeur si param n'est pas un array ( ! PAS DE TRIM ICI)
$.validator.addMethod('verifEgal', function(value, element, param) {
	return this.optional(element) || value == ( param.length > 1 ? $(param[1]).val() : param[0]);
}, $.validator.format( _lg('Saisissez une valeur égale à « {0} »') ));
$.validator.addMethod('verifSupEgal', function(value, element, param) {
	return this.optional(element) || format_decimal(value) >= format_decimal( param.length > 1 ? $(param[1]).val() : param[0]);
}, $.validator.format( _lg('Saisissez une valeur supérieure ou égal à « {0} »') ));
$.validator.addMethod('verifInfEgal', function(value, element, param) {
	return this.optional(element) || format_decimal(value) <= format_decimal( param.length > 1 ? $(param[1]).val() : param[0]);
}, $.validator.format( _lg('Saisissez une valeur inférieure ou égal à « {0} »') ));
$.validator.addMethod('verifSup', function(value, element, param) {
	return this.optional(element) || format_decimal(value) > format_decimal( param.length > 1 ? $(param[1]).val() : param[0]);
}, $.validator.format( _lg('Saisissez une valeur supérieure à « {0} »') ));
$.validator.addMethod('verifInf', function(value, element, param) {
	return this.optional(element) || format_decimal(value) < format_decimal( param.length > 1 ? $(param[1]).val() : param[0]);
}, $.validator.format( _lg('Saisissez une valeur inférieure à « {0} »') ));
$.validator.addMethod('verifDiff', function(value, element, param) {
	return this.optional(element) || value != ( param.length > 1 ? $(param[1]).val() : param[0]);
}, $.validator.format( _lg('Saisissez une valeur différente de « {0} »') ));
$.validator.addMethod('verifDateSup', function(value, element, param) {
	if ($.datepicker.regional[LANGUE_META_SITE]) {
		var sFormat = $.datepicker.regional[LANGUE_META_SITE].dateFormat + ' hh nn ss',
			sValide = date2timestamp( sFormat, value) > date2timestamp( sFormat, param.length > 1 ? $(param[1]).val() : param[0]);
	} else {
		var sValide = !/Invalid|NaN/.test(new Date(value));
	}
	return this.optional(element) || sValide
}, $.validator.format( _lg('Saisissez une date supérieure à « {0} »') ));
$.validator.addMethod('verifDateSupEgal', function(value, element, param) {
	if ($.datepicker.regional[LANGUE_META_SITE]) {
		var sFormat = $.datepicker.regional[LANGUE_META_SITE].dateFormat + ' hh nn ss',
			sValide = date2timestamp( sFormat, value) >= date2timestamp( sFormat, param.length > 1 ? $(param[1]).val() : param[0]);
	} else {
		var sValide = !/Invalid|NaN/.test(new Date(value));
	}
	return this.optional(element) || sValide;
}, $.validator.format( _lg('Saisissez une date supérieure ou égal à « {0} »') ));
$.validator.addMethod('verifDateInfEgal', function(value, element, param) {
	if ($.datepicker.regional[LANGUE_META_SITE]) {
		var sFormat = $.datepicker.regional[LANGUE_META_SITE].dateFormat + ' hh nn ss',
			sValide = date2timestamp( sFormat, value) <= date2timestamp( sFormat, param.length > 1 ? $(param[1]).val() : param[0]);
	} else {
		var sValide = !/Invalid|NaN/.test(new Date(value));
	}
	return this.optional(element) || sValide;
}, $.validator.format( _lg('Saisissez une date inférieure ou égal à « {0} »') ));
