{"version":3,"sources":["BreakdownSelectorView.js","BaseSelectorView.js","DataTypeSelectorView.js","IndicatorJumpSelectorView.js","LocationSelectorView.js","LocationTypeSelectorView.js","MultipleBreakdownSelectorView.js","MultipleDataTypeSelectorView.js","OtherFeaturesSelectorView.js","SingleLocationSelectorView.js","TimeFrameSelectorView.js"],"names":["capitalizeFirstLetter","string","charAt","toUpperCase","slice","$","_","window","nspace","BaseSelectorView","Backbone","View","extend","name","el","templateSelector","propertyName","selectorInfoPropertyName","initializeModel","updateDOM","getDataSummaryText","initialize","bindAll","this","render","selectorInfo","$el","length","template","$tmpl","html","hasValueSet","selectorHasValue","val","model","get","options","some","v","id","Array","defaultMultiSelectOptions","selectedText","numChecked","numTotal","checkedItems","next","text","jQuery","ns","BreakdownSelectorView","join","hideCharacteristics","on","events","change","onChangeUpdateModel","event","prop","chId","indId","srcElement","classList","contains","value","originalEvent","filter","checked","first","lastIndId","attributes","indicatorId","lastChId","characteristicId","selectedTab","location","pathname","split","selectedBreakdown","siblings","selectedCharacteristic","children","data","dataLayer","push","eventCategory","eventAction","eventLabel","props","trigger","set","self","radioSelector","find","selectFirstRadioButton","undefined","$checkedBreakdownRadioButton","silent","$option","$selectedCharacteristicRadio","characteristics","Object","values","selectors","isHidden","distro","ch","str","isBlank","showHideCharacteristicSelector","hide","show","removeClass","parents","addClass","isRendered","__super__","call","indicators","MultipleBreakdownSelectorViewBase","DataTypeSelectorView","getSelectorInfoFunc","onBeforeChange","newProps","oldDfmId","where","dataFormats","newDfm","dfm","currentTypeName","dataFormatId","$radio","attr","IndicatorJumpSelectorView","change select","scrollToIndicator","scrollTop","offset","top","animate","LocationSelectorView","repositionMultiselect","optionIds","$dropdown","dropdownValues","communityNames","i","selector","sort","multiselect","$selectedOptions","modelProp","updateSelect","LocationTypeSelectorView","dropdownValue","communityName","$radioActive","MultipleBreakdownSelectorView","$checkedRadioButton","selectedCharacteristics","hasClass","allOptions","map","each","characteristic","characteristicIds","modelValue","intersection","$characteristics","MultipleDataTypeSelectorView","$allCheckboxes","$checkedCheckboxes","checkboxValues","$self","shouldBeChecked","any","dataFormat","OtherFeaturesSelectorView","change input","propertyValue","getPropertyValue","$checkboxes","ids","$inputs","SingleLocationSelectorView","propertySlugName","lastLocationName","locationSlug","curLocationName","trim","toLowerCase","prototype","TimeFrameSelectorView","oldTfId","timeFrames","tf","newTf","timeFrame"],"mappings":"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","file":"selectors-generated.js","sourcesContent":["/// \r\n/// \r\n\r\n(function($, _) {\r\n var ns = window.nspace(\"ccc.viz.selectors\");\r\n\r\n ns.BreakdownSelectorView = ns.BaseSelectorView.extend({\r\n name: \"Breakdown Selector\",\r\n el: \"#breakdown-selector\",\r\n // templateSelector: \"#breakdown-selector-template\",\r\n template: _.template(\r\n [\r\n '
',\r\n 'Breakdowns',\r\n \"<% for (var i = 0; i < indicators.length; i++) {\",\r\n \"var indicator = indicators[i];\",\r\n 'var vizIsMap = typeof ccc.viz.map != \"undefined\"',\r\n \"var selectorInfo = selectors[indicator.id];\",\r\n 'var htmlId = _.str.sprintf(\"breakdown-%s\", indicator.id); ',\r\n \"%>\",\r\n \"<% if(selectorInfo.characteristics && vizIsMap){ %>\",\r\n '
',\r\n \"<% } else{ %>\",\r\n '
',\r\n \"<% } %>\",\r\n \"<% if (indicator.selected) { %>\",\r\n '\" value=\"<%=indicator.id%>\" data-name=\"<%=selectorInfo.breakdown%>\" checked />',\r\n \"<% }\",\r\n \"else { %>\",\r\n '\" value=\"<%=indicator.id%>\" data-name=\"<%=selectorInfo.breakdown%>\" />',\r\n \"<% } %>\",\r\n '
',\r\n \" \",\r\n \"<% if (selectorInfo.characteristics) {\",\r\n \"var chs = selectorInfo.characteristics;\",\r\n \"%>\",\r\n \" \",\r\n '
',\r\n \"<% for (var j = 0; j < chs.length; j++) {\",\r\n \"var ch = chs[j];\",\r\n \"if (ch.selected) {\",\r\n \"%>\",\r\n\r\n '
\" id=\"radio<%=ch.id%>\" type=\"radio\" value=\"<%=ch.id%>\" checked data-text=\"<%=ch.name%>\">
',\r\n\r\n \"<% }\",\r\n \"else {\",\r\n \"%>\",\r\n '
\" id=\"radio<%=ch.id%>\" type=\"radio\" value=\"<%=ch.id%>\" data-text=\"<%=ch.name%>\">
',\r\n \"<% }\",\r\n \"} %>\",\r\n \"
\",\r\n \"
\",\r\n \"<% } %>\",\r\n \"
\",\r\n \"<% } %>\",\r\n \"
\",\r\n \"
\",\r\n ].join(\"\\n\"),\r\n ),\r\n propertyName: \"indicatorId\",\r\n\r\n initialize: function(options) {\r\n _.bindAll(this);\r\n this.hideCharacteristics = options.hideCharacteristics;\r\n this.model.on(\"after-change\", this.updateDOM);\r\n },\r\n\r\n events: {\r\n change: \"onChangeUpdateModel\",\r\n },\r\n\r\n hasValueSet: function() {\r\n return (\r\n !!this.model.get(this.propertyName) &&\r\n !!this.model.get(\"characteristicId\")\r\n );\r\n },\r\n\r\n onChangeUpdateModel: function(event) {\r\n //check for blank radio options\r\n if (\r\n $(\".breakdown-radio:checked \" + \" ~ .generic-form-select input\")\r\n .length &&\r\n $(\".breakdown-radio:checked \" + \" ~ .generic-form-select input:checked\")\r\n .length === 0\r\n ) {\r\n $(\".breakdown-radio:checked ~ .generic-form-select input:first\").prop(\r\n \"checked\",\r\n true,\r\n );\r\n }\r\n // Indicator ID comes from the radio buttons\r\n var indId = $(\".breakdown-radio:checked\", this.$el).val();\r\n\r\n var chId;\r\n // Characteristic ID from the changed event source?\r\n if(event && event.srcElement && !event.srcElement.classList.contains(\"breakdown-radio\")) {\r\n chId = event.srcElement.value;\r\n }\r\n else if (event && event.originalEvent && event.originalEvent.srcElement && !event.originalEvent.srcElement.classList.contains(\"breakdown-radio\")) {\r\n chId = event.originalEvent.srcElement.value;\r\n }\r\n\r\n // Characteristic ID comes from the checkbox\r\n chId = chId || $(\".breakdown-radio:checked ~ .generic-form-select input\").filter(function() {\r\n return this.checked;\r\n }).first().val();\r\n\r\n var lastIndId = this.model.attributes.indicatorId;\r\n var lastChId = this.model.attributes.characteristicId;\r\n if (indId !== lastIndId || chId !== lastChId) {\r\n // Tracks when a user clicks on a \"Breakdown\" radio button on the \"Explore Data\" page\r\n var selectedTab = capitalizeFirstLetter(\r\n window.location.pathname.split(\"/\")[2],\r\n ); // e.g. 'Map', 'Table', 'Bar chart' tab\r\n var selectedBreakdown = $(\".breakdown-radio:checked\", this.$el)\r\n .siblings(\"label\")\r\n .text(); // distribution name\r\n var selectedCharacteristic = $(\r\n \".breakdown-radio:checked ~ .generic-form-select\",\r\n this.$el,\r\n )\r\n .children('[value=\"' + chId + '\"]')\r\n .data(\"text\");\r\n\r\n dataLayer.push({\r\n event: \"Breakdown Radio Button Clicks\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction:\r\n selectedTab +\r\n \"|\" +\r\n selectedBreakdown +\r\n \"|\" +\r\n selectedCharacteristic,\r\n eventLabel: window.location.pathname,\r\n });\r\n }\r\n\r\n var props = {\r\n characteristicId: chId,\r\n };\r\n props[this.propertyName] = indId;\r\n\r\n // Other selectors are indicator-specific and may need to update other model properties\r\n // in response to the indicator changing. In order to accomodate that, emit a \"before-change\"\r\n // event and pass along the new properties, allowing any handlers to modify the set of new\r\n // properties as needed. This will prevent multiple change events from firing in response to the\r\n // indicator changing.\r\n this.model.trigger(\"before-change\", props);\r\n // Update the model\r\n this.model.set(props);\r\n\r\n // try to force setting the breakdown radio buttons\r\n this.model.trigger(\"after-change\");\r\n },\r\n\r\n /**\r\n * Updates the model with default selections, for cases where the user arrives\r\n * at the page with nothing preselected.\r\n */\r\n initializeModel: function() {\r\n var self = this;\r\n\r\n // It's possible to arrive here with an indicator set, but a required characteristic is not.\r\n // Try to retain the indicator if it's already set.\r\n var indId = this.model.get(this.propertyName);\r\n\r\n var radioSelector = \"input:radio[value='\" + indId + \"']\";\r\n if (indId) {\r\n // Do we have a matching radio button?\r\n var $radioSelector = $(self.el).find(radioSelector);\r\n if ($radioSelector.length === 0) {\r\n selectFirstRadioButton(this.model, this.propertyName);\r\n }\r\n if (\r\n chId === undefined &&\r\n $(radioSelector + \" ~ .generic-form-select input\").length\r\n ) {\r\n $(radioSelector + \" ~ .generic-form-select input:first\").prop(\r\n \"checked\",\r\n true,\r\n );\r\n\r\n this.model.set(\r\n \"characteristicId\",\r\n $(radioSelector + \" ~ .generic-form-select input:first\").val(),\r\n );\r\n }\r\n }\r\n else {\r\n // Check if a radiobutton is already selected\r\n radioSelector = \"input:checked:radio[name='breakdowns']\";\r\n\r\n var $checkedBreakdownRadioButton = $(radioSelector);\r\n\r\n if ($checkedBreakdownRadioButton.length) {\r\n // Update the model to match the value of the selected radio button\r\n this.model.set(\r\n this.propertyName,\r\n $checkedBreakdownRadioButton.val(),\r\n { silent: true },\r\n );\r\n }\r\n else {\r\n selectFirstRadioButton(this.model, this.propertyName);\r\n }\r\n }\r\n // Do we have a matching selection in the characteristics dropdown?\r\n var chId = this.model.get(\"characteristicId\");\r\n var $option = $(radioSelector + \"~input[value='\" + chId + \"']\", this.$el);\r\n if ($option.length === 0) {\r\n $option = $(\".radioOpt[value=\" + chId + \"]\");\r\n\r\n if ($option.length === 0) {\r\n var $selectedCharacteristicRadio = $(radioSelector + \"~input\");\r\n if (!$selectedCharacteristicRadio.length) {\r\n $selectedCharacteristicRadio = $(radioSelector + \"~.characteristics input:checked:radio\");\r\n }\r\n self.model.set(\"characteristicId\", $selectedCharacteristicRadio.val(), {\r\n silent: true,\r\n });\r\n }\r\n }\r\n\r\n function selectFirstRadioButton(model, propertyName) {\r\n // No match? Update the model to match the value of the first radio button\r\n var val = $(self.el)\r\n .find(\"input:radio:first\")\r\n .val();\r\n\r\n model.set(propertyName, val, { silent: true });\r\n\r\n var characteristics = Object.values(model.selectorInfo.selectors)[0].characteristics;\r\n if (characteristics instanceof Array && characteristics.length) {\r\n model.set(\"characteristicId\", characteristics[0].id, { silent: true });\r\n }\r\n\r\n // console.log(Object.values());\r\n\r\n // Object.values(model.selectorInfo.selectors)[0].locationTypes.map(function(){})\r\n }\r\n },\r\n\r\n /**\r\n * Updates the DOM to match the selections specified on the model\r\n */\r\n updateDOM: function() {\r\n // Choose the radio button with the value specified in the model\r\n var radioSelector =\r\n \".breakdown-radio[value='\" + this.model.get(this.propertyName) + \"']\";\r\n $(radioSelector).prop(\"checked\", true);\r\n\r\n // Select the corresponding characteristic from the dropdown, too\r\n $(radioSelector +\r\n \"~.generic-form-select input[value='\" +\r\n this.model.get(\"characteristicId\") +\r\n \"']\",\r\n ).prop(\"checked\", true);\r\n },\r\n\r\n /**\r\n * Returns text summarizing the currently selected options for this selector.\r\n */\r\n getDataSummaryText: function() {\r\n // Don't include the selected value in the data summary if the control is hidden\r\n if (this.isHidden) {\r\n return null;\r\n }\r\n\r\n var radioSelector =\r\n \".breakdown-radio[value='\" + this.model.get(this.propertyName) + \"']\";\r\n var distro = $(radioSelector, this.$el).data(\"name\");\r\n var ch = $(\r\n radioSelector + \"~.generic-form-select input:checked\",\r\n this.$el,\r\n ).data(\"text\");\r\n\r\n return _.str.isBlank(ch) ? distro : distro + \": \" + ch;\r\n },\r\n\r\n showHideCharacteristicSelector: function() {\r\n // Show ONLY the characteristics for the currently selected breakdown\r\n $(\".characteristics\", this.el).hide();\r\n $(\"br\", this.el).hide();\r\n\r\n var radioSelector =\r\n \".breakdown-radio[value='\" + this.model.get(this.propertyName) + \"']\";\r\n $(\r\n radioSelector + \" ~.characteristics, \" + radioSelector + \" ~br\",\r\n this.el,\r\n ).show();\r\n\r\n //if filter has options show open\r\n $(\".filter-container.expand.open\").removeClass(\"open\");\r\n if ($(radioSelector + \"~.generic-form-select input\").length) {\r\n $(radioSelector)\r\n .parents(\".filter-container.expand\")\r\n .addClass(\"open\");\r\n }\r\n },\r\n\r\n render: function(selectorInfo) {\r\n // This selector only needs to be rendered once. After the first time, don't bother re-rendering\r\n if (this.isRendered) {\r\n if (!this.hideCharacteristics) {\r\n this.showHideCharacteristicSelector();\r\n }\r\n return;\r\n }\r\n\r\n // Call the base implementation\r\n ns.BreakdownSelectorView.__super__.render.call(this, selectorInfo);\r\n\r\n // Hide the characteristic dropdown if it's not configured to be shown\r\n if (this.hideCharacteristics) {\r\n $(\".characteristics\", this.el).hide();\r\n $(\"br\", this.el).hide();\r\n }\r\n // Otherwise show only the characterstics for the current indicator\r\n else {\r\n this.showHideCharacteristicSelector();\r\n }\r\n\r\n // Don't bother rendering again\r\n this.isRendered = true;\r\n\r\n // Hide the selector if there is only a single indicator with no breakdown\r\n if (\r\n selectorInfo.indicators.length == 1 &&\r\n !selectorInfo.selectors[selectorInfo.indicators[0].id].characteristics\r\n ) {\r\n this.$el.hide();\r\n this.isHidden = true;\r\n }\r\n },\r\n });\r\n})(jQuery, _);\r\n\r\nfunction capitalizeFirstLetter(string) {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n}\r\n\r\n(function($, _) {\r\n var ns = window.nspace(\"ccc.viz.selectors\");\r\n\r\n // NOTE MultipleBreakdownSelectorViewBase is a legacy version of BreakdownSelectorView\r\n // we changed BreakdownSelectorView and it broke MultipleBreakdownSelectorView\r\n ns.MultipleBreakdownSelectorViewBase = ns.BaseSelectorView.extend({\r\n name: \"Breakdown Selector\",\r\n el: \"#breakdown-selector\",\r\n templateSelector: \"#breakdown-selector-template\",\r\n propertyName: \"indicatorId\",\r\n\r\n initialize: function(options) {\r\n _.bindAll(this);\r\n\r\n this.hideCharacteristics = options.hideCharacteristics;\r\n },\r\n\r\n events: {\r\n change: \"onChangeUpdateModel\",\r\n },\r\n\r\n hasValueSet: function() {\r\n return (\r\n !!this.model.get(this.propertyName) &&\r\n !!this.model.get(\"characteristicId\")\r\n );\r\n },\r\n\r\n onChangeUpdateModel: function() {\r\n // Indicator ID comes from the radio buttons\r\n var indId = $(\"input:radio:checked\", this.$el).val();\r\n\r\n // Characteristic ID comes from the checkbox\r\n var chId = $(\"input:radio:checked~select\", this.$el).val();\r\n\r\n var lastIndId = this.model.attributes.indicatorId;\r\n var lastChId = this.model.attributes.characteristicId;\r\n if (indId !== lastIndId || chId !== lastChId) {\r\n // Tracks when a user clicks on a \"Breakdown\" radio button on the \"Explore Data\" page\r\n var selectedTab = capitalizeFirstLetter(\r\n window.location.pathname.split(\"/\")[2],\r\n ); // e.g. 'Map', 'Table', 'Bar chart' tab\r\n var selectedBreakdown = $(\"input:radio:checked\", this.$el)\r\n .siblings(\"label\")\r\n .text(); // distribution name\r\n var selectedCharacteristic = $(\"input:radio:checked~select\", this.$el)\r\n .children('[value=\"' + chId + '\"]')\r\n .text();\r\n\r\n function capitalizeFirstLetter(string) {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n }\r\n\r\n dataLayer.push({\r\n event: \"Breakdown Radio Button Clicks\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction:\r\n selectedTab +\r\n \"|\" +\r\n selectedBreakdown +\r\n \"|\" +\r\n selectedCharacteristic,\r\n eventLabel: window.location.pathname,\r\n });\r\n }\r\n\r\n var props = {\r\n characteristicId: chId,\r\n };\r\n props[this.propertyName] = indId;\r\n\r\n // Other selectors are indicator-specific and may need to update other model properties\r\n // in response to the indicator changing. In order to accomodate that, emit a \"before-change\"\r\n // event and pass along the new properties, allowing any handlers to modify the set of new\r\n // properties as needed. This will prevent multiple change events from firing in response to the\r\n // indicator changing.\r\n this.model.trigger(\"before-change\", props);\r\n\r\n // Update the model\r\n this.model.set(props);\r\n },\r\n\r\n /**\r\n * Updates the model with default selections, for cases where the user arrives\r\n * at the page with nothing preselected.\r\n */\r\n initializeModel: function() {\r\n var self = this;\r\n\r\n // It's possible to arrive here with an indicator set, but a required characteristic is not.\r\n // Try to retain the indicator if it's already set.\r\n var indId = this.model.get(this.propertyName);\r\n\r\n var radioSelector = \"input:radio[value='\" + indId + \"']\";\r\n if (indId) {\r\n // Do we have a matching radio button?\r\n var $radioSelector = $(radioSelector);\r\n if ($radioSelector.length === 0) {\r\n selectFirstRadioButton(this.model, this.propertyName);\r\n }\r\n }\r\n else {\r\n // Check if a radiobutton is already selected\r\n radioSelector = \"input:checked:radio[name='breakdowns']\";\r\n var $checkedBreakdownRadioButton = $(radioSelector);\r\n if ($checkedBreakdownRadioButton.length) {\r\n // Update the model to match the value of the selected radio button\r\n this.model.set(\r\n this.propertyName,\r\n $checkedBreakdownRadioButton.val(),\r\n { silent: true },\r\n );\r\n }\r\n else {\r\n selectFirstRadioButton(this.model, this.propertyName);\r\n }\r\n }\r\n // Do we have a matching selection in the characteristics dropdown?\r\n var chId = this.model.get(\"characteristicId\");\r\n var $option = $(\r\n radioSelector + \"~select option[value='\" + chId + \"']\",\r\n this.$el,\r\n );\r\n if ($option.length === 0) {\r\n self.model.set(\"characteristicId\", $(radioSelector + \"~select\").val(), {\r\n silent: true,\r\n });\r\n }\r\n\r\n function selectFirstRadioButton(model, propertyName) {\r\n // No match? Update the model to match the value of the first radio button\r\n radioSelector = \"input:radio:first\";\r\n model.set(propertyName, $(radioSelector).val(), { silent: true });\r\n }\r\n },\r\n\r\n /**\r\n * Updates the DOM to match the selections specified on the model\r\n */\r\n updateDOM: function() {\r\n // Choose the radio button with the value specified in the model\r\n var radioSelector =\r\n \"input:radio[value='\" + this.model.get(this.propertyName) + \"']\";\r\n $(radioSelector).prop(\"checked\", true);\r\n\r\n // Select the corresponding characteristic from the dropdown, too\r\n $(radioSelector + \"~select\").val(this.model.get(\"characteristicId\"));\r\n },\r\n\r\n /**\r\n * Returns text summarizing the currently selected options for this selector.\r\n */\r\n getDataSummaryText: function() {\r\n // Don't include the selected value in the data summary if the control is hidden\r\n if (this.isHidden) {\r\n return null;\r\n }\r\n\r\n var radioSelector =\r\n \"input:radio[value='\" + this.model.get(this.propertyName) + \"']\";\r\n var distro = $(radioSelector, this.$el).data(\"name\");\r\n var ch = $(radioSelector + \"~select option:selected\", this.$el).text();\r\n\r\n return _.str.isBlank(ch) ? distro : distro + \": \" + ch;\r\n },\r\n\r\n showHideCharacteristicSelector: function() {\r\n // Show ONLY the characteristics for the currently selected breakdown\r\n $(\".characteristics\", this.el).hide();\r\n $(\"br\", this.el).hide();\r\n\r\n var radioSelector =\r\n \"input:radio[value='\" + this.model.get(this.propertyName) + \"']\";\r\n $(\r\n radioSelector + \" ~.characteristics, \" + radioSelector + \" ~br\",\r\n this.el,\r\n ).show();\r\n },\r\n\r\n render: function(selectorInfo) {\r\n // This selector only needs to be rendered once. After the first time, don't bother re-rendering\r\n if (this.isRendered) {\r\n if (!this.hideCharacteristics) {\r\n this.showHideCharacteristicSelector();\r\n }\r\n return;\r\n }\r\n\r\n // Call the base implementation\r\n ns.BreakdownSelectorView.__super__.render.call(this, selectorInfo);\r\n\r\n // Hide the characteristic dropdown if it's not configured to be shown\r\n if (this.hideCharacteristics) {\r\n $(\".characteristics\", this.el).hide();\r\n $(\"br\", this.el).hide();\r\n }\r\n // Otherwise show only the characterstics for the current indicator\r\n else {\r\n this.showHideCharacteristicSelector();\r\n }\r\n\r\n // Don't bother rendering again\r\n this.isRendered = true;\r\n\r\n // Hide the selector if there is only a single indicator with no breakdown\r\n if (\r\n selectorInfo.indicators.length == 1 &&\r\n !selectorInfo.selectors[selectorInfo.indicators[0].id].characteristics\r\n ) {\r\n this.$el.hide();\r\n this.isHidden = true;\r\n }\r\n },\r\n });\r\n})(jQuery, _);\r\n","/// \r\n/// \r\n\r\n(function($, _) {\r\n var ns = window.nspace(\"ccc.viz.selectors\");\r\n\r\n /**\r\n * \"Abstract\" base class from which other selectors views inherit.\r\n * Selectors must implement the interface described below.\r\n */\r\n ns.BaseSelectorView = Backbone.View.extend({\r\n /**\r\n * @interface properties\r\n */\r\n name: null, // Name of the data selector\r\n el: null, // jQuery selector for the element's container\r\n templateSelector: null, // jQuery selector to locate the underscore.js template\r\n propertyName: null, // The name of the model attribute which the data selector controls\r\n selectorInfoPropertyName: null, // property for the selector info array\r\n\r\n /**\r\n * @interface methods\r\n */\r\n /**\r\n * Updates the model with default selections, for cases where the user arrives\r\n * at the page with nothing preselected.\r\n */\r\n initializeModel: function() {\r\n throw \"Not implemented. Please override in subclass.\";\r\n },\r\n\r\n /**\r\n * Updates the DOM to match the selections specified on the model\r\n */\r\n updateDOM: function() {\r\n throw \"Not implemented. Please override in subclass.\";\r\n },\r\n\r\n /**\r\n * Returns text summarizing the currently selected options for this selector.\r\n */\r\n getDataSummaryText: function() {\r\n throw \"Not implemented. Please override in subclass.\";\r\n },\r\n\r\n /**\r\n * OPTIONAL: Returns true if the model currently has a value set for the selector.\r\n * Default implementation is included in base class\r\n */\r\n //hasValueSet: function()\r\n\r\n //// Abstract class implementation ////\r\n\r\n initialize: function() {\r\n _.bindAll(this, \"render\");\r\n },\r\n\r\n render: function(selectorInfo) {\r\n // Verify this selector's container is present\r\n if (this.$el.length === 0) {\r\n throw \"Could not find the \" + this.name + \" container: \" + this.el;\r\n }\r\n\r\n // Get the underscore template\r\n if (!this.template) {\r\n var $tmpl = $(this.templateSelector);\r\n if ($tmpl.length === 0) {\r\n throw \"Could not find the \" +\r\n this.name +\r\n \" template: \" +\r\n this.templateSelector;\r\n }\r\n\r\n // Pre-compile and cache the template\r\n this.template = _.template($tmpl.html());\r\n }\r\n\r\n // Re-render the control\r\n this.$el.html(this.template(selectorInfo));\r\n\r\n // If the model doesn't yet have the corresponding property set, choose a default now\r\n if (!this.hasValueSet() || !this.selectorHasValue(selectorInfo)) {\r\n this.initializeModel();\r\n }\r\n\r\n // Update the DOM to match the value currently on the model\r\n this.updateDOM();\r\n },\r\n\r\n selectorHasValue: function(selectorInfo) {\r\n if (!this.selectorInfoPropertyName) return true;\r\n\r\n var val = this.model.get(this.propertyName);\r\n var options = selectorInfo[this.selectorInfoPropertyName];\r\n //if any ids in options match val then return true, otherwise return false\r\n return _.some(options, function(v) {\r\n return v.id == val;\r\n });\r\n },\r\n\r\n hasValueSet: function() {\r\n var val;\r\n\r\n val = this.model.get(this.propertyName);\r\n\r\n if (val instanceof Array) {\r\n return !!val.length;\r\n }\r\n return !!this.model.get(this.propertyName);\r\n },\r\n\r\n defaultMultiSelectOptions: {\r\n selectedText: function(numChecked, numTotal, checkedItems) {\r\n var $item;\r\n\r\n if (numChecked > 1) {\r\n return numChecked + \" of \" + numTotal + \" selected\";\r\n }\r\n\r\n $item = $(checkedItems[0]);\r\n return $item.next().text();\r\n }\r\n }\r\n });\r\n})(jQuery, _);\r\n","/// \r\n/// \r\n/// \r\n\r\n(function($, _) {\r\n var ns = window.nspace(\"ccc.viz.selectors\");\r\n\r\n ns.DataTypeSelectorView = ns.BaseSelectorView.extend({\r\n name: \"Data Type Selector\",\r\n el: \"#data-type-selector\",\r\n template: _.template(\r\n [\r\n '
',\r\n 'Data Type',\r\n \"<%\",\r\n \"if (dataFormats.length > 0) {\",\r\n \"var selectedItem = dataFormats.find(function (dataFormat) {\",\r\n \"return dataFormat.selected;\",\r\n \"});\",\r\n \"if (selectedItem === undefined) {\",\r\n \"dataFormats[0].selected = true;\",\r\n \"}\",\r\n \"}\",\r\n \"for (var i = 0; i < dataFormats.length; i++) {\",\r\n \"var format = dataFormats[i];\",\r\n 'var htmlId = _.str.sprintf(\"format-%s\", format.id);',\r\n \"if (format.selected) {\",\r\n \"%>\",\r\n '
',\r\n '\" value=\"<%=format.id%>\" data-name=\"<%=format.name%>\" checked />',\r\n '',\r\n \"
\",\r\n \"<%\",\r\n \"} else {\",\r\n \"%>\",\r\n '
',\r\n '\" value=\"<%=format.id%>\" data-name=\"<%=format.name%>\" />',\r\n '',\r\n \"
\",\r\n \"<%\",\r\n \"}\",\r\n \"%>\",\r\n \"<%\",\r\n \"}\",\r\n \"%>\",\r\n \"
\"\r\n ].join(\"\\n\")\r\n ),\r\n propertyName: \"dataFormatId\",\r\n selectorInfoPropertyName: \"dataFormats\",\r\n\r\n initialize: function(options) {\r\n _.bindAll(\r\n this,\r\n \"onChangeUpdateModel\",\r\n \"initializeModel\",\r\n \"updateDOM\",\r\n \"onBeforeChange\",\r\n \"getDataSummaryText\"\r\n );\r\n\r\n this.getSelectorInfoFunc = options.getSelectorInfoFunc;\r\n\r\n // Handle the before change event so that we have an opportunity to update the\r\n // DataFormatId when the indicator ID changes. This will prevent multiple \"change\"\r\n // events from being emitted in response to changing the indicator.\r\n this.model.on(\"before-change\", this.onBeforeChange);\r\n },\r\n\r\n events: {\r\n change: \"onChangeUpdateModel\"\r\n },\r\n\r\n onBeforeChange: function(newProps) {\r\n var self = this;\r\n\r\n // If the indicator ID is changing, then we need to also change the DFM ID\r\n if (this.model.get(\"indicatorId\") !== newProps.indicatorId) {\r\n var allSelectorInfo = this.getSelectorInfoFunc();\r\n var selectorInfo = allSelectorInfo.selectors[newProps.indicatorId];\r\n\r\n var oldDfmId = self.model.get(\"dataFormatId\");\r\n\r\n // If possible, keep the DFM ID the same (though this won't ever happen)\r\n var sameAsOld = _.where(selectorInfo.dataFormats, { id: oldDfmId });\r\n if (sameAsOld.length > 0) {\r\n return;\r\n }\r\n\r\n // Otherwise, data format IDs are indicator-specific, so when switching between indicators\r\n // we must match base on name, not ID\r\n var newDfm = _.find(selectorInfo.dataFormats, function(dfm) {\r\n return dfm.name === self.currentTypeName;\r\n });\r\n if (newDfm == null) {\r\n // No name-based match? Select the default, instead\r\n newDfm = selectorInfo.dataFormats[0];\r\n }\r\n\r\n // Record the newly selected type name\r\n self.currentTypeName = newDfm.name;\r\n\r\n // Update the newProps object to reflect our change\r\n newProps.dataFormatId = \"\" + newDfm.id;\r\n }\r\n },\r\n\r\n onChangeUpdateModel: function() {\r\n // Update the model\r\n var $radio = $(\"input:radio:checked\", this.$el);\r\n this.model.set(this.propertyName, $radio.val());\r\n\r\n // Save the currently selected name, so we can match based on name when switching between indicators\r\n this.currentTypeName = $radio.data(\"name\");\r\n\r\n // Tracks when a user changes the data type\r\n dataLayer.push({\r\n event: \"Data Type Selection\",\r\n eventCategory: \"Data Type Selection\",\r\n eventAction: \"Data Type|\" + $radio.attr(\"data-name\"),\r\n eventLabel: window.location.pathname\r\n });\r\n },\r\n\r\n initializeModel: function() {\r\n // Update the model with the default selected item in the dropdown\r\n var $radio = $(\"input:radio:checked\", this.$el);\r\n this.model.set(this.propertyName, $radio.val(), { silent: true });\r\n // Save the currently selected name, so we can match based on name when switching between indicators\r\n this.currentTypeName = $radio.data(\"name\");\r\n },\r\n\r\n /**\r\n * Returns text summarizing the currently selected options for this selector.\r\n */\r\n getDataSummaryText: function() {\r\n var name = $(\r\n \"input:radio[value='\" + this.model.get(this.propertyName) + \"']\",\r\n this.$el\r\n ).data(\"name\");\r\n\r\n // The DOM isn't guaranteed to be updated yet in cases where we're switching indicators, so fall back to the currentTypeName property\r\n return name == null ? this.currentTypeName : name;\r\n },\r\n\r\n updateDOM: function() {\r\n // Set the option corresponding to the value on the model\r\n $(\"input:radio[value='\" + this.model.get(this.propertyName) + \"']\", this.$el).prop(\"checked\", true);\r\n }\r\n });\r\n})(jQuery, _);\r\n","/// \r\n/// \r\n/// \r\n\r\n(function($, _) {\r\n var ns = window.nspace(\"ccc.viz.selectors\");\r\n\r\n ns.IndicatorJumpSelectorView = ns.BaseSelectorView.extend({\r\n name: \"Indicator Jump Selector\",\r\n el: \"#indicator-jump-selector\",\r\n templateSelector: \"#indicator-jump-selector-template\",\r\n propertyName: \"indicatorIdJump\",\r\n\r\n events: {\r\n \"change select\": \"onChangeUpdateModel\"\r\n },\r\n\r\n onChangeUpdateModel: function() {\r\n this.scrollToIndicator();\r\n },\r\n\r\n /**\r\n * Initializes the model with the default values for this selector.\r\n * In this case, the default for the indicator jump is no indicator at all.\r\n */\r\n initializeModel: function() {\r\n this.model.set(this.propertyName, null, { silent: true });\r\n },\r\n\r\n scrollToIndicator: function() {\r\n var indicatorId, scrollTop;\r\n\r\n indicatorId = this.$(\"select\").val();\r\n scrollTop = $(\r\n \".profile-indicator-container[data-id=\" + indicatorId + \"]\"\r\n ).offset().top;\r\n $(\"body, html\").animate({ scrollTop: scrollTop }, 0);\r\n // The text of the select should always read as the disabled options (\"Jump to...\").\r\n // This is by design.\r\n this.$(\"option:disabled\").prop(\"selected\", true);\r\n },\r\n\r\n /**\r\n * Returns text summarizing the currently selected options for this selector.\r\n */\r\n getDataSummaryText: function() {\r\n return null;\r\n },\r\n\r\n updateDOM: function() {\r\n var indicators;\r\n\r\n indicators = this.model.get(\"indicatorIds\");\r\n\r\n if (indicators.length >= 5) {\r\n this.$el.show();\r\n return;\r\n }\r\n\r\n this.$el.hide();\r\n }\r\n });\r\n})(jQuery, _);\r\n","/// \r\n/// \r\n/// \r\n/// \r\n\r\n(function($, _) {\r\n var ns = window.nspace(\"ccc.viz.selectors\");\r\n\r\n ns.LocationSelectorView = ns.BaseSelectorView.extend({\r\n name: \"Location Selector\",\r\n el: \"#location-selector\",\r\n templateSelector: \"#location-selector-template\",\r\n propertyName: \"locationIds\",\r\n\r\n initialize: function() {\r\n _.bindAll(this);\r\n\r\n $(window).on(\"resize\", this.repositionMultiselect);\r\n },\r\n\r\n events: {\r\n change: \"onChangeUpdateModel\"\r\n },\r\n\r\n onChangeUpdateModel: function() {\r\n var props, optionIds;\r\n\r\n props = {};\r\n\r\n optionIds = $(\"select\", this.$el).val();\r\n\r\n props[this.propertyName] = optionIds || [];\r\n\r\n this.model.set(props);\r\n\r\n // Tracks if user changes location type on the \"Explore Data\" page\r\n var $dropdown = $(\"select\", this.$el);\r\n var dropdownValues = $dropdown.val();\r\n var communityNames = [];\r\n if (dropdownValues && dropdownValues.length) {\r\n for (var i in dropdownValues) {\r\n var selector = \"option[value=\" + dropdownValues[i] + \"]\";\r\n communityNames.push($(selector, $dropdown).text());\r\n }\r\n communityNames = communityNames.sort();\r\n }\n else {\r\n communityNames = \"Uncheck All\";\r\n }\r\n dataLayer.push({\r\n event: \"Location Type Dropdown Clicks\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"Location Type Dropdown|\" + communityNames,\r\n eventLabel: window.location.pathname\r\n });\r\n },\r\n\r\n initializeModel: function() {\r\n // Update the model with the first item in the dropdown\r\n this.model.set(\r\n this.propertyName,\r\n [$(\"select option:first\", this.$el).val()],\r\n { silent: true }\r\n );\r\n },\r\n\r\n /**\r\n * Repositions the multiselect, as the plugin (unwisely) positions the dropdown out of the select\r\n * element's scope.\r\n */\r\n repositionMultiselect: function() {\r\n this.$(\".location-type select\")\r\n // Make sure multiselect is initialized.\r\n .multiselect(this.defaultMultiSelectOptions)\r\n .multiselect(\"position\");\r\n },\r\n\r\n /**\r\n * Returns text summarizing the currently selected options for this selector.\r\n */\r\n getDataSummaryText: function() {\r\n var $selectedOptions;\r\n\r\n $selectedOptions = $(\"select option:selected\", this.$el);\r\n\r\n if (!$selectedOptions.length) {\r\n return \"No Locations Selected\";\r\n }\r\n\r\n if ($selectedOptions.length === 1) {\r\n return $selectedOptions.text();\r\n }\r\n return $selectedOptions.length + \" Locations\";\r\n },\r\n\r\n render: function(selectorInfo) {\r\n // Call the base implementation\r\n ns.LocationSelectorView.__super__.render.call(this, selectorInfo);\r\n\r\n this.$(\".location-type select\").multiselect(\r\n this.defaultMultiSelectOptions\r\n );\r\n },\r\n\r\n updateDOM: function() {\r\n var modelProp;\r\n\r\n modelProp = this.model.get(this.propertyName);\r\n\r\n // Set the option corresponding to the value on the model\r\n $(\"select\", this.$el)\r\n .val(modelProp)\r\n .updateSelect();\r\n }\r\n });\r\n})(jQuery, _);\r\n","/// \r\n/// \r\n\r\n(function($, _) {\r\n var ns = window.nspace(\"ccc.viz.selectors\");\r\n\r\n ns.LocationTypeSelectorView = ns.BaseSelectorView.extend({\r\n name: \"Location Type Selector\",\r\n el: \"#location-type-selector\",\r\n // templateSelector: \"#location-type-selector-template\",\r\n template: _.template(\r\n [\r\n '
',\r\n 'Location Type',\r\n \"<% for (var i = 0; i < locationTypes.length; i++) {\",\r\n \"var locationType = locationTypes[i];\",\r\n \"if (locationType.selected == true){\",\r\n \"%>\",\r\n '
\" value=\"<%=locationType.id%>\" checked data-text=\"<%=locationType.name%>\">
',\r\n \"<% } else {%>\",\r\n '
\" value=\"<%=locationType.id%>\" data-text=\"<%=locationType.name%>\">
',\r\n \"<%}}%>\",\r\n \"
\"\r\n ].join(\"\\n\")\r\n ),\r\n propertyName: \"locationTypeId\",\r\n selectorInfoPropertyName: \"locationTypes\",\r\n initialize: function() {\r\n _.bindAll(this, \"onChangeUpdateModel\", \"initializeModel\", \"updateDOM\");\r\n },\r\n\r\n events: {\r\n change: \"onChangeUpdateModel\"\r\n },\r\n\r\n onChangeUpdateModel: function() {\r\n var props = {};\r\n var $dropdown = $(\".filter-block\", this.$el);\r\n var dropdownValue = $dropdown.find(\"input:checked\").val();\r\n props[this.propertyName] = dropdownValue;\r\n\r\n // If the location type is changing, then we also need to clear any\r\n // selected location (since it will be of a different location type than we're switching to)\r\n if (this.model.get(this.propertyName) !== props[this.propertyName]) {\r\n props[\"selectedFips\"] = null;\r\n }\r\n\r\n this.model.set(props);\r\n\r\n // Tracks if user changes location type on the \"Explore Data\" page\r\n var selector = \"input[value=\" + dropdownValue + \"]\";\r\n var communityName = $(selector, $dropdown).data(\"\");\r\n dataLayer.push({\r\n event: \"Location Type Dropdown Clicks\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"Location Type Dropdown|\" + communityName,\r\n eventLabel: window.location.pathname\r\n });\r\n },\r\n\r\n initializeModel: function() {\r\n //set the model based on which value is checked\r\n var $radioActive = $(this.$el).find(\"input:checked\").length\r\n ? $(this.$el).find(\".radio-container input:checked\")\r\n : $(this.$el).find(\".radio-container input:first\");\r\n\r\n this.model.set(this.propertyName, $radioActive.val(), {\r\n silent: true\r\n });\r\n },\r\n\r\n /**\r\n * Returns text summarizing the currently selected options for this selector.\r\n */\r\n getDataSummaryText: function() {\r\n return $(\".filter-block input:checked\", this.$el).data(\"text\");\r\n },\r\n\r\n updateDOM: function() {\r\n // Set the option corresponding to the value on the model\r\n $(this.$el)\r\n .find(\r\n 'input[value=\"' + this.model.get(this.propertyName) + '\"]',\r\n this.$el\r\n )\r\n .prop(\"checked\", true);\r\n }\r\n });\r\n})(jQuery, _);\r\n","/// \n/// \n/// \n/// \n/// \n/// \n\n(function($, _) {\n var ns = window.nspace(\"ccc.viz.selectors\");\n\n // NOTE MultipleBreakdownSelectorViewBase is a legacy version of BreakdownSelectorView\n // we changed BreakdownSelectorView and it broke MultipleBreakdownSelectorView\n ns.MultipleBreakdownSelectorView = ns.MultipleBreakdownSelectorViewBase.extend(\n {\n name: \"Multiple Breakdown Selector\",\n el: \"#multiple-breakdown-selector\",\n templateSelector: \"#multiple-breakdown-selector-template\",\n\n initialize: function(options) {\n // Call the base implementation\n ns.BreakdownSelectorView.__super__.initialize.call(this, options);\n\n $(window).on(\"resize\", this.repositionMultiselect);\n },\n\n events: {\n change: \"onChangeUpdateModel\"\n },\n\n onChangeUpdateModel: function() {\n function capitalizeFirstLetter(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n // Indicator ID comes from the radio buttons\n var $checkedRadioButton = $(\"input:radio:checked\", this.$el);\n var indId = $checkedRadioButton.val();\n\n // Characteristic ID comes from the checkbox\n var chId = $(\"input:radio:checked~select\", this.$el).val();\n\n var lastIndId = this.model.attributes.indicatorId;\n var lastChId = this.model.attributes.characteristicId;\n if (indId !== lastIndId || chId !== lastChId) {\n // Tracks when a user clicks on a \"Breakdown\" radio button on the \"Explore Data\" page\n var selectedTab = capitalizeFirstLetter(\n window.location.pathname.split(\"/\")[2]\n ); // e.g. 'Map', 'Table', 'Bar chart' tab\n var selectedBreakdown = $checkedRadioButton.siblings(\"label\").text(); // distribution name\n\n var selectedCharacteristics = [];\n if (chId && chId.length) {\n for (var i = 0; i < chId.length; i++) {\n selectedCharacteristics.push(\n $(\"input:radio:checked~select\", this.$el)\n .children('[value=\"' + chId[i] + '\"]')\n .text()\n );\n }\n }\n if (!selectedCharacteristics.length) {\n if (\n $checkedRadioButton.siblings(\"button\").hasClass(\"ui-state-active\")\n ) {\n // Unchecked all characteristics; do nothing\n }\n else {\n // Clicked on the radio button itself, rather than the Uncheck All button; include all characteristics\n\t\t\t\t\t\tvar radioSelector = \"input:radio[value='\" + indId + \"']\";\r\n if ($(radioSelector).length === 0) {\n // No match? Update the model to match the value of the first radio button\n radioSelector = \"input:radio:first\";\n }\n var allOptions = $(radioSelector + \"~select option\")\n .map(function() {\n return this.value;\n })\n .get();\n\n var self = this;\n _.each(allOptions, function(id) {\n var indicatorId, name, modifiedName;\n\n name = _.filter(\n self.model.selectorInfo.selectors[indId].characteristics,\n function(characteristic) {\n return +characteristic.id === +id;\n }\n )[0].name;\n\n selectedCharacteristics.push(name);\n });\n selectedCharacteristics.sort();\n }\n }\n\n dataLayer.push({\n event: \"Breakdown Radio Button Clicks\",\n eventCategory: \"Interactive Clicks\",\n eventAction:\n selectedTab +\n \"|\" +\n selectedBreakdown +\n \"|\" +\n selectedCharacteristics,\n eventLabel: window.location.pathname\n });\n }\n\n var props = {};\n props.characteristicIds = chId || [];\n props[this.propertyName] = indId;\n\n // Other selectors are indicator-specific and may need to update other model properties\n // in response to the indicator changing. In order to accommodate that, emit a \"before-change\"\n // event and pass along the new properties, allowing any handlers to modify the set of new\n // properties as needed. This will prevent multiple change events from firing in response to the\n // indicator changing.\n this.model.trigger(\"before-change\", props);\n\n // Update the model\n this.model.set(props);\n },\n\n /**\n * Updates the model with default selections, for cases where the user arrives\n * at the page with nothing preselected.\n */\n initializeModel: function() {\n var indId, radioSelector, chId, optionIds, allOptions, modelValue;\n\n // It's possible to arrive here with an indicator set, but a required characteristic is not.\n // Try to retain the indicator if it's already set.\n indId = this.model.get(this.propertyName);\n\n // Do we have a matching radio button?\n radioSelector = \"input:radio[value='\" + indId + \"']\";\n if ($(radioSelector).length === 0) {\n // No match? Update the model to match the value of the first radio button\n radioSelector = \"input:radio:first\";\n\n this.model.set(this.propertyName, $(radioSelector, this.$el).val(), {\n silent: true\n });\n }\n\n // Do we have a matching selection in the characteristics dropdown?\n chId = this.model.get(\"characteristicIds\");\n optionIds = $(radioSelector + \"~select option\", this.$el).map(\n function() {\n return this.value;\n }\n );\n\n if (!chId || !_.intersection(optionIds, chId).length) {\n allOptions = $(radioSelector + \"~select option\")\n .map(function() {\n return this.value;\n })\n .get();\n modelValue = allOptions.length ? allOptions : [\"a\"];\n this.model.set(\"characteristicIds\", modelValue, { silent: true });\n }\n },\n\n /**\n * Repositions the multiselect, as the plugin (unwisely) positions the dropdown out of the select\n * element's scope.\n */\n repositionMultiselect: function() {\n this.$(\".characteristics\")\n // Make sure multiselect is initialized.\n .multiselect(this.defaultMultiSelectOptions)\n .multiselect(\"position\");\n },\n\n /**\n * Updates the DOM to match the selections specified on the model\n */\n updateDOM: function() {\n // Choose the radio button with the value specified in the model\n var radioSelector =\n \"input:radio[value='\" + this.model.get(this.propertyName) + \"']\";\n $(radioSelector).prop(\"checked\", true);\n\n if (!this.model.get(\"characteristicIds\")) {\n return;\n }\n\n // Select the corresponding characteristic from the dropdown, too\n $(radioSelector + \"~select\").val(this.model.get(\"characteristicIds\"));\n },\n\n /**\n * Returns text summarizing the currently selected options for this selector.\n */\n getDataSummaryText: function() {\n var radioSelector, distro, $selectedOptions;\n\n // Don't include the selected value in the data summary if the control is hidden\n if (this.isHidden) {\n return null;\n }\n\n radioSelector =\n \"input:radio[value='\" + this.model.get(this.propertyName) + \"']\";\n distro = $(radioSelector, this.$el).data(\"name\");\n // TODO: we're duplicated the summary text logic here, as this is handled by BaseSelectorView.defaultMultiselectOptions.selectedText, but it's necessary to implement our own method here because\n // 1) That callback is called *after* this function is called, and 2) there's multiselect markup there that's being used to generate the summary text, not the ordinary select markup.\n // Maybe there's a way around this somehow?\n $selectedOptions = $(\n radioSelector + \"~select option:checked\",\n this.$el\n );\n\n if ($selectedOptions.length > 1) {\n return distro + \": \" + $selectedOptions.length + \" selected\";\n }\n\n if ($selectedOptions.length === 1) {\n return distro + \": \" + $selectedOptions.text();\n }\n\n // Though there aren't any options checked, there are options available.\n if ($(radioSelector + \"~select option\", this.$el).length) {\n return distro + \": None selected\";\n }\n\n return distro;\n },\n\n showHideCharacteristicSelector: function() {\n // Show ONLY the characteristics for the currently selected breakdown\n $(\".characteristics ~ .ui-multiselect\", this.el).hide();\n $(\"br\", this.el).hide();\n\n var radioSelector =\n \"input:radio[value='\" + this.model.get(this.propertyName) + \"']\";\n $(\n radioSelector + \" ~.ui-multiselect, \" + radioSelector + \" ~br\",\n this.el\n ).show();\n },\n\n render: function(selectorInfo) {\n var $characteristics;\n\n // Call the base implementation\n ns.BreakdownSelectorView.__super__.render.call(this, selectorInfo);\n\n $characteristics = $(\".characteristics\", this.el).multiselect(\n this.defaultMultiSelectOptions\n );\n\n // Hide the characteristic dropdown if it's not configured to be shown\n if (this.hideCharacteristics) {\n $characteristics.hide();\n $(\"br\", this.el).hide();\n }\n else {\n // Otherwise show only the characteristics for the current indicator\n this.showHideCharacteristicSelector();\n }\n\n // Don't bother rendering again\n this.isRendered = true;\n\n // Hide the selector if there is only a single indicator with no breakdown\n if (\n selectorInfo.indicators.length == 1 &&\n !selectorInfo.selectors[selectorInfo.indicators[0].id].characteristics\n ) {\n this.$el.hide();\n this.isHidden = true;\n }\n }\n }\n );\n})(jQuery, _);\n","/// \r\n/// \r\n/// \r\n\r\n(function($, _) {\r\n var ns = window.nspace(\"ccc.viz.selectors\");\r\n\r\n ns.MultipleDataTypeSelectorView = ns.BaseSelectorView.extend({\r\n name: \"Multiple Data Type Selector\",\r\n el: \"#multiple-data-type-selector\",\r\n templateSelector: \"#multiple-data-type-selector-template\",\r\n propertyName: \"dataTypeIds\",\r\n\r\n initialize: function(options) {\r\n _.bindAll(this);\r\n\r\n this.getSelectorInfoFunc = options.getSelectorInfoFunc;\r\n },\r\n\r\n events: {\r\n change: \"onChangeUpdateModel\"\r\n },\r\n\r\n onChangeUpdateModel: function() {\r\n var $allCheckboxes, $checkedCheckboxes, checkboxValues;\r\n\r\n $allCheckboxes = this.$(\"input:checkbox\");\r\n $checkedCheckboxes = $allCheckboxes.filter(\":checked\");\r\n\r\n if ($allCheckboxes.length === $checkedCheckboxes.length) {\r\n checkboxValues = [\"a\"];\r\n }\n else {\r\n // Update the model\r\n checkboxValues = $checkedCheckboxes\r\n .map(function() {\r\n return this.value;\r\n })\r\n .get();\r\n }\r\n\r\n this.model.set(this.propertyName, checkboxValues);\r\n },\r\n\r\n initializeModel: function() {\r\n // Update the model with all of the available checkboxes.\r\n this.model.set(this.propertyName, [\"a\"], { silent: true });\r\n },\r\n\r\n /**\r\n * Returns text summarizing the currently selected options for this selector.\r\n */\r\n getDataSummaryText: function() {\r\n var dataFormats;\r\n\r\n dataFormats = this.model.get(this.propertyName);\r\n\r\n if (dataFormats[0] === \"a\") {\r\n return \"All Data Types\";\r\n }\r\n\r\n if (!dataFormats.length) {\r\n return \"No Data Types Selected\";\r\n }\r\n\r\n if (dataFormats.length === 1) {\r\n return this.$(\"input[value=\" + dataFormats[0] + \"]\").data(\"name\");\r\n }\r\n\r\n return dataFormats.length + \" Data Types\";\r\n },\r\n\r\n updateDOM: function() {\r\n var dataFormats;\r\n\r\n dataFormats = this.model.get(this.propertyName);\r\n\r\n if (dataFormats[0] === \"a\") {\r\n this.$(\"input\").prop(\"checked\", true);\r\n return;\r\n }\r\n\r\n this.$(\"input\").each(function() {\r\n var $self, shouldBeChecked;\r\n\r\n $self = $(this);\r\n shouldBeChecked = _.any(dataFormats, function(dataFormat) {\r\n return +$self.val() === +dataFormat;\r\n });\r\n $self.prop(\"checked\", shouldBeChecked);\r\n });\r\n }\r\n });\r\n})(jQuery, _);\r\n","/// \r\n/// \r\n/// \r\n\r\n(function($, _) {\r\n var ns = window.nspace(\"ccc.viz.selectors\");\r\n\r\n /**\r\n * The features for the other features selector, only available for profile pages.\r\n */\r\n ns.OtherFeaturesSelectorView = ns.BaseSelectorView.extend({\r\n name: \"Other Features Selector\",\r\n el: \"#other-features-selector\",\r\n templateSelector: \"#other-features-selector-template\",\r\n propertyName: \"otherFeatureIds\",\r\n\r\n events: {\r\n \"change input\": \"onChangeUpdateModel\"\r\n },\r\n\r\n onChangeUpdateModel: function() {\r\n var propertyValue;\r\n\r\n propertyValue = this.getPropertyValue();\r\n\r\n // Update the model\r\n this.model.set(this.propertyName, propertyValue);\r\n },\r\n\r\n getPropertyValue: function() {\r\n var $checkboxes, $checkedCheckboxes, featureIds;\r\n\r\n $checkboxes = this.$(\"input:checkbox\");\r\n $checkedCheckboxes = $checkboxes.filter(\":checked\");\r\n\r\n if ($checkboxes.length === $checkedCheckboxes.length) {\r\n return [\"a\"];\r\n }\r\n\r\n if (!$checkedCheckboxes.length) {\r\n return [];\r\n }\r\n\r\n // Update the model\r\n featureIds = this.$(\"input:checked\")\r\n .map(function() {\r\n return $(this).data(\"id\");\r\n })\r\n .get();\r\n\r\n return featureIds;\r\n },\r\n\r\n /**\r\n * Initializes the model with the default values for this selector.\r\n * In this case, the default for other features is set to all options selected. FB 39453.\r\n */\r\n initializeModel: function() {},\r\n\r\n /**\r\n * Returns text summarizing the currently selected options for this selector.\r\n */\r\n getDataSummaryText: function() {\r\n return null;\r\n },\r\n\r\n updateDOM: function() {\r\n // Set the option corresponding to the value on the model\r\n var ids, $inputs;\r\n\r\n ids = this.model.get(this.propertyName);\r\n $inputs = this.$(\"input\");\r\n\r\n if (!ids || !ids.length) {\r\n $inputs.prop(\"checked\", false);\r\n return;\r\n }\r\n\r\n if (ids[0] === \"a\") {\r\n $inputs.prop(\"checked\", true);\r\n return;\r\n }\r\n\r\n $inputs.each(function() {\r\n var $self, shouldBeChecked;\r\n\r\n $self = $(this);\r\n shouldBeChecked = _.any(ids, function(id) {\r\n return +id === $self.data(\"id\");\r\n });\r\n\r\n $self.prop(\"checked\", shouldBeChecked);\r\n });\r\n }\r\n });\r\n})(jQuery, _);\r\n","/// \r\n/// \r\n/// \r\n/// \r\n/// \r\n\r\n(function($, _) {\r\n var ns = window.nspace(\"ccc.viz.selectors\");\r\n\r\n ns.SingleLocationSelectorView = ns.LocationSelectorView.extend({\r\n name: \"Single Location Selector\",\r\n el: \"#single-location-selector\",\r\n templateSelector: \"#single-location-selector-template\",\r\n propertyName: \"locationId\",\r\n propertySlugName: \"locationSlug\",\r\n\r\n onChangeUpdateModel: function() {\r\n var props, $option;\r\n\r\n props = {};\r\n\r\n $option = this.$(\"select option:selected\");\r\n\r\n if (!$option.length) {\r\n return;\r\n }\r\n\r\n props[this.propertyName] = $option.val();\r\n props[this.propertySlugName] = $option.data(\"slug\");\r\n\r\n var lastLocationName = this.model.attributes.locationSlug;\r\n var curLocationName = $option.text();\r\n if (\r\n curLocationName.trim().toLowerCase() !==\r\n lastLocationName.trim().toLowerCase()\r\n ) {\r\n // Tracks when a user selects a different location (e.g. Borough, or Community District) on the \"Location Profile\" page\r\n dataLayer.push({\r\n event: \"BCD Clicks\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"BCD|\" + curLocationName,\r\n eventLabel: window.location.pathname\r\n });\r\n }\r\n\r\n this.model.set(props);\r\n },\r\n\r\n /**\r\n * Returns text summarizing the currently selected options for this selector.\r\n */\r\n getDataSummaryText: function() {\r\n return $(\"select option:selected\", this.$el).text();\r\n },\r\n\r\n render: function(selectorInfo) {\r\n // Call the base implementation\r\n ns.BaseSelectorView.prototype.render.call(this, selectorInfo);\r\n },\r\n\r\n updateDOM: function() {\r\n var modelProp;\r\n\r\n modelProp = this.model.get(this.propertyName);\r\n\r\n // Set the option corresponding to the value on the model\r\n $(\"select\", this.$el).val(modelProp);\r\n }\r\n });\r\n})(jQuery, _);\r\n","/// \r\n/// \r\n\r\n(function($, _) {\r\n var ns = window.nspace(\"ccc.viz.selectors\");\r\n\r\n ns.TimeFrameSelectorView = ns.BaseSelectorView.extend({\r\n name: \"TimeFrame Selector\",\r\n el: \"#timeframe-selector\",\r\n templateSelector: \"#timeframe-selector-template\",\r\n propertyName: \"timeFrameId\",\r\n selectorInfoPropertyName: \"timeFrames\",\r\n\r\n initialize: function(options) {\r\n _.bindAll(\r\n this,\r\n \"onChangeUpdateModel\",\r\n \"initializeModel\",\r\n \"updateDOM\",\r\n \"onBeforeChange\"\r\n );\r\n\r\n this.getSelectorInfoFunc = options.getSelectorInfoFunc;\r\n\r\n // Handle the before change event so that we have an opportunity to update the\r\n // TimeFrameId when the indicator ID changes.\r\n this.model.on(\"before-change\", this.onBeforeChange);\r\n },\r\n\r\n events: {\r\n change: \"onChangeUpdateModel\"\r\n },\r\n\r\n onBeforeChange: function(newProps) {\r\n // If the indicator ID is changing, then we may need to also change the Time Frame ID\r\n // since each indicator could have a different set of TFs\r\n if (this.model.get(\"indicatorId\") !== newProps.indicatorId) {\r\n var allSelectorInfo = this.getSelectorInfoFunc();\r\n var selectorInfo = allSelectorInfo.selectors[newProps.indicatorId];\r\n\r\n var oldTfId = this.model.get(this.propertyName);\r\n\r\n // If possible, keep the ID the same\r\n var sameAsOld = _.find(selectorInfo.timeFrames, function(tf) {\r\n return tf.id == oldTfId;\r\n });\r\n if (sameAsOld != null) {\r\n return;\r\n }\r\n\r\n // Different set of TFs? Select the first one\r\n var newTf = selectorInfo.timeFrames[0];\r\n\r\n // Update the newProps object to reflect our change\r\n newProps[this.propertyName] = \"\" + newTf.id;\r\n }\r\n },\r\n\r\n onChangeUpdateModel: function() {\r\n this.model.set(this.propertyName, $(\"select\", this.$el).val());\r\n\r\n // Tracks when a user clicks on the \"Timeframe\" dropdown menu\r\n var timeFrame = $(\"select :selected\", this.$el).text();\r\n dataLayer.push({\r\n event: \"Timeframe Dropdown Clicks\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"Timeframe Dropdown|\" + timeFrame,\r\n eventLabel: window.location.pathname\r\n });\r\n },\r\n\r\n initializeModel: function() {\r\n // Update the model with the first item in the dropdown\r\n this.model.set(this.propertyName, $(\"select\", this.$el).val(), {\r\n silent: true\r\n });\r\n },\r\n\r\n /**\r\n * Returns text summarizing the currently selected options for this selector.\r\n */\r\n getDataSummaryText: function() {\r\n return $(\"select option:selected\", this.$el).text();\r\n },\r\n\r\n updateDOM: function() {\r\n // Set the option corresponding to the value on the model\r\n $(\"select\", this.$el).val(this.model.get(this.propertyName));\r\n }\r\n });\r\n})(jQuery, _);\r\n"]}