;(function(){ /** * Please note that when passing in custom templates for * listItemTemplate and orderByTemplate to keep the classes as * they are used in the code at other locations as well. */ var defaults = { items : [{a:2,b:1,c:2},{a:2,b:2,c:1},{a:1,b:1,c:1},{a:3,b:3,c:1}], facets : {'a': 'Title A', 'b': 'Title B', 'c': 'Title C'}, resultSelector : '#results', facetSelector : '#facets', facetContainer : '
>
', facetTitleTemplate : '

<%= title %>

', facetListContainer : '
', listItemTemplate : '
<%= name %> (<%= count %>)
', bottomContainer : '
', orderByTemplate : '
', countTemplate : '
<%= count %> '+dirpro_data.Results+'
', deselectTemplate : '
'+dirpro_data.Deselect+'
', resultTemplate : '
<%= name %>
', noResults : '
'+dirpro_data.nolisting+'
', orderByOptions : {'a': 'by A', 'b': 'by B', 'RANDOM': 'by random',}, state : { orderBy : false, filters : {} }, showMoreTemplate : ''+dirpro_data.loadmore+'', enablePagination : true, paginationCount : dirpro_data.perpage, } /** * This is the first function / variable that gets exported into the * jQuery namespace. Pass in your own settings (see above) to initialize * the faceted search */ var settings = {}; jQuery.facetelize = function(usersettings) { jQuery.extend(settings, defaults, usersettings); settings.currentResults = []; settings.facetStore = {}; jQuery(settings.facetSelector).data("settings", settings); initFacetCount(); filter(); order(); createFacetUI(); updateResults(); } /** * This is the second function / variable that gets exported into the * jQuery namespace. Use it to update everything if you messed with * the settings object */ jQuery.facetUpdate = function() { filter(); order(); updateFacetUI(); updateResults(); } /** * The following section contains the logic of the faceted search */ /** * initializes all facets and their individual filters */ function initFacetCount() { _.each(settings.facets, function(facettitle, facet) { settings.facetStore[facet] = {}; }); _.each(settings.items, function(item) { // intialize the count to be zero _.each(settings.facets, function(facettitle, facet) { if (jQuery.isArray(item[facet])) { _.each(item[facet], function(facetitem) { settings.facetStore[facet][facetitem] = settings.facetStore[facet][facetitem] || {count: 0, id: _.uniqueId("facet_")} }); } else { if (item[facet] !== undefined) { settings.facetStore[facet][item[facet]] = settings.facetStore[facet][item[facet]] || {count: 0, id: _.uniqueId("facet_")} } } }); }); // sort it: _.each(settings.facetStore, function(facet, facettitle) { var sorted = _.keys(settings.facetStore[facettitle]).sort(); if (settings.facetSortOption && settings.facetSortOption[facettitle]) { sorted = _.union(settings.facetSortOption[facettitle], sorted); } var sortedstore = {}; _.each(sorted, function(el) { sortedstore[el] = settings.facetStore[facettitle][el]; }); settings.facetStore[facettitle] = sortedstore; }); } /** * resets the facet count */ function resetFacetCount() { _.each(settings.facetStore, function(items, facetname) { _.each(items, function(value, itemname) { settings.facetStore[facetname][itemname].count = 0; }); }); } /** * Filters all items from the settings according to the currently * set filters and stores the results in the settings.currentResults. * The number of items in each filter from each facet is also updated */ function filter() { // first apply the filters to the items settings.currentResults = _.select(settings.items, function(item) { var filtersApply = true; _.each(settings.state.filters, function(filter, facet) { if (jQuery.isArray(item[facet])) { var inters = _.intersect(item[facet], filter); if (inters.length == 0) { filtersApply = false; } } else { if (filter.length && _.indexOf(filter, item[facet]) == -1) { filtersApply = false; } } }); return filtersApply; }); // Update the count for each facet and item: // intialize the count to be zero resetFacetCount(); // then reduce the items to get the current count for each facet _.each(settings.facets, function(facettitle, facet) { _.each(settings.currentResults, function(item) { if (jQuery.isArray(item[facet])) { _.each(item[facet], function(facetitem) { settings.facetStore[facet][facetitem].count += 1; }); } else { if (item[facet] !== undefined) { settings.facetStore[facet][item[facet]].count += 1; } } }); }); // remove confusing 0 from facets where a filter has been set _.each(settings.state.filters, function(filters, facettitle) { _.each(settings.facetStore[facettitle], function(facet) { if (facet.count == 0 && settings.state.filters[facettitle].length){ facet.count = "+";} }); }); settings.state.shownResults = 0; } /** * Orders the currentResults according to the settings.state.orderBy variable */ function order() { if (settings.state.orderBy) { jQuery(".activeorderby").removeClass("activeorderby"); jQuery('#orderby_'+settings.state.orderBy).addClass("activeorderby"); settings.currentResults = _.sortBy(settings.currentResults, function(item) { if (settings.state.orderBy == 'RANDOM') { return Math.random()*10000; } else { return item[settings.state.orderBy]; } }); } } /** * The given facetname and filtername are activated or deactivated * depending on what they were beforehand. This causes the items to * be filtered again and the UI is updated accordingly. */ function toggleFilter(key, value) { settings.state.filters[key] = settings.state.filters[key] || [] ; if (_.indexOf(settings.state.filters[key], value) == -1) { settings.state.filters[key].push(value); } else { settings.state.filters[key] = _.without(settings.state.filters[key], value); if (settings.state.filters[key].length == 0) { delete settings.state.filters[key]; } } filter(); } /** * The following section contains the presentation of the faceted search */ /** * This function is only called once, it creates the facets ui. */ function createFacetUI() { var itemtemplate = _.template(settings.listItemTemplate); var titletemplate = _.template(settings.facetTitleTemplate); var containertemplate = _.template(settings.facetContainer); jQuery(settings.facetSelector).html(""); _.each(settings.facets, function(facettitle, facet) { var facetHtml = jQuery(containertemplate({id: facet})); var facetItem = {title: facettitle}; var facetItemHtml = jQuery(titletemplate(facetItem)); facetHtml.append(facetItemHtml); var facetlist = jQuery(settings.facetListContainer); _.each(settings.facetStore[facet], function(filter, filtername){ var item = {id: filter.id, name: filtername, count: filter.count}; var filteritem = jQuery(itemtemplate(item)); if (_.indexOf(settings.state.filters[facet], filtername) >= 0) { filteritem.addClass("activefacet"); filteritem.addClass("tick"); } facetlist.append(filteritem); }); facetHtml.append(facetlist); jQuery(settings.facetSelector).append(facetHtml); }); // add the click event handler to each facet item: jQuery('.facetitem').on("click", function(event){ var filter = getFilterById(this.id); toggleFilter(filter.facetname, filter.filtername); jQuery(settings.facetSelector).trigger("facetedsearchfacetclick", filter); order(); updateFacetUI(); updateResults(); }); // Append total result count var bottom = jQuery(settings.bottomContainer); countHtml = _.template(settings.countTemplate, {count: settings.currentResults.length}); jQuery(bottom).append(countHtml); // generate the "order by" options: var ordertemplate = _.template(settings.orderByTemplate); var itemHtml = jQuery(ordertemplate({'options': settings.orderByOptions})); jQuery(bottom).append(itemHtml); jQuery(settings.facetSelector).append(bottom); jQuery('.orderbyitem').each(function(){ var id = this.id.substr(8); if (settings.state.orderBy == id) { jQuery(this).addClass("activeorderby"); } }); // add the click event handler to each "order by" item: jQuery('.orderbyitem').on("click", function(event){ var id = this.id.substr(8); settings.state.orderBy = id; jQuery(settings.facetSelector).trigger("facetedsearchorderby", id); settings.state.shownResults = 0; order(); updateResults(); }); // Append deselect filters button var deselect = jQuery(settings.deselectTemplate).on("click", function(event){ settings.state.filters = {}; jQuery.facetUpdate(); }); jQuery(bottom).append(deselect); jQuery(settings.facetSelector).trigger("facetuicreated"); } /** * get a facetname and filtername by the unique id that is created in the beginning */ function getFilterById(id) { var result = false; _.each(settings.facetStore, function(facet, facetname) { _.each(facet, function(filter, filtername){ if (filter.id == id) { result = {'facetname': facetname, 'filtername': filtername}; } }); }); return result; } /** * This function is only called whenever a filter has been added or removed * It adds a class to the active filters and shows the correct number for each */ function updateFacetUI() { var itemtemplate = _.template(settings.listItemTemplate); _.each(settings.facetStore, function(facet, facetname) { _.each(facet, function(filter, filtername){ var item = {id: filter.id, name: filtername, count: filter.count}; var filteritem = jQuery(itemtemplate(item)).html(); jQuery("#"+filter.id).html(filteritem); if (settings.state.filters[facetname] && _.indexOf(settings.state.filters[facetname], filtername) >= 0) { jQuery("#"+filter.id).addClass("activefacet"); jQuery("#"+filter.id).addClass("tick"); } else { jQuery("#"+filter.id).removeClass("activefacet"); jQuery("#"+filter.id).removeClass("tick"); } }); }); countHtml = _.template(settings.countTemplate, {count: settings.currentResults.length}); jQuery(settings.facetSelector + ' .facettotalcount').replaceWith(countHtml); } /** * Updates the the list of results according to the filters that have been set */ function updateResults() { jQuery(settings.resultSelector).html(settings.currentResults.length == 0 ? settings.noResults : ""); showMoreResults(); } var moreButton; function showMoreResults() { var showNowCount = settings.enablePagination ? Math.min(settings.currentResults.length - settings.state.shownResults, settings.paginationCount) : settings.currentResults.length; var itemHtml = ""; var template = _.template(settings.resultTemplate); for (var i = settings.state.shownResults; i < settings.state.shownResults + showNowCount; i++) { var item = jQuery.extend(settings.currentResults[i], { totalItemNr : i, batchItemNr : i - settings.state.shownResults, batchItemCount : showNowCount }); var itemHtml = itemHtml + template(item); } jQuery(settings.resultSelector).append(itemHtml); if (!moreButton) { moreButton = jQuery(settings.showMoreTemplate).click(showMoreResults); jQuery(settings.resultSelector).after(moreButton); } if (settings.state.shownResults == 0) { moreButton.show(); } settings.state.shownResults += showNowCount; if (settings.state.shownResults == settings.currentResults.length) { jQuery(moreButton).hide(); } jQuery(settings.resultSelector).trigger("facetedsearchresultupdate"); } })(); jQuery(function(){ var status = 0; jQuery(document).on("click", "#category .facettitle",function(e){ var id = "category"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 0; } }); }) jQuery(function(){ var status = 0; jQuery(document).on("click", "#location .facettitle",function(e){ var id = "location"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 0; } }); }) jQuery(function(){ var status = 0; jQuery(document).on("click", "#feature .facettitle",function(e){ var id = "feature"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 0; } }); }) jQuery(function(){ var status = 0; jQuery(document).on("click", "#zipcode .facettitle",function(e){ var id = "zipcode"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 0; } }); }) jQuery(function(){ var status = 0; jQuery(document).on("click", "#local-area .facettitle",function(e){ var id = "local-area"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 0; } }); }) jQuery(function(){ var status = 0; jQuery(document).on("click", "#salaryrange .facettitle",function(e){ var id = "salaryrange"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 0; } }); }) jQuery(function(){ var status = 0; jQuery(document).on("click", "#jobtype .facettitle",function(e){ var id = "jobtype"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 0; } }); }) jQuery(function(){ var status = 0; jQuery(document).on("click", "#postdate .facettitle",function(e){ var id = "postdate"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 0; } }); }) jQuery(function(){ var status = 0; jQuery(document).on("click", "#postdeadline .facettitle",function(e){ var id = "postdeadline"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 0; } }); }) jQuery(function(){ var status = 0; jQuery(document).on("click", "#joblevel .facettitle",function(e){ var id = "joblevel"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 0; } }); }) jQuery(function(){ var status = 0; jQuery(document).on("click", "#gender .facettitle",function(e){ var id = "gender"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 0; } }); }) jQuery(function(){ var status = 0; jQuery(document).on("click", "#experiencerange .facettitle",function(e){ var id = "experiencerange"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 0; } }); }) jQuery(function(){ var status = 0; jQuery(document).on("click", "#educationalrequirements .facettitle",function(e){ var id = "educationalrequirements"; if(status === 0 ){ jQuery("#"+id+" .facetlist").css("display", "block"); jQuery("#"+id+" .facettitle .down").css("visibility", "visible"); jQuery("#"+id+" .facettitle .up").css("visibility", "hidden"); status = 1; } else{ jQuery("#"+id+" .facetlist").css("display", "none"); jQuery("#"+id+" .facettitle .down").css("visibility", "hidden"); jQuery("#"+id+" .facettitle .up").css("visibility", "visible"); status = 0; } }); })