Advertisement
Guest User

Untitled

a guest
Jun 29th, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.64 KB | None | 0 0
  1. #= require jquery
  2. #= require typehead.js
  3.  
  4. $(document).ready ->
  5. window.typeahead.init()
  6.  
  7. window.typeahead = {
  8.  
  9. ######################
  10. # INITIALIZATION STUFF
  11. ######################
  12.  
  13. # Set @compare to true or false
  14. # Set up typeahead elements variables
  15. # Initialize district/state typeaheads and compare listeners
  16. init: ->
  17. if window.location.href.indexOf('compare-') > -1
  18. @compare = true
  19. else
  20. @compare = false
  21. @setElementVariables()
  22. @initStateTypeahead()
  23. @initDistrictTypeahead()
  24. @createComparePricesListeners()
  25.  
  26. setElementVariables: ->
  27. # @typeaheadStates = $('input.typeahead-states')
  28. # @typeaheadStatesCompare = $('input.typeahead-radio-states')
  29. @typeaheadDistricts = $('input.typeahead-districts')
  30. @typeaheadDistrictsCompare = $('input.typeahead-radio-districts')
  31. @postalCd = $('.state-container').data('state') || $('.district-container').data('state')
  32. @districtSlug = $('.district-container').data('district-slug')
  33.  
  34. createComparePricesListeners: ->
  35. $('.button.compare-prices, a.compare-link').click =>
  36. prefix = "#{window.location.origin}/2015/compare-prices"
  37. if @districtSlug != undefined
  38. window.location.href = "#{prefix}/#{@postalCd}/districts/#{@districtSlug}"
  39. else if @postalCd != undefined
  40. window.location.href = "#{prefix}/#{@postalCd}"
  41. else
  42. window.location.href = prefix
  43.  
  44. $('.compare-districts').click =>
  45. prefix = "#{window.location.origin}/2015/compare-districts"
  46. if @districtSlug != undefined
  47. window.location.href = "#{prefix}/#{@postalCd}/districts/#{@districtSlug}"
  48. else if @postalCd != undefined
  49. window.location.href = "#{prefix}/#{@postalCd}"
  50. else
  51. window.location.href = prefix
  52.  
  53.  
  54.  
  55. ########################
  56. # STATE TYPEAHEAD STUFF
  57. #######################
  58.  
  59. initStateTypeahead: ->
  60. if @stateData == undefined
  61. $.getJSON("/api/states").done @createStateTypeaheads.bind(@)
  62. else
  63. @createStateTypeaheads()
  64.  
  65. createStateTypeaheads: (data) ->
  66. # set @stateData to all the states that return
  67. # create state typeahead with name and typeahead element
  68. @stateData = data if data != undefined
  69. @createStateTypeahead('states', @typeaheadDistricts)
  70. # @createStateTypeahead('radio-states', @typeaheadStatesCompare) if @compare
  71.  
  72. createStateTypeahead: (name, typeahead) ->
  73. # options are from typeahead
  74. options = @stateTypeaheadOptions()
  75. options.name = name
  76. @createTypeahead(typeahead, options, @handleStateChange)
  77. @setInitialStateValue(typeahead)
  78.  
  79. stateTypeaheadOptions: ->
  80. displayKey: 'full_name'
  81. source: (q, sync) =>
  82. sync @substringMatcher(@stateData, q, 'state')
  83. limit: 60
  84.  
  85. setInitialStateValue: (typeahead) ->
  86. if @stateName == undefined
  87. $.each @stateData, (_, state) =>
  88. if state.postal_cd == @postalCd
  89. @stateName = state.full_name
  90. typeahead.typeahead('val', @stateName)
  91. else
  92. typeahead.typeahead('val', @stateName)
  93.  
  94. handleStateChange: (e, state) ->
  95. if @validateState(state.full_name)
  96. if $(e.target).hasClass('typeahead-radio-states-prices')
  97. window.location.href = "/2015/compare-prices/#{state.postal_cd}"
  98. else if $(e.target).hasClass('typeahead-radio-states-districts')
  99. window.location.href = "/2015/compare-districts/#{state.postal_cd}"
  100. else
  101. window.location.href = "/2015/#{state.postal_cd}"
  102. else
  103. $(e.target).typeahead('val', @stateName)
  104.  
  105. validateState: (state) ->
  106. @stateData.some (validState) ->
  107. validState.full_name == state
  108.  
  109. ###########################
  110. # DISTRICT TYPEAHEAD STUFF
  111. ###########################
  112.  
  113. initDistrictTypeahead: ->
  114. if @districtData == undefined
  115. $.getJSON("/api/districts").done [@setDistrictData.bind(@), @createDistrictTypeaheads.bind(@)]
  116. else
  117. @createDistrictTypeaheads()
  118.  
  119. setDistrictData: (data) ->
  120. @districtData = data
  121. @inStateDistrictData = data.filter (district) =>
  122. district.postal_cd == @postalCd
  123. @outOfStateDistrictData = data.filter (district) =>
  124. district.postal_cd != @postalCd
  125.  
  126. createDistrictTypeaheads: ->
  127. if @postalCd != undefined
  128. @createDistrictTypeaheadsWithPostalCd()
  129. else
  130. @createDistrictTypeaheadsWithoutPostalCd()
  131.  
  132. createDistrictTypeaheadsWithPostalCd: ->
  133. options = [
  134. @districtTypeaheadOptions(@inStateDistrictData, @inStateDistrictHeader.bind(@)),
  135. @districtTypeaheadOptions(@outOfStateDistrictData, @outOfStateDistrictHeader.bind(@))
  136. ]
  137. @createDistrictTypeahead(@typeaheadDistricts, options, 'districts-state', 'districts-nation')
  138. @createDistrictTypeahead(@typeaheadDistrictsCompare, options, 'radio-districts', 'radio-districts') if @compare
  139.  
  140. createDistrictTypeaheadsWithoutPostalCd: ->
  141. options = @districtTypeaheadOptions(@outOfStateDistrictData, @outOfStateDistrictHeader.bind(@))
  142. @createDistrictTypeahead(@typeaheadDistricts, options, 'districts-nation')
  143.  
  144. districtTypeaheadOptions: (data, header) ->
  145. displayKey: 'name'
  146. source: (q, sync) =>
  147. sync @substringMatcher(data, q, 'district')
  148. limit: 30
  149. templates:
  150. header: header()
  151. suggestion: @districtSuggestion
  152.  
  153. districtSuggestion: ->
  154. suggestion = @suggestion.arguments[0]
  155. "<div data-district-name='#{suggestion.name}' data-state-postal-cd='#{suggestion.postal_cd}' data-district-name='#{suggestion.nces_cd}'>#{suggestion.name}, #{suggestion.postal_cd}</div>"
  156.  
  157. inStateDistrictHeader: ->
  158. "<div class='tt-suggestion-header-state'>#{@typeaheadStates.val()}</div>"
  159.  
  160. outOfStateDistrictHeader: ->
  161. '<div class="tt-suggestion-header-national">National</div>'
  162.  
  163. createDistrictTypeahead: (typeahead, options, firstName, secondName) ->
  164. if secondName != undefined
  165. options[0].name = firstName
  166. options[1].name = secondName
  167. else
  168. options.name = firstName
  169. @createTypeahead(typeahead, options, @handleDistrictChange)
  170. @setInitialDistrictValue(typeahead)
  171.  
  172. handleDistrictChange: (e, district) ->
  173. if @validateDistrict(district.name)
  174. suffix = "#{district.postal_cd}/districts/#{district.slug}"
  175. if $(e.target).hasClass('typeahead-radio-districts')
  176. window.location.href = "/2015/compare-districts/#{suffix}"
  177. else
  178. window.location.href = "/2015/#{suffix}"
  179. else
  180. $(e.target).typeahead('val', @districtName)
  181.  
  182. validateDistrict: (districtName) ->
  183. @districtData.some (validDistrict) ->
  184. validDistrict.name == districtName
  185.  
  186. setInitialDistrictValue: (typeahead) ->
  187. if @districtName == undefined
  188. $.each @inStateDistrictData, (_, district) =>
  189. if district.slug == @districtSlug
  190. @districtName = district.name
  191. typeahead.typeahead('val', @districtName)
  192. if @compare
  193. $('.distance-filter').show()
  194. else
  195. typeahead.typeahead('val', @districtName)
  196. if @compare
  197. $('.distance-filter').show()
  198.  
  199. ###################
  200. # SHARED STUFF
  201. ###################
  202.  
  203. createTypeahead: (element, options, changeCallback) ->
  204. element.typeahead(@typeaheadOptions(), options)
  205. .on 'typeahead:selected typeahead:autocompleted typeahead:change', changeCallback.bind(@)
  206. .on 'typeahead:active', @activeTypeahead
  207.  
  208. typeaheadOptions: ->
  209. minLength: 0
  210.  
  211. substringMatcher: (data, query, type) ->
  212. matches = []
  213. substrRegex = new RegExp(query, 'i')
  214. $.each data, (_, obj) ->
  215. if type == 'state'
  216. str = obj.full_name
  217. else
  218. str = obj.name
  219. matches.push(obj) if substrRegex.test(str)
  220.  
  221. if type == 'district'
  222. matches.sort (a, b) ->
  223. if a.name < b.name then -1 else 1
  224. matches
  225.  
  226. activeTypeahead: (e) ->
  227. element = $(e.target)
  228. element.typeahead('val', '')
  229. element.attr('placeholder', '')
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement