/**
 * Search and filter component
 */
var Search = {
	// Filters list
	listFilters: {},
	
	// List of current active filters
	listActiveFilters: {},
	
	// Filter count
	count: 0,
	
	/**
	 * Add new filter
	 */
	addFilter: function(slug, value) {
		if (typeof this.listFilters[slug] == 'undefined') {
			this.listFilters[slug] = new Array();
		}
		this.listFilters[slug].push(value);
		this.updateFilter();
	},
	
	/**
	 * Remove filter
	 */
	removeFilter: function(slug, value) {
		this.listFilters[slug].splice( this.listFilters[slug].indexOf(value), 1);
		if(this.listFilters[slug].length == 0) delete this.listFilters[slug];
		this.updateFilter();
	},
	
	/**
	 * Add active filters
	 */
	addActiveFilter: function(slug, value) {
		if (typeof this.listActiveFilters[slug] == 'undefined') {
			this.listActiveFilters[slug] = new Array();
		}
		this.listActiveFilters[slug].push(value);
		this.updateFilter();
	},
	
	/**
	 * Remove filter
	 */
	removeActiveFilter: function(slug, value) {
		this.listActiveFilters[slug].splice( this.listActiveFilters[slug].indexOf(value), 1);
		if(this.listActiveFilters[slug].length == 0) delete this.listActiveFilters[slug];
		this.updateFilter();
	},
	
	/**
	 * Update search Filter
	 */
	updateFilter: function() {
		this.count = $('.filterSelector a.selected').size();
		if (this.count) {
//			$('#filterButtonContainer').animate({height: 30});
//			$('#filterButtonContainer').show();
		} else {
//			$('#filterButtonContainer').animate({height: 0}, function() {
//				$('#filterButtonContainer').hide();
//			});
		}
	},
	
	/**
	 * Implode array into string
	 */
	implode: function(glue, pieces) {
	    var i = '',
	        retVal = '',
	        tGlue = '';
	    if (arguments.length === 1) {
	        pieces = glue;
	        glue = '';
	    }
	    if (typeof(pieces) === 'object') {
	        if (Object.prototype.toString.call(pieces) === '[object Array]') {
	            return pieces.join(glue);
	        } 
	        for (i in pieces) {
	            retVal += tGlue + pieces[i];
	            tGlue = glue;
	        }
	        return retVal;
	    }
	    return pieces;
	},
	
	/**
	 * Prepare string
	 */
	toString: function(bolMerge) {
		if (typeof bolMerge == 'undefined') bolMerge = false;
		
		if (bolMerge) {
			for(filter in this.listActiveFilters) {
				this.addFilter( filter, this.listActiveFilters[filter] );
			}
		}
			
		var str = '';
		for(filter in this.listFilters) {
			str += filter + ':' + this.implode(',', this.listFilters[filter]) + '/';
		}
		return str;
	}
};

$(function () {	
	/**
	 * Set active filters
	 */
	$('.removeFilter').each(function() {
		Search.addActiveFilter( $(this).attr('search_slug') , $(this).attr('search_id') );
	});
	
	/**
	 * Limpiar el filtro
	 */
	$('#clearFilter').click(function(){
		var q = '';
		if ($.trim( $('#SearchQ').val() )) {
			q = 'q:' + $('#SearchQ').val();
		}
		window.location = '/restaurantes/index/' + q;
		return false;
	});
	
	/**
	 * Remove filter event
	 */
	$('.removeFilter').each(function(){
		$(this).click(function() {
			Search.removeActiveFilter( $(this).attr('search_slug'),  $(this).attr('search_id') );
			$('#SearchForm').submit();
			return false;
		});
	});
	
	/**
	 * Unique selector click
	 */
	$('ul.uniqueSelector a').click(function() {
		var slug = $(this).attr('search_slug');
		var value = $(this).attr('search_id');
		
		// SI es un suggestion eliminar el texto erroneo
		if ($(this).hasClass('suggestionLink')) $('#SearchQ').val('');
		
		Search.addFilter(slug, value);
		$('#SearchForm').submit();
		
		return false;
	});
	
	$('ul.multipleSelector .selectorCheck').click(function(){
		$(this).parents('.filterSelector').find('a').click();
	});
	
	/**
	 * Search Button
	 */
	if( $().tipTip != undefined ){
		var strFilterButton = $("#filterButtonContainer").html();
		$(".multipleSelector .filterSelector").each(function(){
			$(this).tipTip({
				keepAlive: true,
				delay: 100,
				content: strFilterButton,
				defaultPosition: "right"
			});
		});
	}
	
	/**
	 * Multiple selector click
	 */
	$('ul.multipleSelector a').click(function() {
		var a = $(this).parents('.filterSelector').find('a');
		var radio = $(this).parents('.filterSelector').find('.selectorCheck');
	
		var slug = a.attr('search_slug');
		var value = a.attr('search_id');
		
		if (a.hasClass('selected')) {
			a.removeClass('selected');
			radio.removeAttr('checked');
			Search.removeFilter(slug, value);
		} else {
			a.addClass('selected');
			radio.attr('checked', 'checked');
			Search.addFilter(slug, value);
		}
		
		return false;
	});
	
	/**
	 * Toggle map height
	 */
	$("#location_map").width( 452 );
	$("#location_map").height( 150 );
	$("#toggleMap").parent().click(function(){
		var strSrc = $(this).children().attr("src");
		if( strSrc == "/img/down.png" ){
			$(this).children().attr( "src", "/img/up.png" );
			$("#location_map").animate( { height: 300, marginLeft: -194, width: 656 } );
			$("#mapOptionsBar").animate( { marginLeft: -194, width: 656 } );
			$("#filterPanel").animate( { marginTop: 420 } );
		}else{
			$(this).children().attr( "src", "/img/down.png" );
			$("#location_map").animate( { height: 150, marginLeft: 0, width: 452 } );
			$("#mapOptionsBar").animate( { marginLeft: 0, width: 452 } );
			$("#filterPanel").animate( { marginTop: 39 } );
		}
	});
	
	/**
	 * Submit form
	 */
	$('#filterButton').live( "click", function(){ $('#SearchForm').submit() });
	$('#SearchForm').submit(function() {
		var strSearch = $.trim($('#SearchQ').val());
		var strFilters = Search.toString(true);
		
		var strSearchInfo = strSearch ? 'q:' + strSearch + '/' : '';
		
		$(this).attr('action', '/restaurantes/index/' + strSearchInfo + strFilters);
	});
	$('.selectorCheck').show();
});
