socmap_adf 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. data/.gitignore +10 -0
  2. data/.rvmrc +81 -0
  3. data/CHANGELOG.md +5 -0
  4. data/Gemfile +17 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +3 -0
  7. data/Rakefile +36 -0
  8. data/lib/assets/.gitkeep +0 -0
  9. data/lib/assets/javascripts/.DS_Store +0 -0
  10. data/lib/assets/javascripts/socmap_adf/.DS_Store +0 -0
  11. data/lib/assets/javascripts/socmap_adf/init.js.coffee.erb +9 -0
  12. data/lib/assets/javascripts/socmap_adf/lib/adf_delegate.js.coffee +13 -0
  13. data/lib/assets/javascripts/socmap_adf/lib/adf_view.js.coffee +7 -0
  14. data/lib/assets/javascripts/socmap_adf/modules/.DS_Store +0 -0
  15. data/lib/assets/javascripts/socmap_adf/modules/cluster/init.js.coffee +11 -0
  16. data/lib/assets/javascripts/socmap_adf/modules/cluster/lib/elycharts.js +3769 -0
  17. data/lib/assets/javascripts/socmap_adf/modules/cluster/lib/raphael.js +5815 -0
  18. data/lib/assets/javascripts/socmap_adf/modules/cluster/templates/chart.jst.eco +6 -0
  19. data/lib/assets/javascripts/socmap_adf/modules/cluster/views/chart.js.coffee +107 -0
  20. data/lib/assets/javascripts/socmap_adf/modules/cluster/views/chart_icon.js.coffee +106 -0
  21. data/lib/assets/javascripts/socmap_adf/modules/cluster/views/cluster.js.coffee +127 -0
  22. data/lib/assets/javascripts/socmap_adf/modules/cluster/views/default_icon.js.coffee +170 -0
  23. data/lib/assets/javascripts/socmap_adf/modules/cluster/views/main.js.coffee +10 -0
  24. data/lib/assets/javascripts/socmap_adf/modules/cluster/views/marker_clusterer.js.coffee +358 -0
  25. data/lib/assets/javascripts/socmap_adf/modules/file_uploader/init.js.coffee +7 -0
  26. data/lib/assets/javascripts/socmap_adf/modules/file_uploader/templates/existing_file.jst.eco +10 -0
  27. data/lib/assets/javascripts/socmap_adf/modules/file_uploader/templates/file.jst.eco +3 -0
  28. data/lib/assets/javascripts/socmap_adf/modules/file_uploader/templates/main.jst.eco +7 -0
  29. data/lib/assets/javascripts/socmap_adf/modules/file_uploader/templates/uploading.jst.eco +3 -0
  30. data/lib/assets/javascripts/socmap_adf/modules/file_uploader/views/main.js.coffee +76 -0
  31. data/lib/assets/javascripts/socmap_adf/modules/form/init.js.coffee +9 -0
  32. data/lib/assets/javascripts/socmap_adf/modules/form/models/base.js.coffee +73 -0
  33. data/lib/assets/javascripts/socmap_adf/modules/form/models/error.js.coffee +12 -0
  34. data/lib/assets/javascripts/socmap_adf/modules/form/models/field_binder.js.coffee +104 -0
  35. data/lib/assets/javascripts/socmap_adf/modules/form/models/validator.js.coffee +65 -0
  36. data/lib/assets/javascripts/socmap_adf/modules/form/templates/error_field.jst.eco +7 -0
  37. data/lib/assets/javascripts/socmap_adf/modules/form/templates/field_set.jst.eco +6 -0
  38. data/lib/assets/javascripts/socmap_adf/modules/form/templates/field_set_button.jst.eco +1 -0
  39. data/lib/assets/javascripts/socmap_adf/modules/form/templates/field_sets.jst.eco +2 -0
  40. data/lib/assets/javascripts/socmap_adf/modules/form/views/base.js.coffee +9 -0
  41. data/lib/assets/javascripts/socmap_adf/modules/form/views/field_set.js.coffee +88 -0
  42. data/lib/assets/javascripts/socmap_adf/modules/form/views/field_set_with_button.js.coffee +38 -0
  43. data/lib/assets/javascripts/socmap_adf/modules/form/views/field_sets.js.coffee +81 -0
  44. data/lib/assets/javascripts/socmap_adf/modules/gmap/.DS_Store +0 -0
  45. data/lib/assets/javascripts/socmap_adf/modules/gmap/init.js.coffee +6 -0
  46. data/lib/assets/javascripts/socmap_adf/modules/gmap/views/.DS_Store +0 -0
  47. data/lib/assets/javascripts/socmap_adf/modules/gmap/views/custom_marker.js.coffee +36 -0
  48. data/lib/assets/javascripts/socmap_adf/modules/gmap/views/marker.js.coffee +72 -0
  49. data/lib/assets/javascripts/socmap_adf/modules/gmap/views/marker_with_label.js +566 -0
  50. data/lib/assets/javascripts/socmap_adf/modules/gmap/views/overlay.js.coffee +237 -0
  51. data/lib/assets/javascripts/socmap_adf/modules/gmap/views/overlay_view.js.coffee +143 -0
  52. data/lib/assets/javascripts/socmap_adf/modules/gmap/views/polygon.js.coffee +107 -0
  53. data/lib/assets/javascripts/socmap_adf/modules/image_uploader/init.js.coffee +7 -0
  54. data/lib/assets/javascripts/socmap_adf/modules/image_uploader/templates/main.jst.eco +10 -0
  55. data/lib/assets/javascripts/socmap_adf/modules/image_uploader/views/main.js.coffee +69 -0
  56. data/lib/assets/javascripts/socmap_adf/modules/map/.DS_Store +0 -0
  57. data/lib/assets/javascripts/socmap_adf/modules/map/init.js.coffee +9 -0
  58. data/lib/assets/javascripts/socmap_adf/modules/map/models/custom_map.js.coffee +1 -0
  59. data/lib/assets/javascripts/socmap_adf/modules/map/models/map.js.coffee +63 -0
  60. data/lib/assets/javascripts/socmap_adf/modules/map/templates/main.jst.eco +1 -0
  61. data/lib/assets/javascripts/socmap_adf/modules/map/templates/moving_pin.jst.eco +11 -0
  62. data/lib/assets/javascripts/socmap_adf/modules/map/templates/tooltip.jst.eco +1 -0
  63. data/lib/assets/javascripts/socmap_adf/modules/map/views/google_marker_clusterer.js.coffee +11 -0
  64. data/lib/assets/javascripts/socmap_adf/modules/map/views/main.js.coffee +79 -0
  65. data/lib/assets/javascripts/socmap_adf/modules/map/views/moving_pin.js.coffee +47 -0
  66. data/lib/assets/javascripts/socmap_adf/modules/map/views/tooltip.js.coffee +46 -0
  67. data/lib/assets/javascripts/socmap_adf/modules/marker/init.js.coffee +6 -0
  68. data/lib/assets/javascripts/socmap_adf/modules/marker/views/.DS_Store +0 -0
  69. data/lib/assets/javascripts/socmap_adf/modules/marker/views/main.js.coffee +132 -0
  70. data/lib/assets/javascripts/socmap_adf/modules/minimap/init.js.coffee +9 -0
  71. data/lib/assets/javascripts/socmap_adf/modules/minimap/models/minimap.js.coffee +36 -0
  72. data/lib/assets/javascripts/socmap_adf/modules/minimap/templates/moving_pin.jst.eco +11 -0
  73. data/lib/assets/javascripts/socmap_adf/modules/minimap/templates/tooltip.jst.eco +1 -0
  74. data/lib/assets/javascripts/socmap_adf/modules/minimap/views/main.js.coffee +68 -0
  75. data/lib/assets/javascripts/socmap_adf/modules/minimap/views/moving_pin.js.coffee +55 -0
  76. data/lib/assets/javascripts/socmap_adf/modules/minimap/views/tooltip.js.coffee +47 -0
  77. data/lib/assets/javascripts/socmap_adf/modules/mvc/init.js.coffee +6 -0
  78. data/lib/assets/javascripts/socmap_adf/modules/mvc/views/base.js.coffee +5 -0
  79. data/lib/assets/javascripts/socmap_adf/modules/overlay/.DS_Store +0 -0
  80. data/lib/assets/javascripts/socmap_adf/modules/overlay/init.js.coffee +10 -0
  81. data/lib/assets/javascripts/socmap_adf/modules/overlay/models/overlay.js.coffee +4 -0
  82. data/lib/assets/javascripts/socmap_adf/modules/overlay/templates/main.jst.eco +1 -0
  83. data/lib/assets/javascripts/socmap_adf/modules/overlay/templates/polygon_label.jst.eco +1 -0
  84. data/lib/assets/javascripts/socmap_adf/modules/overlay/views/.DS_Store +0 -0
  85. data/lib/assets/javascripts/socmap_adf/modules/overlay/views/main.js.coffee +6 -0
  86. data/lib/assets/javascripts/socmap_adf/modules/overlay/views/overlay.js.coffee +55 -0
  87. data/lib/assets/javascripts/socmap_adf/modules/overlay/views/polygon_label.js.coffee +17 -0
  88. data/lib/assets/javascripts/socmap_adf/modules/overlay_push/init.js.coffee +8 -0
  89. data/lib/assets/javascripts/socmap_adf/modules/overlay_push/templates/colibration.jst.eco +4 -0
  90. data/lib/assets/javascripts/socmap_adf/modules/overlay_push/views/new.js.coffee +32 -0
  91. data/lib/assets/javascripts/socmap_adf/modules/popup/init.js.coffee +7 -0
  92. data/lib/assets/javascripts/socmap_adf/modules/popup/templates/base.jst.eco +5 -0
  93. data/lib/assets/javascripts/socmap_adf/modules/popup/templates/basic.jst.eco +5 -0
  94. data/lib/assets/javascripts/socmap_adf/modules/popup/views/base.js.coffee +98 -0
  95. data/lib/assets/javascripts/socmap_adf/modules/popup/views/basic.js.coffee +86 -0
  96. data/lib/assets/javascripts/socmap_adf/modules/sidebar/collections/empty +0 -0
  97. data/lib/assets/javascripts/socmap_adf/modules/sidebar/init.js.coffee +11 -0
  98. data/lib/assets/javascripts/socmap_adf/modules/sidebar/models/slice.js.coffee +0 -0
  99. data/lib/assets/javascripts/socmap_adf/modules/sidebar/templates/bottomlink.jst.eco +1 -0
  100. data/lib/assets/javascripts/socmap_adf/modules/sidebar/templates/bottomlinkaction.jst.eco +2 -0
  101. data/lib/assets/javascripts/socmap_adf/modules/sidebar/templates/content.jst.eco +2 -0
  102. data/lib/assets/javascripts/socmap_adf/modules/sidebar/templates/sidebar.jst.eco +3 -0
  103. data/lib/assets/javascripts/socmap_adf/modules/sidebar/templates/tab.jst.eco +3 -0
  104. data/lib/assets/javascripts/socmap_adf/modules/sidebar/templates/tabs.jst.eco +3 -0
  105. data/lib/assets/javascripts/socmap_adf/modules/sidebar/views/bottomlink.js.coffee +41 -0
  106. data/lib/assets/javascripts/socmap_adf/modules/sidebar/views/content.js.coffee +63 -0
  107. data/lib/assets/javascripts/socmap_adf/modules/sidebar/views/sidebar.js.coffee +163 -0
  108. data/lib/assets/javascripts/socmap_adf/modules/sidebar/views/tab.js.coffee +52 -0
  109. data/lib/assets/javascripts/socmap_adf/modules/sidebar/views/tabcontent.js.coffee +23 -0
  110. data/lib/assets/javascripts/socmap_adf/modules/sidebar/views/tabs.js.coffee +63 -0
  111. data/lib/assets/javascripts/socmap_adf/modules/zone/collections/points.js.coffee +1 -0
  112. data/lib/assets/javascripts/socmap_adf/modules/zone/collections/zones.js.coffee +2 -0
  113. data/lib/assets/javascripts/socmap_adf/modules/zone/init.js.coffee +11 -0
  114. data/lib/assets/javascripts/socmap_adf/modules/zone/models/polygon.js.coffee +72 -0
  115. data/lib/assets/javascripts/socmap_adf/modules/zone/templates/main.jst.eco +0 -0
  116. data/lib/assets/javascripts/socmap_adf/modules/zone/views/main.js.coffee +6 -0
  117. data/lib/assets/javascripts/socmap_adf/modules/zone/views/test.js.coffee +17 -0
  118. data/lib/assets/javascripts/socmap_adf/requiress.js.coffee.erb +3 -0
  119. data/lib/generators/install_generator.rb +15 -0
  120. data/lib/generators/templates/socmap.rb.erb +9 -0
  121. data/lib/socmap_adf/engine.rb +5 -0
  122. data/lib/socmap_adf/version.rb +3 -0
  123. data/lib/socmap_adf.rb +17 -0
  124. data/lib/tasks/socmap-adf_tasks.rake +4 -0
  125. data/socmap_adf.gemspec +26 -0
  126. data/test/socmap-adf_test.rb +7 -0
  127. data/test/test_helper.rb +15 -0
  128. metadata +202 -0
