// plugin jQuery
$.fn.initClass = function( sNewClass) {
	return this.each(function() {
		$(this).removeClass().addClass( sNewClass);
	});
};
$.fn.replaceClass = function( sOldClass, sNewClass) {
	return this.each(function() {
		$(this).removeClass( sOldClass).addClass( sNewClass);
	});
};
$.fn.check = function(opt) {
	return this.each(function() {
		this.checked = (opt == 'toggle') ? !this.checked : $is_true(opt, true);
	});
};
$.fn.visible = function() {
	return this.each(function() {
		$(this).css({ visibility: 'visible' });
	});
};
$.fn.hidden = function() {
	return this.each(function() {
		$(this).css({ visibility: 'hidden' });
	});
};
$.fn.toShow = function( b) {
	var fct = $is_true(b, false) ? 'show' : 'hide';
	return this.each(function() {
		$(this)[fct]();
	});
};

$.fn.overlabel = function( options) {
// en attente de placeholder et HTML 5 ! pb avec la verif de form, si erreur ne pas réafficher l'overlabel
	var o = $.extend({
		label_class: 'overlabel-defaut'
	}, options);

	return this.each(function(){
		var label = $(this),
			id = this.htmlFor || label.attr('for');

		if( id != '') {
			var sId = id.replace(/\:/, '\\:');
		} else {
			return this;
		}

		function overFocus( oL) {
			oL.hide();
		}
		function overBlur(jqO) {
			if( jqO.val() == '') {
				label.css({ position: 'absolute'}).show();
			}
		}
		function overRefresh( jqO) {
			jqO.everyTime(500, 'checkEmpty', function() {
				if( this.value == '') {
					overBlur( $(this));
				} else {
					overFocus( label);
				}
			});
		}

		// si title on change le label
		if( $('#' + sId).attr('title') != '') {
			label.text( $('#' + sId).attr('title'));
		}
		label.addClass(o.label_class);

		$('#' + sId)
			.focus( function() {
				overFocus( label);
				$(this).stopTime( 'checkEmpty');
			})
			.blur( function() {
				overBlur( $(this));
				overRefresh( $(this));
			});

		// init
		overFocus( label);
		overBlur( $('#' + sId));
		overRefresh( $('#' + sId));
	});
};

$.fn.contenuAjax = function( options) {
	// Options
	var o = $.extend( {
		url: '',
		type: 'get',
		data: '',
		dataType: 'html',
		place: 'append',
		loadclass: 'ajaxloading_small',
		timeout: 0,
		success_callback: function(){},
		error_callback: function(){},
		complete_callback: function(){},
		beforeSend_callback: function(){}
	}, options);

	return this.each(function(){
		var t = $(this);

		$.ajax({
			url: o.url,
			type: o.type,
			data: o.data,
			dataType: o.dataType,
			context: $(this),
			beforeSend : function() {
				t.addClass(o.loadclass);
				o.beforeSend_callback();
			},
			error: function(oXhr, sStatus, errorThrown) {
				o.error_callback();
			},
			success: function(data) {
				if( o.place !== null) {
					t[o.place](data);
				}
				o.success_callback(data);
			},
			complete: function() {
				t.removeClass(o.loadclass);
				o.complete_callback();
			}
		});
	});
};

