
/*
 * Compilation 06-02-2012 20:26:05
 */


var Loading = new Class({
	
	initialize : function ()
	{
		if (!$('boite-chargement-en-cours'))
		{
			this.boite_chargement = new Element('div', {id: 'boite-chargement-en-cours'});
			this.boite_chargement.adopt(
				new Element('div').addClass('interieur')
					.set('text', __i8n('chargement-en-cours'))
			);
			this.boite_chargement.inject($$('body')[0], 'top');
		}
		else
		{
			this.boite_chargement = $('boite-chargement-en-cours');
		}
	},
	
	view : function (tempo)
	{
		if (tempo > 0)
		{
			this._tempo = this._display.delay(tempo, this);
			return;
		}
		
		this._display();
	},
	
	hide : function ()
	{
		this._hide();
	},
	
	_display : function ()
	{
		this.boite_chargement.setStyle('display', 'block');
	},
	
	_hide : function ()
	{
		$clear(this._tempo);
		this.boite_chargement.setStyle('display', 'none');
	}
	
});


// depends :

/*
 * Permet le trie sur une arborescence
 */


var FilterTree = new Class({

	initialize : function (tree)
	{
		this.instanceTree = tree;
		this.filterEntry = new Element('input', {id:'filterEntry', type:'text'});
		this.filterEntry.addClass('search-tree')
			.inject($(this.instanceTree.id_arbre), 'top')
			.addEvent('keyup', this.checkUpdate.bind(this));
		
		this.time;
	},
	
	checkUpdate : function (event)
	{

		//~ if (this.time == undefined || this.time)
		//~ {
			$clear(this.time);
			this.time = this.update.delay(500, this, event);
			return;
		//~ }
	},
	
	update : function (event)
	{
		event = new Event(event);
		
		$$('.found').removeClass('found');
		event.target
			.removeClass('no-results-found')
			.removeClass('results-found');
		
		var search = event.target.get('value');
		if (!search)
		{
			return;
		}
		
		var countResults = 0;
		search = "^"+search.escapeRegExp();
		var nodeElement;
		
		this.instanceTree.nodesList.each(function (idNode)
		{
			nodeElement = $('lien-' + idNode);
			if (nodeElement && nodeElement.getFirst().get('text').test(search, 'i'))
			{
				nodeElement.addClass('found');
				this.instanceTree.openUntil(idNode);
				countResults++;
			}
		}.bind(this));
		
		
		if (countResults > 0)
		{
			event.target
				.removeClass('no-results-found')
				.addClass('results-found');
		}
		else
		{
			event.target
				.removeClass('results-found')
				.addClass('no-results-found');
		}
	}
});



/*
 * Gestionnaire de calendrier
 * 
 * Permet l'affichage d'un calendrier et la sélection d'une date
 * 
 * Nécessite Mootools
 */

var Calendrier = new Class({
	
	Implements : [Options, Events],

	options	: {
		utiliser_fermer	: true,
		avec_heure		: false,
		pathImages		: ''
	},
	
	initialize	: function(date, options)
	{
		if (options)
		{
			this.setOptions(options);
		}
		
		// TODO : faire l'internationnalisation
		this.liste_mois		= ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Aout','Septembre','Octobre','Novembre','Décembre'];
		this.liste_jours	= ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'];
		
		this.nombre_jours	= [31,28,31,30,31,30,31,31,30,31,30,31];
		
		// controle si on se trouve dans une année bisextile //
		if (this.annee % 4 === 0 && this.annee % 100 !== 0 || this.annee % 400 === 0)
		{
			// modifie le nombre de jours du mois de Février //
			this.nombre_jours[1] = 29;
		}
		
		this.date_en_cours = date;
		this.id = this.options.id?this.options.id:'calendrier';
	},
	
	afficher	: function()
	{
		this.construire_calendrier();
	},
	
	update		: function()
	{
		this.construire_calendrier();
	},
	
	construire_calendrier	: function()
	{
		// si pas de conteneur spécifié //
		if (!this.options.container)
		{
			return;
		}
		
		this.jour = this.date_en_cours.getDate();
		this.annee = this.date_en_cours.getFullYear();
		this.mois = this.date_en_cours.getMonth();
		this.premier_jour = new Date(this.annee, this.mois, 1);
		this.dernier_jour = new Date(this.annee, this.mois, this.nombre_jours[this.mois]);
		var premier_jour = !this.premier_jour.getDay()?7:this.premier_jour.getDay();
		
		// si le calendrier existe déjà //
		var div_calendrier;
		if ($(this.id))
		{
			div_calendrier = $(this.id).empty();
		}
		else
		{
			// on crée un nouveau calendrier //
			div_calendrier = new Element('div', {'id': this.id}).setStyle('opacity', 0);
		}
		
		// on ajoute les class optionelles //
		if (this.options.className && !div_calendrier.hasClass(this.options.className))
		{
			div_calendrier.addClass(this.options.className);
		}
		
		var table = new Element('table');
		var tbody = new Element('tbody');
		table.adopt(tbody);
		
		/* Définition de l'en-tête du tableau */
		var thead = new Element('thead');
		var tr_head = new Element('tr');
		var th_haut = new Element('th', {'colspan': 7});
		thead.adopt(tr_head.adopt(th_haut));
		
		// si on utilise l'option "fermer" //
		if (this.options.utiliser_fermer)
		{
			var div_fermer = new Element('div').addClass('fermer');
			var img_fermer = new Element('img', {'src':this.options.pathImages + '/close-calendar.png', 'alt':''});
			div_fermer.adopt(img_fermer);
			img_fermer.addEvent('click', this.fermer.bind(this));
			th_haut.adopt(div_fermer);
		}
		
		var div_mois = new Element('div').addClass('mois');
		var div_annee = new Element('div').addClass('annee');
		th_haut.adopt(div_mois, div_annee);

		var img_change_mois_gauche = new Element('img', {'src':this.options.pathImages + '/left-arrow.png','alt':''});
		var img_change_mois_droite = new Element('img', {'src':this.options.pathImages + '/right-arrow.png','alt':''});
		var text_mois = new Element('div').set('text', this.liste_mois[this.mois]);
		div_mois.adopt(img_change_mois_gauche, text_mois, img_change_mois_droite);
		
		var img_change_annee_gauche = new Element('img', {'src':this.options.pathImages + '/left-arrow.png','alt':''});
		var img_change_annee_droite = new Element('img', {'src':this.options.pathImages + '/right-arrow.png','alt':''});
		var text_annee = new Element('div').set('text', this.annee);
		div_annee.adopt(img_change_annee_gauche, text_annee, img_change_annee_droite);
		
		thead.adopt(new Element('tr').adopt(th_haut));
		
		// ajout les évènements sur les boutons //
		img_change_annee_gauche.addEvent('click', this.diminuer_annee.bind(this));
		img_change_annee_droite.addEvent('click', this.augmenter_annee.bind(this));
		img_change_mois_gauche.addEvent('click', this.diminuer_mois.bind(this));
		img_change_mois_droite.addEvent('click', this.augmenter_mois.bind(this));
		
		// liste les noms des jours //
		var libelle_jour = new Element('tr').addClass('header-jour');
		for (i = 1; i <= 7; i++)
		{
			libelle_jour.adopt(new Element('td').set('text', (this.liste_jours[i%7]).substr(0,3)));
		}
		tbody.adopt(libelle_jour);
		

		var tr_date = new Element('tr');
		var time = this.premier_jour.getTime() - ((premier_jour-1)*3600*24*1000);
		
		// pour les jours autres que les jours du mois en cours, on met la class 'autre-mois' //
		for (i = 1; i < premier_jour; i++)
		{
			var jour_avant = new Date(time);
			tr_date.adopt(new Element('td').addClass('autre-mois').set('text', jour_avant.getDate()));
			time += 3600*24*1000;
		}
		tbody.adopt(tr_date);
		
		var numero_jour_ligne;
		
		var functionLoop = {
			'click':	function (event)
			{
				event = new Event(event);
				this.jour_clique = event.target.get('text').toInt();
				this.fireEvent('clickdate');
			}.bind(this),
			'mouseover'	: function(event)
			{
				this.addClass('jour-mois-hover');
			},
			'mouseout'	: function(event)
			{
				this.removeClass('jour-mois-hover');
			}
		};
		
		for (i = 1; i <= this.nombre_jours[this.mois]; i++)
		{
			numero_jour_ligne = i+premier_jour-1;
			
			var td_jour = new Element('td').addClass('jour-mois')
				.set('text', i).addEvents(functionLoop);
			
			// si on est sur le jour en cours, on met la class 'jour-selectionne' //
			if (i == this.jour)
			{
				td_jour.addClass('jour-selectionne');
			}
			tr_date.adopt( td_jour );
			
			// fin de semaine //
			if (numero_jour_ligne % 7 === 0)
			{
				tr_date	= new Element('tr');
				tbody.adopt(tr_date);
			}
		}
		
		// si le dernier jour ne clos pas la semaine //
		if (numero_jour_ligne % 7 !== 0)
		{
			time = this.dernier_jour.getTime();
			var start = (numero_jour_ligne % 7) + 1;
			for (i = start; i <= 7; i++)
			{
				time += 3600*24*1000;
				var jour_apres = new Date(time);
				tr_date.adopt(new Element('td').addClass('autre-mois').set('text', jour_apres.getDate()));
			}
		}
		
		table.adopt(thead, tbody);
		div_calendrier.adopt(table);
		div_calendrier.injectInside(this.options.container);
		
		// affiche le calendrier //
		$(this.id).tween('opacity', 1);
		
		this.fireEvent('onUpdate');
	},
	
	diminuer_annee	: function()
	{
		this.date_en_cours = new Date(this.annee-1, this.mois, this.jour);
		this.construire_calendrier();
		this.fireEvent('changeannee');
	},
	
	augmenter_annee	: function()
	{
		this.date_en_cours = new Date(this.annee+1, this.mois, this.jour);
		this.construire_calendrier();
		this.fireEvent('changeannee');
	},
	
	augmenter_mois	: function()
	{
		this.date_en_cours = new Date(this.annee, this.mois+1, this.jour);
		this.construire_calendrier();
		this.fireEvent('changemois');
	},
	
	diminuer_mois	: function()
	{
		this.date_en_cours = new Date(this.annee, this.mois-1, this.jour);
		this.construire_calendrier();
		this.fireEvent('changemois');
	},
	
	fermer	: function()
	{
		this.fireEvent('close');
		var tween = new Fx.Tween($(this.id), {onComplete: function ()
		{
			if ($(this.id))
			{
				$(this.id).destroy();
			}
		}.bind(this)});
		
		tween.start('opacity', 0);
	},
	
	getJourClique	: function()
	{
		return this.jour_clique;
	},
	
	getJour	: function()
	{
		return this.jour;
	},
	
	getMois	: function()
	{
		return this.mois+1;
	},
	
	getAnnee	: function()
	{
		return this.annee;
	},
	
	getDate	: function()
	{
		var date;
		date  = (this.getJourClique() < 10)?'0'+this.getJourClique():this.getJourClique();
		date += '-'+( (this.getMois() < 10)?'0'+this.getMois():this.getMois() );
		date += '-'+this.getAnnee();
		if ( this.options.avec_heure )
		{
			var _date = new Date();
			date += ' ';
			date +=	(_date.getHours().toInt()< 10)?'0':'';
			date +=	_date.getHours()+':';
			date +=	(_date.getMinutes().toInt()< 10)?'0':'';
			date +=	_date.getMinutes()+':';
			date +=	(_date.getSeconds().toInt()< 10)?'0':'';
			date +=	_date.getSeconds();
		}
		return date;
	}
	
});

