var memo_obj = new Array();
var url_chargee = new Array();
var xhr_actifs = {};

function findObj_test_forcer(n, forcer) { 
	var p,i,x;

	// Voir si on n'a pas deja memorise cet element
	if (memo_obj[n] && !forcer) {
		return memo_obj[n];
	}

	var d = document; 
	if((p = n.indexOf("?"))>0 && parent.frames.length) {
		d = parent.frames[n.substring(p+1)].document; 
		n = n.substring(0,p);
	}
	if(!(x = d[n]) && d.all) {
		x = d.all[n]; 
	}
	for (i = 0; !x && i<d.forms.length; i++) {
		x = d.forms[i][n];
	}
	for(i=0; !x && d.layers && i<d.layers.length; i++) x = findObj(n,d.layers[i].document);
	if(!x && document.getElementById) x = document.getElementById(n); 

	// Memoriser l'element
	if (!forcer) memo_obj[n] = x;
	return x;
}

function findObj(n) { 
	return findObj_test_forcer(n, false);
}
// findObj sans memorisation de l'objet - avec Ajax, les elements se deplacent dans DOM
function findObj_forcer(n) { 
	return findObj_test_forcer(n, true);
}

function hide_obj(obj) {
	var element;
	if (element = findObj(obj)){
		jQuery(element).css("visibility","hidden");
	}
}

// deplier un ou plusieurs blocs
jQuery.fn.showother = function(cible) {
	var me = this;
	if (me.is('.replie')) {
		me.addClass('deplie').removeClass('replie');
		jQuery(cible)
		.slideDown('fast',
			function(){
				jQuery(me)
				.addClass('blocdeplie')
				.removeClass('blocreplie')
				.removeClass('togglewait');
			}
		);
	}
	return this;
}

// replier un ou plusieurs blocs
jQuery.fn.hideother = function(cible) {
	var me = this;
	if (!me.is('.replie')){
		me.addClass('replie').removeClass('deplie');
		jQuery(cible)
		.slideUp('fast',
			function(){
				jQuery(me)
				.addClass('blocreplie')
				.removeClass('blocdeplie')
				.removeClass('togglewait');
			}
		);
}
	return this;
}

// pour le bouton qui deplie/replie un ou plusieurs blocs
jQuery.fn.toggleother = function(cible) {
	if (this.is('.deplie'))
		return this.hideother(cible);
	else
		return this.showother(cible);
}

// deplier/replier en hover
// on le fait subtilement : on attend 400ms avant de deplier, periode
// durant laquelle, si la souris  sort du controle, on annule le depliement
// le repliement ne fonctionne qu'au clic
// Cette fonction est appelee a chaque hover d'un bloc depliable
// la premiere fois, elle initialise le fonctionnement du bloc ; ensuite
// elle ne fait plus rien
jQuery.fn.depliant = function(cible) {
	// premier passage
	if (!this.is('.depliant')) {
		var time = 400;

		var me = this;
		this
		.addClass('depliant');

		// effectuer le premier hover
		if (!me.is('.deplie')) {
			me.addClass('hover')
			.addClass('togglewait');
			var t = setTimeout(function(){
				me.toggleother(cible);
				t = null;
			}, time);
		}

		me
		// programmer les futurs hover
		.hover(function(e){
			me
			.addClass('hover');
			if (!me.is('.deplie')) {
				me.addClass('togglewait');
				if (t) { clearTimeout(t); t = null; }
				t = setTimeout(function(){
					me.toggleother(cible);
					t = null;
					}, time);
			}
		}
		, function(e){
			if (t) { clearTimeout(t); t = null; }
			me
			.removeClass('hover');
		})

		// gerer le triangle clicable
		/*.find("a.titremancre")
			.click(function(){
				if (me.is('.togglewait') || t) return false;
				me
				.toggleother(cible);
				return false;
			})*/
		.end();

	}
	return this;
}
jQuery.fn.depliant_clicancre = function(cible) {
		var me = this.parent();
		// gerer le triangle clicable
		if (me.is('.togglewait')) return false;
		me.toggleother(cible);
		return false;
}