/*** TOGGLE ***/
function toggle( opt) {
	if($defined(opt.classDefaut)) {
		var bCookie = false, aCookie = [],
			s = $.extend({
				classDefaut: '', // ni ouvert, ni fermé
				classClose: $defined(opt.classClose) ? opt.classClose : opt.classDefaut + '-close', // fermé
				classOpen: $defined(opt.classOpen) ? opt.classOpen : opt.classDefaut + '-open', // ouvert
				openStart: false, // false = fermé, true = ouvert au démarrage
				cookieName: '', // si non vide, save ds cookie
				idName: $defined(opt.idName) ? opt.idName : opt.cookieName + '-', // endroit où on click: ex : html->panel-15 donc idName = panel
				idPanel: '', // si le "contenu click" et éloigné du "contenu à ouvrir" Ex : html-> tog-panel-15 donc idPanel = tog
				forceId: [], // force des contenus au démarrage
				animation: '', // cf. slideToggle
				click_callback: function(){} // au click
			}, opt);

		if( $defined(s.cookieName) && s.cookieName != '' ) {
			aCookie = ($.cookie( s.cookieName) || '').split('\.');
			bCookie = true;
		}

		$('.' + s.classDefaut).click(function() {
			var iId = this.id.replace(s.idName, ''),
				oPanel = (s.idPanel == '' ? $(this).next() : $('#' + s.idPanel + '-' + this.id));
			// Action
			if( s.animation != '') {
				oPanel.slideToggle(s.animation);
			} else {
				oPanel.toggle();
			}

			if( $(this).hasClass(s.classOpen)) {
				$(this).replaceClass( s.classOpen, s.classClose);
			} else {
				$(this).replaceClass( s.classClose, s.classOpen);
			}

			if( bCookie) {
				if( iId + '' != '' ) {
					var iPos;
					if( (iPos = $.inArray(iId, aCookie)) != -1) {
						do {
							aCookie.splice(iPos, 1);
						} while( (iPos = $.inArray(iId, aCookie)) != -1)
					} else {
						aCookie.push(iId);
					}
					$.cookie( s.cookieName, aCookie.join('.'), {expires: 365} );
				}
			}
			s.click_callback( this);
		}).each(function() {
			// Initialisation
			var iId = this.id.replace(s.idName, ''),
				bIsCookie = ($.inArray(iId, aCookie) != -1),
				bIsForced = ($.inArray(iId, s.forceId) != -1),
				oPanel = (s.idPanel == '' ? $(this).next() : $('#' + s.idPanel + '-' + this.id));

			if ( (s.openStart && !bIsCookie && !bIsForced) || (!s.openStart && (bIsCookie || bIsForced))) {
				$(this).replaceClass(s.classDefaut, s.classOpen);
				oPanel.show();
			} else {
				$(this).replaceClass(s.classDefaut, s.classClose);
				oPanel.hide();
			}
			// ajout le forceid en cookie si non stocké
			if( bCookie && bIsForced) {
				if( iId + '' != '') {
					var iPos;
					if( (iPos = $.inArray(iId, aCookie)) == -1) {
						aCookie.push(iId);
						$.cookie( s.cookieName, aCookie.join('.'), {expires: 365} );
					}
				}
			}
		});
	}
}

/*** CAPSLOCK **/
var capslock = {
	oImgWarning: document.createElement('img'),
	init: function( sRacineCharte) {
		$(':password').each(function() {
			$(this).keypress( function(e) {
				if( ((e.which >= 65 && e.which <=  90) && !e.shiftKey) ||
					((e.which >= 97 && e.which <= 122) && e.shiftKey)) { // majusule, sans shift
					capslock.show_warning(getSrcElement(e));
				} else {
					capslock.hide_warning(getSrcElement(e));
				}
			});
		});
		$(this.oImgWarning).attr({
			src: sRacineCharte + 'image/capslock.png',
			alt: _lg("Attention, la touche de Verr. Maj est activée.")
		}).css({
			position: 'absolute',
			display: 'none',
			zIndex: 999
		}).click( function() { $(this).hide() })
		.appendTo('body');
	},
	show_warning: function(targ) {
		var offset = $(targ).offset();
		$(this.oImgWarning).css({
			top: (offset.top - 65),
			left: (offset.left + $(targ).outerWidth())
		}).show();
	},
	hide_warning: function(targ) {
		$(this.oImgWarning).hide();
	}
};

