var Medias = Class.create({
	
	/**
	 * 
	 */
	initialize: function(inNode, mode) {
		
		this.currentFolderPath = null;
		this.currentMediaTree = null;
		this.currentFileList = null;
		this.mode = 0;
		
		this.tree = null;
		this.list = null;
		this.editor = null;
		this.currentForm = null;
		
		this.sizes = null;
		this.crops = null;
		this.currentCropper = null;
		
		//reset events
		this.onFileOpen = null;
		this.onFoldersLoaded = null;
		this.onFilesLoaded = null;
		
		if(mode != null) this.mode = mode;
		else this.mode = 0;
		
		if(this.mode == 0){
			
			var btadd = Noa.nodes.button('addpage', Noa.getLabel("mediasBtAddMedia"), { click: this.addMedia.bindAsEventListener(this) });
			var btfold = Noa.nodes.button('addfolder', Noa.getLabel("mediasBtAddFolder"), { click: this.addFolder.bindAsEventListener(this) });
			
			inNode.appendChild(Builder.node('p', { 'class':'submenu' }, [btadd, btfold]));
		}
		this.tree = $(Builder.node('div', { 'class':'bloc list MediasFolders' }));
		this.list = $(Builder.node('div', { 'class':'bloc list' }));
		this.editor = new Element('div', { 'class':'edit' });
		var ed = $(Builder.node('div', { 'class':'bloc last2 MediasEditor' }, [this.editor]));
		
		inNode.appendChild(this.tree);
		inNode.appendChild(this.list);
		inNode.appendChild(ed);

		this.folders();
	},
	/**
	 * 
	 */
	folders: function(){
		
		this.tree.update();
		this.list.update();
		this.editor.update();
		
		
		var foldunfoldHandler = function(){
			var div = this.up().down('div');
			var ul = this.up().down('ul');
			if(ul != undefined){
				if(ul.visible()){
					if(this.nodeName == "DIV"){
						ul.hide();
						div.removeClassName('open');
						div.addClassName('close');
					}
				}
				else{
					ul.show();
					div.removeClassName('close');
					div.addClassName('open');
				}
			}
		}
		
		this.getFolderTree(function(data){
			
			function recuFolders(folders){
				var ul = Builder.node('ul');
				folders.each(function(folder){
					var a = Builder.node('a', {href:'javascript:void(0);'}, [folder.label]);
					a.observe('click', this.files.bindAsEventListener(this, folder.path/*, folder.childs ? true : false*/));
					folder._link = a;
					
					var bt = new Element('div');
					if(folder.childs){
						bt.addClassName('close');
						bt.observe('click', foldunfoldHandler);
						a.observe('click', foldunfoldHandler);
					}
					
					var li = Builder.node('li', [bt, a]);
					
					if(folder.childs) li.appendChild(recuFolders.bind(this)(folder.childs));
					
					ul.appendChild(li);
					
				}.bind(this));
				ul.hide();
				return ul;
			}
			
			var ul = recuFolders.bind(this)(data.folderTree);
			ul.show();
			this.tree.update(ul);
			
			this.currentMediaTree = data.folderTree;
			
			if(this.onFoldersLoaded) this.onFoldersLoaded(data.folderTree);
			
			this.sizes = data.sizes;
			this.crops = data.crops;
			
		}.bind(this));
	},
	/**
	 * 
	 */
	files: function(event, path/*, hasChilds*/){
		this.currentFolderPath = path;

		var decs = this.tree.descendants();
		decs.each(function(elm){
			if(elm.match('a')) elm.removeClassName('on');
		});
		
		var a = null;
		if(event) a = event.element();
		else a = this.getLinkWithPath(this.currentMediaTree, path);
		if(a){
			a.blur();
			a.addClassName('on');
			
			function recuOpen(li){
				if(li && li.nodeName == 'LI'){
					ul = li.up();
					if(ul){
						if(!ul.visible()) ul.show();
						recuOpen(ul.up());
					}
				}
			}
			recuOpen(a.up());
		}
		
		this.list.update();
		this.editor.update();
		
		this.getFileList(path, function(data){
			
			if(data.fileList.length <= 0){
				this.list.appendChild(Builder.node('p', [Noa.getLabel("mediasNoMedias")]));
			}
			
			else{
				var ul = Builder.node('ul');
				data.fileList.each(function(file){
					var a = Builder.node('a', {href:'javascript:void(0);'}, [file.name]);
					a.addClassName('ext '+file.type.toLowerCase());
					a.observe('click', this.open.bindAsEventListener(this, file));
					file._link = a;
					ul.appendChild(Builder.node('li', [a]));
				}.bind(this));
				
				this.list.appendChild(ul);
			}
			
			if(this.mode == 0/* && !hasChilds*/){
				var form = $(Builder.node('form'));
				this.currentForm = form;
				form.appendChild(Noa.nodes.separator());
				form.appendChild(Noa.nodes.button('delete', Noa.getLabel("mediasBtFDel"), { click: this.delfolder.bindAsEventListener(this, path) }));
				this.list.appendChild(form);
			}
			
			this.currentFileList = data.fileList; // On stock la liste de fichier pour s'en servir dans Medias.open
			
			if(this.onFilesLoaded) this.onFilesLoaded(data.fileList);
			
		}.bind(this));
	},
	/**
	 * 
	 */
	open: function(event, file){
		// Si file est un path on cherche l'objet file correspondant
		if(typeof(file) != 'object'){
			for(var i=0; i<this.currentFileList.length; i++){
				if(this.currentFileList[i].path == file){
					file = this.currentFileList[i];
					break;
				}
			}
		}

		// Affichage du bon item en gras
		var decs = this.list.descendants();
		decs.each(function(elm){
			if(elm.match('a')) elm.removeClassName('on');
		});
		var a = null;
		if(event) a = event.element();
		else a = this.getLinkWithPath(this.currentFileList, file.path);
		if(a){
			a.blur(); 
			a.addClassName('on');
		}

		// Mise à jour de la div mediasEditor

		if(this.currentCropper){
			this.currentCropper.remove();
			this.currentCropper = null;
		}
		
		this.editor.update();
		this.editor.appendChild(Builder.node('h3', [file.name]));
		var info = file.path;
		if(file.width && file.height){
			info += ' - ' + file.width + 'x' + file.height + ' px';
		}
		this.editor.appendChild(Builder.node('p', [info]));
		
		var type = file.type.toLowerCase();
		if(type == 'jpg' || type == 'jpeg' || type == 'gif' || type == 'png'){
			/*var m = this.mode == 0 ? 350 : 260;
			var w = file.width;
			var h = file.height;
			if(file.width > m || file.height > m){
				if(file.width > file.height){
					h = file.height / file.width * m;
					w = m;
				}
				else{
					w = file.width / file.height * m;
					h = m;
				}
			}*/
			var img = $(Builder.node('img', { src:escape(Noa.MEDIAS_PATH + file.path) + '?t=' + new Date().getTime() })); // use of esacpe insted of urlEncode ... 
			Noa.resizeImage(img, this.mode == 0 ? 475 : 358, this.mode == 0 ? 380 : 358);
		}
		else{
			var img = $(Builder.node('img', { src:"img/generic_file.png" }));
		}
		this.editor.appendChild(Builder.node('p', {'class':'thumb'}, [img]));
		
		
		// Si on est en mode normal, on ajoute le formulaire
		if(this.mode == 0){
			var form = $(Builder.node('form'));
			this.currentForm = form;
			
			
			var elms = this.makeSelectTree(this.currentMediaTree, file);
			form.appendChild(Noa.nodes.select('moveto', 'moveto', null, elms, null, Noa.getLabel("mediasFormMove")));
			form.appendChild(Noa.nodes.button('', Noa.getLabel("mediasBtMove"), { click: this.move.bindAsEventListener(this, file) }));
			
			form.appendChild(Noa.nodes.separator());
			form.appendChild(Noa.nodes.input('text', 'newname', 'newname', null, file.name, null, Noa.getLabel("mediasFormName")));
			form.appendChild(Noa.nodes.button('', Noa.getLabel("mediasBtName"), { click: this.rename.bindAsEventListener(this, file) }));
			
			if(type == 'jpg' || type == 'jpeg'){
				form.appendChild(Noa.nodes.separator());
				elms = [];
				elms[0] = {label:Noa.getLabel("mediasSelectResize"), value:-1, className:"default"};
				for(var i=1; i<this.sizes.length+1; i++){
					elms[i] = {label:this.sizes[i-1], value:i-1};
				}
				form.appendChild(Noa.nodes.select('resize', null, null, elms, null, Noa.getLabel("mediasFormResize")));
				form.appendChild(Noa.nodes.button('', Noa.getLabel("mediasBtResize"), { click: this.resize.bindAsEventListener(this, file) }));
				
				form.appendChild(Noa.nodes.separator());
				elms = [];
				elms[0] = {label:Noa.getLabel("mediasSelectCrop"), value:-1, className:"default"};
				for(i=1; i<this.crops.length+1; i++){
					elms[i] = {label:this.crops[i-1].label, value:i-1};
				}
				form.appendChild(Noa.nodes.select('crop', null, null, elms, { click:this.startCrop.bindAsEventListener(this, file, img) }, Noa.getLabel("mediasFormCrop")));
				form.appendChild(Noa.nodes.button('', Noa.getLabel("mediasBtCrop"), { click: this.crop.bindAsEventListener(this, file, img) }));
			}
			
			form.appendChild(Noa.nodes.separator());
			form.appendChild(Noa.nodes.button('delete', Noa.getLabel("mediasBtDel"), { click: this.del.bindAsEventListener(this, file) }));
			
			this.editor.appendChild(form);
		}
		
		else if(this.mode == 1){}
		
		if(this.onFileOpen) this.onFileOpen(file);
	},
	/**
	 * 
	 */
	addMedia: function(){
		this.list.update();
		
		var form = $(Builder.node('form'));
		this.currentForm = form;
		form.appendChild(Noa.nodes.input('file', 'file', null, null, '', null, Noa.getLabel("mediasFormAddFile")));
		
		form.appendChild(Noa.nodes.input('text', 'url', null, null, '', null, Noa.getLabel("mediasFormAddURL")))
		
		// On charge la liste des dossiers
		this.getFolderTree(function(data){
			var elms = this.makeSelectTree(data.folderTree);
			
			form.appendChild(Noa.nodes.select('savein', 'savein', null, elms, null, Noa.getLabel("mediasFormAddIn")));
			form.appendChild(Noa.nodes.input('text', 'name', 'name', null, '', null, Noa.getLabel("mediasFormAddName")));
			form.appendChild(Noa.nodes.button('', Noa.getLabel("mediasBtUpload"), { click: this.upload.bindAsEventListener(this) }));
		}.bind(this));
		
		this.editor.update(form);
	},
	/**
	 * 
	 */
	addFolder: function(){
		this.list.update();
		
		var form = $(Builder.node('form', { id:'currentForm' }));
		this.currentForm = form;
		form.appendChild(Noa.nodes.input('text', 'name', 'name', null, '', null, Noa.getLabel("mediasFormAddFName")));
		
		// On charge la liste des dossiers
		this.getFolderTree(function(data){
			var elms = [];
			if(data.folderTree.length > 0){
				elms = this.makeSelectTree(data.folderTree);
			}
			elms.unshift( {label:"/", value:""} );
			
			form.appendChild(Noa.nodes.select('savein', 'savein', null, elms, null, Noa.getLabel("mediasFormAddFIn")));
			form.appendChild(Noa.nodes.button('', Noa.getLabel("mediasBtFSave"), { click: this.newfolder.bindAsEventListener(this) }));
		}.bind(this));
		
		this.editor.update(form);
	},
	/**
	 * 
	 */
	move: function(event, file, replace){
		var params = { mediaPath:file.path, moveTo:this.currentForm['moveto'].value };
		if(replace) params.replace = true;
		
		Noa.ajaxCall('Medias', 'move', params, function(data){
			if(data.result){
				// On recharge l'affichage de la liste de fichiers
				this.files(null, params.moveTo);
				// On affiche le fichier qui à été déplacé
				this.onFilesLoaded = function(files){
					this.open(null, data.result.newPath);
					this.onFilesLoaded = null;
				}.bind(this);
			}
			else{// gestion des erreurs
				if(data.error.text == "fileExistsInDest"){
					Noa.message(Noa.getLabel("mediasMessageFExistsInDest"), function(){
						this.move(null, file, true);
					}.bind(this));
				}
			}
		}.bind(this) );
	},
	/**
	 * 
	 */
	rename: function(event, file, replace){
		var params = { mediaPath:file.path, newName:this.currentForm['newname'].value };
		if(replace) params.replace = true;

		Noa.ajaxCall('Medias', 'rename', params, function(data){
			if(data.result){
				// On recharge l'affichage de la liste de fichiers
				this.files(null, this.currentFolderPath);
				// On affiche le fichier qui à été déplacé
				this.onFilesLoaded = function(files){
					this.open(null, data.result.newPath);
					this.onFilesLoaded = null;
				}.bind(this);
			}
			else{// gestion des erreurs
				if (data.error.text == "fileExists") {
					Noa.message(Noa.getLabel("mediasMessageFileExists"), function(){
						this.rename(null, file, true);
					}.bind(this));
				}
				else if(data.error.text == "nameNull"){
					Noa.message(Noa.getLabel("mediasMessageNameNull"));
				}
			}
		}.bind(this) );
	},
	/**
	 * 
	 */
	resize: function(event, file){
		
		if(this.currentForm['resize'].value == '-1') return;
		
		var params = { mediaPath:file.path, newSize:this.currentForm['resize'].value };
		
		Noa.ajaxCall('Medias', 'resize', params, function(data){
			if(data.result){
				// On recharge l'affichage de la liste de fichiers
				this.files(null, this.currentFolderPath);
				// On affiche le fichier qui à été déplacé
				this.onFilesLoaded = function(files){
					this.open(null, data.result.newPath);
					this.onFilesLoaded = null;
				}.bind(this);
			}
			else{// gestion des erreurs
			}
		}.bind(this) );
	},
	/**
	 * 
	 */
	startCrop: function(event, file, img){
		
		if(this.currentForm['crop'].value == '-1') return;
		
		if(!img.cropper){
			var wR = file.width / img.width;
			var hR = file.height / img.height;
			
			var ratio = {
				x: this.crops[event.element().value].width,
				y: this.crops[event.element().value].height
			};
			this.currentCropper = img.cropper = new Cropper.Img(img, {
				ratioDim: ratio,
				minWidth: ratio.x / wR,
				minHeight: ratio.y / hR
			});
		}
	},
	/**
	 * 
	 */
	crop: function(event, file, img){
		if(!this.currentCropper || this.currentCropper.areaCoords.x2 <= 0 || this.currentCropper.areaCoords.y2 <= 0) return;
		
		var params = { mediaPath:file.path, cropId:this.currentForm['crop'].value };
		
		var wR = file.width / img.width;
		var hR = file.height / img.height;
		
		params.coords = Object.toJSON({
			x1: this.currentCropper.areaCoords.x1 * wR,
			y1: this.currentCropper.areaCoords.y1 * hR,
			x2: this.currentCropper.areaCoords.x2 * wR,
			y2: this.currentCropper.areaCoords.y2 * hR
		});
		
		Noa.ajaxCall('Medias', 'crop', params, function(data){
			if(data.result){
				// On recharge l'affichage de la liste de fichiers
				this.files(null, this.currentFolderPath);
				this.onFilesLoaded = function(files){
					this.open(null, data.result.newPath);
					this.onFilesLoaded = null;
				}.bind(this);
			}
			else{// gestion des erreurs
			}
		}.bind(this) );
	},
	/**
	 * 
	 */
	del: function(event, file){
		Noa.message(Noa.getLabel("mediasMessageDel", file.name), function(){
			var params = { mediaPath:file.path };

			Noa.ajaxCall('Medias', 'delete', params, function(data){
				if(data.result){
					// On recharge l'affichage de la liste de fichiers
					this.files(null, this.currentFolderPath);
				}
				else{// gestion des erreurs
				}
			}.bind(this) );
		}.bind(this));
	},
	/**
	 * 
	 */
	upload: function(event, isok){
		var folder = this.currentForm['savein'].value;
		
		if (!isok) {
			fname = null;
			if (this.currentForm['file'].value != "") {
				var fname = this.currentForm['file'].value;
			}
			else 
				if (this.currentForm['url'].value != "") {
					var fname = this.currentForm['url'].value
					fname = fname.substr(fname.lastIndexOf('/')+1);
				}
			if (fname != null) {
				var params = {
					fname: fname,
					savein: folder,
					name: this.currentForm['name'].value
				};
				Noa.ajaxCall('Medias', 'testUpload', params, function(data){
					if (data.result) {
						this.upload(null, true);
					}
					else {// gestion des erreurs
						if (data.error.text == "fileExists") {
							Noa.message(Noa.getLabel("mediasMessageFExistsInDest"), function(){
								this.upload(null, true);
							}.bind(this));
						}
						if(data.error.text == "typeFilter") {
							Noa.message(Noa.getLabel("mediasMessageFileTypeErr"));
						}
					}
				}.bind(this));
			}
			return;
		}
		
		
		if (this.currentForm['file'].value != "") {
			Noa.upload.init(this.currentForm, 'ajax.php?Medias=upload');
			Noa.upload.submit(function(data){
				if (data.result) {
					// On recharge l'affichage de la liste de fichiers
					this.files(null, folder);
					// On affiche le fichier qui à été déplacé
					this.onFilesLoaded = function(files){
						this.open(null, data.result.newPath);
						this.onFilesLoaded = null;
					}.bind(this);
				}
				else {// gestion des erreurs
				}
			}.bind(this));
		}
		else if(this.currentForm['url'].value != ""){
			var params = this.currentForm.serialize(true);
			Noa.ajaxCall('Medias', 'upload', params, function(data){
				if(data.result){
					// On recharge l'affichage de la liste de fichiers
					this.files(null, folder);
					// On affiche le fichier qui à été déplacé
					this.onFilesLoaded = function(files){
						this.open(null, data.result.newPath);
						this.onFilesLoaded = null;
					}.bind(this);
				}
				else{// gestion des erreurs
				}
			}.bind(this) );
		}
	},
	/**
	 * 
	 */
	newfolder: function(){
		var params = { name:$('currentForm')['name'].value, savein:$('currentForm')['savein'].value };
		Noa.ajaxCall('Medias', 'newfolder', params, function(data){
			if(data.result){
				// On recharge la liste de tout les dossiers
				this.folders();
				this.onFoldersLoaded = function(){
					// On affiche le contenu du nouveau dossier (vide)
					this.files(null, data.result.newPath);
				}.bind(this);
			}
			else{// gestion des erreurs
				if (data.error.text == "folderExists") {
					Noa.message(Noa.getLabel("mediasMessageFolderExists"));
				}
				else if(data.error.text == "nameNull"){
					Noa.message(Noa.getLabel("mediasMessageNameNull"));
				}
			}
		}.bind(this) );
	},
	/**
	 * 
	 */
	delfolder: function(event, path){
		Noa.message(Noa.getLabel("mediasMessageDelF"), function(){
			Noa.ajaxCall('Medias', 'delfolder', { path:path }, function(data){
				if(data.result){
					// On recharge la liste de tout les dossiers
					this.folders();
					this.onFoldersLoaded = function(){
						// On affiche le contenu du nouveau dossier (vide)
						this.files(null, data.result.newPath);
					}
				}
				else{// gestion des erreurs
				}
			}.bind(this) );
		}.bind(this));
	},
	
	/********************************************************************************************************/
	/********************************************************************************************************/
	getLinkWithPath: function(list, path){
		if(list){
			var ret = null;
			function recuList(medias){
				var mi = medias.length;
				for(var i=0; i<mi; i++){
					if(medias[i].path == path && medias[i]._link){
						ret = medias[i]._link;
					}
					if(medias[i].childs) recuList(medias[i].childs);
				}
			}
			recuList(list);
		}
		return ret;
	},
	
	makeSelectTree: function(folders, file){
		var elms = [];
		var depth = 0;
		function recuFolders(folders){
			folders.each(function(folder){
				var elm = {label:''};
				for(var i=0; i<depth; i++) elm.label += ' | ';
				elm.label += folder.label;
				elm.value = folder.path;
				if(file && folder.path == file.path.substring(0, file.path.lastIndexOf('/'))){
					elm.disabled = true;
					//elm.selected = true;
				}
				if(!file && folder.path == this.currentFolderPath){
					elm.selected = true;
				}
				elms.push(elm);
				if(folder.childs){
					depth ++;
					recuFolders.bind(this)(folder.childs);
					depth --;
				}
			}.bind(this));
		}
		recuFolders.bind(this)(folders);
		
		return elms;
	},

	/********************************************************************************************************/
	getFolderTree: function(callback){
		Noa.ajaxCall('Medias', 'getFolderTree', null, callback);
	},
	getFileList: function(folder, callback){
		Noa.ajaxCall('Medias', 'getFileList', {'folder': folder}, callback);
	}
});
Medias.NORMAL_MODE = 0;
Medias.POPIN_MODE = 1;






