/**
 * class	QAIC_Popup
 * author	Paul Kruijt
 */
var QAIC_Popup = new Class({
	
 	/**
	 * constructor
	 * @return void
	 */
	initialize: function()
	{
		// nodes
		this.root_node	= document.getElement('body');
		
		// id's
		this.filter_id						= 'qaic_filter';
		this.popup_id						= 'qaic_popup';
		this.content_id						= 'qaic_popup_content';
		this.loader_id						= 'qaic_popup_loader';
		this.form_filters_id				= 'qaic_form_filters';
		this.field_type_id					= 'qaic_filter_field_type_id';
		this.button_new_config_handler_id	= 'qaic_popup_filter_new_config_handler';
		
		// classes
		this.content_filter_class		= 'qaic_popup_content_filter';
		this.class_selection_handler	= 'qaic_popup_filter_item_selection_handler';
		this.class_empty_filter			= 'qaic_popup_filter_item_empty';
		this.class_disabled				= 'qaic_disabled';
		this.class_close				= 'close';
		this.class_show					= 'show';
		this.class_hide					= 'hide';
		
		// paths
		this.loader_img_path	= '../img/qaic_loader.gif';
	},
	
	/**
	 * create
	 * @param	string	request_url (complete with parameters)
	 * @param	string	form_id
	 * @param	string	form_action
	 * @return	void
	 */
	create: function(request_url, form_id, form_action)
	{
		// set vars
		var _this = this;
		
		// create filter
		if (!$(this.filter_id))
		{
			this.filter_node = new Element('div', {'id' : this.filter_id});
			this.filter_node.inject(this.root_node);
		}
		
		// create popup
		if (!$(this.popup_id))
		{
			this.popup_node = new Element('div', {'id' : this.popup_id});
			this.popup_node.inject(this.root_node);
			
			this.content_node = new Element('div', {'id' : this.content_id});
			this.content_node.inject(this.popup_node);
			
			this.close_node = new Element('div', {'class' : this.class_close});
			this.close_node.inject(this.popup_node);
			
			this.close_handler_node = new Element('a',
			{
				'href'		: '#',
				'events'	: 
				{
					'click'	: function()
					{
						// remove popup
						_this.remove();
						
						return false;
					}
				}
			});
			
			this.close_handler_node.inject(this.close_node);
		}
		
		// load content
		if (request_url)
		{
			this.loadContent(request_url);
		}
		
		// submit form
		if (form_id)
		{
			var form_action = !form_action ? null : form_action;
			
			this.submitForm(form_id, form_action);
		}
	},
	
	/**
	 * remove
	 * @return void
	 */
	remove: function()
	{
		if (this.filter_node)	this.filter_node.dispose();
		if (this.popup_node)	this.popup_node.dispose();
	},
	
	/**
	 * load content (http request)
	 * @param	string	request_url (complete with parameters)
	 * @return	void
	 */
	loadContent: function(request_url)
	{
		// set vars
		var _this = this;
		
		// make request
		if (this.content_node && request_url)
		{
			var http_request = new Request.HTML(
			{
				url			: request_url,
				update		: this.content_node,
				onRequest	: function()
				{
					// create filter
					_this.createFilter();
					
					// create loader
					_this.createLoader();
				},
				onComplete	: function()
				{
					// set content events
					_this.setContentEvents();
					
					// remove filter
					_this.removeFilter();
					
					// remove loader
					_this.removeLoader();
				}
			});
			
			http_request.get();
		}
	},
	
	/**
	 * submit form (http request)
	 * @param	string	form_id
	 * @param	string	form_action
	 * @return	void
	 */
	submitForm: function(form_id, form_action)
	{
		// set vars
		var _this 		= this;
		var form_action	= !form_action ? '../http/filter_selection.php' : form_action;
		
		if (this.content_node && form_id)
		{
			var form_node = $(form_id);
			
			if (form_node)
			{
				form_node.set('action', form_action);
				
				// send form (ajax)
				form_node.set('send',
				{
					onRequest: function()
					{
						// create filter
						_this.createFilter();
						
						// create loader
						_this.createLoader();
					},
					onSuccess: function(data)
					{
						// set html
						_this.content_node.innerHTML = data;
						
						// set content events
						_this.setContentEvents();
						
						// remove filter
						_this.removeFilter();
						
						// remove loader
						_this.removeLoader();
					}
				});
				
				form_node.send();
			}
		}
	},
	
	/**
	 * set content events
	 * @return void
	 */
	setContentEvents: function()
	{
		// set filter selection events
		this.setFilterSelectionEvents();
		
		// set filter empty events
		this.setFilterEmptyEvents();
		
		// set new configuration events
		this.setNewConfigEvents();
		
		// set download events
		this.setDownloadEvents();
	},
	
	/**
	 * set filter selection events
	 * @return void
	 */
	setFilterSelectionEvents: function()
	{
		// set vars
		var _this = this;
		
		if (this.content_node)
		{
			var selection_handler_nodes			= this.content_node.getElements('a.'+this.class_selection_handler);
			var total_selection_handler_nodes	= selection_handler_nodes.length;
			
			if (total_selection_handler_nodes > 0)
			{
				selection_handler_nodes.each(function(selection_handler_node, index)
				{
					selection_handler_node.removeEvents();
					selection_handler_node.addEvents(
					{
						'click'	: function()
						{
							var selection_handler_id	= this.get('id');
							var filter_type_id			= selection_handler_id.replace('qaic_popup_filter_item_search_', '').toInt();
							
							if (filter_type_id > 0)
							{
								// set hidden input
								var field_type_node	= $(_this.field_type_id);
								
								if (field_type_node)
								{
									field_type_node.set('value', filter_type_id);
									
									var qaic_popup_filter_selection = new QAIC_PopupFilterSelection();
									qaic_popup_filter_selection.create('', _this.form_filters_id);
								}
							}
							
							return false;
						}
					});
				});
			}
		}
	},
	
	/**
	 * set filter empty events
	 * @return void
	 */
	setFilterEmptyEvents: function()
	{
		// set vars
		var _this = this;
		
		if (this.content_node)
		{
			var empty_nodes			= this.content_node.getElements('.'+this.class_empty_filter);
			var total_empty_nodes	= empty_nodes.length;
			
			if (total_empty_nodes > 0)
			{
				empty_nodes.each(function(empty_node, index)
				{
					var empty_handler_node	= empty_node.getElement('a');
					
					if (empty_handler_node)
					{
						empty_handler_node.removeEvents();
						empty_handler_node.addEvents(
						{
							'click'	: function()
							{
								var empty_handler_class	= this.get('class');
								
								if (empty_handler_class != _this.class_disabled)
								{
									var empty_handler_id	= this.get('id');
									var filter_type_id		= empty_handler_id.replace('qaic_popup_filter_item_empty_', '').toInt();
									
									if (filter_type_id > 0)
									{
										// set hidden input
										var field_filter_node	= $('qaic_filter_field_'+filter_type_id);
										
										if (field_filter_node)
										{
											field_filter_node.set('value', '');
											
											// empty hidden alt field
											var field_filter_alt_node	= $('qaic_filter_field_alt_'+filter_type_id);
											if (field_filter_alt_node) field_filter_alt_node.set('value', '');
											
											// submit filters form
											qaic_popup.submitForm('qaic_form_filters', '../http/filter.php');
										}
									}
								}
								
								return false;
							}
						});
					}
				});
			}
		}
	},
	
	/**
	 * set new configuration events
	 * @return void
	 */
	setNewConfigEvents: function()
	{
		// set vars
		var _this = this;
		
		if (this.content_node)
		{
			var button_new_config = $(this.button_new_config_handler_id);
			
			if (button_new_config)
			{
				button_new_config.removeEvents();
				button_new_config.addEvents(
				{
					'click' : function()
					{
						var empty_nodes			= _this.content_node.getElements('.'+_this.class_empty_filter);
						var total_empty_nodes	= empty_nodes.length;
						
						if (total_empty_nodes > 0)
						{
							empty_nodes.each(function(empty_node, index)
							{
								var empty_handler_node	= empty_node.getElement('a');
								
								if (empty_handler_node)
								{
									var empty_handler_class	= empty_handler_node.get('class');
									
									if (empty_handler_class != _this.class_disabled)
									{
										var empty_handler_id	= empty_handler_node.get('id');
										var filter_type_id		= empty_handler_id.replace('qaic_popup_filter_item_empty_', '').toInt();
										
										if (filter_type_id > 0)
										{
											// set hidden input
											var field_filter_node	= $('qaic_filter_field_'+filter_type_id);
											
											if (field_filter_node)
											{
												field_filter_node.set('value', '');
												
												// empty hidden alt field
												var field_filter_alt_node	= $('qaic_filter_field_alt_'+filter_type_id);
												if (field_filter_alt_node) field_filter_alt_node.set('value', '');
											}
										}
									}
								}
							});
							
							// submit filters form
							qaic_popup.submitForm('qaic_form_filters', '../http/filter.php');
						}
						
						return false;
					}
				});
			}
		}
	},
	
	/**
	 * set download events
	 * @return void
	 */
	setDownloadEvents: function()
	{
		// set vars
		var _this = this;
		
		if (this.content_node)
		{
			var button_results_node	= $('qaic_popup_filter_button_results');
			
			if (button_results_node)
			{
				button_results_node.removeEvents();
				button_results_node.addEvents(
				{
					'click'	: function()
					{
						var button_class = this.get('class');
						
						if (button_class != _this.class_disabled)
						{
							// dynamicly set value of hidden field
							var field_download_type_node	= $('qaic_field_download_type_id');
							
							if (field_download_type_node)
							{
								field_download_type_node.set('value', 3);
								
								var qaic_popup_downloads = new QAIC_PopupDownloads();
								qaic_popup_downloads.create('', _this.form_filters_id, '../http/downloads.php');
							}
						}
						
						return false;
					}
				});
			}
			
			var button_cad_node	= $('qaic_popup_filter_button_cad');
			
			if (button_cad_node)
			{
				button_cad_node.removeEvents();
				button_cad_node.addEvents(
				{
					'click'	: function()
					{
						var button_class = this.get('class');
						
						if (button_class != _this.class_disabled)
						{
							// dynamicly set value of hidden field
							var field_download_type_node	= $('qaic_field_download_type_id');
							
							if (field_download_type_node)
							{
								field_download_type_node.set('value', 2);
								
								var qaic_popup_downloads = new QAIC_PopupDownloads();
								qaic_popup_downloads.create('', _this.form_filters_id, '../http/downloads.php');
							}
						}
						
						return false;
					}
				});
			}
			
			var button_specs_node	= $('qaic_popup_filter_button_specs');
			
			if (button_specs_node)
			{
				button_specs_node.removeEvents();
				button_specs_node.addEvents(
				{
					'click'	: function()
					{
						var button_class = this.get('class');
						
						if (button_class != _this.class_disabled)
						{
							// dynamicly set value of hidden field
							var field_download_type_node	= $('qaic_field_download_type_id');
							
							if (field_download_type_node)
							{
								field_download_type_node.set('value', 1);
								
								var qaic_popup_downloads = new QAIC_PopupDownloads();
								qaic_popup_downloads.create('', _this.form_filters_id, '../http/downloads.php');
							}
						}
						
						return false;
					}
				});
			}
		}
	},
	
	/**
	 * create filter
	 * @return void
	 */
	createFilter: function()
	{
		if (this.popup_node)
		{
			this.content_filter_node = new Element('div', {'class' : this.content_filter_class});
			this.content_filter_node.inject(this.popup_node);
		}
	},
	
	/**
	 * remove filter
	 * @return void
	 */
	removeFilter: function()
	{
		if (this.content_filter_node) this.content_filter_node.dispose();
	},
	
	/**
	 * create loader
	 * @return void
	 */
	createLoader: function()
	{
		if (this.popup_node)
		{
			// create wrapper
			this.loader_node = new Element('div', {'id' : this.loader_id});
			this.loader_node.inject(this.popup_node);
			
			// create image
			this.loader_img_node = new Element('img', {'src' : this.loader_img_path});
			this.loader_img_node.inject(this.loader_node);
		}
	},
	
	/**
	 * remove loader
	 * @return void
	 */
	removeLoader: function()
	{
		if (this.loader_node) this.loader_node.dispose();
	}
});