/*** MULTISELECT ***/
var multiselect = {
	o: {
		selectBox1: null, // selecteur jquery
		selectBox2: null, // selecteur jquery
		defautBox2: null,
		url: ''
	},
	init: function(options) {
		if(options) {
			$.extend(this.o, options);
			$(this.o.selectBox1).change(this.upd);
			this.upd();
		}
	},
	upd: function() {
		var s = this.o;
		$.getJSON(s.url,{id: $(s.selectBox1).val(), ajax: 'true'}, function(j) {
			var i, oSel = $id( $(s.selectBox2).attr('id'));
			oSel.options.length = 0;
			for(i = 0; i < j.length; i++) {
				oSel.options[i] = new Option(j[i].optionDisplay, j[i].optionValue);
			}
		});
	}
};

// zebrure tb (IE)
function zebre(sSelecteur, sClass) {
	if( $.browser.msie) {
		sSelecteur = $defined( sSelecteur) ? sSelecteur + ' ' : 'table ';
		$(sSelecteur + 'tbody > tr:even').addClass( sClass);
	}
}

// langue
function _lg(s) {
	return ($defined(i18n) && i18n[s]) ? i18n[s] : s;
}
function _lgNombre(n) {
	var o = '';
	n += '';
	for( i = n.length; i > 3; i -= 3) {
		o = i18n.thousands_sep + n.slice(i - 3, i) + o;
	}
	return ( n.slice(0, i) + o);
}
function sprintf(s) {
	var i, bits = s.split('%'),
		out = bits[0],
		re = /^([ds])(.*)$/;

	for( i = 1; i < bits.length; i++) {
		var p = re.exec(bits[i]);
		if (!p || arguments[i] === null) continue;
		if (p[1] == 'd') {
			out += parseInt(arguments[i], 10);
		} else if (p[1] == 's') {
			out += arguments[i];
		}
		out += p[2];
	}
	return out;
}
function pluriel(s, p, n) { //ex: sprintf(pluriel( _lg("%s sungulier", _lg('%s pluriels"), iNb), _lgNombre(iNb))
	return n != 1 ? p : s;
}
function _lgDialogBouton( selecteur) {
	$(selecteur).dialog('widget').find('.ui-dialog-buttonpane .ui-button-text').each(function() {
		var s = 'Non traduit';
		switch( $(this).text()) {
			case 'Annuler': s = _lg('Annuler'); break;
			case 'Enregistrer': s = _lg('Enregistrer');	break;
			case 'Fermer': s = _lg('Fermer'); break;
			case 'Supprimer': s = _lg('Supprimer');	break;
			case 'Transmettre': s =	_lg('Transmettre'); break;
		}
		$(this).text( s);
	});
}

// renvoi JUSTE si on est loggué ou pas
function test_ident( options) {
	var oXhr = false,
		o = $.extend( {
			url: URL_SITE + 'index.php',
			data: 'p=identification&mod=test_ident',
			afficheMsg : true,
			msg: constante('ajaxIdentError')
		}, options);

	$.ajax({
		url: o.url,
		data: o.data,
		timeout: 10000,
		async: false,
		error: function(oXhr, sStatus, errorThrown) {
			alert( constante('ajaxError'));
			oXhr = false;
		},
		success: function(data) {
			oXhr = (data == 'ok');
		}
	});
	if( !oXhr && o.afficheMsg) {
		alert( o.msg);
	}
	return oXhr;
}

// "Constante" prédéfinie
function constante( sCode, aParam) {
	switch( sCode) {
		case 'datepicker' : return _lg( 'Choisissez une date');
		case 'ajaxError' : return _lg( 'Une erreur est survenue :\n\nRafraichissez la page et essayer à nouveau.\nSi le problème persiste, contactez le webmaster.');
		case 'ajaxIdentError' : return _lg( 'Votre session est terminée :\n\nRafraichissez la page et essayer à nouveau.\nSi le problème persiste, contactez le webmaster.');
		case 'formError' : return sprintf(
				pluriel(
					_lg( 'Erreur de saisie : %s erreur rencontrée lors de la validation du formulaire.'),
					_lg( 'Erreur de saisie : %s erreurs rencontrées lors de la validation du formulaire.'),
					aParam
				),
				_lgNombre( aParam)
			);
		default: return '[Erreur code: "' + sCode + '" inconnu.]';
	}
}

