
(function($){
	
	jQuery.fn.Dropdowns = function(json_data, callback){	
		
		
		return this.each(function(){
								  			
			var $this = $(this);				
			
			//var width = $this.css('width');
			//var backgroundColor = $this.css('background-color');
			
			var select_class = $this.attr('class');
			
			var dynamic_filter = '';
			
			if ($this.hasClass('dynamic-filter'))
			{
				dynamic_filter = 'dynamic-filter';
			}
			
			// Wrap this select box
			$this.wrap('<div class="dropdown-replace '+select_class+'" style="position: relative; " />');
			var wrapper = $this.parent();
			
			// Hide this select box
			$this.hide();
			
			// Get the name of this select box
			var select_name = $this.attr('name');			
						
			// Remove the name from this select box to avoid conflicts
			$this.removeAttr('name');
			
			// Add input field to replace selection
			var input_replace_string = '<input type="text" name="'+select_name+'" class="'+dynamic_filter+'" style="display:none;">';
			$(input_replace_string).appendTo(wrapper);
			var input_replace = $this.siblings('input');
			
			// Add p tag to hold the current selection
			var label_string = '<a class="replace-label" href="#" style="display: block;"></a>';
			$(label_string).appendTo(wrapper);
			var label = $this.siblings('.replace-label');
			
			// Add an inner div to hold all the options, and work as the dropdown background
			var inner_string = '<div class="dropdown-inner" style="position: absolute; display: none; z-index: 20; width: 100%"></div>';
			$(inner_string).appendTo(wrapper);
			var inner = $this.siblings('.dropdown-inner');
			
			var form = $this.closest('form');									
			// Array to store all of this select's options
			var option_array = new Array();
			
			var details_set = false;
						
			$this.children('option').each(function(i,o){
				
				option_array.push(o);
								
				if ($(o).is(':selected'))
				{
					if ($(o).val() != "")
					{
						$(input_replace).val($(o).val());
						$(label).html($(o).html());
						details_set = true;
						
					}
				}
				
				//option_backgroundColor = $(o).css('background-color');
				
				// Add the option to a new div as anchor elements
				
				// UPDATE BY ALEX - needs to read the JSON to see if this item is actually needed in the list, if it's not
				// then we leave it out..
				
				// (Not quite as easy as it sounds ;])
			
				var dynamic = false;
			
				if ($(form).attr('name') == 'lib_documents_filter')
				{
					var pj = json_data['lib_documents'];
					dynamic = true;
				}
				else if (($(form).attr('name') == 'news_filter') || ($(form).attr('name') == 'news_filter_menu'))
				{
					var pj = json_data['news'];
					dynamic = true;
				}
				else if ($(form).attr('name') == 'case_study_category')
				{
					var pj = json_data['case_studies'];
					dynamic = true;
				}
				else if ($(form).attr('name') == 'lib_supportlinks_filter_menu')
				{
					var pj = json_data['lib_supportlinks'];
					dynamic = true;
				}
				
				if (dynamic)
				{
					if (i == 0)
					{
						$('<a href="#" rel="'+$(o).attr('value')+'" class="dropdown-item" style="display: block;">'+$(o).text()+'</a>').appendTo(inner);
					}
					else
					{
						if (select_name == 'categories')
						{
							$.each(pj['categories'], function(category,related_areas){
															  
								if (category == $(o).attr('value'))
								{
									$('<a href="#" rel="'+$(o).attr('value')+'" class="dropdown-item" style="display: block;">'+$(o).text()+'</a>').appendTo(inner);
								}
								else if (related_areas == $(o).attr('value'))
								{
									// If the form JUST has categories, then the value is actually the 2nd parameter, with the first being the numerical index
									$('<a href="#" rel="'+$(o).attr('value')+'" class="dropdown-item" style="display: block;">'+$(o).text()+'</a>').appendTo(inner);
								}
								
							});
						}
						else if (select_name == 'local_area')
						{
							$.each(pj['local_area'], function(local_area,related_cat){
								
								if (local_area == $(o).attr('value'))
								{
									$('<a href="#" rel="'+$(o).attr('value')+'" class="dropdown-item" style="display: block;">'+$(o).text()+'</a>').appendTo(inner);
								}
								
							});
						}
						else if (select_name == 'news_type')
						{
							$.each(pj['news_type'], function(news_type,related_cats_and_areas){
								
								if (news_type == $(o).attr('value'))
								{
									$('<a href="#" rel="'+$(o).attr('value')+'" class="dropdown-item" style="display: block;">'+$(o).text()+'</a>').appendTo(inner);
								}
								
							});
						}
						else if (select_name == 'month')
						{
							$.each(pj['month'], function(month,related_year){
														 
								if (related_year != '!')
								{
								
									if (month == $(o).attr('value'))
									{
										$('<a href="#" rel="'+$(o).attr('value')+'" class="dropdown-item" style="display: block;">'+$(o).text()+'</a>').appendTo(inner);
									}
								}
								
							});
						}
						else if (select_name == 'year')
						{
							$.each(pj['year'], function(year,related_month){
								
								if (year == $(o).attr('value'))
								{
									$('<a href="#" rel="'+$(o).attr('value')+'" class="dropdown-item" style="display: block;">'+$(o).text()+'</a>').appendTo(inner);
								}
								
							});
						}
						else
						{
							$('<a href="#" rel="'+$(o).attr('value')+'" class="dropdown-item" style="display: block;">'+$(o).text()+'</a>').appendTo(inner);
						}
					}
				}
				else
				{
					$('<a href="#" rel="'+$(o).attr('value')+'" class="dropdown-item" style="display: block;">'+$(o).text()+'</a>').appendTo(inner);
				}
										
			});
			
			// Sets the label and value to the first value from this select box
			if (!details_set)
			{
			$(input_replace).val($(option_array[0]).attr('value'));
			$(label).html($(option_array[0]).html());
			}
			
			$('.keyword-search-box').click(function(){
				
				revert_to_default('month');
				revert_to_default('year');
				revert_to_default('categories');
				revert_to_default('local_area');
				
			});
			
			$('a.replace-label').click(function(){
			
				$('.keyword-search-box').val('Search keyword');
				$('.dropdown-inner').css('display','none');
				$('.dropdown-replace').css('z-index', '0');
				$(this).siblings('.dropdown-inner').css('display','block');
				$(this).parent().css('z-index','20');
				
				var input = $(this).siblings('input')
				
				var filter_type = $(input).attr('name');
								
				var level_1 = 'local_area categories';
				var level_2 = 'month year news_type';
				
				if (level_1.indexOf(filter_type) >= 0)
				{
					// Level 1 filter.
					revert_to_default('month');
					revert_to_default('year');
					revert_to_default('news_type');
				}
				else if (level_2.indexOf(filter_type) >= 0)
				{
					// Level 2 filter
					revert_to_default('categories');
					revert_to_default('local_area');
				}
				
				filter_changed(input);
				
				
				return false;
					
			});
			
			$('div.dropdown-inner').click(function(){return false;});
			
			$(document).click(function(){
			
				$('div.dropdown-inner').css('display','none');
				
			});
			
			$('a.dropdown-item').click(function(){
			
				var option_title = $(this).html();
				var option_value = $(this).attr('rel');
							
				var input = $(this).parent().siblings('input');			
				var label = $(this).parent().siblings('.replace-label');			
								
				$(input).val(option_value);
				
				$(label).html(option_title);
				
				$('div.dropdown-inner').css('display','none');
												
				filter_changed(input, this);
				
				return false;
				
			});
			
			function revert_to_default(filter_name)
			{
				// This funciton grabs the first items in a dropdown and applies it as the form value. (reverts to default)
				var input = $('input[name='+filter_name+']');
				
				var first_item = $(input).siblings('div.dropdown-inner').find('a.dropdown-item:first');
								
				$(input).val($(first_item).attr('rel'));
				$(input).siblings('a.replace-label').html($(first_item).html());
				
				$(input).siblings('div.dropdown-inner').find('a.dropdown-item').css('display','block');
				
			}
			
			filter_changed($('input:first'), null);
						
			function filter_changed(input, value)
			{
				
				var form = $(input).closest('form');
				
				var form_name = $(form).attr('name');
				
				var input_name = $(input).attr('name');
				
				if (input_name == 'news_type' || input_name == 'categories' || input_name == 'local_area' || input_name == 'month' || input_name == 'year')
				{
				}
				else
				{
					return false;
				}
				
				var input_value = $(value).attr('rel');
				
				// Different filter forms added here.
				if (form_name == 'lib_documents_filter')
				{
					var json = json_data.lib_documents;
				}
				else if (form_name == 'news_filter' || form_name == 'news_filter_menu')
				{
					var json = json_data.news;
				}
				else if (form_name == 'case_study_category')
				{
					var json = json_data.case_studies;
				}
				else if (form_name == 'lib_supportlinks_filter_menu')
				{
					var json = json_data.lib_supportlinks;
				}
				
				
				if (json[input_name] != undefined)
				{
					var selection_data = json[input_name];
					
					if (selection_data[input_value] != undefined)
					{
						var input_data = selection_data[input_value];
						
						var new_stuff = '';
												
						if (input_name == 'local_area')
						{
							var categories_inner = $('input[name=categories]').siblings('.dropdown-inner');
							$(categories_inner).find('a.dropdown-item').css('display', 'none');
							$(categories_inner).find('a.dropdown-item:first').css('display', 'block');
							$.each(input_data, function(key,value){
								$('a.dropdown-item[rel='+value+']').css('display','block');
							});
						}
						else if (input_name == 'categories')
						{
							var local_area_inner = $('input[name=local_area]').siblings('.dropdown-inner');
							$(local_area_inner).find('a.dropdown-item').css('display', 'none');
							$(local_area_inner).find('a.dropdown-item:first').css('display', 'block');
							$.each(input_data, function(key,value){
								$('a.dropdown-item[rel='+value+']').css('display','block');
							});
						}
						else if (input_name == 'year')
						{
							var month_inner = $('input[name=month]').siblings('.dropdown-inner');
							$(month_inner).find('a.dropdown-item').css('display', 'none');
							$(month_inner).find('a.dropdown-item:first').css('display', 'block');
							$.each(input_data, function(key,value){
								$('a.dropdown-item[rel='+value+']').css('display','block');
							});
						}
						else if (input_name == 'month')
						{
							var year_inner = $('input[name=year]').siblings('.dropdown-inner');
							$(year_inner).find('a.dropdown-item').css('display', 'none');
							$(year_inner).find('a.dropdown-item:first').css('display', 'block');
							$.each(input_data, function(key,value){
								$('a.dropdown-item[rel='+value+']').css('display','block');
							});
						}
					}
				}
				else
				{
					if (input_name == 'news_type')
					{
						var categories_inner = $('input[name=categories]').siblings('.dropdown-inner');
						$(categories_inner).find('a.dropdown-item').css('display', 'block');
						var local_area_inner = $('input[name=local_area]').siblings('.dropdown-inner');
						$(local_area_inner).find('a.dropdown-item').css('display', 'block');
						
					}
					if (input_name == 'local_area')
					{
						var categories_inner = $('input[name=categories]').siblings('.dropdown-inner');
						$(categories_inner).find('a.dropdown-item').css('display', 'block');
					}
					if (input_name == 'categories')
					{
						var local_area_inner = $('input[name=local_area]').siblings('.dropdown-inner');
						$(local_area_inner).find('a.dropdown-item').css('display', 'block');
					}
					if (input_name == 'year')
					{
						var month_inner = $('input[name=month]').siblings('.dropdown-inner');
						$(month_inner).find('a.dropdown-item').css('display', 'block');
					}
					if (input_name == 'month')
					{
						var year_inner = $('input[name=year]').siblings('.dropdown-inner');
						$(year_inner).find('a.dropdown-item').css('display', 'block');
					}
				}
				
				
						
								
				var data = $(form).serialize();
								
				var input_name = $(input).attr('name');				
				/*
				
				$.getJSON('http://www.balancenortheast.co.uk/f/dynamic_filter.php', data, function(response){
					
					//alert(response);
					
					var json_data = $.parseJSON(response);
					
					// Categories
					var available_categories = new Array();
					var available_areas = new Array();
					var available_months = new Array();
					var available_years = new Array();
					
					var categories_inner = $('input[name=categories]').siblings('.dropdown-inner');
					$(categories_inner).find('a.dropdown-item').css('display', 'none');
					$(categories_inner).find('a.dropdown-item:first').css('display', 'block');
					
					$.each(response.categories, function(i,o){
						available_categories.push(o);	
						$('a.dropdown-item[rel='+o+']').css('display','block');
					});
					
					var areas_inner = $('input[name=local_area]').siblings('.dropdown-inner');
					$(areas_inner).find('a.dropdown-item').css('display', 'none');
					$(areas_inner).find('a.dropdown-item:first').css('display', 'block');
					
					$.each(response.local_area, function(i,o){
						available_areas.push(o);	
						$('a.dropdown-item[rel='+o+']').css('display','block');
					});
					
					var month_inner = $('input[name=month]').siblings('.dropdown-inner');
					$(month_inner).find('a.dropdown-item').css('display', 'none');
					$(month_inner).find('a.dropdown-item:first').css('display', 'block');	
					
					$.each(response.month, function(i,o){
						available_months.push(o);	
						$('a.dropdown-item[rel='+o+']').css('display','block');
					});
					
					var year_inner = $('input[name=year]').siblings('.dropdown-inner');
					$(year_inner).find('a.dropdown-item').css('display', 'none');
					$(year_inner).find('a.dropdown-item:first').css('display', 'block');	
					
					$.each(response.year, function(i,o){
						available_years.push(o);	
						$('a.dropdown-item[rel='+o+']').css('display','block');
					});
				});
				*/
				
			}
						
			if (typeof callback == 'function') { // make sure the callback is a function
				callback.call(this); // brings the scope to the callback
			}

			
		});
	};
	
})(jQuery);