var charger_calendrier = function (champ)
{
	var id = 'calendier'+(champ.id?'-'+champ.id:'');
	var calen = new Calendrier(new Date(), {
		id			: id,
		className	: 'calendrier',
		container	: document.getElementsByTagName('body')[0],
		pathImages	: '/images/design/icons/calendar'
	});
	var max_char;
	if (champ.hasClass('avec-heure'))
	{
		calen.setOptions({avec_heure: true});
		max_char = 19;
	}
	else
	{
		max_char = 10;
	}
	
	// on règle la taille du champ du formulaire //
	champ.setStyles({'width':(1+max_char)+'ex','text-align':'center'});
	
	// quand on clique sur une date //
	calen.addEvent(
		'clickdate', function ()
		{
			champ.value = this.getDate();
			champ.fireEvent('change');
			this.fermer();
		}
	);
	
	// on ajoute l'image du calendrier à coté du champ //
	var img = new Element('img', {'src':'/images/design/icons/calendar.png','alt':''});
	img.addClass('calendrier-icone').addEvents({
		'click'	: function (event)
		{
			event = new Event(event).stop();
			if (!$(id))
			{
				calen.afficher();
				$(id).setStyles({'position':'absolute', 'top': event.page.y, 'left': event.page.x});
			}
			else
			{
				calen.fermer();
			}
		}
	});
	img.injectAfter(champ);
};



/*
 * Gestion de l'upload progress bar
 */
var CUploadProgress = new Class({
	
	Implements: [Options],
	
	initialize : function (el, options)
	{
		if (el.get('value'))
		{
			this.setOptions(options);
			
			this.progressBar = new Element('div').addClass('upload-progress-bar');
			this.progressBarTxt = new Element('div', {'class':'text-preloading'});
			this.progressBarStatus = new Element('div', {'class':'progress-bar'});
			this.progressBar.adopt(this.progressBarTxt, this.progressBarStatus)
				.inject(el.getParent(), 'bottom');
			
			this.setOptions(options);
			this.finished = false;
			
			this.request = new Request({
				url			: this.options.url,
				async		: false,
				data		: {'id':el.get('value')},
				onComplete	: this.updateProgressBar.bind(this)
			});
			this.request.send.delay(2000, this.request);
		}
	},
	
	execute : function ()
	{
		this.request.send();
	},
	
	updateProgressBar : function (datas)
	{
		this.status = JSON.decode(datas);
		
		if (this.status != null)
		{
			var str = 'Total : '+(this.status.current/1024).round()+'ko / '+(this.status.total/1024).round()+'ko - '
				+ (this.status.percent*100).round()/100+'%';
			this.progressBarStatus.setStyle('width', (this.status.percent/100 * 296).round()+'px');

			if (this.status.errorStr)
			{
				str += '<br />'+this.status.errorStr;
			}
			this.progressBarTxt.set('html', str);
		}
		
		if (!this.request.isSuccess() || this.status.error)
		{
			this.progressBarStatus.setStyles({
				'background-color':'#F00',
				'width':'296px'
			});
		}
		else
		{
			this.execute.delay(3000, this);
		}
	}
	
});


/*
 * Permet la sélection avancée d'élément
 * 
 * 	Options :
 * 		className		: class CSS à appliquer à l'élément de sélection
 * 		container		: élément HTML utiliser pour enclencher la sélection (par défaut : body)
 * 		vertical		: permet ou non la sélection vertical (génère une hauteur de 20px)
 * 		horizontal		: permet ou non la sélection horizontal (génère une largeur de 20px)
 * 		filterElement	: liste d'élements à filtrer pour dans un second filtrer le éléments enfants,
 * 							si non spécifié, applique une détection de collision sur tous les éléments
 * 							enfants de "container", peut engendrer un gain conséquent en performance.
 *	
 *	-> appliquer la class "can-selected" sur les élements pouvant être sélectionnés
 */

var Selection = new Class({
	
	Implements : [Options, Events],
	
	options : {
		vertical	: true,
		horizontal	: true
	},
	
	initialize : function (options)
	{
		this.setOptions(options);
		
		this.selectEl = new Element('div');
		this.selectEl.setStyles({
			position			: 'absolute',
			left				: 0,
			top					: 0,
			width				: 0,
			height				: 0,
			border				: '1px dashed #333',
			'background-color'	: '#DDD',
			opacity				: 0.5,
			display				: 'none',
			'font-size'			: '1px'
		}).inject($('body'), 'top');
		
		if (this.options.classNames)
		{
			this.selectEl.addClass(this.options.classNames);
		}
		
		this._initEvent();
	},
	
	_initEvent : function ()
	{
		if (!this.options.container)
		{
			this.options.container = $('body');
		}
		
		this.bounds = {
			start			: this.start.bind(this),
			stop			: this.stop.bind(this),
			move			: this._mouseMove.bind(this)
		};
		
		$(this.options.container).addEvent('mousedown', this.bounds.start);
	},
	
	/*
	 * Enclenche la sélection
	 */
	start : function (event)
	{
		event.preventDefault();
		
		if (this._activateSelection || event.rightClick)
		{
			return;
		}
		
		var el = $(event.target);
		
		document.addEvent('mousemove', this.bounds.move);
		document.addEvent('mouseup', this.bounds.stop);
		
		this.selectEl.setStyles({
			left	: event.page.x + 'px',
			top		: event.page.y + 'px',
			width	: 0,
			height	: 0,
			display	: 'block'
		});
		
		this.startPoint = {y: event.page.y, x: event.page.x};
		
		this._activateElement = el;
		
		this._activateSelection = true;
		
		this.fireEvent('start', [event]);
	},
	
	
	stop : function (event)
	{
		if (!this._activateSelection || event.rightClick)
		{
			return;
		}
		
		event.preventDefault();
		
		// controle du mouvement de souris + relache du bouton
		document.removeEvent('mousemove', this.bounds.move);
		document.removeEvent('mouseup', this.bounds.stop);
		
		var el = $(event.target);
		
		this.selectEl.store('coordinates', this.selectEl.getCoordinates());
		
		var selected = [];
		var els = this.options.filterElement?this.options.filterElement:
			$(this.options.container).getElements('*');
		
		els.each(
			function (el)
			{
				if (!el.hasClass('disabled') && this._checkCollision(el, this.selectEl))
				{
					el.getElements('.can-selected').each(
						function (elChild)
						{
							// si l'heure est sélectionnée
							if (this._checkCollision(elChild, this.selectEl))
							{
								selected.push(elChild);
							}
						}.bind(this)
					);
				}
			}.bind(this)
		);
		
		this.selectEl.setStyle('display', 'none');
		
		this._activateSelection = false;
		this.fireEvent('stop', [event, selected]);
	},
	
	/**
	 * Controle si un élément HTML touche un autre élément
	 */
	_checkCollision : function (el, elTarget)
	{
		var coorEl = el.retrieve('coordinates');
		if (!coorEl)
		{
			coorEl = el.getCoordinates();
		}
		
		var coorElTarget = elTarget.retrieve('coordinates');
		if (!coorElTarget)
		{
			coorElTarget = elTarget.getCoordinates();
		}
		
		return !(
			coorEl.top > coorElTarget.bottom
			||
			coorEl.left > coorElTarget.right
			||
			coorEl.right < coorElTarget.left
			||
			coorEl.bottom < coorElTarget.top
		);
	},
	
	/**
	 * Pendant une sélection, controle la position du curseur,
	 * redimensionne le bloc de sélection en conséquence
	 */
	_mouseMove : function (event)
	{
		event = new Event(event).stop();
		
		var coordonates = this.selectEl.getCoordinates();
		
		if (this.options.horizontal)
		{
			if (event.page.x <= this.startPoint.x)
			{
				this.selectEl.setStyles({
					left	: event.page.x + 'px',
					width	: (this.startPoint.x - event.page.x) + 'px'
				});
			}
			else
			{
				this.selectEl.setStyles({
					left	: this.startPoint.x + 'px',
					width	: (event.page.x - coordonates.left) + 'px'
				});
			}
		}
		else
		{
			this.selectEl.setStyles({
				left	: this.startPoint.x + 'px',
				width	: '20px'
			});
		}
		
		if (this.options.vertical)
		{
			if (event.page.y <= this.startPoint.y)
			{
				this.selectEl.setStyles({
					top		: event.page.y + 'px',
					height	: (this.startPoint.y - event.page.y) + 'px'
				});
			}
			else
			{
				this.selectEl.setStyles({
					top	: this.startPoint.y + 'px',
					height	: (event.page.y - coordonates.top) + 'px'
				});
			}
		}
		else
		{
			this.selectEl.setStyles({
				top	: this.startPoint.y + 'px',
				height	: '20px'
			});
		}
	}

});// depends : Loading