@@ -0,0 +1,358 @@
1
+ class ADF.Cluster.Views.MarkerClusterer extends google.maps.OverlayView
2
+
3
+ MARKER_CLUSTER_IMAGE_PATH_ : "http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/" + "images/m"
4
+ MARKER_CLUSTER_IMAGE_EXTENSION_ : "png"
5
+
6
+ constructor: (map, opt_markers, opt_options) ->
7
+ @map_ = map
8
+ @setMap(@map_)
9
+
10
+ @markers_ = []
11
+
12
+ @clusters_ = []
13
+ # @sizes = [53, 56, 66, 78, 90]
14
+ @sizes = [1, 1, 1, 1, 1]
15
+
16
+ @styles_ = []
17
+
18
+ @ready_ = false
19
+ options = opt_options or {}
20
+
21
+ @clusterShowType_ = options["clusterShowType"] or "default"
22
+
23
+ @gridSize_ = options["gridSize"] or 100
24
+
25
+ @minClusterSize_ = options["minimumClusterSize"] or 2
26
+
27
+ @maxZoom_ = options["maxZoom"] or null
28
+ @styles_ = options["styles"] or []
29
+
30
+ @imagePath_ = options["imagePath"] or @MARKER_CLUSTER_IMAGE_PATH_
31
+
32
+ @imageExtension_ = options["imageExtension"] or @MARKER_CLUSTER_IMAGE_EXTENSION_
33
+
34
+ @zoomOnClick_ = true
35
+ @zoomOnClick_ = options["zoomOnClick"] unless options["zoomOnClick"] is `undefined`
36
+
37
+ @showAllClusters_ = false
38
+ @showAllClusters_ = options["showAllClusters"] unless options["showAllClusters"] is `undefined`
39
+
40
+ @maxZoomOnClick_ = options["maxZoomOnClick"] or 20
41
+
42
+ @averageCenter_ = false
43
+ @averageCenter_ = options["averageCenter"] unless options["averageCenter"] is `undefined`
44
+ @setupStyles_()
45
+
46
+ @prevZoom_ = @map_.getZoom()
47
+
48
+ # Add the map event listeners
49
+ that = this
50
+ google.maps.event.addListener @map_, "zoom_changed", ->
51
+ zoom = that.map_.getZoom()
52
+ unless that.prevZoom_ is zoom
53
+ that.prevZoom_ = zoom
54
+ that.resetViewport()
55
+
56
+ google.maps.event.addListener @map_, "idle", ->
57
+ that.redraw()
58
+
59
+ # Finally, add the markers
60
+ @addMarkers opt_markers, false if opt_markers and opt_markers.length
61
+
62
+ onAdd: () ->
63
+ @setReady_ true
64
+
65
+ draw: () ->
66
+
67
+ onRemove: () ->
68
+
69
+ extend: (obj1, obj2) ->
70
+ ((object) ->
71
+ for property of object::
72
+ @::[property] = object::[property]
73
+ this
74
+ ).apply obj1, [obj2]
75
+
76
+ setupStyles_: ->
77
+ return if @styles_.length
78
+ i = 0
79
+ size = undefined
80
+
81
+ while size = @sizes[i]
82
+ @styles_.push
83
+ url: @imagePath_ + (i + 1) + "." + @imageExtension_
84
+ height: size
85
+ width: size
86
+
87
+ i++
88
+
89
+ fitMapToMarkers: ->
90
+ markers = @getMarkers()
91
+ bounds = new google.maps.LatLngBounds()
92
+ i = 0
93
+ marker = undefined
94
+
95
+ while marker = markers[i]
96
+ bounds.extend marker.getPosition()
97
+ i++
98
+ @map_.fitBounds bounds
99
+
100
+ getClusterShowType: () ->
101
+ @clusterShowType_
102
+
103
+ setStyles: (styles) ->
104
+ @styles_ = styles
105
+
106
+ getStyles: ->
107
+ @styles_
108
+
109
+ isZoomOnClick: ->
110
+ @zoomOnClick_
111
+
112
+ getMaxZoomOnClick: ->
113
+ @maxZoomOnClick_
114
+
115
+ isAverageCenter: ->
116
+ @averageCenter_
117
+
118
+ getMarkers: ->
119
+ @markers_
120
+
121
+ getTotalMarkers: ->
122
+ @markers_.length
123
+
124
+ setMaxZoom: (maxZoom) ->
125
+ @maxZoom_ = maxZoom
126
+
127
+ getMaxZoom: ->
128
+ @maxZoom_
129
+
130
+ calculator_: (markers, numStyles) ->
131
+ index = 0
132
+ count = markers.length
133
+ dv = count
134
+ while dv isnt 0
135
+ dv = parseInt(dv / 10, 10)
136
+ index++
137
+ index = Math.min(index, numStyles)
138
+ text: count
139
+ index: index
140
+
141
+ setCalculator: (calculator) ->
142
+ @calculator_ = calculator
143
+
144
+ getCalculator: ->
145
+ @calculator_
146
+
147
+ addMarkers: (markers, opt_nodraw) ->
148
+ i = 0
149
+ marker = undefined
150
+
151
+ while marker = markers[i]
152
+ @pushMarkerTo_ marker
153
+ i++
154
+ @redraw() unless opt_nodraw
155
+
156
+ pushMarkerTo_: (marker) ->
157
+ marker.isAdded = false
158
+ if marker["draggable"]
159
+
160
+ # If the marker is draggable add a listener so we update the clusters on
161
+ # the drag end.
162
+ that = this
163
+ google.maps.event.addListener marker, "dragend", ->
164
+ marker.isAdded = false
165
+ that.repaint()
166
+
167
+ @markers_.push marker
168
+
169
+ addMarker: (marker, opt_nodraw) ->
170
+ @pushMarkerTo_ marker
171
+ @redraw() unless opt_nodraw
172
+
173
+ removeMarker_: (marker) ->
174
+ index = -1
175
+ if @markers_.indexOf
176
+ index = @markers_.indexOf(marker)
177
+ else
178
+ i = 0
179
+ m = undefined
180
+
181
+ while m = @markers_[i]
182
+ if m is marker
183
+ index = i
184
+ break
185
+ i++
186
+
187
+ # Marker is not in our list of markers.
188
+ return false if index is -1
189
+ marker.getMarker().setMap null if marker.getMarker()
190
+ marker.setMap null
191
+ @markers_.splice index, 1
192
+ true
193
+
194
+ removeMarker: (marker, opt_nodraw) ->
195
+ removed = @removeMarker_(marker)
196
+ if not opt_nodraw and removed
197
+ @resetViewport()
198
+ @redraw()
199
+ true
200
+ else
201
+ false
202
+
203
+ removeMarkers: (markers, opt_nodraw) ->
204
+ removed = false
205
+ i = 0
206
+ marker = undefined
207
+
208
+ while marker = markers[i]
209
+ r = @removeMarker_(marker)
210
+ removed = removed or r
211
+ i++
212
+ if not opt_nodraw and removed
213
+ @resetViewport()
214
+ @redraw()
215
+ true
216
+
217
+ setReady_: (ready) ->
218
+ unless @ready_
219
+ @ready_ = ready
220
+ @createClusters_()
221
+
222
+ getTotalClusters: ->
223
+ @clusters_.length
224
+
225
+ getMap: ->
226
+ @map_
227
+
228
+ getGridSize: ->
229
+ @gridSize_
230
+
231
+ setGridSize: (size) ->
232
+ @gridSize_ = size
233
+
234
+ getMinClusterSize: () ->
235
+ @minClusterSize_
236
+
237
+ setMinClusterSize: (size) ->
238
+ @minClusterSize_ = size
239
+
240
+ getExtendedBounds: (bounds) ->
241
+ projection = @getProjection()
242
+
243
+ # Turn the bounds into latlng.
244
+ tr = new google.maps.LatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng())
245
+ bl = new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng())
246
+
247
+ # Convert the points to pixels and the extend out by the grid size.
248
+ trPix = projection.fromLatLngToDivPixel(tr)
249
+ trPix.x += @gridSize_
250
+ trPix.y -= @gridSize_
251
+ blPix = projection.fromLatLngToDivPixel(bl)
252
+ blPix.x -= @gridSize_
253
+ blPix.y += @gridSize_
254
+
255
+ # Convert the pixel points back to LatLng
256
+ ne = projection.fromDivPixelToLatLng(trPix)
257
+ sw = projection.fromDivPixelToLatLng(blPix)
258
+
259
+ # Extend the bounds to contain the new bounds.
260
+ bounds.extend ne
261
+ bounds.extend sw
262
+ bounds
263
+
264
+ isMarkerInBounds_: (marker, bounds) ->
265
+ bounds.contains marker.getPosition()
266
+
267
+ clearMarkers: () ->
268
+ @resetViewport true
269
+
270
+ # Set the markers a empty array.
271
+ @markers_ = []
272
+
273
+ resetViewport: (opt_hide) ->
274
+ # Remove all the clusters
275
+ i = 0
276
+ cluster = undefined
277
+
278
+ while cluster = @clusters_[i]
279
+ cluster.remove()
280
+ i++
281
+
282
+ # Reset the markers to not be added and to be invisible.
283
+ i = 0
284
+ marker = undefined
285
+
286
+ while marker = @markers_[i]
287
+ marker.isAdded = false
288
+ marker.getMarker().setMap null if opt_hide and marker.getMarker()
289
+ marker.setMap null if opt_hide
290
+ i++
291
+ @clusters_ = []
292
+
293
+ repaint: ->
294
+ oldClusters = @clusters_.slice()
295
+ @clusters_.length = 0
296
+ @resetViewport()
297
+ @redraw()
298
+
299
+ # Remove the old clusters.
300
+ # Do it in a timeout so the other clusters have been drawn first.
301
+ window.setTimeout (->
302
+ i = 0
303
+ cluster = undefined
304
+
305
+ while cluster = oldClusters[i]
306
+ cluster.remove()
307
+ i++
308
+ ), 0
309
+
310
+ redraw: ->
311
+ @createClusters_()
312
+
313
+ distanceBetweenPoints_: (p1, p2) ->
314
+ return 0 if not p1 or not p2
315
+ R = 6371 # Radius of the Earth in km
316
+ dLat = (p2.lat() - p1.lat()) * Math.PI / 180
317
+ dLon = (p2.lng() - p1.lng()) * Math.PI / 180
318
+ a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) * Math.sin(dLon / 2) * Math.sin(dLon / 2)
319
+ c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
320
+ d = R * c
321
+ d
322
+
323
+ addToClosestCluster_: (marker) ->
324
+ distance = 40000 # Some large number
325
+ clusterToAddTo = null
326
+ pos = marker.getPosition()
327
+ i = 0
328
+ cluster = undefined
329
+
330
+ while cluster = @clusters_[i]
331
+ center = cluster.getCenter()
332
+ if center
333
+ d = @distanceBetweenPoints_(center, marker.getPosition())
334
+ if d < distance
335
+ distance = d
336
+ clusterToAddTo = cluster
337
+ i++
338
+ if clusterToAddTo and clusterToAddTo.isMarkerInClusterBounds(marker)
339
+ clusterToAddTo.addMarker marker
340
+ else
341
+ cluster = new ADF.Cluster.Views.Cluster(@)
342
+ cluster.addMarker marker
343
+ @clusters_.push cluster
344
+
345
+ createClusters_: () ->
346
+ return unless @ready_
347
+
348
+ # Get our current map view bounds.
349
+ # Create a new bounds object so we don't affect the map.
350
+ mapBounds = new google.maps.LatLngBounds(@map_.getBounds().getSouthWest(), @map_.getBounds().getNorthEast())
351
+ bounds = @getExtendedBounds(mapBounds)
352
+ i = 0
353
+ marker = undefined
354
+
355
+ while marker = @markers_[i]
356
+ @addToClosestCluster_ marker if not marker.isAdded and (@showAllClusters_ || @isMarkerInBounds_(marker, bounds))
357
+ i++
358
+ google.maps.event.trigger @map_, "clustersCreatedForViewPoint", @clusters_
@@ -0,0 +1,7 @@
1
+ # Default requires for ADF modules
2
+ #= require_self
3
+ #= require_tree ./templates
4
+ #= require_tree ./views
5
+
6
+ ADF.FileUploader =
7
+ Views: {}
@@ -0,0 +1,10 @@
1
+ <li>
2
+ <span class="file-status">
3
+ <span class="qq-upload-file"></span>
4
+ <span class="qq-upload-spinner">Loading...</span>
5
+ <span class="qq-upload-size"></span>
6
+ <strong class="qq-upload-failed-text" style="display: none;">Neizdevās pievienot</strong>
7
+ <span class="qq-upload-cancel"></span>
8
+ <span>(<a href="#" style="display:inline;">dzēst</a>)</span>
9
+ </span>
10
+ </li>
@@ -0,0 +1,3 @@
1
+ <span class="file-status true" id="file-uploaded-file-<%= @id %>">
2
+ <%= @name %> (<a href="#" class="remove-file" content-id="<%= @id %>" style="display:inline;">dzēst</a>)
3
+ </span>
@@ -0,0 +1,7 @@
1
+ <div class="file_upload_wrap" style="overflow: hidden;">
2
+ <div class="qq-upload-button qq-upload-drop-area upload_button"><span class="button_title">Pievienot</span></div>
3
+ <span class="file_upload_message"></span>
4
+ </div>
5
+ <ul class="qq-upload-list" style="display: none;"></ul>
6
+ <p class="file-list">
7
+ </p>
@@ -0,0 +1,3 @@
1
+ <span class="file-status loading" id="file-uploading-file-<%= @id %>">
2
+ <%= @name %>
3
+ </span>
@@ -0,0 +1,76 @@
1
+ class ADF.FileUploader.Views.Main extends ADF.MVC.Views.Base
2
+
3
+ template: JST['socmap_adf/modules/file_uploader/templates/main']
4
+ fileTemplate: JST['socmap_adf/modules/file_uploader/templates/file']
5
+ existingFileTemplate: JST['socmap_adf/modules/file_uploader/templates/existing_file']
6
+ fileUploadingTemplate: JST['socmap_adf/modules/file_uploader/templates/uploading']
7
+ documents: []
8
+ events:
9
+ "click .remove-file" : "onFileRemoved"
10
+ allowedExtensions: ['pdf', 'doc', 'docx', 'jpg', 'jpeg', 'png', 'gif']
11
+ sizeLimit: 2024000
12
+ message: ""
13
+
14
+ initialize: () ->
15
+ _.bindAll(this, 'render')
16
+ @documents = []
17
+ @onComplete = @options.onComplete if @options.onComplete
18
+ @onCancel = @options.onCancel if @options.onComplete
19
+ @onProgressCallback = @options.onProgress if @options.onProgress
20
+ @documents = @options.documents if @options.documents
21
+ @allowedExtensions = @options.allowedExtensions if @options.allowedExtensions?
22
+ @sizeLimit = @options.sizeLimit if @options.sizeLimit?
23
+ @message = @options.message if @options.message?
24
+
25
+ render: () ->
26
+ options =
27
+ element: $(@el).get(0)
28
+ action: '/api/documents'
29
+ multiple: false
30
+ debug: true
31
+ allowedExtensions: @allowedExtensions
32
+ onComplete: @onFileUploaded
33
+ onProgress: @onProgress
34
+ onSubmit: @onSubmit
35
+ template: @template()
36
+ sizeLimit: @sizeLimit
37
+ messages:
38
+ typeError: "Failam {file} ir nepareizs formāts. Tikai {extensions} formāti ir atļauti."
39
+ sizeError: "Fails {file} ir pārāk liels. Faila maksimālais lielums {sizeLimit}."
40
+ minSizeError: "Faila {file} izmērs ir par mazu, minimums {minSizeLimit}."
41
+ emptyError: "Fails {file} ir tukšs."
42
+ onLeave: "Fails nav pabeidzis augšuplādi. Vai tiešām vēlaties pamest aplikāciju?"
43
+
44
+ if !@uploader
45
+ @uploader = new qq.FileUploader options
46
+ _.each @documents, (document) =>
47
+ @addFileInList(document)
48
+
49
+ @$(".file_upload_message").html(@message)
50
+ @
51
+
52
+ onFileUploaded: (id, fileName, responseJSON) =>
53
+ @$(".file-list").find("#file-uploading-file-#{id}").remove()
54
+ @documents.push responseJSON
55
+ @addFileInList(responseJSON)
56
+ if @onComplete
57
+ @onComplete(@documents)
58
+
59
+ onProgress: () =>
60
+ @onProgressCallback() if @onProgressCallback
61
+
62
+ onSubmit: (id, fileName) =>
63
+ obj = {id: id, name: fileName}
64
+ @$(".file-list").append(@fileUploadingTemplate(obj))
65
+
66
+ addFileInList: (document) ->
67
+ @$(".file-list").append(@fileTemplate(document))
68
+
69
+ onFileRemoved: (e) =>
70
+ e = e.currentTarget
71
+ id = $(e).attr("content-id")
72
+ _.each @documents, (document) =>
73
+ if parseInt(document.id) == parseInt(id)
74
+ document.remove = true
75
+ @$("#file-uploaded-file-#{id}").remove()
76
+ return false
@@ -0,0 +1,9 @@
1
+ # Default requires for ADF modules
2
+ #= require_self
3
+ #= require_tree ./models
4
+ #= require_tree ./templates
5
+ #= require_tree ./views
6
+
7
+ ADF.Form =
8
+ Models: {}
9
+ Views: {}
@@ -0,0 +1,73 @@
1
+ class ADF.Form.Models.Base extends Backbone.Model
2
+
3
+ constructor: () ->
4
+ @correct = false
5
+ @view = null
6
+ @fieldBinders = []
7
+ @errors = []
8
+ @validations = []
9
+ @markChecks = false
10
+ @bindFocus = true
11
+ super()
12
+
13
+ setView: (view) =>
14
+ @view = view
15
+
16
+ bindValue: (valueName, options = {}) ->
17
+ options.markChecks = @markChecks
18
+ options.bindFocus = @bindFocus
19
+ fieldBinder = new ADF.Form.Models.FieldBinder(@, valueName, options)
20
+ @fieldBinders.push(fieldBinder)
21
+ fieldBinder
22
+
23
+ # Validation
24
+ onValueChanged: () =>
25
+ @validateFields()
26
+
27
+ validateModel: () ->
28
+ if @isValid() && @isCustomValidationValid()
29
+ @errors = []
30
+ @view.onDataValid() if @view
31
+ return true
32
+ else
33
+ @view.onDataInvalid() if @view
34
+ return false
35
+
36
+ validateFields: () ->
37
+ @errors = []
38
+ validation.validate() for validation in @validations
39
+ @validateModel()
40
+
41
+ isValid: () ->
42
+ for validation in @validations
43
+ if !validation.isValid()
44
+ return false
45
+ return true
46
+
47
+ getError: (attribute) ->
48
+ for error in @errors
49
+ if error.attribute == attribute
50
+ return error
51
+ return null
52
+
53
+ getErrorByType: (attribute, type) ->
54
+ for error in @errors
55
+ if error.attribute == attribute and error.type == type
56
+ return error
57
+ return null
58
+
59
+ hasError: (attribute) ->
60
+ @getError(attribute) != null
61
+
62
+ validates: (type, attributes, options = {}) =>
63
+ @validations.push(new ADF.Form.Models.Validator(@, attribute, type, options)) for attribute in attributes
64
+
65
+ clearValidations: (attributes) ->
66
+ for attribute in attributes
67
+ @validations = _.reject @validations, (validation) =>
68
+ return validation.getAttribute() == attribute
69
+ @validateFields()
70
+
71
+ # Callbacks
72
+ isCustomValidationValid: ->
73
+ return true
@@ -0,0 +1,12 @@
1
+ class ADF.Form.Models.Error
2
+
3
+ type: null
4
+ message: "Error"
5
+ value: null
6
+ attribute: null
7
+
8
+ constructor: (type, message, attribute, value) ->
9
+ @type = type
10
+ @message = message
11
+ @attribute = attribute
12
+ @value = value
@@ -0,0 +1,104 @@
1
+ class ADF.Form.Models.FieldBinder
2
+
3
+ model: null
4
+ field: null
5
+ attribute: null
6
+ isTyping: false
7
+ timeout: null
8
+
9
+ constructor: (model, attribute, options) ->
10
+ @model = model
11
+ @attribute = attribute
12
+ @model.on "change", @onValueChanged
13
+ @markChecks = options.markChecks
14
+ @bindFocus = options.bindFocus
15
+ @onFieldSuccess = options.success if typeof( options.success ) == "function"
16
+ @onFieldError = options.error if typeof( options.error ) == "function"
17
+
18
+ to: (field) ->
19
+ @field = field
20
+ @bindField()
21
+
22
+ bindField: () ->
23
+ $(@field).bind "keyup", @typing
24
+ $(@field).bind "change", @valueChanged
25
+ $(@field).bind "focus", @onFocus if @bindFocus
26
+ $(@field).bind "blur", @hideMessages
27
+
28
+ typing: (e) =>
29
+ clearTimeout(@timeout)
30
+ @isTyping = true
31
+ self = @
32
+ @timeout = setTimeout( () =>
33
+ @isTyping = false
34
+ @valueChanged(e)
35
+ 500)
36
+
37
+ valueChanged: (e) =>
38
+ @model.set(@attribute, e.delegateTarget.value)
39
+ if !@isTyping
40
+ if @model.hasError(@attribute)
41
+ @hideSuccess()
42
+ @showError()
43
+ else
44
+ @hideError()
45
+ @showSuccess()
46
+
47
+ onFocus: (e) =>
48
+ if @model.getErrorByType(@attribute, "present") != null
49
+ @hideError()
50
+ else
51
+ @valueChanged(e)
52
+
53
+ hideMessages: () =>
54
+ @hideSuccess(true)
55
+ @hideError()
56
+
57
+ markCorrect: () ->
58
+ $(@field).parent().addClass("checked")
59
+ @onFieldSuccess()
60
+
61
+ unmarkCorrect: () ->
62
+ $(@field).parent().removeClass("checked")
63
+ @onFieldError()
64
+
65
+ showError: () ->
66
+ errorField = $(@field).parent().find(".error_message")
67
+ label = $(@field).parent().find("label")
68
+ if errorField
69
+ error = @model.getError(@attribute)
70
+ errorField.html(error.message)
71
+ errorField.fadeIn("fast")
72
+ if label
73
+ label.removeClass("done")
74
+ label.addClass("error")
75
+
76
+ hideError: () ->
77
+ errorField = $(@field).parent().find(".error_message")
78
+ label = $(@field).parent().find("label")
79
+ if errorField
80
+ errorField.html("")
81
+ errorField.hide()
82
+ if label
83
+ label.removeClass("error")
84
+
85
+ showSuccess: () ->
86
+ successField = $(@field).parent().find(".success_message")
87
+ label = $(@field).parent().find("label")
88
+ if successField
89
+ successField.fadeIn("slow")
90
+ if label
91
+ label.addClass("done")
92
+ @markCorrect() if @markChecks
93
+
94
+ hideSuccess: (withFade = false) ->
95
+ successField = $(@field).parent().find(".success_message")
96
+ if successField
97
+ if withFade
98
+ successField.fadeOut("slow")
99
+ else
100
+ successField.hide()
101
+ @unmarkCorrect() if @markChecks
102
+
103
+ onFieldSuccess: () ->
104
+ onFieldError: () ->