Medias.lang = {uk_en:{
	mediasTitle:				"Medias",
	
	mediasBtAddMedia:			"Add media",
	mediasBtAddFolder:			"Add folder",
	mediasNoMedias:				"No files in this folder",
	mediasFormMove:				"Move to",
	mediasBtMove:				"Move",
	mediasFormName:				"New name",
	mediasBtName:				"Rename",
	mediasFormResize:			"Resize",
	mediasBtResize:				"Resize",
	mediasSelectResize:			"Select a size...",
	mediasFormCrop:				"Crop",
	mediasBtCrop:				"Crop",
	mediasSelectCrop:			"Select a format...",
	mediasBtDel:				"Delete",
	mediasFormAddFile:			"File",
	mediasFormAddURL:			"Url",
	mediasFormAddIn:			"Save in",
	mediasFormAddName:			"New name",
	mediasBtUpload:				"Upload",
	mediasFormAddFName:			"Name",
	mediasFormAddFIn:			"Create in",
	mediasBtFSave:				"Save",
	mediasBtFDel:				"Delete this folder",
	mediasMessageDel:			"Delete the file \"{$}\" ?",
	mediasMessageDelF:			"Delete this folder and all it's content ?",
	mediasMessageFileExists: 	"A file with the same name allready exists. Do you want to replace it ?",
	mediasMessageFolderExists: 	"A folder with the same name allready exists",
	mediasMessageNameNull: 		"You must specify a name.",
	mediasMessageFExistsInDest:	"A file with the same name allready exists in the destination folder. Do you want to replace it ?",
	mediasMessageFileTypeErr:	"The file type is not valid."
}};
Object.extend(Noa.langData.uk_en, Medias.lang.uk_en);


