$(document).ready(function() {
	
	function isEmpty(obj) {
	
	    for (var prop in obj) {
	        if (obj.hasOwnProperty(prop)) return false;
	    }
	    return true;
	
	};
	var display_tips = false;
	
	$.fn.advanced_search = function(options){
		/* Advanved seach */
		/**
		 * Create the default Object to be reused later when we define different search areas of the website.
		 */

		settings = jQuery.extend({			
			filter_options: {
				brand: { 
					display: true,
					text: 'Brand'
				},
				technology: {
					display: true,
					text: 'Technology'
				},
				type: {
					display: true,
					text: 'Product Type'
				},
				type2: {
					display: true,
					text: 'Stock Type'
				}		
			},
			selected_options : {},
			brand_url : "",
			technology_url : "",
			type_url : "",
			toggle : '',
			display : false,
			render_on_startup : true,
			animate_results: true,
			search_url : {},			
			attributes: {},
			chosen_title: '<h6 class="chosen_title">Search for:</h6>',
			chosen_animation: 'slide',
			restricted_results: false
			}, options);
		
		settings['search_url']['length'] = 0;
		settings.search_url.attribute_criteria = {};
		
		var this_form = this;
		
		if (settings['toggle'] != "") {		
			$(settings['toggle']).live('click', function(){
				this_form.slideToggle('slow');
			});
		}

		/*if (!settings['display']) {
			this_form.hide();
		}*/	
		
		/**
		 * Run Once - Advanced Search
		 * Build up the URLs depending on what has already been sleceted and determined from the URL (view form creates the LI objects)
		 */	var uid = 0;
		$('.added_item', this_form).each(function(){
			var $option = $(this).next().attr('name');
			var $val = $(this).next().attr('value');
			//settings['filter_options'][$option]['display'] = false;
						
			if ($val != "") {
				if (settings['search_url']['length'] == 0 && settings['chosen_title']) {
					$(".chosen_options", this_form).before(settings['chosen_title']);
					$(".chosen_options", this_form).parent().find('h6.chosen_title').hide().slideDown('slow');
				}
				
				$start = $option.indexOf('[');
				$end = $option.indexOf(']', $start);
				this_uid = $option.slice($start + 1, $end);
				$option = $option.slice(0, $start);
				
				$item = "({ \"" + this_uid + "\" : '"+$val+"' })";
				settings['search_url']['length']++;
				settings['search_url'][$option] = jQuery.extend(settings['search_url'][$option], eval($item));
			}
		});
		
		if (settings['search_url']['length'] == 0) {
			$("div.selected_container", this).hide();
		}
		
		/**
	 	* Run Once - Remove no-script box as its got its own form elements and will confuse the form handler
	 	*/
		$('noscript', this_form).remove();
		
		/**
	 	* Run Once - Rebuild the drop down lists dynamicly.
	 	*/
		// Re Design the search area if JavaScript is turned on.		
		if (settings['render_on_startup']) {
			$('.available_options', this_form).append(advanced_search_build());
		}
		
		advanced_search_rebuild(this_form,settings);
		
		// Determin if weant to let someone press the search button?
		if (settings['search_url']['length'] > 0) {
			/*$("input[type='submit']").removeAttr('disabled');*/
		}
		else {
			if (!settings['display']) {
				this_form.hide();
			}
		}
		
		
		// Build a list of results when we select a type
		$("select[name='options_selector']", this_form).change(function(){
			var $results_obj = $("select[name='options_results']", this_form);
			if ($(this).val() != "") {
				//var option = settings['filter_options'][$(this).val()];
				
				/* Build URL for Searching */
				var url ="";
				if ($("option:selected", this).hasClass('attribute')) {
					$url = 'value/attribute/'+$(this).val();
				}
				else {					
					$url = "" + $(this).val();
				}
				
				if (settings['restricted_results'] == true) {
					$url = $url + "/restricted/true";
				}
				
				//$url = $url + settings['brand_url'] + settings['technology_url'] + settings['type_url'];
				for (var url_filter in settings['search_url']) {
					for (var option_val in settings['search_url'][url_filter]) {
						$url = $url + "/" + url_filter + "/" + settings['search_url'][url_filter][option_val];
					}
				}
				
				$results_obj.html('<option selected>Loading Data..</option>');
				
				// This seems juddery on first load.
				advanced_search_update($results_obj, $url);				
				$results_obj.parent().slideDown('slow');							
			}
			else {
				if (settings['animate_results']) {
					$results_obj.parent().slideUp('slow');
				}
			}
		});
		
		
		// When a filter option has been selected then add this to the list and update the URL
		$("select[name='options_results']", this_form).change(function(){
			var chosen_option = $("select[name='options_selector'] option:selected", this_form);
			if (chosen_option.hasClass('attribute')) {
				chosen_option = 'attribute_criteria';
				settings['restricted_results'] = true;
			} else {
				chosen_option = chosen_option.val();
			}
			
			var this_text = $('option:selected', this).text();
			var $extra_results = false;
						
			if ($(this).val() != "") {
				
			
				if (settings['search_url']['length'] == 0 && settings['chosen_title']) {
					$(".chosen_options", this_form).before(settings['chosen_title']);
					$(".chosen_options", this_form).parent().find('h6.chosen_title').hide().slideDown('slow');
				}
			
				$item = "({ \""+$(this).val()+"\" : '"+$(this).val()+"' })";
			
				settings['search_url']['length']++; 
				settings['search_url'][chosen_option] = jQuery.extend(settings['search_url'][chosen_option], eval($item));
				
				
				if (settings['animate_results']) {
					$(this).parent().slideUp('slow');
				}
				
				var html = '<li class="added"><a href="#" title="Remove Option" alt="Remove Option" class="added_item">' + this_text + '</a>';
				html += '<input type="hidden" name="'+chosen_option+'['+$(this).val()+']" value="' + $(this).val() + '"></li>';
				
				$(".chosen_options", this_form).append(html);
				$this_li = $(".chosen_options li:last-child", this_form);

				if (settings['chosen_animation'] == "slide") {
					$this_li.hide().slideDown('slow', function(){
						advanced_search_rebuild(this_form, settings);
					});
				} else if (settings['chosen_animation'] == "fade") {
					$this_li.hide().fadeIn('slow', function(){
						advanced_search_rebuild(this_form, settings);
					});
				} else {
					advanced_search_rebuild(this_form, settings);		
				}
				
				
				if (settings['search_url']['length'] > 0) {
					$("div.selected_container", this_form).slideDown('slow');
				}	
				
				$(this).html('<option>- No Results -</option>');
				
				
			}
		});
		
		
		// Remove the filter options that have been added/applied
		$(".added_item", this_form).live('click', function(){
			var parent = $(this).parent();
			var selected_option = $(this).next('input');
			var $option_key = selected_option.attr('name');
			var $option_value = settings['filter_options'][$option_key];
					
			$start = $option_key.indexOf('[');
			$end = $option_key.indexOf(']',$start);
			this_uid = $option_key.slice($start+1,$end);
			$option = $option_key.slice(0,$start)
			
			settings['search_url']['length']--;
			delete settings['search_url'][$option][this_uid];
			
			if (settings['search_url']['length'] == 0) {
				parent.parent().parent().find('h6.chosen_title').slideUp('slow', function() { parent.parent().parent().find('h6.chosen_title').remove(); });
			}
			
			
			
			if (isEmpty(settings['search_url']['attribute_criteria'])){
				settings['restricted_results'] = false;
				//re-enable tooltips
				display_tips = true;
			}
			
			if (settings['chosen_animation'] == "slide") {
				parent.slideUp('slow', function(){
					parent.remove();
				});
			} else if (settings['chosen_animation'] == "fade") {
				parent.fadeOut('slow', function(){
					parent.remove();
				});			
			} else {
				parent.remove();
			}
			advanced_search_rebuild(this_form, settings);
		
			if (settings['search_url']['length'] == 0) {
				$("div.selected_container", this_form).slideUp('slow');
			}
			
			return false;
		});
		
	}
	/**
	 * Standard Functions used with both
	 *************************************/
		
	// Rebuild the list options.
	function advanced_search_build(){
		var html = "";
		var options_html = "";
		html += '<li class="options">'
		html += '<select name="options_selector" class="filter_options">';
		html += '</select></li>';
		html += '<li style="display: none;"><select name="options_results"><option selected>- No Results -</option></select></li>';
		html += '<li style="display: none;"><select name="attribute_results"><option selected>- No Results -</option></select></li>';
		html += '<li style="display: none;"><span class="submitBtn"><input type="submit" class="full_width" value="Find" /></span></li>';
		return html;
	}
	
	// Create the options to choose from, some may already be used.
	function advanced_search_rebuild(this_form, settings){

		if (settings['animate_results']) {
			$("select[name='options_results']", this_form).parent().slideUp('slow');
			$("select[name='attribute_results']", this_form).parent().slideUp('slow');
		}
		
		// Rebuild the list of objects to filter by
		var html = '<option value="">- Search by -</option>';
		var i = 0;
		var $obj = $(".filter_options", this_form);	
		
		for (var option in settings['filter_options']) {
			if (settings['filter_options'][option]['display'] == true) {
				i++;
				html += '<option value="' + option + '">' + settings['filter_options'][option]['text'] + '</option>';
			}
		}		
		
		
		//only fetch attributes if a tech has been selected
		if(settings['search_url']['technology'])
		{
			var $url = 'attribute';
			var cnt = 0;
			for (var option_val in settings['search_url']['technology']) {
				$url = $url + "/technology/" + option_val;
				cnt++;
			}
			//make sure a tech id exists
			if (cnt > 0) {
				var $obj = $("select[name='options_selector']", this_form);
					$.getJSON("/advancedsearch/find/" + $url, function(j){
						var options = '';
						if (j.length > 1) {
							for (var i = 0; i < j.length; i++) {
								options += '<option class="attribute" value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
							}
							$obj.append(options);
							show_tips();
						} 
					});
				
			}
		}
		
		
		
		$obj.html(html);
		
		// reset the results fields
		$("select[name='options_results']", this_form).html('<option>- No Results -</option>');
		$("select[name='attribute_results']", this_form).html('<option>- No Results -</option>');
		
		if (settings['animate_results']) {
			if (i == 0) {
				$obj.slideUp('slow');
			}
			else {
				$obj.slideDown('slow');
			}
			if (settings['search_url'].length > 0) {
				$("input[type='submit']", this_form).parent().parent().slideDown('slow');
			}
			else {
				$("input[type='submit']", this_form).parent().parent().slideUp('slow');
			}
		}
	}

	function show_tips() {
		//display tooltips
				
		if($('.search_form').css('display')!='none'){
			//filter options and advanced search
			elem = $('select.filter_options');
		} else {
			//filter options only
			if($('#filter_collapse').css('display')!='none'){
				elem = $('.filter_container select.filter_options');
			} else {
				elem = null;
			}		
		}
		
		if (elem) {
			elem.qtip({
				content: "Attribute Search Available",
				show: {
					when: false, 
					ready: true 
				},
				hide: { when: { event: 'unfocus' } },
				position: {
			    	corner: {
			    		target: 'rightBottom',
			    		tooltip: 'leftTop'
			    	}
			   },
			   style: {
			   		border: {
						width: 5,
						radius: 5
					},
					background: '#ffffff',
					padding: 10,
					textAlign: 'center',
					tip: true,
					name: 'red'
			   }

			});
		}
	}
	
	// Set the advanced search form to be a search class
	//$(".advanced_search_form").advanced_search({toggle: '.toggle_advanced_search' });	
	$(".search_form").advanced_search({toggle: '#as_toggle' });	
	
	
	//quicksearch bar
	var qs = $("ol.quicksearch");
	//populate brands
	advanced_search_update($("select[name='brand[]']",qs),'brand');
	$("select[name='brand[]']",qs).change(function(){
		var sel_brand = $(':selected',this).val();
		advanced_search_update($("select[name='technology[]']",qs),'technology/brand/' + sel_brand);
	});
	//populate tech
	advanced_search_update($("select[name='technology[]']",qs),'technology');
	//update type dropdown when technology is changed
	$("select[name='technology[]']",qs).change(function() {
		var sel_tech = $(':selected',this).val();
		advanced_search_update($("select[name='type[]']",qs),'type/technology/' + sel_tech);
		$("select[name='type[]']",qs).val('M');
	});
	//populate types
	advanced_search_update($("select[name='type[]']",qs),'type');
	$("select[name='type[]']",qs).val('M');	
});

	
	function advanced_search_update($obj, $url){
		$.getJSON("/advancedsearch/find/" + $url, function(j){
			var options = '';
			
			for (var i = 0; i < j.length; i++) {
				options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
			}
			$obj.html(options);
		});
	}	
