var Explorateur = Class.create({

	initialize: function(derniers_uploads) {
		this.id = 0; // racine
		this.id_parent = 0;
		this.adresse = '';
		this.dossiers = {};
		this.fichiers = {};
		this.move = false; // deplacement du curseur (pour detecter les clics ou dragndrop)
		this.nb_elements = 0;
		this.charge = false;
		
		this.derniers_uploads = derniers_uploads;
		
		this.actualiser();
	},
	
	charger: function(id, vider) {
		this.id = id;
		new Ajax.Request('../lib/ajax/explorateur.php', {
			method: 'get',
			parameters: { 'id': id },
			onSuccess: function(transport) {
				Dossier.charge = true;
				
				var reponseJSON = transport.responseText || '{}';
				var reponse = reponseJSON.evalJSON(true);

				Dossier.id_parent = reponse.id_parent;

				Dossier.dossiers = reponse.dossiers;
				Dossier.fichiers = reponse.fichiers;

				Dossier.nb_elements = Dossier.dossiers.size() + Dossier.fichiers.size();

				Dossier.adresse = reponse.adresse;

				Dossier.afficher();
				
				if (vider)
					Dossier.vider_corbeille();
			},
			onFailure: function() {
				alert('erreur AJAX');
				Dossier.vider_div();
			}
		});
	},
	
	charger_derniers_uploads: function() {
		new Ajax.Request('../lib/ajax/derniers_uploads.php', {
			method: 'get',
			onSuccess: function(transport) {
				this.charge = true;
				
				var reponseJSON = transport.responseText || '{}';
				var reponse = reponseJSON.evalJSON(true);
				
				if (reponse.fichiers.size() > 0)
				{
					$('icones').innerHTML = '';
					Dossier.masquer_bulle();
					Dossier.fichiers = reponse.fichiers;
					Dossier.fichiers.each(function(f, k) {
						Dossier.afficher_fichier(k);
					});
				}
				else
					Dossier.dossier_vide();
			},
			onFailure: function() {
				alert('erreur AJAX');
			}
		});
	},
	
	afficher: function() {
		this.vider_div();
		
		/////////////////////
		// barre d'adresse //
		/////////////////////
		var adresse = $('adresse');
		adresse.innerHTML = this.adresse;
		
		//////////////////////////////////////
		// barre avec racine, corbeille ... //
		//////////////////////////////////////
		var options_explorateur = $('options_explorateur');
		
		// affichage de l'icone racine
		if (this.id) {
			var racine = Builder.node('div', { className: 'fichier', alt: 'd:0', onclick: 'Dossier.charger(0);' }, [
				Builder.node('img', { alt: '', src: 'images/racine_mini.png' }),
				Builder.node('span', {}, 'Racine')
			]);
			Droppables.add(racine, {
				onDrop: function(depose) {
					Dossier.deplacer(depose, racine);
				}
			});
		} else {
			var racine = Builder.node('div', { className: 'fichier indisponible' }, [
				Builder.node('img', { alt: '', src: 'images/racine_mini2.png' }),
				Builder.node('span', {}, 'Racine')
			]);
			Droppables.remove(racine);
		}
		options_explorateur.insert(racine);

		// affichage de l'icone dossier parent
		if (this.id > 0) {
			var parent = Builder.node('div', { className: 'fichier', alt: 'd:'+this.id_parent, onclick: 'Dossier.charger('+this.id_parent+');' }, [
				Builder.node('img', { alt: '', src: 'images/dossier_parent.png' }),
				Builder.node('span', {}, 'Dossier parent')
			]);
			Droppables.add(parent, {
				onDrop: function(depose) {
					Dossier.deplacer(depose, parent);
				}
			});
		} else {
			var parent = Builder.node('div', { className: 'fichier indisponible' }, [
				Builder.node('img', { alt: '', src: 'images/dossier_parent2.png' }),
				Builder.node('span', {}, 'Dossier parent')
			]);
			Droppables.remove(parent);
		}
		options_explorateur.insert(parent);

		// affichage de la corbeille
		if (this.id >= 0) {
			var corbeille = Builder.node('div', { className: 'fichier', alt: 'd:-1', onclick: 'Dossier.charger(-1);' }, [
				Builder.node('img', { alt: '', src: 'images/corbeille_pleine.png' }),
				Builder.node('span', {}, 'Corbeille')
			]);
			Droppables.add(corbeille, {
				onDrop: function(depose) {
					Dossier.deplacer(depose, corbeille);
				}
			});
		} else {
			var corbeille = Builder.node('div', { className: 'fichier indisponible' }, [
				Builder.node('img', { alt: '', src: 'images/corbeille_pleine2.png' }),
				Builder.node('span', {}, 'Corbeille')
			]);
			Droppables.remove(corbeille);
		}
		options_explorateur.insert(corbeille);

		// affichage de l'icone nouveau dossier ou vider la corbeille
		if (!this.corbeille()) {
			var nouveau_dossier = Builder.node('div', { className: 'fichier', onclick: 'Dossier.creer();' }, [
				Builder.node('img', { alt: '', src: 'images/dossier_mini.png' }),
				Builder.node('span', {}, 'Nouveau Dossier')
			]);
			options_explorateur.insert(nouveau_dossier);
		} else {
			var vider_corbeille = Builder.node('div', { className: 'fichier', onclick: 'Dossier.charger(-1, true);' }, [
				Builder.node('img', { alt: '', src: 'images/corbeille.png' }),
				Builder.node('span', {}, 'Vider la corbeille')
			]);
			options_explorateur.insert(vider_corbeille);
		}

		// fin des flottants		
		this.separateur(options_explorateur);
		
		
		/////////////////////////////////////
		// Icones des dossiers et fichiers //
		/////////////////////////////////////
		if (this.charge)
		{
			var icones = $('icones');

			if (this.nb_elements > 0) {
				// affichage des dossiers
				this.dossiers.each(function(d, k) {
					Dossier.afficher_dossier(k);
				});

				// affichage des fichiers
				this.fichiers.each(function(f, k) {
					Dossier.afficher_fichier(k);
				});
			} else {
				this.dossier_vide();
			}
			this.separateur(icones);
		}
	},
	
	afficher_dossier: function(k) {
		var dossier = this.dossiers[k];
		var icone = Builder.node('div', { className: 'fichier', alt: 'd:'+dossier.id }, [
			Builder.node('img', {
				alt: '',
				src: 'images/dossier.png',
				onmousemove: 'Dossier.afficher_bulle(event, this.parentNode);',
				onmouseout: 'Dossier.masquer_bulle();',
				onmousedown: 'Dossier.debut_clic();',
				onmouseup: 'if (Dossier && !Dossier.move) { Dossier.charger('+dossier.id+'); }'
			}),
			Builder.node('span', {
				onmousedown: 'Dossier.debut_clic();',
				onmouseup: 'if (Dossier && !Dossier.move) { Dossier.renommer(this); }'
			}, dossier.nom)
		]);
		new Draggable(icone, {
			revert: 'failure',
			onStart: function() {
				Dossier.fin_clic();
				Dossier.masquer_bulle();
			},
			onEnd: function() {
				Dossier.debut_clic();
			}
		});
		Droppables.add(icone, {
			onDrop: function(depose) {
				Dossier.deplacer(depose, icone);
			}
		});
		$('icones').insert(icone);
	},
	
	afficher_fichier: function(k) {
		var fichier = this.fichiers[k];
		var extension = $A(fichier.nom.split('.')).last().toLowerCase();
		
		if (fassoc[extension]) {
			var icone_fichier = fassoc[extension];
		} else {
			var icone_fichier = fassoc['autre'];
		}
		
		var icone = Builder.node('div', { className: 'fichier', alt: 'f:'+fichier.code }, [
			Builder.node('img', {
				alt: '',
				src: 'images/mimetypes/'+icone_fichier,
				className: 'icone_fichier',
				onmousemove: 'Dossier.afficher_bulle(event, this.parentNode);',
				onmouseout: 'Dossier.masquer_bulle();',
				onmousedown: 'Dossier.debut_clic();',
				onmouseup: 'if (Dossier && !Dossier.move) { document.location = \'http://caizzii.com/download-'+fichier.code+'-'+fichier.nom+'\'; }'
			}),
			Builder.node('span', {
				onmousedown: 'Dossier.debut_clic();',
				onmouseup: 'if (Dossier && !Dossier.move) { Dossier.renommer(this); }'
			}, fichier.nom)
		]);
		new Draggable(icone, {
			revert: 'failure',
			onStart: function() {
				Dossier.fin_clic();
				Dossier.masquer_bulle();
			},
			onEnd: function() {
				Dossier.debut_clic();
			}
		});
		$('icones').insert(icone);
	},
	
	deplacer: function(depose, dossier) {
		
		new Effect.Parallel([
			new Effect.Squish($A(depose.getElementsByTagName('img')).first(), { sync: true }),
			new Effect.Shrink(depose, { sync: true }),
			new Effect.Fade(depose, { sync: true })
		]);
		
		//dossier.highlight();
		
		new Ajax.Request('../lib/ajax/deplacer.php', {
			method: 'get',
			parameters: { 'id': depose.getAttribute('alt'), 'id_parent': dossier.getAttribute('alt') },
			onSuccess: function(transport) {
				var reponse = transport.responseText;
				if (reponse != '') {
					alert(reponse);
					Dossier.actualiser();
				} else {
					Dossier.nb_elements--;
					if (Dossier.nb_elements == 0)
						window.setTimeout(function() { Dossier.dossier_vide(); }, 1000);
				}
			},
			onFailure: function() {
				alert('erreur AJAX');
				Dossier.vider_div();
			}
		});
	},
	
	renommer: function(element) {
		element = $(element);
		var id = $(element.parentNode).getAttribute('alt');
		var nom = element.innerHTML;
		var nouveau_nom = prompt('Nouveau nom :', nom);
		if (nouveau_nom && nom != nouveau_nom) {
			new Ajax.Request('../lib/ajax/renommer.php', {
				method: 'get',
				parameters: { 'id': id, 'id_parent': this.id_parent, 'nouveau_nom': nouveau_nom },
				onSuccess: function(transport) {
					var reponse = transport.responseText;
					if (reponse != '') {
						alert(reponse);
					} else {
						Dossier.actualiser(); // pour actualiser le nom et l'infobulle
					}
				},
				onFailure: function() {
					alert('erreur AJAX');
					Dossier.vider_div();
				}
			});
		}
	},

	creer: function() {
		var nom = prompt('Entrez un nom de dossier');
		if (nom) {
			new Ajax.Request('../lib/ajax/creer_dossier.php', {
				method: 'get',
				parameters: { 'id': this.id, 'nom': nom },
				onSuccess: function(transport) {
					var reponse = transport.responseText;
					if (reponse != '') {
						alert(reponse);
					} else {
						Dossier.actualiser();
					}
				},
				onFailure: function() {
					alert('erreur AJAX');
					Dossier.vider_div();
				}
			});
		}
	},
	
	vider_corbeille: function() {
		if (this.nb_elements > 0) {
			new Ajax.Request('../lib/ajax/vide_corbeille.php', {
				method: 'get',
				onSuccess: function(transport) {
					var reponse = transport.responseText;
					if (reponse != '') {
						alert(reponse);
					} else {
						Dossier.dossier_vide();
					}
				},
				onFailure: function() {
					alert('erreur AJAX');
					Dossier.vider_div();
				}
			});
		} else {
			alert('Il n\'y a rien a supprimer !');
		}
	},

	afficher_bulle: function(e, element) {
		if (!this.move) {
			if (!e)
				e = window.event;
				
			var x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft);
			var y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop);
			
			var infobulle = $('infobulle');
			var element = $(element);
			var id = element.getAttribute('alt');
			
			var type = id.split(':')[0];
			id = id.split(':')[1];
			var html = '';
			
			if (type == 'd') {
				var dossier = this.dossiers[this.k_dossier(id)];
				html += '<h4>Dossier :</h4>';
				html += '<p>'+dossier.nom+'/</p>';
			} else {
				var fichier = this.fichiers[this.k_fichier(id)];
				html += '<h4>Fichier :</h4>';
				html += '<p>'+fichier.nom+'</p>';
				html += '<h4>Poids :</h4>';
				html += '<p>'+fichier.taille+'</p>';
				if (fichier.mime && fichier.mime.strip()) {
					html += '<h4>Type MIME :</h4>';
					html += '<p>'+fichier.mime+'</p>';
				}
				if (fichier.description && fichier.description.strip()) {
					html += '<h4>Description :</h4>';
					html += '<p>'+fichier.description+'</p>';
				}
				if (fichier.pass_utilisateur && fichier.pass_utilisateur.strip()) {
					html += '<h4>Mot de passe :</h4>';
					html += '<p>'+fichier.pass_utilisateur+'</p>';
				}
			}
			
			if (infobulle.innerHTML != html)
				infobulle.innerHTML = html;
				
			infobulle.setStyle({
				left: (x + 15)+'px',
				top: (y + 15)+'px',
				display: 'block'
			});
		}
	},
	
	k_dossier: function(id) {
		var k_dossier;
		this.dossiers.each(function(v, k) {
			if (v.id == id)
				k_dossier = k;
		});
		return k_dossier;
	},
	
	k_fichier: function(code) {
		var k_fichier;
		this.fichiers.each(function(v, k) {
			if (v.code == code)
				k_fichier = k;
		});
		return k_fichier;
	},
	
	masquer_bulle: function() {
		$('infobulle').hide();
	},

	corbeille: function() {
		return this.adresse.split('/').first() == 'Corbeille';
	},

	actualiser: function() {
		if (this.derniers_uploads)
			this.charger_derniers_uploads();
			
		else
			this.charger(this.id);
	},
	
	vider_div: function() {
		$('icones').innerHTML = '';
		$('options_explorateur').innerHTML = '';
		this.masquer_bulle();
	},

	dossier_vide: function() {
		var mess = Builder.node('span', { className: 'message' }, 'Le dossier est vide.');
		var icones = $('icones');
		icones.innerHTML = '';
		icones.insert(mess);
		this.masquer_bulle();
	},

	debut_clic: function() {
		this.move = false;
	},
	
	fin_clic: function() {
		this.move = true;
	},
	
	separateur: function(element) {
		$(element).insert(Builder.node('div', { className: 'fin_float' }));
	},

	mousemove: function(e) {
		this.fin_clic();
	}

});