Medias.lang = {fr_fr:{
	mediasTitle:				"Medias",
	
	mediasBtAddMedia:			"Ajouter un fichier",
	mediasBtAddFolder:			"Créer un dossier",
	mediasNoMedias:				"Pas de fichiers dans ce dossier",
	mediasFormMove:				"Déplacer vers",
	mediasBtMove:				"Déplacer",
	mediasFormName:				"Nouveau nom",
	mediasBtName:				"Renommer",
	mediasFormResize:			"Redimentionner",
	mediasBtResize:				"Redimentionner",
	mediasSelectResize:			"Choisir une taille...",
	mediasFormCrop:				"Recadrer",
	mediasBtCrop:				"Recadrer",
	mediasSelectCrop:			"Choisir un format...",
	mediasBtDel:				"Supprimer",
	mediasFormAddFile:			"Fichier",
	mediasFormAddURL:			"Url",
	mediasFormAddIn:			"Placer dans",
	mediasFormAddName:			"Nouveau nom",
	mediasBtUpload:				"Transférer",
	mediasFormAddFName:			"Nom",
	mediasFormAddFIn:			"Créer dans",
	mediasBtFSave:				"Créer",
	mediasBtFDel:				"Supprimer ce dossier",
	mediasMessageDel:			"Vraiment supprimer le fichier \"{$}\" ?",
	mediasMessageDelF:			"Vraiment supprimer ce dossier ?",
	mediasMessageFileExists: 	"Un fichier du même nom existe déjà. Voulez-vous le remplacer ?",
	mediasMessageFolderExists: 	"Un dossier du même nom existe déjà",
	mediasMessageNameNull: 		"Vous devez spécifier un nom.",
	mediasMessageFExistsInDest:	"Un fichier du même nom existe déjà dans le dossier de destination. Voulez-vous le remplacer ?",
	mediasMessageFileTypeErr:	"Le type de fichier n'est pas valide."
}};
Object.extend(Noa.langData.fr_fr, Medias.lang.fr_fr);