/*
 * Exécution de requête HTTP par XMLHttpRequest
 * 
 */
var CajaxRequest = new Class({
	
	Extends : Request,
	
	initialize : function ()
	{
		this.parent({method: 'get'});
		
		this.loading = new Loading();
		
		this.addEvents({
			'request'	: function ()
			{
				this.loading.view(300);
			}.bind(this),
			'success'	: function ()
			{
				this.loading.hide();
			}.bind(this),
			'failure'	: function ()
			{
				this.loading.hide();
			}.bind(this),
			'cancel'	: function ()
			{
				this.loading.hide();
			}.bind(this)
		});
		
		$$('.activer-mode-ajax').addEvent('click', this.execute2);
	},
	
	addElement : function (element)
	{
		element.removeEvents('click').addEvent('click', this.execute2);
	},
	
	parse : function (el)
	{
		if (el && el.getElements)
		{
			el.getElements('.activer-mode-ajax').addEvent('click', this.execute2);
		}
	},
	
	execute2 : function (event)
	{
		event = new Event(event);
		if (this.get('href'))
		{
			event.stop();
			ajaxRequest.execute(this.get('href'));				
		}
	},
	
	execute : function (linkToLoad)
	{
		this.setOptions({url: linkToLoad}).send();				
	}
	
});




/*
 * Gestion intérative de l'arbre
 * 
 */
var Arbre = new Class({
	
	Implements: [Events, Options],
	
	options : {
		ids_noeuds : []
	},
	
	/*
	 * Constructueur
	 * 
	 * @return void
	 */
	initialize : function(id)
	{
		if (!$(id))
		{
			return;
		}
		
		this.id_arbre = id;
		this.filter = new FilterTree(this);
		
		// option : tout déplier //
		if ($(this.id_arbre+'-deplier'))
		{
			$(this.id_arbre+'-deplier').addEvent('click', this.openAllNodes.bind(this));
		}
		
		// option : tout replier //
		if ($(this.id_arbre+'-replier'))
		{
			$(this.id_arbre+'-replier').addEvent('click', this.closeAllNodes.bind(this));
		}
		
		this.addEvent('parseComplete', this.loadConfig.bind(this));
		
		this.parseTree();
	},
	
	
	parseTree : function ()
	{
		// ajout des évènements sur les icones d'état //
		var getElements = new Elements([$(this.id_arbre).getElements('.plus'),
		$(this.id_arbre).getElements('.minus')])
		getElements.addEvent('click', function (event)
		{
			event = new Event(event).stop();
			var id_noeud = event.target.get('id').replace(/etat-/g, '');
			this.toggleNode(id_noeud);
		}.bind(this));
		
		this.nodesList = $$('.branche').extend($$('.feuille')).map(function (item)
		{
			if (item.get)
			{
				return item.get('id');
			}
			return item;
		});
		
		this.fireEvent('parseComplete');
	},
	
	
	/*
	 * Retourne l'ID du parent d'un neoud
	 * 
	 * @param string $id_noeud ID du noeud
	 * @return void
	 */
	getParent : function (idNode)
	{
		if ($(idNode))
		{
			return $(idNode).getParent().getParent();
		}
	},
	
	
	/*
	 * Ouverture d'un noeud
	 * 
	 * @param string $id_noeud ID du noeud
	 * @return void
	 */
	openNode : function(id_noeud)
	{
		if ($('tree-anime-'+id_noeud))
		{
			return;
		}
		
		if ($(id_noeud))
		{
			var branch = $('ul-'+id_noeud);
			if (branch && !branch.hasClass('branche-ouvert'))
			{
				//~ var divAnime = new Element('div', {
					//~ 'id':'tree-anime-'+id_noeud,
					//~ 'class':'animation'
				//~ });
				//~ divAnime.inject(branch, 'before').adopt(branch);
				
				branch.removeClass('branche-ferme')
					.addClass('branche-ouvert');
					
				//~ var height = branch.getCoordinates().height;
				//~ divAnime.setStyle('height', 0)
					//~ .set('tween', {
							//~ onComplete	: function (el)
							//~ {
								//~ el.getFirst().inject(el, 'before');
								//~ el.destroy();
							//~ }
						//~ }
					//~ )
					//~ .tween('height', height+'px');
			}
			
			var stateNode = $('etat-'+id_noeud);
			if (stateNode && stateNode.hasClass('plus'))
			{
				stateNode.removeClass('plus');
				stateNode.addClass('minus');
			}
			
			if (!this.noeuds_ouverts.contains(id_noeud))
			{
				this.noeuds_ouverts.push(id_noeud);
				this.saveConfig();
			}
			
			this.fireEvent('openNode', id_noeud);
		}
	},
	
	
	/*
	 * Ouvre tous les noeuds parent d'un noeud
	 * 
	 * @return void
	 */
	openUntil : function (idNode)
	{
		var parentElement = this.getParent(idNode);
		var idParent = parentElement.get('id');
		
		var secure = 0
		while (idParent != this.id_arbre)
		{
			if (secure > 100)
			{
				break;
			}
			secure++;
			
			this.openNode(idParent);
			
			parentElement = this.getParent(idParent);
			idParent = parentElement.get('id');
		}
	},
	
	
	/*
	 * Fermeture d'un noeud
	 * 
	 * @param string $id_noeud ID du noeud
	 * @return void
	 */
	closeNode : function(id_noeud)
	{
		if ($('tree-anime-'+id_noeud))
		{
			return;
		}
		
		if ($(id_noeud))
		{
			var branch = $('ul-'+id_noeud);
			if (branch && !branch.hasClass('branche-ferme'))
			{
				//~ var divAnime = new Element('div', {
					//~ 'id':'tree-anime-'+id_noeud,
					//~ 'class':'animation'
				//~ });
				//~ divAnime.inject(branch, 'before').adopt(branch);
				
				branch.removeClass('branche-ouvert')
					.addClass('branche-ferme')
				//~ var height = branch.getCoordinates().height;
				//~ divAnime.set('tween', {
						//~ onComplete	: function (el)
						//~ {
							//~ el.getFirst()
								//~ .removeClass('branche-ouvert')
								//~ .addClass('branche-ferme')
								//~ .inject(el, 'before');
							//~ el.destroy();
						//~ }
					//~ }
				//~ ).tween('height', 0);
			}
			
			var stateNode = $('etat-'+id_noeud);
			if (stateNode && stateNode.hasClass('minus'))
			{
				stateNode.removeClass('minus');
				stateNode.addClass('plus');
			}
			
			if (this.noeuds_ouverts.contains(id_noeud))
			{
				this.noeuds_ouverts.erase(id_noeud);
				this.saveConfig();
			}
			
			this.fireEvent('closeNode', id_noeud);
		}
	},
	
	
	/*
	 * Alternance fermeture/ouverture d'un noeud
	 * 
	 * @param string $id_noeud ID du noeud
	 * @return void
	 */
	toggleNode : function(id_noeud)
	{
		if ($('ul-'+id_noeud))
		{
			if ($('ul-'+id_noeud).hasClass('branche-ouvert'))
			{
				this.closeNode(id_noeud);
			}
			else
			{
				this.openNode(id_noeud);
			}
		}
	},
	
	
	/*
	 * Ouvre tous les noeuds
	 * 
	 * @return void
	 */
	openAllNodes : function(event)
	{
		if (event)
		{
			event = new Event(event).stop();
		}
		
		$(this.id_arbre).getElements('.branche').each(
			function (branche)
			{
				this.openNode(branche.get('id'));
			}.bind(this)
		);
	},
	
	
	/*
	 * Ferme tous les noeuds
	 * 
	 * @return void
	 */
	closeAllNodes : function(event)
	{
		if (event)
		{
			event = new Event(event).stop();
		}
		
		$(this.id_arbre).getElements('.branche').each(
			function (branche)
			{
				this.closeNode(branche.get('id'));
			}.bind(this)
		);
		
		this.noeuds_ouverts = [];
		this.saveConfig();
	},
	
	
	/*
	 * Charge le cookie contenant l'état des branches
	 * 
	 * @return void
	 */
	loadConfig : function ()
	{
		this.noeuds_ouverts = JSON.decode(Cookie.read(this.id_arbre));
		if ($type(this.noeuds_ouverts) == 'object')
		{
			this.noeuds_ouverts = $extend([], this.noeuds_ouverts);
			this.noeuds_ouverts.erase(undefined);
		}
		else
		{
			this.noeuds_ouverts = [];
		}
	},
	
	
	/*
	 * Sauvegarde le cookie contenant l'état des branches
	 * 
	 * @return void
	 */
	saveConfig : function ()
	{
		Cookie.write(this.id_arbre, JSON.encode(this.noeuds_ouverts));
	}
	
});


