/**
 * class	CS_VisitorUpload
 * author	Wouter Onis
 */
var CS_VisitorUpload = new Class({
	
	/**
	 * initialize
	 * @param	integer	page_object_id
	 * @param	string	upload_file
	 * @param	integer	contact_id
	 * @param	string	contact_key
	 * @return	void
	 */
	initialize: function(page_object_id, upload_file, contact_id, contact_key)
	{
		// settings applet
		this.applet_id 			= '';
		this.applet_name 		= '';
		this.applet_code 		= '';
		this.applet_archive 	= '';
		this.applet_width 		= '';
		this.applet_height 		= '';
		this.applet_mayscript 	= '';
		this.applet_params	 	= new Object();
		
		// set vars
		this.page_object_id 	= page_object_id;
		this.upload_file 		= upload_file;
		this.contact_id			= contact_id;
		this.contact_key		= contact_key;
		this.output_node		= $('cs_visitor_upload_output_'+page_object_id);
		this.start_folder_id	= 0;
		
		// nodes
		this.loader_img_node	= $('cs_visitor_upload_loader_img');
		
		// id's
		this.loader_popup_id	= 'cs_visitor_upload_loader_popup';
		this.upload_form_id		= 'cs_visitor_upload_form';
		
		// classes
		this.hide_class						= 'cs_hide';
		this.show_class						= 'cs_show';
		this.table_folder_class				= 'cs_visitor_upload_folder';
		this.table_file_class				= 'cs_visitor_upload_file';
		this.table_folder_hover_class		= 'cs_visitor_upload_folder_hover';
		this.table_file_hover_class			= 'cs_visitor_upload_file_hover';
		this.table_td_name_class			= 'cs_visitor_upload_name';
		this.table_td_delete_file_class		= 'cs_visitor_upload_delete_file';
		this.table_td_delete_folder_class	= 'cs_visitor_upload_delete_folder';
		this.table_td_rename_class			= 'cs_visitor_upload_rename';
		this.close_dir_class				= 'cs_visitor_upload_close_dir';
		this.cancel_dir_class				= 'cs_visitor_upload_cancel_dir';
		this.submit_dir_class				= 'cs_visitor_upload_submit_dir';
		this.input_dir_class				= 'cs_visitor_upload_input_dir_name';
		this.add_dir_class					= 'cs_visitor_upload_add_dir';
		this.add_file_class					= 'cs_visitor_upload_add_file';
		
		// strings
		this.txt_name 					= '';
		this.txt_size					= '';
		this.txt_date					= '';
		this.txt_download				= '';
		this.txt_delete					= '';
		this.txt_rename					= '';
		this.txt_header					= '';
		this.txt_body					= '';
		this.txt_create_new_dir			= '';
		this.txt_upload_new_files		= '';
		this.txt_change_dirname			= '';
		this.txt_create_new_folder		= '';
		this.txt_folder_name			= '';
		this.txt_cancel					= '';
		this.txt_save_dir				= '';
		this.txt_create_dir				= '';
		this.txt_close_x				= '';
		this.txt_confirm_folder_delete	= '';
		this.txt_confirm_file_delete	= '';
		this.txt_disk_usage				= '';
		this.delete_not_allowed			= 0;
		this.rename_not_allowed			= 0;
		this.hide_disk_usage			= 0;
		this.hide_folders				= 0;
		
		// prefixes
		this.folder_id_prefix			= 'cs_visitor_upload_folder_';
		this.folder_rename_id_prefix	= 'cs_visitor_upload_folder_rename_';
		this.file_id_prefix				= 'cs_visitor_upload_file_';
		
		// set start events
		this.setStartEvent();
	},
	
	/**
	 * set start events
	 * @return	void
	 */
	setStartEvent: function()
	{
		// set vars
		var _this = this;
		
		// main buttons
		var add_folder_button	= $(document.body).getElement('.'+this.add_dir_class);
		var add_file_button		= $(document.body).getElement('.'+this.add_file_class);
		
		if (add_folder_button)
		{
			// now add an event
			add_folder_button.addEvent('click', function()
			{
				// create folder
				_this.createDir(0);
				
				return false;
			});
		}
		
		if (add_file_button)
		{
			// first remove event
			add_file_button.removeEvent('click');
			
			// now add an event
			add_file_button.addEvent('click', function()
			{
				// call jumploader
				_this.uploadFiles();
				
				return false;
			});
		}
	},
	
	/**
	 * load items
	 * @param	integer	start_folder_id
	 * @param	boolean	show_ftp_folder
	 * @return	void
	 */
	loadItems: function(start_folder_id, show_ftp_folder)
	{
		var show_ftp_folder = !show_ftp_folder ? 0 : 1;
		
		// set vars
		if (this.output_node)
		{
			// set vars
			var _this				= this;
			var http_url			= '../html/components/contentmanager/functions/visitor_upload/getItems.php';
			this.start_folder_id	= !start_folder_id ? 0 : parseInt(start_folder_id);
			
			// set params
			var obj_params	= new Object();
			obj_params		= {
				'start_folder_id' : this.start_folder_id,
				'txt_name' : ''+this.txt_name+'',
				'txt_size' : ''+this.txt_size+'',
				'txt_date' : ''+this.txt_date+'',
				'txt_download' : ''+this.txt_download+'',
				'txt_delete' : ''+this.txt_delete+'',
				'txt_rename' : ''+this.txt_rename+'',
				'txt_confirm_folder_delete' : ''+this.txt_confirm_folder_delete+'',
				'txt_confirm_file_delete' : ''+this.txt_confirm_file_delete+'',
				'txt_disk_usage' : ''+this.txt_disk_usage+'',
				'delete_not_allowed' : this.delete_not_allowed.toInt(),
				'rename_not_allowed' : this.rename_not_allowed.toInt(),
				'hide_disk_usage' : this.hide_disk_usage.toInt(),
				'hide_folders' : this.hide_folders.toInt(),
				'show_ftp_folder' : show_ftp_folder
			}
			
			// make request
			var http_request = new Request.HTML({
				url			: http_url,
				update		: this.output_node,
				onRequest	: function()
				{
					// show loader
					_this.showLoader();
				},
				onComplete	: function()
				{
					// hide loader
					_this.hideLoader();
					
					// set events
					_this.setEvents();
					
					// toggle main buttons
					_this.toggleMainButtons();
				}
			});
			
			http_request.get(obj_params);
		}
	},
	
	/**
	 * toggle main buttons
	 * @return	void
	 */
	toggleMainButtons: function()
	{
		var add_folder_button	= $(document.body).getElement('.'+this.add_dir_class);
		var add_file_button		= $(document.body).getElement('.'+this.add_file_class);
		
		// show buttons
		if (this.start_folder_id > 0)
		{
			if (add_folder_button)	add_folder_button.setStyle('display', 'block');
			if (add_file_button)	add_file_button.setStyle('display', 'block');
		}
		else
		{
			if (add_folder_button)	add_folder_button.setStyle('display', 'none');
			if (add_file_button)	add_file_button.setStyle('display', 'none');
		}
	},
	
	/**
	 * show loader
	 * @return	void
	 */
	showLoader: function()
	{
		if (this.loader_img_node)
		{
			// create filter
			this.createFilter();
			
			// show loader
			this.loader_img_node.set('class', this.show_class);
		}
	},
	
	/**
	 * hide loader
	 * @return	void
	 */
	hideLoader: function()
	{
		// hide loader
		if (this.loader_img_node)
		{
			this.loader_img_node.set('class', this.hide_class);
		}
		
		// remove filter
		if ($('cs_visitor_upload_popup_filter_'+this.page_object_id))
		{
			$('cs_visitor_upload_popup_filter_'+this.page_object_id).dispose();
		}
	},
	
	/**
	 * set events
	 * @return	void
	 */
	setEvents: function()
	{
		// set vars
		var _this	= this;
		
		// table folder events
		var table_folder_nodes			= this.output_node.getElements('.'+this.table_folder_class);
		var total_table_folder_nodes	= table_folder_nodes.length;
		
		if (total_table_folder_nodes > 0)
		{
			table_folder_nodes.each(function(table_folder_node, index)
			{
				table_folder_node.addEvent('mouseover', function()
				{
					this.set('class', _this.table_folder_hover_class);
				});
				
				table_folder_node.addEvent('mouseleave', function()
				{
					this.set('class', _this.table_folder_class);
				});
			});
		}
		
		// table file events
		var table_file_nodes		= this.output_node.getElements('.'+this.table_file_class);
		var total_table_file_nodes	= table_file_nodes.length;
		
		if (total_table_file_nodes > 0)
		{
			table_file_nodes.each(function(table_file_node, index)
			{
				table_file_node.addEvent('mouseover', function()
				{
					this.set('class', _this.table_file_hover_class);
				});
				
				table_file_node.addEvent('mouseleave', function()
				{
					this.set('class', _this.table_file_class);
				});
			});
		}
		
		// table td events
		var table_td_nodes			= this.output_node.getElements('td');
		var total_table_td_nodes	= table_td_nodes.length;
		
		if (total_table_td_nodes > 0)
		{
			table_td_nodes.each(function(table_td_node, index)
			{
				switch (table_td_node.className)
				{
					//**************
					// name column *
					//**************
					case _this.table_td_name_class :
					
						var anchor_node	= table_td_node.getElement('a');
						
						if (anchor_node)
						{
							anchor_node.addEvent('click', function()
							{
								// ftp folder
								if (!this.get('id'))
								{
									// load items
									_this.loadItems(_this.start_folder_id, 1);
								}
								
								// get folder id
								else
								{
									var arr_folder_id	= this.id.split(_this.folder_id_prefix);
									var folder_id		= arr_folder_id[1];
									
									// load items
									_this.loadItems(folder_id);
								}
								
								return false;
							});
						}
						
					break;
					
					//***********************
					// delete folder column *
					//***********************
					case _this.table_td_delete_folder_class :
					
						var anchor_node	= table_td_node.getElement('a');
						
						if (anchor_node)
						{
							anchor_node.addEvent('click', function()
							{
								// get folder id
								var arr_anchor_att	= this.id.split(_this.folder_id_prefix);
								var arr_anchor_id	= arr_anchor_att[1].split('_');
								var folder_id		= parseInt(arr_anchor_id[0]);
								var folder_name		= arr_anchor_id[1];
								
								// delete folder
								_this.deleteDir(folder_id, ''+folder_name+'', ''+_this.txt_confirm_folder_delete+'');
								
								return false;
							});
						}
						
					break;
					
					//***********************
					// rename folder column *
					//***********************
					case _this.table_td_rename_class :
					
						var anchor_node	= table_td_node.getElement('a');
						
						if (anchor_node)
						{
							anchor_node.addEvent('click', function()
							{
								// get folder id
								var arr_anchor_id	= this.id.split(_this.folder_rename_id_prefix);
								var folder_id		= parseInt(arr_anchor_id[1]);
								
								// rename folder
								_this.createDir(folder_id);
								
								return false;
							});
						}
						
					break;
					
					//*********************
					// delete file column *
					//*********************
					case _this.table_td_delete_file_class :
					
						var anchor_node	= table_td_node.getElement('a');
						
						if (anchor_node)
						{
							anchor_node.addEvent('click', function()
							{
								// get file id
								var arr_anchor_att	= this.id.split(_this.file_id_prefix);
								var arr_anchor_id	= arr_anchor_att[1].split('_');
								var file_id			= parseInt(arr_anchor_id[0]);
								var file_name		= arr_anchor_id[1];
								
								// delete file
								_this.deleteFile(file_id, ''+file_name+'', ''+_this.txt_confirm_file_delete+'');
								
								return false;
							});
						}
						
					break;
					
					default:
					break;
				}
			});
		}
	},
	
	/**
	 * create filter
	 * @return	void
	 */
	createFilter: function()
	{
		var filter = new Element('div');
		filter.set('id','cs_visitor_upload_popup_filter_'+this.page_object_id);
		filter.set('class','cs_visitor_upload_popup_filter');
		
		filter.injectInside(document.body);
	},
	
	/**
	 * create popup
	 * @return	void
	 */
	createPopup: function()
	{
		this.popup = new Element('div');
		this.popup.set('id','cs_visitor_upload_popup_'+this.page_object_id);
		this.popup.set('class','cs_visitor_upload_popup_create_dir');
		
		this.popup.injectInside(document.body);
	},
	
	/**
	 * create popup loader
	 * @return	void
	 */
	createLoaderPopup: function()
	{
		if (this.popup && this.loader_img_node)
		{
			// create root node
			var loader_popup = new Element('div');
			loader_popup.set('id', this.loader_popup);
			
			var loader_popup_img = new Element('img');
			loader_popup_img.set('src', this.loader_img_node.src);
			
			loader_popup_img.injectInside(loader_popup);
			loader_popup.injectInside(this.popup);
		}
	},
	
	/**
	 * remove popup loader
	 * @return	void
	 */
	removeLoaderPopup: function()
	{
		if (this.loader_popup)
		{
			this.loader_popup.dispose();
		}
	},
	
	/**
	 * clean popup
	 * @return	void
	 */
	cleanPopup: function()
	{
		// set vars
		var _this = this;
		
		// send form
		var form = $(this.upload_form_id);
		form.set('send', {
			onRequest: function()
			{
				// empty popup
				$('cs_visitor_upload_popup_'+_this.page_object_id).empty();
				
				// create popup loader
				_this.createLoaderPopup();
			},
			onSuccess: function(data)
			{
				// remove popup loader
				_this.removeLoaderPopup();
				
				// remove popup
				_this.hidePopup();
				
				// get items
				_this.loadItems(_this.start_folder_id);
			}
		});
		
		form.send();
	},
	
	/**
	 * create folder
	 * @param	integer	folder_id
	 * @return	void
	 */
	createDir: function(folder_id)
	{
		// set vars
		var _this	= this;
		
		if (this.start_folder_id > 0)
		{
			// create filter
			this.createFilter();
			
			// create popup
			this.createPopup();
			
			var http_url	= '../html/components/contentmanager/functions/visitor_upload/getCreateNewDir.php';
			var folder_id	= folder_id > 0 ? parseInt(folder_id) : 0;
			
			// set params
			var obj_params	= new Object();
			obj_params		= {
				'parent_folder_id' : this.start_folder_id,
				'folder_id' : folder_id,
				'txt_change_dirname' : ''+this.txt_change_dirname+'',
				'txt_create_new_folder' : ''+this.txt_create_new_folder+'',
				'txt_folder_name' : ''+this.txt_folder_name+'',
				'txt_cancel' : ''+this.txt_cancel+'',
				'txt_save_dir' : ''+this.txt_save_dir+'',
				'txt_create_dir' : ''+this.txt_create_dir+'',
				'txt_close_x' : ''+this.txt_close_x+''
			}
			
			// make request
			var http_request = new Request.HTML({
				url			: http_url,
				update		: this.popup,
				onRequest	: function()
				{
					// create popup loader
					_this.createLoaderPopup();
				},
				onComplete	: function()
				{
					// remove popup loader
					_this.removeLoaderPopup();
					
					// set events
					_this.setCreateDirEvents();
				}
			});
			
			http_request.get(obj_params);
		}
	},
	
	/**
	 * set events for creating dir
	 * @return	void
	 */
	setCreateDirEvents: function()
	{
		// set vars
		var _this	= this;
		
		if (this.popup)
		{
			//*****************
			// input keypress *
			//*****************
			var input_dir = this.popup.getElement('.'+this.input_dir_class);
			
			if (input_dir)
			{
				input_dir.addEvent('keypress', function(e)
				{
					if (e.key == 'enter')
					{
						// save form
						_this.cleanPopup();
					}
					
				});
			}
				
			//***************
			// close button *
			//***************
			var close_dir_node	= this.popup.getElement('.'+this.close_dir_class);
			
			if (close_dir_node)
			{
				var close_anchor_node	= close_dir_node.getElement('a');
				
				if (close_anchor_node)
				{
					close_anchor_node.addEvent('click', function()
					{
						// hide popup
						_this.hidePopup();
						
						return false;
					});
				}
			}
			
			//****************
			// cancel button *
			//****************
			var cancel_dir_node	= this.popup.getElement('.'+this.cancel_dir_class);
			
			if (cancel_dir_node)
			{
				var cancel_anchor_node	= cancel_dir_node.getElement('a');
				
				if (cancel_anchor_node)
				{
					cancel_anchor_node.addEvent('click', function()
					{
						// hide popup
						_this.hidePopup();
						
						return false;
					});
				}
			}
			
			//****************
			// submit button *
			//****************
			var submit_dir_node	= this.popup.getElement('.'+this.submit_dir_class);
			
			if (submit_dir_node)
			{
				var submit_anchor_node	= submit_dir_node.getElement('a');
				
				if (submit_anchor_node)
				{
					submit_anchor_node.addEvent('click', function()
					{
						// save form
						_this.cleanPopup();
						
						return false;
					});
				}
			}
		}
	},
	
	/**
	 * delete folder
	 * @param	integer	folder_id
	 * @param	string	folder_name
	 * @param	string	confirmation_message
	 * @return	void
	 */
	deleteDir: function(folder_id, folder_name, confirmation_message)
	{
		var _this = this;
		
		if (folder_id > 0)
		{
			confirmation_message = confirmation_message.replace('{folder}', folder_name);
			if (confirm(confirmation_message))
			{
				var http_request = new Request({
					url:		'../html/components/contentmanager/functions/visitor_upload/deleteDir.php',
					method:		'get',
					data:		'folder_id='+folder_id,
					onSuccess:	function(data)
					{
						_this.loadItems(_this.start_folder_id);
					}
				});
				
				http_request.send();
			}
		}
	},
	
	/**
	 * delete file
	 * @param	integer	file_id
	 * @param	string	file_name
	 * @param	string	confirmation_message
	 * @return	void
	 */
	deleteFile: function(file_id, file_name, confirmation_message)
	{
		var _this = this;
		
		if (file_id > 0)
		{
			confirmation_message = confirmation_message.replace('{file}', file_name);
			if (confirm(confirmation_message))
			{
				var http_request = new Request({
					url:		'../html/components/contentmanager/functions/visitor_upload/deleteFile.php',
					method:		'get',
					data:		'file_id='+file_id,
					onSuccess:	function(data)
					{
						_this.loadItems(_this.start_folder_id);
					}
				});
				
				http_request.send();
			}
		}
	},
	
	/**
	 * remove popup
	 * @return	void
	 */
	hidePopup: function()
	{
		$('cs_visitor_upload_popup_'+this.page_object_id).dispose();
		$('cs_visitor_upload_popup_filter_'+this.page_object_id).dispose();
	},
	
	/**
	 * remove applet popup
	 * @return	void
	 */
	removeAppletPopup: function()
	{
		// remove filter
		$('cs_visitor_upload_popup_filter_'+this.page_object_id).dispose();
		
		// remove jumploader popup
		$('cs_visitor_upload_jumploader_wrapper_'+this.page_object_id).dispose();
		
		// load items
		this.loadItems(this.start_folder_id);
	},
	
	/**
	 * upload files
	 * @return	void
	 */
	uploadFiles: function()
	{
		if (this.start_folder_id > 0)
		{
			// create filter
			this.createFilter();
			
			// create jumploader popup
			this.createAppletPopup();
		}
	},
	
	/**
	 * create applet popup
	 * @return	void
	 */
	createAppletPopup: function()
	{
		// set vars
		var _this = this;
		
		// create popup
		var popup_node = new Element('div', {
			'id'	: 'cs_visitor_upload_jumploader_wrapper_'+this.page_object_id,
			'class'	: 'cs_visitor_upload_jumploader_wrapper'
		});
		
		// create header wrapper
		var applet_header_node = new Element('div', {
			'class'	: 'cs_visitor_upload_jumploader_header'
		});
		
		var close_button_node = new Element('a', {
			'href'	: '#',
			'html'	: this.txt_close_x,
			'events': {
				'click': function()
				{
					// remove upload applet
					_this.removeAppletPopup();
					
					return false;
				}
			}
		});
		
		// create applet wrapper
		var applet_wrapper_node = new Element('div', {
			'id'	: 'cs_visitor_upload_jumploader_applet',
			'class'	: 'cs_visitor_upload_jumploader'
		});
		
		// create applet (the oldschool way, because internet explorer cannot load applet when created with mootools 1.2)
		var applet_jumploader_node = document.createElement('applet');
		//applet_jumploader_node.setAttribute('id', this.applet_id);
		applet_jumploader_node.setAttribute('name', this.applet_name);
		applet_jumploader_node.setAttribute('code', this.applet_code);
		applet_jumploader_node.setAttribute('archive', this.applet_archive);
		applet_jumploader_node.setAttribute('width', this.applet_width);
		applet_jumploader_node.setAttribute('height', this.applet_height);
		applet_jumploader_node.setAttribute('mayscript', '');
		
		// create applet params
		if (this.applet_params)
		{
			for (applet_param_name in this.applet_params)
			{
				var applet_param_node = document.createElement('param');
				applet_param_node.setAttribute('name', applet_param_name);
				applet_param_node.setAttribute('value', this.applet_params[applet_param_name]);
				
				applet_jumploader_node.appendChild(applet_param_node);
			}
		}
		
		// add folder id param to upload url
		var applet_param_node = document.createElement('param');
		applet_param_node.setAttribute('name', 'uc_uploadUrl');
		applet_param_node.setAttribute('value', this.upload_file+'&folder_id='+this.start_folder_id);
		
		applet_jumploader_node.appendChild(applet_param_node);
		
		// inject nodes
		close_button_node.injectInside(applet_header_node);
		applet_header_node.injectInside(popup_node);
		applet_wrapper_node.injectInside(popup_node);
		applet_wrapper_node.appendChild(applet_jumploader_node);
		popup_node.injectInside(document.body);
	}
	
});
