;(function($){
	dsg.fn.advancedSearch = function(sRemoteUrl, narrowSearchTxt, params){
		var params = $.extend({
			departmentValue : $('#advanced-search-department').val(),
			departmentName : $('#advanced-search-department').attr('name'),
			resultHolder : '',
			splitAfterLine : 'no',
			viewAllLabel : "Voir plus de critères",
			callback : function(){}
		},params);
		
		var $loader = $('<span class="loader"></span>').hide();
		
		var defaultValues={};
		
		$("#advanced-search select:not(#advanced-search-sort)").each( function(){
			defaultValues[$(this).attr('name')]=$(this).html();
		});	
		
		var getNewValues = function(name){

			var getCriteria = function(){
				var $criteria = {};
				var $narrow_val = [];
				var getCurrentValues = function(fieldnames){
					$.each(fieldnames, function(i, n){
						if(n!=='narrow'){
							$value = $("#advanced-search div>[name="+n+"]").attr('value');
							if ($value !== 'null' && $value !== 'all') {
								$criteria[n]=$value;
							};
						}else{
							$("#advanced-search .narrow-container select").each(function(){
								$narrow_val.push($(this).attr('value'));
							});
							$criteria["narrow"] = $narrow_val;
						}
					});
				}
				switch(name){
					case 'department' : getCurrentValues(['department']); break;
					case 'category' : getCurrentValues(['department', 'category']); break;
					case 'market' : getCurrentValues(['category', 'market', 'brands']); break;
					case 'aAttributeValues[]' : getCurrentValues(['market', 'brands', 'narrow']); break;
					case 'brands' : getCurrentValues(['category', 'market', 'brands', 'narrow']); break;
				}
				
				return $criteria;
			};
			
			/* Insert Loader */
			var $loaderplace = name === 'aAttributeValues[]' ? ".narrowed-search" : "select[name = " + name + "]";
			$loader.insertAfter($loaderplace).css({display:'inline-block'});
			
			/* Disable Fields */
			$("#advanced-search select").not("select[name=category], select[name=department]").attr("disabled","disabled").siblings("label").addClass("disabled");
			
			/* Remove Narrow Search */
			if (name == 'market' && $(".narrow-container")) {
				$(".narrow-container").remove();
			};
			
			/* Request */
			/*$.getJSON(sRemoteUrl,
				{
					language: "fr",
					action: "criterion",
					type2: getCriteria()
				},
				function(data){
					setValues(data);
					$loader.hide();
					$(params.resultHolder).text();
					if(data.amount && params.resultHolder !='') {$(params.resultHolder).text(data.amount + ' résultats')};
				}
			);*/
			
			$.ajax({
				url: sRemoteUrl,
				//cache: false,
				dataType: 'json',

				data: {
					language: "fr",
					action: "criterion",
					//formValues : params.form.serialize(),
					type2: getCriteria()
				},
				success: function(data){
					setValues(data);
					$loader.hide();
					if(data.amount && params.resultHolder !='') {$(params.resultHolder).text(data.amount)};
					params.callback();
				},
				complete: function(){
					if($("#advanced-search-market").attr("disabled") == ""){
						$("#advanced-search-sort").removeAttr("disabled").siblings("label").removeClass("disabled");
					}
				}
			});

			
		};
			
		var setValues = function(data){
			
			/* Return a series of options from JSON data */
			var dataToOptions = function(field_data){
				var opts = [];
				$.each(field_data, function(val, label){
					opts.push('<option value="'+ val +'">'+ label +'</option>');
				});
				return opts.join();
			};
			
			/* Create narrow search fields and insert them into the DOM */
			var showNarrowFields = function(data){
				$(".narrow-container").remove();
				var attr_lines_html = [];
				attr_lines_html.push('<div class="narrow-container"><label class="narrow">' + narrowSearchTxt + '</label><div class="narrowed-search">');

				$.each(data, function(i, line){
					if(i < params.splitAfterLine || params.splitAfterLine == "no" ){
						attr_lines_html.push('<div class="clear-left viewable">');
						$.each(line, function(j, field){
							if (j > 0) {
								attr_lines_html.push('</div><div class="viewable">');
							}
							attr_lines_html.push('<label for="narrow-field-' + i + '-' + j + '">' + field[0] + '</label><select name="aAttributeValues[]" id="narrow-field-' + i + '-' + j + '">');
							attr_lines_html.push(dataToOptions(field[1]));
							attr_lines_html.push('</select>');	
						});
						attr_lines_html.push('</div>');	
					}else{
						attr_lines_html.push('<div class="clear-left hidden">');
						$.each(line, function(j, field){
							if (j > 0) {
								attr_lines_html.push('</div><div class="hidden">');
							}
							attr_lines_html.push('<label for="narrow-field-' + i + '-' + j + '">' + field[0] + '</label><select name="aAttributeValues[]" id="narrow-field-' + i + '-' + j + '">');
							attr_lines_html.push(dataToOptions(field[1]));
							attr_lines_html.push('</select>');	
						});
						attr_lines_html.push('</div>');	
					}
				});
				if( (data.length > params.splitAfterLine) && (params.splitAfterLine != "no") ){
					attr_lines_html.push('<p class="viewall" id="viewall">'+params.viewAllLabel+'</p>');
				}
				attr_lines_html.push('</div></div>');
				$attributes_lines = $(attr_lines_html.join("")).hide().insertAfter($("#advanced-search-market").parent()).slideDown().bind("disable", function(){
					$(this).remove();
				});
				$('#viewall').click( function(){
					$(this).hide(); 
					$(".hidden").slideDown(function(){params.callback()}); 
				})
			}
			
			/* Set new options to a selected field */
			var updateField = function(thatfield, field_data){
				var previousvalue = thatfield.attr('value');
				thatfield.html(dataToOptions(field_data));
				if(previousvalue){
					thatfield.attr('value', previousvalue);
				};
				if(thatfield.attr('disabled')){
					thatfield.removeAttr("disabled").siblings("label").removeClass("disabled");
				};
			}
			
			/* Set new options to each narrow field */
			var updateNarrowField = function(field, field_data){
			$.each(field_data, function(val, label){
				$.each(label, function(val, label){
						var tags = /<\/?[^>]+(>|$)/g;
						var strippedLabel = label[0].replace(tags,'');
						//var thatlabel = $("#advanced-search label:contains(" + label[0] + ")");
						var thatlabel = $("#advanced-search label:contains(" + strippedLabel + ")");
						var thatfield = thatlabel.siblings("select");
						updateField(thatfield, label[1])
					});
				});
			}
		
			$.each(data, function(field, field_data){
				if (field != "attributes_lines") {
					if (field_data) {
						var thatfield = $("#advanced-search select[name=" + field + "]");
						updateField(thatfield, field_data);
					}else{
						$("#advanced-search select[name=" + field + "]").attr("disabled","disabled").html(defaultValues[field]).siblings("label").addClass("disabled");
					}
				}else{
					if (field_data){
						if($(".narrow-container").html()){updateNarrowField(field, field_data);}
						else{showNarrowFields(field_data);}
					}
					else if($(".narrow-container").html()){$(".narrow-container").remove();};
				};
			});
			
		}
		
		$("#advanced-search select:not(#advanced-search-sort)").live("change", function(){
			var name = $(this).attr("name");
			getNewValues(name);
			$("#advanced-search-sort").attr("disabled","disabled").siblings("label").addClass("disabled");
		});
		
		// On load execute once
		if(params.departmentValue){
			getNewValues(params.departmentName);
		}
		
		// Chainable plugin
		return $(this);
	};
	
	jQuery.fn.extend({

		resultLoad : function(params){
			var params = $.extend({
				sUrl : '',
				jsDest : ''
			},params);
			
			$(params.jsDest).html('<div class="loader">&nbsp;</div>')
			$.ajax({
				url: params.sUrl,
				data: $(this).serialize(),
				success: function(html){
					$(params.jsDest+' .loader').remove()
					$(params.jsDest).html(html);
				}
			});
		}
	
	});	
	
})(jQuery);