// depends : CajaxRequest

// gestion des acces sur les espaces de travail
var CManageAccessGroups = new Class({
	
	initialize : function ()
	{
		if (window.infosWorkspaces)
		{
			this._infosWorkspaces = JSON.decode(infosWorkspaces);
		}
		
		if ($('tableau-liste-workspaces'))
		{
			$('tableau-liste-workspaces').getElements('a').each(
				function (a)
				{
					a.setStyle('display', 'none');
					var box = a.getPrevious();
					// si la box n'est pas bloqué //
					if (!box.hasClass('disabled'))
					{
						box.addEvent('click', function ()
						{
							if (ajaxRequest && !ajaxRequest.running)
							{
								// requète de modification de droit //
								ajaxRequest.execute(a.href);
							}
						});
					}
				}
			);
			
			if (this._infosWorkspaces && $('tableau-liste-workspaces').getElements('tr').length > 15)
			{
				$('tableau-liste-workspaces').getElements('tr').each(
					function (ligne)
					{
						var id_workspace = ligne.getProperty('id');
						if (id_workspace)
						{
							id_workspace = id_workspace.replace(/[^0-9]*/, '');
							
							var div = new Element('div', {
								'id'	: 'action-'+id_workspace,
								'class'	: 'etat-ws'
							});
							
							if (this._infosWorkspaces[id_workspace])
							{
								div.addClass('open').addEvent('click', this.changeStateWorkspace.bind(this));
							}
							div.inject(ligne.getElement('td'), 'top');
						}
					}.bind(this)
				);
				
				$('tableau-liste-workspaces').getElements('div.open').each(
					function (node)
					{
						this.changeStateNode(node, 'close');
					}.bind(this)
				);
			}
		}
	},
	
	// si la modification d'un accès a réussi //
	updateSuccess : function (id_groupe, id_workspace, type, acces, id_root_workspace)
	{
		var idCheckbox = 'checkbox-'+type+'-'+id_groupe+'-'+id_workspace;
		var idCheckboxRoot = 'checkbox-lecture-'+id_groupe+'-'+id_root_workspace;
		
		if (type == 'ecriture')
		{
			var id_ecriture = idCheckbox;
			var id_lecture = idCheckbox.replace('ecriture', 'lecture');
		}
		else
		{
			var id_ecriture = idCheckbox.replace('lecture', 'ecriture');
			var id_lecture = idCheckbox;
		}
		
		// si la box existe //
		var checkbox = $(idCheckbox);
		if (checkbox)
		{
			if (checkbox.hasClass('div-checkbox-checked'))
			{
				checkbox.removeClass('div-checkbox-checked');
				if (type == 'lecture')
				{
					$(id_ecriture).removeClass('div-checkbox-checked');
				}
			}
			else
			{
				checkbox.addClass('div-checkbox-checked');
				if (type == 'ecriture')
				{
					$(id_lecture).addClass('div-checkbox-checked');
				}
			}
			
			var linkBox = checkbox.getNext();
			var infos = /changer-acces-([a-z]*)-([0-9]*)-groupe-([0-9]*)-workspace-([0-9]*)/.exec(linkBox.href);
			var id_groupe = infos[3];
			var id_workspace = infos[4];
			
			var readCheckbox = $('checkbox-lecture-'+id_groupe+'-'+id_workspace);
			var writeCheckbox = $('checkbox-ecriture-'+id_groupe+'-'+id_workspace);
			if (readCheckbox)
			{
				readCheckbox.getNext().href = '/action/changer-acces-lecture-' +
					(readCheckbox.hasClass('div-checkbox-checked')?0:1)+
					'-groupe-'+id_groupe+'-workspace-'+id_workspace+'.html';
			}
			if (writeCheckbox)
			{
				writeCheckbox.getNext().href = '/action/changer-acces-ecriture-' +
					(writeCheckbox.hasClass('div-checkbox-checked')?0:1)+
					'-groupe-'+id_groupe+'-workspace-'+id_workspace+'.html';
			}
		}
		
		var rootCheckbox = $(idCheckboxRoot);
		if (rootCheckbox && id_workspace != id_root_workspace && !rootCheckbox.hasClass('div-checkbox-checked'))
		{
			rootCheckbox.addClass('div-checkbox-checked');
			rootCheckbox.getNext().href = '/action/changer-acces-lecture-0-groupe-'+
				id_groupe+'-workspace-'+id_root_workspace+'.html';
		}
	},
	
	changeStateWorkspace : function (event)
	{
		//~ var el = event.target;
		this.toggleNode(event.target);
		return;
		//~ var event = new Event(event).stop();
		var el = event.target;
		var id_workspace = el.getProperty('id').replace(/[^0-9]*/, '');
		
		if (this._infosWorkspaces && this._infosWorkspaces[id_workspace])
		{
			var currentState = el.hasClass('open')?'open':'close';
			var nextState = el.hasClass('open')?'close':'open';
			
			this._infosWorkspaces[id_workspace].each(
				function (id_workspace_fils)
				{
					var wsChild = $('action-'+id_workspace_fils);
					if (wsChild && nextState == 'close' && !wsChild.hasClass('close'))
					{
						//~ wsChild.fireEvent('click');
						this.toggleNode(wsChild);
					}
					
					$('workspace-'+id_workspace_fils).setStyle(
						'display', nextState == 'close'?'none':''
					);
				}.bind(this)
			);
			
			el.addClass(nextState).removeClass(currentState);
		}
		
	},
	
	changeStateNode : function (node, newState)
	{
		var currentState = node.hasClass('open')?'open':'close';
		
		if (currentState != newState)
		{
			this.toggleNode(node);
		}
	},
	
	toggleNode : function (el)
	{
		//~ var el = event.target;
		var id_workspace = el.getProperty('id').replace(/[^0-9]*/, '');
		
		if (this._infosWorkspaces && this._infosWorkspaces[id_workspace])
		{
			var currentState = el.hasClass('open')?'open':'close';
			var nextState = el.hasClass('open')?'close':'open';
			
			this._infosWorkspaces[id_workspace].each(
				function (id_workspace_fils)
				{
					var wsChild = $('action-'+id_workspace_fils);
					if (wsChild && nextState == 'close' && !wsChild.hasClass('close'))
					{
						this.toggleNode(wsChild);
					}
					
					$('workspace-'+id_workspace_fils).setStyle(
						'display', nextState == 'close'?'none':''
					);
				}.bind(this)
			);
			
			el.addClass(nextState).removeClass(currentState);
		}
	}
	
});


// gestion des utilisateurs sur la page d'ajout d'utilisateur au groupe
var CUserListManager = new Class({
	
	initialize : function ()
	{
		if ($('users-list'))
		{
			$('users-list').getElements('.email')
				.addEvent('click', this.addUser.bind(this));
		}
	},
	
	addUser : function (event)
	{
		event.stop();
		var email = event.target.get('text');
		var value = $('email_destinataire').get('value');

		if (value.contains(email, '\n'))
		{
			return;
		}
		if (value)
		{
			value += '\n';
		}
		
		$('email_destinataire').set('value', value + email);
	}
	
});



