;(function($){
	dsg.fn.advancedSearch = function(sRemoteUrl){
		
		var $attributes_lines = $([]);
		var $loader = $('<span class="loader"></span>').hide();
		
		var $lines = $("#advanced-search").find("div.box fieldset div, div.submit-search div");
		
		// All form selects
		var $selects =
		
		// Bind enable / disable events
		$lines.each(function(){
			$(this)
				.bind("enable", function(){
					if ( $(this)
							
							// Disable label
							.find("label").removeClass("disabled").end()
							
							// Disable select
							.find("select").removeAttr("disabled").end()
							
							// Disable submit button
							.find("span:has(button[type=submit])").removeClass("disabled").end()
							.find("button[type=submit]").removeClass("disabled").length > 0 ) {
						
						// Disable form submit
						$(this).parents("form:eq(0)").unbind("submit");
					}
				})
				.bind("disable", function(){
					if ( $(this)
							.find("label").addClass("disabled").end()
							.find("select").attr("disabled","disabled").end()
							.find("span:has(button[type=submit])").addClass("disabled").end()
							.find("button[type=submit]").addClass("disabled").length > 0 ) {
						$(this).parents("form:eq(0)").submit(function(e){e.preventDefault()});
					}
				});
		})
		
		.not(":first, :eq(4)").trigger("disable").end()
		
		// Change event on <select>s
		.find("select").slice(0,3).change(function(){
			
			var curValue = $(this).val();
			
			var $parent = $(this).parents("div:first");
			
			// Disable next lines
			var $nextLines = $parent.nextAll();
			$nextLines.not($nextLines.slice(-1)).trigger("disable");
			$lines.parent().filter("div").children().trigger("disable");
			
			if ( curValue != "null" && curValue != "all" ) {
				
				// Show loader
				$loader.insertAfter(this).fadeIn();
				
				$.getJSON(sRemoteUrl,
					{
						language: "fr",
						action: "criterion",
						type: $(this).attr("name"),
						id: curValue
					},
					function(data){
						
						$loader.hide();
						
						$.each(data, function(field, field_data){
							
							if (field != "attributes_lines") {
								
								var $curSelect = $selects.filter("[name="+ field +"]");
								var nextOpts = [];
								$.each(field_data, function(val, label){
									nextOpts.push('<option value="'+ val +'">'+ label +'</option>');
								});
								
								$curSelect.html(nextOpts.join()).parents("div:first").trigger("enable");
								
								if ($curSelect[0] === $selects.slice(2,3)[0]) {
									$lines.slice(3,4).trigger("enable"); // Active brands
									$lines.parent().filter("div").children().trigger("enable"); // Active submit
								}
							}
							
							else {
								
								$attributes_lines.remove();
								var attr_lines_html = [];
								
								attr_lines_html.push('<div class="narrow-container"><label class="narrow">Narrow your search :</label><div class="narrowed-search">');
								
								$.each(field_data, function(i, line){
									
									attr_lines_html.push('<div class="clear-left">');
									
									$.each(line, function(j, field){
										
										if (j > 0){
											attr_lines_html.push('</div><div>');
										}
										
										attr_lines_html.push('<label for="narrow-field-'+ i +'-'+ j +'">'+ field[0] +'</label><br /><select name="aAttributeValues[]" id="narrow-field-'+ i +'-'+ j +'">');
										
										$.each(field[1], function(value, label){
											attr_lines_html.push('<option value="'+value+'">'+label+'</option>');
										});
										
										attr_lines_html.push('</select>');
										
									});
									
									attr_lines_html.push('</div>');
									
								});
								
								attr_lines_html.push('</div></div>');
								
								$attributes_lines = $(attr_lines_html.join(""))
									.hide().insertAfter($parent).slideDown(function(){
										$lines.parent().filter("div").children().trigger("enable"); // Active submit
									})
									.bind("disable", function(){
										$(this).remove();
									});
							}
						});
					}
				);
			}
		}).end();
	};
})(jQuery);
