;(function($){
	$.fn.advancedSearch = function(sRemoteUrl, params){
		var params = $.extend({
			departmentValue : $('#advanced-search-department').val(),
			departmentName : $('#advanced-search-department').attr('name'),
			categoryValue : $('#advanced-search-category').val(),
			categoryName : $('#advanced-search-category').attr('name'),
			resultHolder : '',
			splitAfterLine : 'no',
			narrowSearch : 'Filtre spécifique', 
			viewAllLabel : "Voir plus de critères",
			form : this,
			callback : function(){}
		},params);
		
		if (params.splitAfterLine !== "no") viewAll = false;
		else viewAll = true;
		
		var $loader = $('<span class="loader"></span>').hide();
		
		var defaultValues={};

		params.form.find("select:not(#advanced-search-sort)").each( function(){
			defaultValues[$(this).attr('name')]=$(this).html();
		});	
		
		var getFirstValues = function(params){
			var $criteria = {};
			
			params.form.find("input[type=hidden]").each( function(){
				$criteria[$(this).attr("name")] = $(this).val();
			});
			$criteria[params.form.find("select:first").attr("name")] = params.form.find("select:first option:selected").val();
			
			/* Insert Loader */
			var $loaderplace = (name === 'aAttributeValues[]' ? ".narrowed-search" : "select[name = " + name + "]");
			$loader.insertAfter($loaderplace).css({display:'inline-block'});
			
			/* Disable Fields */
			params.form.find("select").not("select[name=category], select[name=department]").attr("disabled","disabled").siblings("label").addClass("disabled");
            var loaderOffset = $("#search-submit").position().left - 30;
			params.form.find(".advanced-search-submit").css({backgroundPosition: loaderOffset + 'px 50%'}).addClass("loading");
			
			/* Remove Narrow Search */
			if (name == 'market' && $(".narrow-container")) {
				$(".narrow-container").remove();
			};
			
			$.ajax({
				url: sRemoteUrl,
				dataType: 'json',

				data: {
					language: "fr",
					action: "criterion",
					type2: $criteria
				},
				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").length > 0) jInput = $("#advanced-search-market");
					else jInput = $("#advanced-search-segment");
					
					if(jInput.attr("disabled") == "" ){
						$("#advanced-search-sort").removeAttr("disabled").siblings("label").removeClass("disabled");
						params.form.find(".advanced-search-submit").removeClass("loading");
					}
				}
			});
			
		};
		
		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 = params.form.find("div>[name="+n+"]").attr('value');
							if ($value !== 'null' && $value !== 'all') {
								$criteria[n]=$value;
							};
						}else{
							params.form.find(".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(['department','category', 'market']); break;
					case 'segment' : getCurrentValues(['department','category', 'market', 'segment']); break;
					case 'aAttributeValues[]' : getCurrentValues(['department','category','market', 'segment', 'brands', 'narrow', 'price-range']); break;
					case 'price-range' : getCurrentValues(['department','category','market', 'segment', 'brands', 'narrow', 'price-range']); break;
					case 'brands' : getCurrentValues(['department','category','market','segment', 'brands', 'narrow', 'price-range']); break;
				}
				
				if (params.splitAfterLine !== "no" && name != "aAttributeValues[]") viewAll = false;
				
				return $criteria;
			};
			
			/* Insert Loader */
			var $loaderplace = name === 'aAttributeValues[]' ? ".narrowed-search" : "select[name = " + name + "]";
			$loader.insertAfter($loaderplace).css({display:'inline-block'});
			
			/* Disable Fields */
			params.form.find("select,button").not("select[name=category], select[name=department]").attr("disabled","disabled").siblings("label").addClass("disabled");
            var loaderOffset = $("#search-submit").position().left - 30;
			params.form.find(".advanced-search-submit").css({backgroundPosition: loaderOffset + 'px 50%'}).addClass("loading");
			
			/* Remove Narrow Search */
			if (name == 'market' && $(".narrow-container")) {
				$(".narrow-container").remove();
			} else if (name == 'segment' && $(".narrow-container")) {
				$(".narrow-container").slideUp(function(){
                    $(".narrow-wrapper").removeClass('on');
                }).empty();
			};
			
			$.ajax({
				url: sRemoteUrl,
				dataType: 'json',
				data: {
					language: "fr",
					action: "criterion",
					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").length > 0) jInput = $("#advanced-search-market");
					else jInput = $("#advanced-search-segment");
					
					if(jInput.attr("disabled") == "" ){
						$("#advanced-search-sort").removeAttr("disabled").siblings("label").removeClass("disabled");
						params.form.find(".advanced-search-submit").removeClass("loading");
					}
				}
			});

			
		};
			
		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){
				var attr_lines_html = [];
				attr_lines_html.push('<div class="narrow-container"><label class="narrow">' + params.narrowSearch + '</label><div class="narrowed-search">');
				$.each(data, function(i, line){
					if( i < params.splitAfterLine || params.splitAfterLine == "no" || viewAll === true){
						attr_lines_html.push('<div class="viewable grd-4">');
						$.each(line, function(j, field){
							if (j > 0) {
								attr_lines_html.push('</div><div class="viewable grd-4">');
							}
							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="hidden grd-4">');
						$.each(line, function(j, field){
							if (j > 0) {
								attr_lines_html.push('</div><div class="hidden grd-4">');
							}
							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") && viewAll === false) {
					attr_lines_html.push('<p class="viewall" id="viewall">'+params.viewAllLabel+'</p>');
				}
				attr_lines_html.push('</div></div>');
				if ($(".narrow-container").length>0) {
					$(".narrow-container").html($(attr_lines_html.join("")).html());
				}
				else {
					$attributes_lines = $(attr_lines_html.join("")).hide().appendTo(".narrow-wrapper").slideDown().bind("disable", function(){
						$(this).remove();
					});
				}
				$('#viewall').click( function(){
					$(this).hide(); 
					$(".hidden").slideDown(function(){params.callback()});
					viewAll = true;
				})
                    if ( $('.narrowed-search').find('div').length ) {
                        $(".narrow-wrapper").addClass('on');
                    }
			}
			
			/* Set new options to a selected field */
			var updateField = function(thatfield, field_data){
				var previousvalue = thatfield.attr('value');
				if(!thatfield.is("button")) thatfield.html(dataToOptions(field_data));
				if(previousvalue){
					thatfield.attr('value', previousvalue);
				};
				if(thatfield.attr('disabled')){
					if (!thatfield.is("button") || field_data == true)
						thatfield.removeAttr("disabled").siblings("label").removeClass("disabled");
						params.form.find(".advanced-search-submit").removeClass("loading");
				};
			}
			
			/* Set new options to each narrow field */
			var updateNarrowField = function(field, field_data){
			$.each(field_data, function(i, label){
				$.each(label, function(j, label){
						var tags = /<\/?[^>]+(>|$)/g;
						var strippedLabel = label[0].replace(tags,'');
						var thatlabel = params.form.find('label[for="narrow-field-' + i + '-' + j + '"]');
						var thatfield = thatlabel.siblings("select");
						updateField(thatfield, label[1])
					});
				});
			}
			
			$.each(data, function(field, field_data){
				if (field != "attributes_lines") {
					if (field_data) {
						var thatfield = params.form.find("select[name=" + field + "], button[id=" + field + "]");
						updateField(thatfield, field_data);
					}else{
						params.form.find("select[name=" + field + "], button[id=" + field + "]").attr("disabled","disabled").html(defaultValues[field]).siblings("label").addClass("disabled");
            var loaderOffset = $("#search-submit").position().left - 30;
			params.form.find(".advanced-search-submit").css({backgroundPosition: loaderOffset + 'px 50%'}).addClass("loading");
					}
				}else{
					if (field_data && field != "false"){
						if($(".narrow-container").html()) { 
							updateNarrowField(field,field_data);
						}
						else {
							showNarrowFields(field_data);
							$(".narrow-container").slideDown(); 
						}
						//showNarrowFields(field_data);
					}
					else if($(".narrow-container").html()){$(".narrow-container").remove();};
				};
			});
			
		}
		
		params.form.find("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");
            var loaderOffset = $("#search-submit").position().left - 30;
			params.form.find(".advanced-search-submit").css({backgroundPosition: loaderOffset + 'px 50%'}).addClass("loading");
		});
		
		getFirstValues(params);

		// 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);