var CManageAccesUser = new Class({
	
	initialize : function ()
	{
		var userList = $$('.move-user');
		if (!userList.length)
		{
			return;
		}
		
		userList.addEvent('mousedown', this.initDragDrop.bind(this));
		userList.addEvent('click', function (event) {event.stop();});
		
		this.blockMove = new Element('div',
			{
				'id':'move-user',
				'styles': {
					'opacity'	: 0.8,
					'position'	: 'absolute',
					'display'	: 'none',
					'z-index'	: 1000
				}
			}
		).inject($$('body')[0], 'top');
		
		this.dragInstance = new Drag.Move(this.blockMove, {
			//~ handle			: $$('.deplacer-document'),
			preventDefault	: true,
			precalculate	: true,
			snap			: 0,
			droppables		: $$('a.group-droppable'),
			onComplete		: this.fnOnCompleteOrCancel.bind(this),
			onDrop			: this.fnOnDrop.bind(this),
			onCancel		: this.fnOnCompleteOrCancel.bind(this),
			onEnter			: function (element, dropped) {
				dropped.morph('a.on-enter-group');
			},
			onLeave			: function (element, dropped) {
				dropped.morph('a.on-leave-group');
			}
		});
		

		this.bound = {
			hiddeActionsMenu : this.hiddeActionsMenu.bind(this)
		}
	},
	
	initDragDrop : function (event)
	{
		event.stop();
		this.hiddeActionsMenu();
		
		var a = event.target.getParent();
		if (!a.get('href'))
		{
			return;
		}
		this.idUser = a.get('href').replace(/.*user-([0-9]*)-from.*/g, '$1');
		this.idGroup = a.get('href').replace(/.*-from-([0-9]*).*/g, '$1');
		
		this.blockMove.set('html', $('text-user-'+this.idUser).get('html'))
			.setStyles({
				left	: event.page.x + 2 + 'px',
				top		: event.page.y + 2 + 'px',
				display	: 'block'
			});
		
		this.blockMove.store('idUser', this.idUser);
		this.dragInstance.start(event);
	},
	
	fnOnDrop : function (element, dropped)
	{
		if (!$$('a.group-droppable').contains(dropped))
		{
			return;
		}
		
		dropped.morph('a.on-leave-group');
		
		this.idGroupTarget = dropped.get('id').replace(/[^0-9]*/g, '');
		var coordinates = element.getCoordinates();
		
		this.viewActionsMenu.delay(200, this, {
			x	: coordinates.left,
			y	: coordinates.top
		});
	},
	
	fnOnCompleteOrCancel : function ()
	{
		$$('.on-enter-workspace').morph('a.on-leave-group');
		this.blockMove.setStyle('display', 'none');		
	},
	
	viewActionsMenu : function (where)
	{
		this.hiddeActionsMenu();
		
		var container = new Element('div', {
			'id'	: 'actions-move-user',
			'class'	: 'actions-move-user'
		});
		
		var body = $$('body')[0];
		
		container.inject(body, 'top').setStyles({
			top		: where.y + 'px',
			left	: where.x + 'px'
		}).set('html', '<ul id="list-actions-move-user">\
		<li><a id="copy-user" href="/actions/groupe/move-user.html">'+__i8n('copier')+'</a></li>\
		<li><a id="move-user" href="/actions/groupe/move-user.html">'+__i8n('deplacer')+'</a></li>\
		</ul>\
		');
		
		body.addEvent('click', this.bound.hiddeActionsMenu);
		
		$('list-actions-move-user').getElements('li')
			.addEvent('click', this.controlAction.bind(this));
		
		container.set('tween', {fps:50}).tween(
			'height', $('list-actions-move-user').getCoordinates().height + 'px'
		);
		
	},
	
	hiddeActionsMenu : function ()
	{
		$$('body')[0].removeEvent('click', this.bound.hiddeActionsMenu);
		
		if ($('actions-move-user'))
		{
			$('actions-move-user').destroy();
		}
	},
	
	controlAction : function (event)
	{
		var event = new Event(event).stop();
		this.hiddeActionsMenu();
		
		if (event.target.href != '')
		{
			var request = new CajaxRequest();
			request.setOptions({
				url		: event.target.href,
				method	: 'post',
				data	: {
					ac				: event.target.id,
					idUser			: this.idUser,
					idGroup			: this.idGroup,
					idGroupTarget	: this.idGroupTarget
				}
			});
			
			request.send();
		}
	}

});





var parseTreeWorkspace = function (render)
{
	if (!$('workspaces-arbre'))
	{
		return;
	}
	
	if (render)
	{
		var parent = $('workspaces-arbre').getParent();
		$('workspaces-arbre').destroy();
		parent.set('html', JSON.decode(render));
	}
	
	arbre_workspace.fireEvent('parseComplete', arbre_workspace);
	
	$('workspaces-arbre').getElements('.ws-arbre').addEvents({
		'mouseover' : function (event)
		{
			var id_noeud = this.get('id').replace(/lien-/g, '');
			if ($('ul-'+id_noeud) && $('ul-'+id_noeud).hasClass('branche-ferme'))
			{
				this.store('timerOpen', arbre_workspace.openNode
					.delay(1000, arbre_workspace, id_noeud));
			}
		},
		'mouseout' : function (event)
		{
			if (this.retrieve('timerOpen'))
			{
				$clear(this.retrieve('timerOpen'));
				this.eliminate('timerOpen');
			}
		}
	});
	
};



// gestion des documents
var CManageDocuments = new Class({

	initialize : function()
	{
		this.documents = [];
		this.idsDocuments = [];
		this.idOpenedDocument;
		this.animeOnProgress = false;
		
		// récupère les espaces de travail droppables
		if ($('workspaces-arbre'))
		{
			this.droppablesWorkspaces = $$('a.peut-recevoir-document');
		}
	},
	
	getDocument : function (idDocument)
	{
		if (this.documents[idDocument])
		{
			return this.documents[idDocument];
		}
		return false;
	},
	
	getOpenedDocument : function ()
	{
		if (this.idOpenedDocument && this.documents[this.idOpenedDocument])
		{
			return this.documents[this.idOpenedDocument];
		}
		return false;
	},
	
	getDroppablesWorkspaces : function ()
	{
		if (this.droppablesWorkspaces)
		{
			return this.droppablesWorkspaces;
		}
		return [];
	},
	
	parse : function()
	{
		$$('a.lien-document').addEvent('click', this.eLoadContentDocument.bind(this));
		
		// cherche les documents
		$$('.document').each(
			function (documentHTML)
			{
				// ID du document
				var idDocument = documentHTML.get('id').replace(/[^0-9]*/g, '');
				this.idsDocuments.push(idDocument);
				
				// instancie un nouveau document
				this.documents[idDocument] = new CDocument(idDocument);
				
				// redéfinition du lien
				//~ var linkDocument = $('document-link-'+idDocument);
				//~ linkDocument.set('href', linkDocument.get('href')+'#document-'+idDocument);
				
				// définie les paramêtres du document
				this.documents[idDocument].setName($('document-name-'+idDocument).get('text'))
					.setLink($('document-link-'+idDocument).get('href'));
				
			}.bind(this)
		);
		
		this.manageMoveDocument = new MoveDocument(this);
		
		if ($('content-document'))
		{
			this.idOpenedDocument = $('content-document').getParent().getParent()
				.get('id').replace(/[^0-9]*/g, '');
			//~ this.openDocumentAnimation();
		}
	},
	
	openDocumentAnimation : function ()
	{
		if ($('content-document'))
		{
			this.animeOnProgress = true;
			$('content-document').setStyle('height', 0);
			var openEffect = new Fx.Tween(
				$('content-document'),
				{
					duration: 500,
					onComplete: function ()
					{
						this.animeOnProgress = false;
						ajaxRequest.parse($('content-document'));						
					}.bind(this)
				}
			);
			openEffect.start('height',
				$('contenu-description-document').getCoordinates().height+'px');
		}
	},
	
	closeDocumentAnimation : function (fnOnComplete)
	{
		if (!$('content-document'))
		{
			return;
		}
		
		this.animeOnProgress = true;
		var closeEffect = new Fx.Tween(
			$('content-document'),
			{
				duration: 500,
				onComplete: function ()
				{
					$('content-document').getParent().destroy();
					this.animeOnProgress = false;
					//~ alert(fnOnComplete);
					fnOnComplete();
				}.bind(this)
			}
		);
		closeEffect.start('height', 0);
	},
	
	eLoadContentDocument : function (event)
	{
		event = new Event(event).stop();
		var document = this.getDocument(
			event.target.get('id').replace(/[^0-9]*/g, '')
		);
		
		this.loadContentDocument(document);
	},
	
	loadContentDocument : function (document)
	{
		if (this.animeOnProgress)
		{
			return;
		}
		
		
		if ($('content-document'))
		{
			if (this.idOpenedDocument == document.getID())
			{
				this.closeContentDocument();
				this.idOpenedDocument = false;
				var r = new Request({
					url		: window.location.toString(),
					data	: {'ac':'noDocument'}
				});
				r.send();
				return;
			}
			var fn = this.loadContentDocument.bind(this, document);
			this.closeContentDocument(fn);
			
			return;
		}
		
		var id_workspace = document.getLink().replace(/.*workspace-([0-9]+).*/g, '$1');
		//~ return;
		var load = new Request({
			url				: '/workspace-'+id_workspace+'-voirdocument-'+document.getID()+'.html',
			method			: 'get',
			data			: {'ac':'getDocument'},
			//~ evalResponse	: true,
			onComplete		: function (content)
			{
				var tr = $('content-document-'+document.getID());
				if (tr)
				{
					tr.set('html', content);
					this.openDocumentAnimation();
				}
				this.idOpenedDocument = document.getID();
			}.bind(this)
		});
		
		var loading = new Loading();
		
		load.addEvents({
			'request'	: function ()
			{
				loading.view(300);
			},
			'success'	: function ()
			{
				loading.hide();
			},
			'failure'	: function ()
			{
				loading.hide();
			},
			'cancel'	: function ()
			{
				loading.hide();
			}
		}).send();
	},
	
	closeContentDocument : function (fnOnComplete)
	{
		if (this.animeOnProgress)
		{
			return;
		}
		
		if (!fnOnComplete)
		{
			fnOnComplete = $empty;
		}
		
		if ($('content-document'))
		{
			this.closeDocumentAnimation(fnOnComplete);
			return;
		}
		fnOnComplete();
	}

});