// Encode
function js_encode( s) { return s.replace(/\\/g, '\\\\').replace(/"/g, '\&#34;').replace(/\'/g, '\&#39'); }
function url_encode( s) { return encodeURIComponent( s); }
function url_decode( s) { return decodeURIComponent( s); }
function html_encode( s) { return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '\&#34;'); }
function html_decode( s) { return s.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&#34/g, '"'); }
function isHtml_encode( s) { return (s.search(/&amp;/g) != -1 || s.search(/&lt;/g) != -1 || s.search(/&gt;/g) != -1 || s.search(/&#34;/g) != -1); }
function html_decode_if_encode() { return isHtml_encode(s) ? html_decode(s) : s; }

// Tronque la chaine passée en paramètre
function tronquer( s, iMax) {
	s = $.trim( s);
	return ( s.length > iMax ) ? s.substr( 0, iMax / 2) + '[\u2026]' + Right(s, iMax / 2) : s;
}
// coupe
function couper( s, iMax) {
	s = $.trim( s);
	return ( s.length > iMax ) ? Left(s, iMax) + '[\u2026]' : s;
}

function Left( s, n){
	if( n <= 0) {
		return '';
	} else if( n > String(s).length){
		return s;
	} else {
		return String(s).substring(0, n);
	}
}
function Right( s, n){
	if( n <= 0) {
		return '';
	} else if (n > String(s).length) {
		return s;
	} else {
		var iLen = String(s).length;
		return String(s).substring(iLen, iLen - n);
	}
}

// Date
function date2timestamp( sFormat, sDate){ // dd/mm/yy hh.nn.ss
	var sPosD = sFormat.indexOf('d'),
		sPosM = sFormat.indexOf('m'),
		sPosY = sFormat.indexOf('y'),
		sPosH = sFormat.indexOf('h'),
		sPosMn = sFormat.indexOf('n'),
		sPosS = sFormat.indexOf('s'),
		d = sDate.substring( sPosD, sPosD + 2),
		m = sDate.substring( sPosM, sPosM + 2),
		y = sDate.substring( sPosY, sPosY + 4),
		h = sDate.substring( sPosH + 2, sPosH + 4), // ! yy = 4
		mn = sDate.substring( sPosMn + 2, sPosMn + 4),
		s = sDate.substring( sPosS + 2, sPosS + 4);
	return new Date( y, m, d, h, mn, s).getTime();
}

// syncho avec PHP
function format_html_id( s, sReplace) {
	sReplace = $defined(sReplace) ? sReplace : '';
	return s.replace(/^[^a-z_]+/i, sReplace).replace(/\W+/, sReplace);
}

function format_decimal( s, sReplace) {
	sReplace = $defined(sReplace) ? sReplace : '\.';
	switch( i18n.decimal_sep) {
		case ',': return Number( String(s).replace(',', sReplace));
		case '٫': return Number( String(s).replace('٫', sReplace)); // \u066B
		default: return Number( s);
	}
}

// @see d_box_alert en php
function d_box_alert( options) {
	var o = $.extend({
		code: 'attention',
		text: '',
		id: 'box_alert'
	}, options);

	switch( o.code) {
		case 'attention': sCode = ' help-attention'; break;
		case 'information': sCode = ' help-information'; break;
		case 'critique': sCode = ' help-critique'; break;
		case 'interrogation': sCode = ' help-interrogation'; break;
		case 'formulaire-echec': sCode = ' help-form-echec'; break;
		case 'formulaire-ok': sCode = ' help-form-ok'; break;
		default: sCode = '';
	}

	return '<div id="' + o.id + '" class="helpBoxInfos-ON ' + sCode + '">' + o.text + '</div>';
}

// Events
function getEvent(e) { return e || window.event; }
function getSrcElement(e) { return	e.target || e.srcElement; }

function $redirect(sUrl, oWindow) {
	if( !$defined(oWindow)) oWindow = window;
	if( !$defined(sUrl) || sUrl == '') sUrl = oWindow.location;
	oWindow.location = sUrl;
}

function $defined(o) { return (o != undefined); }
function $is_true(t, v) { return $defined(t) ? t : v; }

function $id( s) {
	return s ? document.getElementById(s) : null;
}

function $insertCSS(url, sMedia) {
	$('head').append('<link rel="stylesheet" href="' + url + '" type="text/css" media="' + (sMedia || 'screen') + '" />');
}
function $insertScript(url) {
	$('head').append( $('<script>', { src: url}));
}

// tableau
function ArrayDedoublonne(aOrigine) {
	var bDoublon, i, j, k = 0, aTab = [];
	for( i = 0, length = aOrigine.length; i < length; i++) {
		bDoublon = false;
		for(j = 0; j < k && !bDoublon; j++) {
			if(aOrigine[i] === aTab[j]) {
				bDoublon = true;
			}
		}
		if( !bDoublon) {
			aTab[k++] = aOrigine[i];
		}
	}
	return aTab;
}

// recherche dichotomique si déjà trié sinon -> $.inArray
// bType (true = entier)
function ArrayRecherche_dicho(aOrigine, valeur, bType) {
	var trouve = -1, valTab, milieu = 0,
		debut = 0, // debut du tableau
		fin = aOrigine.length; // fin du tableau

	valeur = bType ? parseFloat(valeur) : valeur.toString();
	if( fin > 0) {
		while (trouve == -1) {
			milieu = Math.floor((debut + fin ) / 2);
			valTab = bType ? parseFloat(aOrigine[milieu]) : aOrigine[milieu].toString();
			if (valTab === valeur) {
				trouve = milieu;
			} else {
				if( fin - debut <= 1) {
					break;
				} else {
					if( valTab > valeur) {
						fin = milieu;
					} else {
						debut = milieu;
					}
				}
			}
		}
	}
	return trouve;
}
// pour trier des nombres (croissant) : tab.sort(compare_num)
// tab.sort() (croissant) pour des chaines
function trie_num_croissant(a, b) { return a - b; }
function trie_num_decroissant(a, b) { return b - a; }

function get_url_param( sUrl, sParam, bTous) {
	var aResults = new RegExp( "[\\?&]" + sParam.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]") + "=([^&#]*)").exec( sUrl);
	return $is_true(bTous, false) ? aResults : ( aResults === null ? null : aResults[1]);
}

// popup
var WindowPopupReference = null;
function popup(sURL, sNom, sOption, iW, iH, isCenter) {
//if(WindowPopupReference == null || WindowPopupReference.closed) {
	if (sOption == 'all=yes') {
		sOption = 'directories=1,location=1,menubar=1,resizable=1,scrollbars=1,status=1,toolbar=1';
	}
	sOption += ((sOption != '') ? ',' : '') + 'width=' + iW + ',height=' + iH;
	if (window.screen && isCenter) {
		sOption += ',left=' + ((screen.width - iW) / 2) + ',top=' + ((screen.height - iH) / 2);
	}
	WindowPopupReference = window.open(sURL, sNom, sOption);
	WindowPopupReference.focus();
/*}
else
	WindowPopupReference.focus();*/
}

// DEBUG
var dW = null;
function debug(text) {
	if (!window.top.dW || window.top.dW.closed) {
		showDebug();
	}
	dW = window.top.dW.document.write(text + '\n');
}
function showDebug() {
	window.top.dW = window.open('', 'Debug', 'left=0,top=0,width=300,height=700,scrollbars=yes,status=yes,resizable=yes');
	window.top.dW.opener = self;
	window.top.dW.document.open();
	window.top.dW.document.write('<html><head><title>Debug</title></head><body><div align="right" onclick="if(wp = window.opener){wp.hideDebug();wp.showDebug();}">[ Reset ]</div><pre>\n');
}
function hideDebug() {
	if (window.top.dW && ! window.top.dW.closed) {
		window.top.dW.close();
		window.top.dW = null;
	}
}

// Geolocalisation GOOGLE V3
var oGMAPV3_OPTION = null;
function gmapv3_async( option) {
	oGMAPV3_OPTION = option;
	if( typeof google == 'undefined') {
		$insertScript( 'http://maps.google.com/maps/api/js?sensor=false&language=' + LANGUE_META_SITE + '&callback=gmapv3_init');
	} else {
		return gmapv3_init();
	}
}
function gmapv3_init( option) {
	var o = $defined(option) ? option : oGMAPV3_OPTION;
	return new oGmapv3( o).init();
}
function oGmapv3( option) { // return objet (sauf en async)
	this.o = $.extend({
		mapConteneur: null, // map
		mapH: 320,
		mapW: 'auto',
		mapLat:	46.5,
		mapLng:	2.4,
		mapTypeId: '',
		mapZoom: 5,
		aMarker: [], // [titre || title], [champLat, champLng]
		iwTpl: null,
		conteneur: null,
		rechercher: false,
		geolocMoi: false
	}, option);

	this.map = null;

	this.init = function() {
		var t = this;

		if( t.o.mapConteneur !== null && $id(t.o.mapConteneur)) {
			if( t.o.conteneur !== null) {
				$('#' + t.o.conteneur).show();
			}
			$('#' + t.o.mapConteneur).css({ height: t.o.mapH, width: t.o.mapW});

			t.map = new google.maps.Map( $id(t.o.mapConteneur), {
				scrollwheel: false,
				zoom: parseInt( t.o.mapZoom) || 5,
				center: new google.maps.LatLng( parseFloat( t.o.mapLat) || 46.5, parseFloat( t.o.mapLng) || 2.4),
				mapTypeId: google.maps.MapTypeId.ROADMAP,
				mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}
			});
			if( t.o.mapTypeId != '' && t.o.mapTypeId !== null) {
				t.map.setMapTypeId( t.o.mapTypeId);
			}

			t.genererMarkers();

			if( t.o.rechercher) {
				var geocoder = new google.maps.Geocoder();

				$('#' + t.o.mapConteneur)
					.before('<label for="geomap_recherche_geocoding_' + t.o.mapConteneur + '" class="nomarge">' + _lg('Adresse&nbsp;:') + '</label>')
					.before( $('<input/>', {
							type: 'text',
							id: 'geomap_recherche_geocoding_' + t.o.mapConteneur,
							'class': 'mInput',
							'keypress': function(e) { // @#! IE
								if( e.which == 13) {
									$(this).next('input').click();
									return false;
								}
							}
						})
					).before( $('<input/>', {
						type: 'button',
						'class': 'small_btn',
						value: _lg('Rechercher'),
						click: function() {
							var sAdresse = $.trim( $('#geomap_recherche_geocoding_' + t.o.mapConteneur).val());
							if( sAdresse == '') {
								alert( _lg('Merci de renseigner le champ « adresse »'));
							} else {
								geocoder.geocode( { 'address': sAdresse }, function(results, status) {
									if( status == google.maps.GeocoderStatus.OK) {
										var oMarker = t.marker();
										oMarker.setPosition( results[0].geometry.location);
										t.map.setCenter( results[0].geometry.location);
										//t.map.setZoom(16);
										t.updateChamp( oMarker);
									} else {
										alert( _lg('La localisation a échouée.'));
									}
								});
							}
						}
					})
				);
			}
			if( t.o.geolocMoi && navigator.geolocation) {
				$('#' + t.o.mapConteneur).before( '<span/>').prev('span').append( $('<input/>', {
						type: 'button',
						'class': 'medium_btn',
						value: _lg('Géolocalisez-moi'),
						click: function() {
							var oBtn = $(this);
							oBtn.hide().parents('span').addClass('ajaxloading_small').css({ 'padding-left': oBtn.width()});
							navigator.geolocation.getCurrentPosition( function( position) {
								var oLatLng = new google.maps.LatLng( position.coords.latitude, position.coords.longitude),
									oMarker = t.marker();
								oMarker.setPosition( oLatLng);
								t.map.setCenter( oLatLng);
								//t.map.setZoom(5);
								t.updateChamp( oMarker);
								oBtn.show().parent('span').css({ padding:0 }).removeClass();
							}, function( errorcode) {
								oBtn.show().parent('span').css({ padding:0 }).removeClass();
							});
						}
					})
				);
			}
			return t;
		} else {
			return false;
		}
	};

	this.genererMarkers = function() {
		var t = this;
		for( var i = 0; i < t.o.aMarker.length; i++) {
			if( parseFloat(t.o.aMarker[i].lat) && parseFloat(t.o.aMarker[i].lng)) {
				var oMarker = new google.maps.Marker({
					position: new google.maps.LatLng( parseFloat(t.o.aMarker[i].lat), parseFloat(t.o.aMarker[i].lng)),
					map: t.map,
					title: t.o.aMarker[i].titre || t.o.aMarker[i].title || '',
					draggable: t.o.aMarker[i].draggable || false,
					champLat: t.o.aMarker[i].champLat || '',
					champLng: t.o.aMarker[i].champLng || ''
				});
				if( t.o.aMarker[i].draggable) {
					google.maps.event.addListener( oMarker, 'dragend', function() {
						t.map.setCenter( oMarker.position);
						t.updateChamp( oMarker, oMarker.position.lat(), oMarker.position.lng());
					});
				}

				// evite d'écraser des propriétés
				t.o.aMarker[i].marker = oMarker;

				if( $.isFunction(t.o.iwTpl)) {
					var oInfoWindow = new google.maps.InfoWindow({
						content: t.o.iwTpl( t.o.aMarker[i])
					});
					google.maps.event.addListener(oMarker, 'click', t.openInfoWindow( oInfoWindow, oMarker));
				}
			}
		}
	};

	this.updateChamp = function( oMarker) {
		if(	oMarker.champLat != '') { $('#' + oMarker.champLat).val( oMarker.position.lat()); }
		if(	oMarker.champLng != '') { $('#' + oMarker.champLng).val( oMarker.position.lng()); }
	};

	this.openInfoWindow = function(oInfoWindow, oMarker) {
		return function() {
			//var map = oMarker.getMap();
			// Fermer la dernière bulle ouverte avant d'ouvrir celle demandé
			if (this.map.visibleInfoWindow) {
				this.map.visibleInfoWindow.close();
			}
			oInfoWindow.open(this.map, oMarker);
			this.map.visibleInfoWindow = oInfoWindow;
		};
	};

	this.repereId = function( oRepere, bId) {
		var i, iCount = this.o.aMarker.length;
		for(i = 0; i < iCount; i++) {
			if ( this.o.aMarker[i] !== null) {
				if ( this.o.aMarker[i].marker == oRepere) {
					return $is_true( bId, true) ? this.o.aMarker[i] : i;
				}
			}
		}
		return $is_true( bId, true) ? null : 0;
	};

	this.marker = function( iIndex) {
		var iId = parseInt(iIndex) ? iIndex : 0;
		return this.o.aMarker[iId].marker || 0;
	};
}

/* DEMANDE DE CONFIRMATION FAUSSE POPUP */
function confirmerSuppression( options) {
	var o = $.extend({
		selecteur: '.jsSupprConfirm',
		message: _lg('Voulez-vous supprimer cet élément ?'),
		titre: _lg('Suppression')
	}, options);
	$(o.selecteur).click(function() {
		var lienSuppr = this.href,
			oDiv = document.createElement('div');
		$('body').append(oDiv);
		$(oDiv).html( o.message).dialog({
			title: o.titre,
			modal: true,
			closeText: _lg('Fermer'),
			buttons: {
				'Annuler': function() { $(oDiv).remove(); },
				'Supprimer': function() { $redirect(lienSuppr); }
			}
		});
		_lgDialogBouton( o.selecteur);
		return false;
	});
}
