/**
 * @class	Job Search
 * @author	Jeffrey van der Veen
 */
var JobSearch = new Class(
{
	/**
	 * initialize
	 * @param	string	root_node_id
	 * @return	void
	 */
	initialize: function(root_node_id)
	{
		// nodes
		this.root_node = root_node_id ? $(root_node_id) : null;
	},
	
	/**
	 * start
	 * @return	void
	 */
	start: function()
	{
		this.setEvents();
	},
	
	/**
	 * set events
	 * @return	void
	 */
	setEvents: function()
	{
		var _this = this;
		
		$$('body').addEvent('click', function()
		{
			_this.closeOptions();
		});
		
		this.setInputEvents();
		this.setSelectEvents();
		this.setChecklistEvents();
	},
	
	/**
	 * set input events
	 * @return	void
	 */
	setInputEvents: function()
	{
		var _this = this;
		
		if (this.root_node)
		{
			var input_nodes = this.root_node.getElements('input[type=text]');
			
			if (input_nodes.length)
			{
				input_nodes.each(function(input_node)
				{
					var row_node	= input_node.getParent('.row');
					var label_node	= row_node ? row_node.getElement('label') : null;
					var label_text	= label_node ? label_node.get('text') : null;

					if (input_node.get('value') == label_text)
					{
						input_node.set('class', 'empty');
					}

					input_node.addEvents(
					{
						'focus'	: function()
						{
							var row_node	= this.getParent('.row');
							var label_node	= row_node ? row_node.getElement('label') : null;
							var label_text	= label_node ? label_node.get('text') : null;

							if (this.get('value') == label_text)
							{
								this.set('value', null);
								
								this.set('class', '');
							}
						},
						'blur'	: function()
						{
							var row_node	= this.getParent('.row');
							var label_node	= row_node ? row_node.getElement('label') : null;
							var label_text	= label_node ? label_node.get('text') : null;

							if (!this.get('value'))
							{
								this.set('value', label_text);
								
								this.set('class', 'empty');
							}
						}
					});
				});
			}
		}
	},
	
	/**
	 * set select events
	 * @return	void
	 */
	setSelectEvents: function()
	{
		var _this = this;
		
		if (this.root_node)
		{
			var select_nodes = this.root_node.getElements('select');
			
			if (select_nodes.length)
			{
				for (i=0; i<select_nodes.length; i++)
				{
					var select_node		= select_nodes[i];
					var selected_node	= select_node.getSelected();
					var option_nodes	= select_node.getElements('option');
					var field_node		= select_node.getParent('.field');
					
					var row_node	= select_node.getParent('.row');
					var label_node	= row_node ? row_node.getElement('label') : null;
					var label_text	= label_node ? label_node.get('text') : null;
					
					if (field_node)
					{
						var alt_select_node		= new Element('div', {'class': 'select'});
						var alt_options_node	= new Element('div', {'class': 'options'});
						var alt_options_tl_node	= new Element('div', {'class': 'options_tl'});
						var alt_options_tc_node	= new Element('div', {'class': 'options_tc'});
						var alt_options_tr_node	= new Element('div', {'class': 'options_tr'});
						var alt_options_ml_node	= new Element('div', {'class': 'options_ml'});
						var alt_options_mc_node	= new Element('div', {'class': 'options_mc'});
						var alt_options_mr_node	= new Element('div', {'class': 'options_mr'});
						var alt_options_bl_node	= new Element('div', {'class': 'options_bl'});
						var alt_options_bc_node	= new Element('div', {'class': 'options_bc'});
						var alt_options_br_node	= new Element('div', {'class': 'options_br'});
						
						alt_select_node.inject(field_node);
						alt_options_node.inject(alt_select_node);
						alt_options_tl_node.inject(alt_options_node);
						alt_options_tc_node.inject(alt_options_node);
						alt_options_tr_node.inject(alt_options_node);
						alt_options_ml_node.inject(alt_options_node);
						alt_options_mc_node.inject(alt_options_node);
						alt_options_mr_node.inject(alt_options_node);
						alt_options_bl_node.inject(alt_options_node);
						alt_options_bc_node.inject(alt_options_node);
						alt_options_br_node.inject(alt_options_node);
						
						if (selected_node)
						{
							var selected_text	= selected_node.get('text');
							
							var alt_selected_node = new Element('div', {'class': 'selected', 'html': '<span>'+selected_text+'</span>'});
							
							alt_selected_node.inject(alt_select_node, 'top');
							
							alt_selected_node.addEvent('click', function(event)
							{
								var alt_select_node		= this.getParent('.select');
								var alt_options_node	= alt_select_node ? alt_select_node.getElement('.options') : null;
								
								if (alt_options_node)
								{
									if (!alt_options_node.hasClass('open'))
									{
										_this.closeOptions();
										event.stopPropagation();
									}
									
									alt_options_node.toggleClass('open');
								}
							});
						}
						
						if (option_nodes.length)
						{
							for (j=0; j<option_nodes.length; j++)
							{
								var option_node		= option_nodes[j];
								var option_value	= option_node.get('value');
								var option_text		= option_node.get('text');
								var alt_option_node	= new Element('div', {'class': 'option '+option_value, 'text': option_text});
								
								if (option_node.get('selected'))
								{
									alt_option_node.addClass('active');
									
									if (label_text == option_text) alt_selected_node.getElement('span').set('class', 'empty');
								}
								
								
								
								alt_option_node.inject(alt_options_mc_node);
								
								alt_option_node.addEvent('click', function(event)
								{
									var option_class		= this.get('class');
									var option_value		= option_class.split(' ')[1];
									var option_text			= this.get('text');
									var field_node			= this.getParent('.field');
									var select_node			= field_node ? field_node.getElement('select') : null;
									var alt_selected_node	= field_node ? field_node.getElement('.selected') : null;
									var alt_active_node		= field_node ? field_node.getElement('.active') : null;
									
									if (select_node)
									{
										select_node.set('value', option_value);
									}
									
									if (alt_selected_node)
									{
										alt_selected_node.set('html', '<span>'+option_text+'</span>');
									}
									
									if (alt_active_node)
									{
										alt_active_node.removeClass('active');
									}
									
									this.addClass('active');
								});
							}
						}
					}
				}
			}
		}
	},
	
	/**
	 * set checklist events
	 * @return	void
	 */
	setChecklistEvents: function()
	{
		var _this = this;
		
		if (this.root_node)
		{
			var checklist_nodes = this.root_node.getElements('.checklist');
			
			if (checklist_nodes.length)
			{
				checklist_nodes.addEvent('click', function(event)
				{
					event.stopPropagation();
				});
				
				for (i=0; i<checklist_nodes.length; i++)
				{
					var checklist_node		= checklist_nodes[i];
					var selected_node		= checklist_node.getElement('.selected');
					var options_node		= checklist_node.getElement('.options');
					var options_close_node	= checklist_node.getElement('.options_close');
					var handler_nodes		= checklist_node.getElements('a');
					var checkbox_nodes		= checklist_node.getElements('input[type=checkbox]');
					var footer_node			= checklist_node.getElement('.options_footer');
					
					this.setSelected(checklist_node);
					
					if (selected_node && options_node)
					{
						selected_node.addEvent('click', function(event)
						{
							var checklist_node	= this.getParent('.checklist');
							var options_node	= checklist_node ? checklist_node.getElement('.options') : null;
							
							if (options_node)
							{
								if (!options_node.hasClass('open'))
								{
									_this.closeOptions();
									event.stopPropagation();
								}
								
								options_node.toggleClass('open');
							}
						});
					}
					
					if (options_close_node)
					{
						options_close_node.addEvent('click', function()
						{
							var checklist_node	= this.getParent('.checklist');
							var options_node	= checklist_node ? checklist_node.getElement('.options') : null;
							
							if (options_node)
							{
								options_node.removeClass('open');
							}
						});
					}
					
					if (handler_nodes.length)
					{
						handler_nodes.addEvent('click', function()
						{
							this.toggleClass('open');
							
							var next_ul_node = this.getNext('ul');
							
							if (next_ul_node)
							{
								next_ul_node.toggleClass('open');
							}
							
							return false;
						});
					}
					
					if (checkbox_nodes.length)
					{
						checkbox_nodes.addEvent('click', function()
						{
							var checklist_node = this.getParent('.checklist');
							
							if (checklist_node)
							{
								_this.setSelected(checklist_node);
							}
						});
						
						if (footer_node)
						{
							footer_node.addEvent('click', function()
							{
								var checklist_node	= this.getParent('.checklist');
								var selected_nodes	= checklist_node ? checklist_node.getElements('input[type=checkbox]:checked') : null;
								
								if (selected_nodes)
								{
									selected_nodes.set('checked', null);
									_this.setSelected(checklist_node);
								}
							});
						}
						
						checkbox_nodes.each(function(checkbox_node)
						{
							var checked_input = checkbox_node.checked;
							
							if (checked_input)
							{
								var ul_nodes		= checkbox_node.getParents('ul');
								var total_ul_nodes	= ul_nodes.length;

								if (total_ul_nodes > 0)
								{
									ul_nodes.each(function(ul_node)
									{
										ul_node.set('class', 'open');
										
										var li_node	= ul_node.getParent('li');

										if (li_node)
										{
											var anchor_node = li_node.getElement('a');
											if (anchor_node) anchor_node.set('class', 'open');
										}
									});
								}
							}
						});
					}
				}
			}
		}
	},
	
	/**
	 * set selected
	 * @param	string	root_node
	 * @return	void
	 */
	setSelected: function(root_node)
	{
		if (root_node)
		{
			var row_node			= root_node.getParent('.row');
			var label_node			= row_node ? row_node.getElement('label') : null;
			var label_text			= label_node ? label_node.get('text') : null;
			var selected_node		= root_node.getElement('.selected');
			var amount_node			= root_node.getElement('.amount');
			var selected_nodes		= root_node.getElements('input[type=checkbox]:checked');
			var selected_amount		= selected_nodes.length;
			var selected_label_node	= null;
			
			if (selected_node)
			{
				switch (selected_amount)
				{
					case 0: break;
					case 1:
						selected_label_node	= selected_nodes.getNext('label');
						label_text				= selected_label_node ? selected_label_node.get('text') : null;
						break
					default:
						label_text = '';
						
						for (b=0; b<selected_amount; b++)
						{
							selected_label_node	 = selected_nodes[b].getNext('label');
							label_text				+= b > 0 ? '; ' : '';
							label_text				+= selected_label_node ? selected_label_node.get('text') : '';
						}
						break;
				}
				
				var class_empty = selected_amount == 0 ? ' class="empty"' : '';
				
				selected_node.set('html', '<span'+class_empty+'>'+label_text+'</span>');
			}
			
			if (amount_node)
			{
				amount_node.set('text', selected_amount);
			}
		}
	},
	
	/**
	 * close options
	 * @return	void
	 */
	closeOptions: function()
	{
		if (this.root_node)
		{
			var open_options_node = this.root_node.getElements('.options.open');
			
			if (open_options_node)
			{
				open_options_node.removeClass('open');
			}
		}
	}
});