var MoveDocument = new Class({
	
	//~ initialize : function (manager, event, idDocument)
	initialize : function (manager)
	{
		//~ this.event = event;
		this.managerDocument = manager;
		//~ this.document = manager.getDocument(idDocument);
		
		this.bounds = {
			keydown: this.controlCopy.bind(this),
			keyup: this.controlCopy.bind(this)
		};
		
		// information de déplacement
		this.imageType = new Element('img', {'src':'/images/design/icons/empty.png','alt':'','title':''});
		this.text = new Element('span');
		
		// Move block
		this.blockMove = new Element('div',
			{
				'id':'move-document',
				'styles': {
					'opacity'	: 0.8,
					'position'	: 'absolute',
					'display'	: 'none',
					'z-index'	: 1000
				}
			}
		).inject($$('body')[0], 'top').adopt(this.imageType, this.text);
		
		
		// on configure l'element avant de démarrer le déplacement
		$$('.deplacer-document').addEvent('mousedown', this.configureDragElement.bind(this));
		
		// crée l'instance de Drag&Drop sur le clone de document //
		this.dragInstance = new Drag.Move(this.blockMove, {
			//~ handle			: $$('.deplacer-document'),
			preventDefault	: true,
			snap			: 0,
			precalculate	: true,
			droppables		: this.managerDocument.getDroppablesWorkspaces(),
			onComplete		: this.finishDocumentToWorkspace.bind(this),
			onDrop			: this.dropDocumentOnWorkspace.bind(this),
			onCancel		: this.finishDocumentToWorkspace.bind(this),
			onEnter			: function (element, dropped) {
				dropped.morph('.on-enter-workspace');
			},
			onLeave			: function (element, dropped) {
				dropped.morph('.on-leave-workspace');
			}
		});
		
		this.controlKeyPressed = false;
	},
	
	
	configureDragElement : function (event)
	{
		event = new Event(event);
		
		this.document = this.managerDocument.getDocument(
			event.target.get('id').replace(/[^0-9]*/g, '')
		);
		
		this.controlKeyPressed = event.control;
		this.moveType = this.controlKeyPressed?'copier':'deplacer';
		this._updateImageType();
		
		this.blockMove.setStyles({
				'display'	: 'block'
			}).setStyles({
				'top'		: event.page.y + 1+'px',
				'left'		: event.page.x + 1+'px'
			});
		
		this.text.set('text', this.document.getName());
		
		// TODO : non fonctionnel sous Opera, à tester sous IE
		document.addEvent('keydown', this.bounds.keydown);
		document.addEvent('keyup', this.bounds.keyup);
		
		
		// refermera les noeuds de l'arbre ouverts
		if (arbre_workspace)
		{
			this.fnRegisterNode = this.registerNode.bind(this);
			arbre_workspace.addEvent('onOpenNode', this.fnRegisterNode);
		}
		
		this.dragInstance.start(event);
	},
	
	registerNode : function (node)
	{
		if (!this.nodesTree)
		{
			this.nodesTree = [];
		}
		
		if (!this.nodesTree.contains(node))
		{
			this.nodesTree.push(node);
		}
	},
	
	controlCopy : function (event)
	{
		//~ $('indev').adopt(new Element('div').set('text', event.control));
		event = new Event(event);
		
		if (event.code == 17)
		{
			this.controlKeyPressed = !this.controlKeyPressed;
			this.moveType = !this.controlKeyPressed?'deplacer':'copier';
			this._updateImageType();
		}
	},
	
	_updateImageType : function ()
	{
		this.imageType.set(
			'src',
			'/images/design/icons/'+
				(this.moveType == 'deplacer'?'move':'copy')+
				'.png'
		);
	},
	
	
	finishDocumentToWorkspace : function ()
	{
		document.removeEvent('keydown', this.bounds.keydown);
		document.removeEvent('keyup', this.bounds.keyup);
		
		if (this.fnRegisterNode)
		{
			arbre_workspace.removeEvent('onOpenNode', this.fnRegisterNode);
		}
		
		if (this.nodesTree && this.nodesTree.length)
		{
			this.nodesTree.each(
				function (idNode)
				{
					arbre_workspace.closeNode(idNode);
				}
			);
			this.nodesTree = [];
		}
		
		$$('.on-enter-workspace').morph('.on-leave-workspace');
		this.blockMove.setStyle('display', 'none');
	},
	
	
	dropDocumentOnWorkspace : function (element, dropped)
	{
		// si ce n'est pas un élément de l'arbre, on annule //
		if (!this.managerDocument.getDroppablesWorkspaces().contains(dropped))
		{
			return;
		}
		
		dropped.morph('.on-leave-workspace');
		
		
		this.moveDocument(dropped.get('id').replace(/[^0-9]*/g, ''));
	},
	
	
	moveDocument : function (idWorkspace)
	{
		// requète de déplacement //
		var requete = new Request({
			url		: '/action/document.html',
			method	: 'post',
			data	: {
				'id_document': this.document.getID(),
				'id_workspace': idWorkspace,
				'deplacer': this.moveType == 'deplacer'?'deplacer':'',
				'copier': this.moveType == 'copier'?'copier':'',
				'confirme': 0
			}
		});
		requete.send();
	}
});

var CDocument = new Class({
	
	initialize : function (idDocument)
	{
		this.id_document = idDocument;
		this.name = '';
	},
	
	setName : function (name)
	{
		this.name = name;
		return this;
	},
	
	setLink : function (link)
	{
		this.link = link;
		return this;
	},
	
	getID : function ()
	{
		return this.id_document;
	},
	
	getName : function ()
	{
		return this.name;
	},
	
	getLink : function ()
	{
		return this.link;
	}
	
});

/* fait disparaitre le document de la page */
var enleverDocumentPage = function (id_document, text)
{
	if (!id_document)
	{
		return;
	}
	
	if (text)
	{
		alert(text);
	}
	
	var linkLocation = document.location.toString();
	var args = /workspace-([0-9]+)-voirdocument/.exec(linkLocation);
	if (args)
	{
		document.location.href = '/workspace-'+args[1]+'.html';
		return;
	}
	document.location.reload();
};




var CManageModerator = new Class({
	
	initialize : function ()
	{
		// initialise formulaire d'ajout d'animateur
		if ($('form-ajout-animateur'))
		{
			$('form-ajout-animateur').addEvent('submit', this.add.bind(this));
		}
	},
	
	add : function (event)
	{
		event = new Event(event).stop();
		event.target.send(); // nécessite Mootools
	},
	
	remove : function (event)
	{
		//~ event = new Event(event).stop();
		//~ var infosLink = event.target.getParent();
		
	},
	
	refreshList : function (contentJSON)
	{
		if ($('content-list'))
		{
			$('content-list').empty().set('html',
				JSON.decode(contentJSON)
			);
		}
		ajaxRequest.parse($('content-list'));
		
		return this;
	},
	
	successfulAdd : function ()
	{
		if ($('email_destinataire'))
		{
			$('email_destinataire').value = '';
		}
		return this;
	},
	
	successfulDelete : function (email)
	{
		var listLink = $('list-moderators');
		if (listLink)
		{
			listLink.getElements('a').each(
				function (a)
				{
					if (a.href.contains(email))
					{
						a.getParent().getParent().destroy();
					}
				}
			);
		}		
		return this;
	}
	
});






/*
 * PAGE REUNIONS
 */

