Created
June 25, 2014 17:42
-
-
Save alyraz/33e27df4b90fb5f22148 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
HC.filters = function filtersCollection() { | |
var api = {}; | |
var filters = { | |
amenity: [], | |
activity: [], | |
feature: [] | |
}; | |
api.add = function(type, name) { | |
filters[type].push(name); | |
var eventName = 'filterSelected'; | |
triggerEvent(eventName, type, name); | |
}; | |
api.remove = function(type, name) { | |
filters[type] = _.reject(filters[type], function(filter) { | |
return filter === name; | |
}); | |
var eventName = 'filterUnselected'; | |
triggerEvent(eventName, type, name); | |
}; | |
api.selected = function() { | |
return filters; | |
}; | |
api.isSelected = function(type, name) { | |
return _.some(filters[type], function(filter) { | |
return filter === name; | |
}); | |
}; | |
api.updateFilters = function(type, name) { | |
api.isSelected(type, name) ? api.remove(type, name) : api.add(type, name); | |
} | |
function triggerEvent(eventName, type, name) { | |
$.event.trigger({ | |
type: eventName, | |
filter: { | |
type: type, | |
name: name | |
}, | |
selectedFilters: api.selected() | |
}); | |
} | |
return api; | |
}(); | |
function filterHandlers() { | |
var filters = HC.filters; | |
var hideAllPopovers = function(e) { | |
$('.filter-handlers > span').not(this).removeClass('active').popover('hide'); | |
$(this).toggleClass('active'); | |
} | |
var selectFilter = function(e) { | |
e.preventDefault(); | |
var target = $(e.currentTarget).find('a'); | |
var filter = target.data('filter').split('-'); | |
var type = _.first(filter); | |
var name = _.last(filter); | |
filters.updateFilters(type, name); | |
} | |
return { | |
hideAllPopovers: hideAllPopovers, | |
selectFilter: selectFilter | |
} | |
} | |
function filtersView() { | |
var api = {}; | |
api.updateCounts = function(e) { | |
var filters = e.selectedFilters; | |
_.each(_.keys(filters), function(filterName) { | |
var filterCount = filters[filterName].length; | |
var contents = filterCount > 0 ? '('+filterCount+')' : ''; | |
$('.'+filterName+'-count').html(contents); | |
}); | |
} | |
return api; | |
} | |
function filterItemsView() { | |
var api = {}; | |
api.onItemSelect = function(e) { | |
$('.filter-options li').removeClass('active'); | |
var filters = e.selectedFilters; | |
_.each(_.keys(filters), function(filterType) { | |
_.each(filters[filterType], function(filter) { | |
var element = $('a[data-filter="'+filterType+'-'+filter+'"]').parent(); | |
element.addClass('active'); | |
}); | |
}); | |
} | |
return api; | |
} | |
$(document).ready(function() { | |
var handler = filterHandlers(); | |
var view = filtersView(); | |
var itemsView = filterItemsView(); | |
$('.filter-handlers > span').on('click', handler.hideAllPopovers); | |
$('.filter-handlers > span').popover({ | |
html : true, | |
content: function() { | |
var panelToShow = $(this).data('panel'); | |
var $panelToShow = $('.'+panelToShow+'-panel'); | |
return $panelToShow; | |
}, | |
placement: 'bottom' | |
}); | |
$('.filters li').on('click', handler.selectFilter); | |
$(document).on('filterSelected', view.updateCounts); | |
$(document).on('filterUnselected', view.updateCounts); | |
$(document).on('filterSelected', itemsView.onItemSelect); | |
$(document).on('filterUnselected', itemsView.onItemSelect); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment