var Filearea = {
	filearea_expand : function(event, id) {
		// Prevent default event
		if (event != null)
			YAHOO.util.Event.preventDefault(event);	
			
		// Get a reference to the row
		var loader_container = YAHOO.util.Dom.get('filearea_row_' + id);
		
		// Expand the row if it hasn't been expanded already
		if (!YAHOO.util.Dom.hasClass(loader_container, 'expanded')) {		
			// Get the url to the file that displays additional information about a filearea
			var url = YAHOO.util.Event.getTarget(event).href;
				
			// Show a loader
			Filearea.append_loader('filearea_row_' + id, loader_container, 'loader_expand');
			
			// Create sucess and failure handlers
			function successHandler(o) {
				// Remove the loader
				Filearea.delete_loader('filearea_row_' + id);
				
				// Show the expanded filearea
				var response = Xml.parse_simple(o.responseXML);
				loader_container.innerHTML += response['data'];
				
				// Mark the row as expanded
				YAHOO.util.Dom.addClass(loader_container, 'expanded');
			}
			function failureHandler(o) {
				// Remove the loader
				Filearea.delete_loader('filearea_row_' + id);
				
				// Show error
				alert('Request failed (' + o.statusText + ')');
			}	
			
			// Make the request
			YAHOO.util.Connect.asyncRequest('GET', url, {success:successHandler, failure:failureHandler});
		}
	}, 
	
	filearea_create : function(event) {
		// Prevent default event
		if (event != null)
			YAHOO.util.Event.preventDefault(event);	
		
		// Collect form content
		var form = YAHOO.util.Event.getTarget(event);
		YAHOO.util.Connect.setForm(form, true); 
		
		// Show loader
		var loader_container = YAHOO.util.Dom.getElementsByClassName('submit', 'div', form);
		Filearea.append_loader('filearea_create', loader_container[0]);
		
		// Create callback
		var callback = {
			upload: function(o) {
				// Remove the loader
				Filearea.delete_loader('filearea_create');
				
				// Parse the response
				var response = Xml.parse_simple(o.responseXML);
				var response_area = YAHOO.util.Dom.getElementsByClassName('response_area', 'div', form);
				
				// Add the new filearea to the document
				if (response['status'] == 1) {
					var fileareas_container = YAHOO.util.Dom.get('fileareas_container');
					fileareas_container.innerHTML = response['data'] + fileareas_container.innerHTML;
					
					// Remove the new class from the next sibling (if there is a sibling with a new class)
					var next_new_filearea = YAHOO.util.Dom.getNextSiblingBy(this_file, function(el) {
						if (YAHOO.util.Dom.hasClass(el, 'filearea_new'))
							return true;
						else 
							return false;	
					});
					if (next_new_filearea)
						YAHOO.util.Dom.removeClass(next_new_filearea, 'filearea_new');
						
					// Clear the form
					form.clear();
				}
				
				// Display response message
				Filearea.show_response(response_area[0], response);
			}
		};
		
		// Make the request
		YAHOO.util.Connect.asyncRequest('POST', form.action, callback);
	}, 
	
	filearea_edit : function(event, id) {
		// Prevent default event
		if (event != null)
			YAHOO.util.Event.preventDefault(event);	
			
		// Collect form content
		var form = YAHOO.util.Event.getTarget(event);
		YAHOO.util.Connect.setForm(form, true);
		
		// Show loader
		var loader_container = YAHOO.util.Dom.getElementsByClassName('submit', 'div', form);
		Filearea.append_loader('filearea_edit_' + id, loader_container[0]);
			
		// Create callback
		var callback = {
			upload: function(o) {
				// Remove the loader
				Filearea.delete_loader('filearea_edit_' + id);
				
				// Parse the response
				var response = Xml.parse_simple(o.responseXML);
				var response_area = YAHOO.util.Dom.getElementsByClassName('response_area', 'div', form);
				
				// Add the new files to the document
				if (response['status'] == 1) {
					if (response['data']) {
						var files_container = YAHOO.util.Dom.get('files_container_' + id);
						files_container.innerHTML = response['data'] + files_container.innerHTML;
					}
					
					// Update the background of the file row
					if (form.hidden.checked == true) {
						if (!YAHOO.util.Dom.hasClass('filearea_row_' + id, 'filearea_hidden'))
							YAHOO.util.Dom.addClass('filearea_row_' + id, 'filearea_hidden')
						} else {
							YAHOO.util.Dom.removeClass('filearea_row_' + id, 'filearea_hidden')
						}
						
						// Update the headers according to the new file name
						YAHOO.util.Dom.get('filearea_files_container_header_name').innerHTML = form.name.value;	// files container header
						YAHOO.util.Dom.get('filearea_edit_header_name').innerHTML = form.name.value;			// edit filearea header
						YAHOO.util.Dom.get('filearea_delete_header_name').innerHTML = form.name.value;			// delete filearea header
						YAHOO.util.Dom.get('filearea_row_' + id + '_link_name').innerHTML = form.name.value;	// filearea name link
						YAHOO.util.Dom.get('filearea_row_' + id + '_description').innerHTML = form.description.value; // filearea name link
				}					
				
				// Display response message
				Filearea.show_response(response_area[0], response);
			}
		};					
		
		// Make the request
		YAHOO.util.Connect.asyncRequest('POST', form.action, callback);
	}, 
	
	filearea_delete : function(event, id) {
		// Prevent default event
		if (event != null)
			YAHOO.util.Event.preventDefault(event);	
			
		// Show loader
		var form = YAHOO.util.Event.getTarget(event);
		var loader_container = YAHOO.util.Dom.getElementsByClassName('submit', 'div', form);
		Filearea.append_loader('filearea_delete_' + id, loader_container[0]);	

		// Create sucess and failure handlers
		function successHandler(o) {
			// Remove the loader
			Filearea.delete_loader('filearea_delete_' + id);
			
			var response = Xml.parse_simple(o.responseXML);
			if (response['status'] == 1) {
				// Delete the filearea row
				var filearea_row = YAHOO.util.Dom.get('filearea_row_' + id);
				filearea_row.parentNode.removeChild(filearea_row);
			} else {
				// Show the message
				var response_area = YAHOO.util.Dom.getElementsByClassName('response_area', 'div', form);
				Filearea.show_response(response_area[0], response);
			}
		}
		function failureHandler(o) {
			// Remove the loader
			Filearea.delete_loader('filearea_delete_' + id);
			
			// Show error
			alert('Request failed (' + o.statusText + ')');
		}	
		
		// Make the request
		YAHOO.util.Connect.asyncRequest('GET', YAHOO.util.Event.getTarget(event).action, {success:successHandler, failure:failureHandler});			
	}, 
	
	another_file_input : function(event) {
		// Prevent default event
		if (event != null)
			YAHOO.util.Event.preventDefault(event);	
			
		// Show loader
		var target = YAHOO.util.Event.getTarget(event);
		var loader_container = target.parentNode;
		Filearea.append_loader('another_file', loader_container, 'loader_expand');
		
		// Create sucess and failure handlers
		function successHandler(o) {
			// Remove the loader
			Filearea.delete_loader('another_file');

			// Show the new file input
			var response = Xml.parse_simple(o.responseXML);
			var this_file = target.parentNode.parentNode;
			var next_file_container = YAHOO.util.Dom.getNextSiblingBy(this_file, function(el) {
				if (YAHOO.util.Dom.hasClass(el, 'next_file_container'))
					return true;
				else 
					return false;	
			});
			next_file_container.innerHTML += response['data'];
			
			// Remove the clicked "new file" link
			var new_file_link = target.parentNode;
			new_file_link.parentNode.removeChild(new_file_link);
		}
		function failureHandler(o) {
			// Remove the loader
			Filearea.delete_loader('another_file');
			
			// Show error
			alert('Request failed (' + o.statusText + ')');
		}	
		
		// Make the request
		YAHOO.util.Connect.asyncRequest('GET', target.href, {success:successHandler, failure:failureHandler});		
	}, 
	
	file_edit : function(event, id) {
		// Prevent default event
		if (event != null)
			YAHOO.util.Event.preventDefault(event);	
			
		// Collect form content
		var form = YAHOO.util.Event.getTarget(event);
		YAHOO.util.Connect.setForm(form, true);
		
		// Show loader
		var loader_container = YAHOO.util.Dom.getElementsByClassName('submit', 'div', form);
		Filearea.append_loader('file_edit_' + id, loader_container[0]);
		
		// Create callback
		var callback = {
			upload: function(o) {
				// Remove the loader
				Filearea.delete_loader('file_edit_' + id);
				
				// Parse response
				var response = Xml.parse_simple(o.responseXML);
				
				// Update the gui if the edit was sucessfull
				if (response['status'] == 1) {
					// Update the background of the file row
					if (form.__file_hidden_0.checked == true) {
						if (!YAHOO.util.Dom.hasClass('file_row_' + id, 'file_hidden'))
							YAHOO.util.Dom.addClass('file_row_' + id, 'file_hidden')
					} else {
						YAHOO.util.Dom.removeClass('file_row_' + id, 'file_hidden')
					}
					
					// Update some labels
					if (response['name']) {
						YAHOO.util.Dom.get('file_edit_header_name').innerHTML = response['name'];			// edit header
						YAHOO.util.Dom.get('file_delete_header_name').innerHTML = response['name'];			// delete header
						YAHOO.util.Dom.get('file_row_' + id + '_link_name').innerHTML = response['name'];	// file name link
					}
					YAHOO.util.Dom.get('file_row_' + id + '_description').innerHTML = form.__file_description_0.value; // file description
				}
				
				// Display response message
				var response_area = YAHOO.util.Dom.getElementsByClassName('response_area', 'div', form);
				Filearea.show_response(response_area[0], response);
			}
		};					
		
		// Make the request
		YAHOO.util.Connect.asyncRequest('POST', form.action, callback);		
	}, 
	
	file_delete : function(event, id) {
		// Prevent default event
		if (event != null)
			YAHOO.util.Event.preventDefault(event);	
			
		// Show loader
		var form = YAHOO.util.Event.getTarget(event);		
		var loader_container = YAHOO.util.Dom.getElementsByClassName('submit', 'div', form);
		Filearea.append_loader('file_delete_' + id, loader_container[0]);	

		// Create sucess and failure handlers
		function successHandler(o) {
			// Remove the loader
			Filearea.delete_loader('file_delete_' + id);
			
			var response = Xml.parse_simple(o.responseXML);
			if (response['status'] == 1) {
				// Delete the file row
				var file_row = YAHOO.util.Dom.get('file_row_' + id);
				file_row.parentNode.removeChild(file_row);
			} else {
				// Show the message
				var response_area = YAHOO.util.Dom.getElementsByClassName('response_area', 'div', form);
				Filearea.show_response(response_area[0], response);
			}
		}
		function failureHandler(o) {
			// Remove the loader
			Filearea.delete_loader('file_delete_' + id);
			
			// Show error
			alert('Request failed (' + o.statusText + ')');
		}	
		
		// Make the request
		var form = YAHOO.util.Event.getTarget(event);
		YAHOO.util.Connect.asyncRequest('GET', form.action, {success:successHandler, failure:failureHandler});			
	}, 
	
	file_expand : function(event, id) {
		// Prevent default event
		if (event != null)
			YAHOO.util.Event.preventDefault(event);	
			
		// Get a reference to the row
		var loader_container = YAHOO.util.Dom.get('file_row_' + id);
		
		// Expand the row if it hasn't been expanded
		if (!YAHOO.util.Dom.hasClass(loader_container, 'expanded')) {
			// Get the url to the file that displays additional information about a filearea
			var target = YAHOO.util.Event.getTarget(event);
			if (target.nodeName == 'IMG')
				target = target.parentNode;
			var url = target.href;
				
			// Show a loader
			Filearea.append_loader('file_row_' + id, loader_container, 'loader_expand');
			
			// Create sucess and failure handlers
			function successHandler(o) {
				// Remove the loader
				Filearea.delete_loader('file_row_' + id);
				
				// Show the expanded filearea
				var response = Xml.parse_simple(o.responseXML);
				loader_container.innerHTML += response['data'];
				
				// Mark the row as expanded
				YAHOO.util.Dom.addClass(loader_container, 'expanded');
			}
			function failureHandler(o) {
				// Remove the loader
				Filearea.delete_loader('file_row_' + id);
				
				// Show error
				alert('Request failed (' + o.statusText + ')');
			}	
			
			// Make the request
			YAHOO.util.Connect.asyncRequest('GET', url, {success:successHandler, failure:failureHandler});
		}
	}, 
	
	append_loader : function(loader_name, container, loader_class) {
		// Create the loader
		var loader = Filearea.create_loader(loader_name, loader_class);
		
		// Append the loader to a container
		if (loader != null)
			container.appendChild(loader.element);
			
		return loader.id;
	}, 
	
	create_loader : function(loader_name, loader_class) {
		// Check if there is a loader with this name already
		var already_loading = YAHOO.util.Dom.get('__loader_' + loader_name);
		if (!already_loading) {
			loader_class = loader_class || 'loader_submit';
			
			// Create the loader
			var loader = document.createElement('div');
			loader.setAttribute('id', '__loader_' + loader_name);
			YAHOO.util.Dom.addClass(loader, loader_class);
			loader.innerHTML = '<img src="img/filearea/loader.gif" />';
			
			// Return the id of the loader allong with the new element
			return {id : loader_name, element : loader};
		} else {
			return null;
		}
	}, 
	
	delete_loader : function(id) {
		var loader = YAHOO.util.Dom.get('__loader_' + id);
		loader.parentNode.removeChild(loader);
	}, 
	
	show_response : function(response_area, response) {
		// Set the correct visibility for the response area
		if (response['message']) {
			// Make it so that the response area reflects the type of the message
			if (response['status'] == 1) {
				YAHOO.util.Dom.replaceClass(response_area, 'response_area_red', 'response_area_green');	
			} else {
				YAHOO.util.Dom.replaceClass(response_area, 'response_area_green', 'response_area_red');
			}			
			YAHOO.util.Dom.replaceClass(response_area, 'hidden', 'visible');
				
			// Set the response area content
			response_area.innerHTML = response['message'];
		} else {
			YAHOO.util.Dom.replaceClass(response_area, 'visible', 'hidden');
		}
	}
}