var datesSelectorMeeting = new Class({
	
	/** Initialisation de la sélection des dates pour une réunion
	 */
	initialize : function (selectDateMeeting)
	{
		this._selectedOverHour = [];
		this._startSelectOverHour = 0;
		this._startHour = 0;
		this._endHour = 23;
		
		this._selectDateMeeting = selectDateMeeting?true:false;
		
		if (this._selectDateMeeting && !$('programmer-reunion'))
		{
			return;
		}
		
		if ($('liste-dates-reunion'))
		{
			var hours = $('liste-dates-reunion').getElements('li.hour');
			var links = $('liste-dates-reunion').getElements('li a.link-action');
			
			if (links.length && hours.length)
			{
				links.removeProperty('href');
			}
			this.selection = new Selection({
				container	: $('liste-dates-reunion'),
				horizontal	: !this._selectDateMeeting
			});
			this.selection.addEvents({
				'start' : this.activeSelectDate.bind(this),
				'stop' : this.unactiveSelectDate.bind(this)
			});
			
			this._initEvents()._refreshDatas();
		}
	},
	
	
	/** Initialisation des évènements
	 */
	_initEvents : function ()
	{
		this.bounds = {
			checkOverHour	: this._checkOverHour.bind(this),
			eventStop		: $lambda(false)
		};
		
		// met en avant l'heure sous le curseur
		$('liste-dates-reunion').getElements('li.hour')
			.addEvent('mouseover', this.bounds.checkOverHour);
		
		return this;
	},
	
	
	/** Met à jour les informations :
	 * 	-> interval d'horaire d'une journée
	 *  -> met en mémoire la liste des journées (ul.day)
	 *  -> met en mémoire la liste des heures (ul.day li.hour)
	 */
	_refreshDatas : function ()
	{
		if ($('startHour'))
		{
			this._startHour = $('startHour').get('value');
		}
		if ($('endHour'))
		{
			this._endHour = $('endHour').get('value');
		}
		
		// liste des journées
		this._days = $$('#liste-dates-reunion ul.day');
		this.selection.setOptions({filterElement : this._days});
		
		// liste des heures
		this._hours = $$('#liste-dates-reunion ul.day li.hour');
		
		// liste des heures dans l'intervale sélectionné
		this._hoursActivated = [];
		
		this._hours.each(
			function (elHour)
			{
				var date = elHour.retrieve('datetime', Date.parse(elHour.id.replace('id-', '').replace('_', ' ')));
				elHour.store('datetime', date);
				if (date)
				{
					if (date.get('hr') >= this._startHour && date.get('hr') <= this._endHour)
					{
						this._hoursActivated.push(elHour);
						elHour.setStyle('display', 'block');
					}
					else if (elHour.getStyle('display') != 'none')
					{
						elHour.setStyle('display', 'none');
					}
				}
			}.bind(this)
		);
		
		// définir l'affichage des blocs d'heures
		this._hoursHeader = $$('#liste-dates-reunion ul.list-hours li');
		this._hoursHeader.each(
			function (elHour)
			{
				var hour = elHour.get('text').trim();
				if (hour != '')
				{
					hour = hour.toInt();
					elHour.setStyle(
						'display',
						hour == 12 || hour >= this._startHour && hour <= this._endHour?'block':'none'
					);
				}
			}.bind(this)
		);
		
		this._updateCoordinates();
	},
	
	
	/** Met à jour le cache des coordonnées des éléments
	 *  -> liste des heures (ul.day li.hour)
	 */
	_updateCoordinates : function ()
	{
		// enregistre les coordonnées des blocs d'heures
		this._hoursActivated.each(
			function (elHour)
			{
				elHour.store('coordinates', elHour.getCoordinates());
			}
		);
		
		// enregistre les coordonnées des blocs d'heures des en-tête
		this._hoursHeader.each(
			function (elHour)
			{
				elHour.store('coordinates', elHour.getCoordinates());
			}
		);
	},
	
	
	/** Sélectionne l'heure en fonction de la position du curseur dans les jours
	 */
	_checkOverHour : function (event)
	{
		if (this.lastSelected)
		{
			this.lastSelected.removeClass('selected');
			this.lastSelected = undefined;
		}
		
		if (this._activateSelection)
		{
			return;
		}
		
		var el = $(event.target);
		
		var posEl = el.getCoordinates();
		
		for (var i = 0, l = this._hoursHeader.length; i < l; i++)
		{
			el = this._hoursHeader[i];
			var coorEl = el.retrieve('coordinates');
			if (coorEl.top >= posEl.top && coorEl.top <= posEl.top)
			{
				this.lastSelected = el;
				el.addClass('selected');
				break;
			}
		}
	},
	
	
	/** Force la sélection de l'heure en fonction de la position du curseur
	 * dans les jours
	 * (à supprimer ?)
	 */
	_initOverSelect : function (event)
	{
		var posEl = {top: event.page.y, bottom: event.page.y};
		
		this._selectedOverHour.each(
			function (el)
			{
				el.removeClass('selected');
			}
		);
		this._selectedOverHour = [];
		
		this._hoursHeader.each(
			function (el)
			{
				var coorEl = el.retrieve('coordinates');
				if (coorEl.bottom >= posEl.top && coorEl.top <= posEl.bottom)
				{
					this.lastSelected = el;
					el.addClass('selected');
				}
			}.bind(this)
		);
	},
	
	
	/** On désactive la sélection de l'heure en fonction de la position du curseur
	 * 	durant la sélection
	 */
	activeSelectDate : function (event)
	{		
		$('liste-dates-reunion').getElements('li.hour')
			.removeEvent('mouseover', this.bounds.checkOverHour);
		
		this._updateCoordinates();
	},
	
	
	/** Récupération des éléments sélectionnés et envoie d'une requête pour
	 *	sauvegarder la sélection
	 */
	unactiveSelectDate : function (event, selectedEls)
	{
		if (selectedEls.length)
		{
			if (this._selectDateMeeting)
			{
				var firstDate = selectedEls[0].retrieve('datetime');
				var lastDate = selectedEls[selectedEls.length-1].retrieve('datetime');
				
				$('date').set('value', firstDate.format('%d-%m-%Y'))
					.fireEvent('change', [event]);
				
				$('hour').set('value', firstDate.format('%H').toInt())
					.fireEvent('change', [event]);
				
				if (firstDate.format('%d') != lastDate.format('%d'))
				{
					$('duree').set('value', 23 - firstDate.format('%H').toInt() + 1);
				}
				else
				{
					$('duree').set('value', lastDate.format('%H').toInt() - firstDate.format('%H').toInt() + 1);
				}
				
				$('duree').fireEvent('change', [event]);
			}
			else
			{
				var selected = [];
				var currentEl;
				var reverseChoice = $('actionOnSelect').value == 'reverse';
				
				if (selectedEls.length == 1) {
					currentEl = selectedEls[0];
					selected.push(currentEl.id.replace('_', ' ').replace('id-', ''));
					if (currentEl.hasClass('selected-by-user')) {
						reverseChoice = true;
						currentEl.removeClass('selected-by-user');
						currentEl.getElement('input').checked = true;
					} else {
						reverseChoice = false;
						currentEl.addClass('selected-by-user');
						currentEl.getElement('input').checked = false;
					}
				} else {
					var nbSelected = 0;
					var selectedState = selectedEls[0].hasClass('selected-by-user');
					for (var i = 0; i < selectedEls.length; i++) {
						currentEl = selectedEls[i];
						selected.push(currentEl.id.replace('_', ' ').replace('id-', ''));
						nbSelected += currentEl.hasClass('selected-by-user')?1:0;
						if (reverseChoice) {
							currentEl.removeClass('selected-by-user');
							currentEl.getElement('input').checked = true;
						} else {
							currentEl.addClass('selected-by-user');
							currentEl.getElement('input').checked = false;
						}
					}
					console.log(selectedEls[0].hasClass('selected-by-user'));
					console.log(selectedEls[0]);
					if (nbSelected == selectedEls.length && selectedState) {
						reverseChoice = true;
						for (var i = 0; i < selectedEls.length; i++) {
							currentEl = selectedEls[i];
							currentEl.removeClass('selected-by-user');
							currentEl.getElement('input').checked = true;
						}
					}
				}
				
				// envoie de la requête de sélection de date
				var r = new Request({
					url		: '/reunion/participe/' + window.location.href.replace(/[^0-9]*/, ''),
					methods	: 'get',
					data 	: {dates : selected, reverseSelection: reverseChoice?'reverse':'normal'}
				});
				r.send();
			}
		}
		
		this._initOverSelect(event);
		
		$('liste-dates-reunion').getElements('li.hour')
			.addEvent('mouseover', this.bounds.checkOverHour);
	}
	
});


var selectorUsersMeeting = new Class({
	
	/** Initialisation de la sélection des participants
	 */
	initialize : function ()
	{
		// vérifie bien l'existance des blocs
		if (!window.groups || !$('div-groups') || !$('users-list-meeting'))
		{
			return;
		}
		
		
		this.groups = JSON.decode(window.groups);
		this.usersListInput = $('users-list-meeting').getElements('input');
		
		$('div-groups').setStyle('display', 'block')
			.getElements('input')
			.addEvent('click', this._checkSelectGroup.bind(this));
		
		this.usersListInput.addEvent('click', this._checkSelectUser.bind(this));
	},
	
	
	/** Lors de la sélection d'un groupe, on sélection les utilisateurs
	 */
	_checkSelectGroup : function (event)
	{
		var el = $(event.target);
		if (el.checked && this.groups) // si sélectionné
		{
			var id_groupe = el.value;
			var users;

			// recherche des utilisateurs du groupe
			this.groups.each(
				function (groupe)
				{
					// si c'est le bon groupe
					if (groupe['id_groupe'] == id_groupe)
					{
						users = groupe['users'];
					}
				}
			);
			
			// utilisateurs trouvés
			if (users && $('users-list-meeting'))
			{
				// on check tous les utilisateurs du groupe
				this.usersListInput.each(
					function (checkbox_user)
					{
						// si l'utilisateur fait parti du groupe
						if (users.contains(checkbox_user.value))
						{
							checkbox_user.checked = true;
						}
					}
				);
			}
		}
	},
	
	
	/** Controle sur sélection d'utilisateur
	 */
	_checkSelectUser : function (event)
	{
		var el = $(event.target);
		
		// si la checkbox est en lecture seul, on fait rien du tout //
		if (el.getProperty('readonly'))
		{
			el.checked = !el.checked;
			return;
		}
		
		if (!this.groups)
		{
			return;
		}

		// si on désélectionne l'utilisateur
		if (!el.checked)
		{
			var id_utilisateur = el.value;
			
			// on désélectionne tous les groupes de l'utilisateur //
			this.groups.each(
				function (groupe)
				{
					if (groupe['users'].contains(id_utilisateur))
					{
						if ($('group-'+groupe['id_groupe']))
						{
							$('group-'+groupe['id_groupe']).checked = false;
						}
					}
				}
			);
		}
	}
	
});


