function mod_formulaire(sForm, sMod) {
	if (sMod.substring(0, 3) == 'eff') {
		$(sForm + ' :text').attr('readonly', 'readonly');
	}
}

function select(o, mode) {
	if (o) {
		switch (o.type.toLowerCase()) {
			case 'select':
				o.options.selected = (mode == 'toggle') ? !o.options.selected : $is_true(mode, true);
			break;
			case 'select-multiple':
				if (mode == 'toggle') {
					$.each( o.options, function() {
						this.selected = !this.selected;
					});
				} else {
					mode = $is_true(mode, true);
					$.each( o.options, function() {
						this.selected = mode;
					});
				}
		}
	}
}

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')) {
			$('#dialog_disableForm').html(sHtml).data('fermer', s.fermer).dialog('option', {
				title: s.titre,
				closeOnEscape: s.fermer,
				height: $('#dialog_disableForm').width(500).height()
			}).dialog('open');
		} else {
			$('body').append('<div id="dialog_disableForm" title="' + s.titre + '">' + sHtml + '</div>');
			$('#dialog_disableForm').data('fermer', s.fermer).dialog({
				resizable: false,
				closeOnEscape: s.fermer,
				draggable: false,
				height: $('#dialog_disableForm').width(500).height(),
				width: 500,
				modal: true,
				open: function(){
					if( ! $(this).data('fermer')) {
						$(this).parents('.ui-dialog:first').find('.ui-dialog-titlebar-close').remove();
					}
				}
			});
		}
	},
	hide : function() {
		$('#dialog_disableForm').dialog('close');
	}
};

function countCar() {
	$("textarea[class*='js-maxlength:']").each(function() {
		var cpt = this.id + '-maxlength';
		if( $id(cpt) && ! $(this).data('countCar')) {
			var m = this.className.match(/js-maxlength:(\d+)/);
			this.maxVal = $.isArray(m) ? m[1] : 0;
			$(this).keyup(function() {
				textareaLenght( this, cpt);
			}).keypress(function() {
				textareaLenght( this, cpt);
			}).data('countCar', true);
			textareaLenght(this, cpt);
		}
	});
	function textareaLenght( o, cpt) {
		var len = o.value.length,
			s = o.value.replace(/\r\n/g,'--').replace(/\n/g,'--'), // retour chariot = 2car
			t = s.length - len;
		if ((len + t) > o.maxVal) {
			o.value = o.value.substring(0, o.maxVal - t);
		}
		var iLng = o.maxVal - o.value.length - t;
		$('#' + cpt).html( ' : ' +
			sprintf(
				pluriel(
					_lg("<strong>%s</strong> caractère restant"),
					_lg("<strong>%s</strong> caractères restants"),
					iLng),
				_lgNombre(iLng)
			)
		);
	}
}
$( function() { countCar(); });

// @#$ ne marche pas dans le domReady
function disabledAutoComplete() {
	$(':password').attr('autocomplete', 'off');
}

// test
$.validator.addMethod('emailing', function(value, element, param) {
	var bValide = true,
		aMails = value.replace(/\s+/g,'').split(';');
	for (var i = 0; i < aMails.length; 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('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) || /^[\s\d]{6,15}$/.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'));

// 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} »') ));