var CMeeting = new Class({
	
	initialize : function ()
	{
		var url = window.location.href.toString();
		
		if (url.test(/\/reunion\/participants\/[0-9]*/))
		{
			this.selectionUsersGroups = new selectorUsersMeeting();
		}
		
		var testDetails = url.test(/\/reunion\/details\/[0-9]*/);
		if (url.test(/\/reunion\/[0-9]*/))
		{
			this.selectionDates = new datesSelectorMeeting(testDetails);
		}
	}

});




/*
 * PAGE PROFIL
 */
var CProfile = new Class({
	
	initialize : function ()
	{
		this.userNameField = $('user-name');
		this.userFirstNameField = $('user-first-name');
		this.userEmailField = $('email1');
		this.userEmailFieldConfirmation = $('email2');
		
		if (this.userNameField)
		{
			this.userNameField.addEvent('blur', this.checkNameField);
		}
		
		if (this.userFirstNameField)
		{
			this.userFirstNameField.addEvent('blur', this.checkFirstNameField);
		}
		
		if (this.userEmailField)
		{
			this.userEmailField.addEvent('blur', this.checkMail);
		}
		
		if (this.userEmailFieldConfirmation)
		{
			this.userEmailFieldConfirmation.addEvent('blur', this.checkMail);
		}
	},
	
	checkNameField : function (event)
	{
		this.set(
			'value',
			this.get('value').toUpperCase()
		);
	},
	
	checkFirstNameField : function (event)
	{
		var firstName = this.get('value');
		firstName = firstName.charAt(0).toUpperCase() +
			firstName.substring(1).toLowerCase();
			
		this.set('value', firstName);
	},
	
	checkMail : function (event)
	{
		//~ var value = this.get('value').trim();
		//~ 
		//~ if (value == '' || !$('invalid-email'))
		//~ {
			//~ return;
		//~ }
		//~ 
		//~ if (!value.match(/^([a-zA-Z0-9]+(([\.\-\_]?[a-zA-Z0-9]+)+)?)\@(([a-zA-Z0-9]+[\.\-\_])+[a-zA-Z]{2,4})$/gi))
		//~ {
			//~ alert($('invalid-email').get('value'));
		//~ }
	}
	
});


/*
 * Déclanchement d'un animation pour une action réussi
 */
var animateSuccesAction = function ()
{
	var el = $('action-success');
	if (!el)
	{
		return;
	}
	
	// effet pour attirer l'attention
	var color = el.getStyle('background-color');
	el.setStyle('background-color', '#F88')
		.set('tween', {duration: 1000})
		.tween('background-color', color);
	
	// fait disparaître l'alerte
	//~ var hide = function () {
		//~ var hidden = new Fx.Morph(el, {
			//~ duration: 'long',
			//~ onComplete: function (element)
			//~ {
				//~ element.setStyle('display', 'none');
			//~ }
		//~ });
		//~ hidden.start({
			//~ height : 0,
			//~ opacity : 0
		//~ });
	//~ };
	//~ hide.delay(3000);
}
window.addEvent('domready', animateSuccesAction);



/*
 * Contrôle sur les formulaires
 * 
 */
var CFormulaire = new Class({
	
	initialize : function ()
	{
		if ($('login_user'))
		{
			$('login_user').focus();
		}
		

		// onclick sur bouton retour
		if ($('retour'))
		{
			$('retour').addEvent('click', function (event)
			{
				if ($('backlink'))
				{
					event = new Event(event).stop();
					document.location.replace($('backlink').get('value'));
				}
			});
		}
	},
	
	
	sending : function ()
	{
		if ($('boite-chargement-en-cours'))
		{
			$('boite-chargement-en-cours').setStyle('display', 'block');
		}
	}
	
});


var arbre_workspace;
var ajaxRequest;
var formulaire;
var meeting;
var manageModerator;
var profile;
var userListManager;
var manageAccesUser;


/*
 * Liste des évènements globaux
 */

window.addEvent('load', function ()
{
	var md = new CManageDocuments();
	md.parse();
});


window.addEvent('domready', function ()
{
	// préchargement de l'image de chargement ajax
	var preloadingImgBase = new Asset.images(['/images/loading-1.gif']);
	
	ajaxRequest = new CajaxRequest();
	formulaire = new CFormulaire();
	manageAccessGroups = new CManageAccessGroups();
	meeting = new CMeeting();
	manageModerator = new CManageModerator();
	
	if (window.location.toString().test(/.*compte.*/))
	{
		profile = new CProfile();
	}
	
	if (window.location.toString().test(/.*videodemo.*/))
	{
		var videoClip = new Swiff("/images/design/solution/videoclip.swf", {
			width		: 800,
			height		: 500,
			container	: $("videoclip")
		});
	}
	
	if ($("logos-adhoc"))
	{
		var videoClip = new Swiff("/flash/logos-1.swf", {
			width		: 400,
			height		: 65,
			container	: $("logos-adhoc")
		});
	}
	
	// si l'arbre des espaces de travail est affiché //
	if ($('workspaces-arbre'))
	{
		arbre_workspace = new Arbre('workspaces-arbre');
		parseTreeWorkspace();
	}
	
	// si on trouve l'arbre des groupes //
	if ($('groupe-arbre'))
	{
		var arbre_groupe = new Arbre('groupe-arbre');
	}
	
	if ($('users-list'))
	{
		userListManager = new CUserListManager('groupe-arbre');
	}
	
	// ajout d'une version
	var formFile = $('ajout-document')?$('ajout-document'):$('ajout-fichier');
	if (formFile)
	{
		formFile.addEvent('submit', function (event)
		{
			this.removeEvents('submit')
				.addEvent('submit', function (event) {event.stop()});
			
			var buttons = this.getElements('input.bouton');
			if (buttons)
			{
				buttons.setStyle('visibility', 'hidden');
			}
			
			var compatibility = Browser.Engine.trident || Browser.Engine.gecko;
			
			if ($('progress_fichier') && compatibility)
			{
				var progressBar = new CUploadProgress($('progress_fichier'), {
					url : '/action/get-upload-status.html'
				});
			}
		});
	}
	

	$$('.charge-calendrier').each(
		function ( champ )
		{
			charger_calendrier(champ);
		}
	);
	
	// page groupe affichée
	if ($('liste-utilisateurs'))
	{
		manageAccesUser = new CManageAccesUser();
	}
	
	FormValidator.add('required', {
		errorMsg: __i8n('champ-obligatoire'),
		test: function(element)
		{
			var value = element.get('value').trim();
			return !(value == null || value.length == 0);
		}
	});
	FormValidator.add('unique-login', {
		errorMsg: __i8n('identifiant-utilise'),
		test: function(element)
		{
			var value = element.get('value').trim();
			var loginUsed = false;
			var request = new Request({
				url			: '/form/check',
				method		: 'post',
				async		: false,
				onComplete	: function (response)
				{
					loginUsed = JSON.decode(response)?true:false;
				}.bind(this),
				data 		: {'login': value}
			});
			request.send();
			return !loginUsed;
		}
	});
	
	FormValidator.add('unique-email', {
		errorMsg: __i8n('email-deja-utilisee'),
		test: function(element)
		{
			var value = element.get('value').trim();
			var used = false;
			var request = new Request({
				url			: '/form/check',
				method		: 'post',
				async		: false,
				onComplete	: function (response)
				{
					used = JSON.decode(response)?true:false;
				}.bind(this),
				data 		: {'email': value}
			});
			request.send();
			return !used;
		}
	});
	
	FormValidator.add('validate-numeric-positive', {
		errorMsg: __i8n('nombre-positif'),
		test: function(element)
		{
			return FormValidator.getValidator('validate-numeric').test(element)
				&& element.value > 0;
		}
	});
	
	Date.parsePatterns = [
		{
			//"12.31.08", "12-31-08", "12/31/08", "12.31.2008", "12-31-2008", "12/31/2008"
			re: /^(\d{1,2})[\.\-\/](\d{1,2})[\.\-\/](\d{2,4})$/,
			handler: function(bits){
				var d = new Date();
				d.setYear(bits[3]);
				d.setMonth(bits[2].toInt() - 1, bits[1].toInt());
				return Date.fixY2K(d);
			}
		}
	].extend(Date.parsePatterns);
	
	var activeForm = [$('registration'), $('nouvelle-reunion'), $('programmer-reunion')];
	activeForm.each(
		function (form)
		{
			if (form != null)
			{
				form.getElements('input.cancel').addEvent('click', function (event)
				{
					form.removeEvents('submit');
				});
				
				var validateRegistration = new FormValidator(form, {
					onElementPass		: function (el)
					{
						var pError = $(el.get('validatorProps').pError);
						if (pError)
						{
							pError.set('text', '');
							return;
						}
						
						pError = el.getNext();
						if (pError && pError.get('tag') == 'p' && pError.hasClass('error'))
						{
							pError.destroy();
						}
					},
					onElementFail		: function (el, validators)
					{
						var pError = $(el.get('validatorProps').pError);
						
						if (validators.length == 1)
						{
							var validator = this.getValidator(validators[0]);
							if (!pError)
							{
								pError = el.getNext();
							}
							
							if (!pError || pError.get('tag') != 'p' || !pError.hasClass('error'))
							{
								pError = new Element('p', {'class': 'error'});
								pError.inject(el, 'after');
							}
							
							pError.set('text', validator.getError(el));
						}
					}

				});
			}
		}
	);

});


