foliage 0.1.0
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.
- checksums.yaml +7 -0
 - data/LICENSE.txt +22 -0
 - data/README.md +9 -0
 - data/app/assets/images/.keep +0 -0
 - data/app/assets/images/map/marker/icon-2x.png +0 -0
 - data/app/assets/images/map/marker/icon.png +0 -0
 - data/app/assets/images/map/marker/icon.svg +67 -0
 - data/app/assets/images/map/marker/shadow.png +0 -0
 - data/app/assets/javascripts/core_ext.js.coffee +61 -0
 - data/app/assets/javascripts/foliage.js.coffee +23 -0
 - data/app/assets/javascripts/foliage/band.js.coffee +99 -0
 - data/app/assets/javascripts/foliage/bubbles.js.coffee +77 -0
 - data/app/assets/javascripts/foliage/categories.js.coffee +70 -0
 - data/app/assets/javascripts/foliage/choropleth.js.coffee +51 -0
 - data/app/assets/javascripts/foliage/color.js.coffee +39 -0
 - data/app/assets/javascripts/foliage/gradient.js.coffee +72 -0
 - data/app/assets/javascripts/foliage/heatmap.js.coffee +49 -0
 - data/app/assets/javascripts/foliage/leaf.js.coffee +422 -0
 - data/app/assets/javascripts/foliage/path.js.coffee +76 -0
 - data/app/assets/javascripts/foliage/paths.js.coffee +131 -0
 - data/app/assets/javascripts/foliage/point_group.js.coffee +83 -0
 - data/app/assets/javascripts/foliage/points.js.coffee +79 -0
 - data/app/assets/javascripts/foliage/simple.js.coffee +35 -0
 - data/app/assets/javascripts/leaflet/geographic_util.js.coffee +23 -0
 - data/app/assets/javascripts/leaflet/ghost_label.js.coffee +100 -0
 - data/app/assets/javascripts/leaflet/ghost_label_cluster.js.coffee +192 -0
 - data/app/assets/javascripts/leaflet/layers_scheduler.js.coffee +57 -0
 - data/app/assets/javascripts/leaflet/reactive_measure.js.coffee +414 -0
 - data/app/assets/stylesheets/all.scss +16 -0
 - data/app/assets/stylesheets/application.css +15 -0
 - data/app/assets/stylesheets/compass/reset.scss +3 -0
 - data/app/assets/stylesheets/compass/reset/utilities.scss +142 -0
 - data/app/assets/stylesheets/leaflet.scss +1093 -0
 - data/app/assets/stylesheets/leaflet/label.scss +40 -0
 - data/app/assets/stylesheets/leaflet/tooltip.scss +42 -0
 - data/app/assets/stylesheets/mixins.scss +131 -0
 - data/app/assets/stylesheets/reset.scss +89 -0
 - data/app/assets/stylesheets/variables.scss +47 -0
 - data/app/helpers/foliage_helper.rb +23 -0
 - data/lib/foliage.rb +9 -0
 - data/lib/foliage/leaf.rb +235 -0
 - data/lib/foliage/rails.rb +2 -0
 - data/lib/foliage/rails/engine.rb +7 -0
 - data/lib/foliage/rails/integration.rb +8 -0
 - data/lib/foliage/version.rb +3 -0
 - data/vendor/assets/javascripts/.keep +0 -0
 - data/vendor/assets/javascripts/autosize.js +211 -0
 - data/vendor/assets/javascripts/geographiclib.js +3074 -0
 - data/vendor/assets/javascripts/leaflet.js.erb +9175 -0
 - data/vendor/assets/javascripts/leaflet/draw.js +3573 -0
 - data/vendor/assets/javascripts/leaflet/easy-button.js +366 -0
 - data/vendor/assets/javascripts/leaflet/fullscreen.js +162 -0
 - data/vendor/assets/javascripts/leaflet/heatmap.js +142 -0
 - data/vendor/assets/javascripts/leaflet/label.js +545 -0
 - data/vendor/assets/javascripts/leaflet/measure.js +6966 -0
 - data/vendor/assets/javascripts/leaflet/modal.js +364 -0
 - data/vendor/assets/javascripts/leaflet/providers.js +479 -0
 - data/vendor/assets/javascripts/rbush.js +621 -0
 - data/vendor/assets/stylesheets/.keep +0 -0
 - data/vendor/assets/stylesheets/bootstrap/mixins.scss +55 -0
 - data/vendor/assets/stylesheets/bootstrap/variables.scss +10 -0
 - data/vendor/assets/stylesheets/leaflet.scss +479 -0
 - data/vendor/assets/stylesheets/leaflet/draw.scss +282 -0
 - data/vendor/assets/stylesheets/leaflet/easy-button.scss +56 -0
 - data/vendor/assets/stylesheets/leaflet/fullscreen.scss +2 -0
 - data/vendor/assets/stylesheets/leaflet/measure.scss +168 -0
 - data/vendor/assets/stylesheets/leaflet/modal.scss +85 -0
 - metadata +171 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA1:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: ddfe5960094bf8bbd1f7250eea1b7470eb04dfe3
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 233456b00d6ea184176015a33e739039a5358a68
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 29489a93eb3b3fba23d0769c825579911dbefe1317d3061a856ad484636179cf42a96789579e26c5eee90b5db280bec21734a330b118a45b097b823ac15daa0b
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 221131a3db6c00fdd8d2331d50574f5aa5ce60746f037bf165e13c92074a832e65e0b1f0764ac2bec74049d374e47f95a7621ce4cf0188283913334b48a5d34e
         
     | 
    
        data/LICENSE.txt
    ADDED
    
    | 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Copyright (c) 2014-2016 Ekylibre, Jérémie Bonal
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            The MIT LICENSE
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Permission is hereby granted, free of charge, to any person obtaining
         
     | 
| 
      
 6 
     | 
    
         
            +
            a copy of this software and associated documentation files (the
         
     | 
| 
      
 7 
     | 
    
         
            +
            "Software"), to deal in the Software without restriction, including
         
     | 
| 
      
 8 
     | 
    
         
            +
            without limitation the rights to use, copy, modify, merge, publish,
         
     | 
| 
      
 9 
     | 
    
         
            +
            distribute, sublicense, and/or sell copies of the Software, and to
         
     | 
| 
      
 10 
     | 
    
         
            +
            permit persons to whom the Software is furnished to do so, subject to
         
     | 
| 
      
 11 
     | 
    
         
            +
            the following conditions:
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            The above copyright notice and this permission notice shall be
         
     | 
| 
      
 14 
     | 
    
         
            +
            included in all copies or substantial portions of the Software.
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         
     | 
| 
      
 17 
     | 
    
         
            +
            EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         
     | 
| 
      
 18 
     | 
    
         
            +
            MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         
     | 
| 
      
 19 
     | 
    
         
            +
            NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
         
     | 
| 
      
 20 
     | 
    
         
            +
            LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
         
     | 
| 
      
 21 
     | 
    
         
            +
            OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
         
     | 
| 
      
 22 
     | 
    
         
            +
            WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         
     | 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,9 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Foliage
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Extracted from [Ekylibre's repo](http://github.com/ekylibre/ekylibre) as part of the [Osmosis](http://github.com/Aquaj/osmosis) fork, this gem provides convenient helpers, javascript and styles to quickly and easily display maps.
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Based on [Leaflet.js](http://leafletjs.com).
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ## Dependencies
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            `// TODO`
         
     | 
| 
         
            File without changes
         
     | 
| 
         Binary file 
     | 
| 
         Binary file 
     | 
| 
         @@ -0,0 +1,67 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            <?xml version="1.0" encoding="UTF-8" standalone="no"?>
         
     | 
| 
      
 2 
     | 
    
         
            +
            <!-- Created with Inkscape (http://www.inkscape.org/) -->
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            <svg
         
     | 
| 
      
 5 
     | 
    
         
            +
               xmlns:dc="http://purl.org/dc/elements/1.1/"
         
     | 
| 
      
 6 
     | 
    
         
            +
               xmlns:cc="http://creativecommons.org/ns#"
         
     | 
| 
      
 7 
     | 
    
         
            +
               xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         
     | 
| 
      
 8 
     | 
    
         
            +
               xmlns:svg="http://www.w3.org/2000/svg"
         
     | 
| 
      
 9 
     | 
    
         
            +
               xmlns="http://www.w3.org/2000/svg"
         
     | 
| 
      
 10 
     | 
    
         
            +
               xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
         
     | 
| 
      
 11 
     | 
    
         
            +
               xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
         
     | 
| 
      
 12 
     | 
    
         
            +
               id="svg2"
         
     | 
| 
      
 13 
     | 
    
         
            +
               version="1.1"
         
     | 
| 
      
 14 
     | 
    
         
            +
               inkscape:version="0.91 r13725"
         
     | 
| 
      
 15 
     | 
    
         
            +
               width="25"
         
     | 
| 
      
 16 
     | 
    
         
            +
               height="41"
         
     | 
| 
      
 17 
     | 
    
         
            +
               viewBox="0 0 25 41"
         
     | 
| 
      
 18 
     | 
    
         
            +
               sodipodi:docname="icon.svg">
         
     | 
| 
      
 19 
     | 
    
         
            +
              <metadata
         
     | 
| 
      
 20 
     | 
    
         
            +
                 id="metadata8">
         
     | 
| 
      
 21 
     | 
    
         
            +
                <rdf:RDF>
         
     | 
| 
      
 22 
     | 
    
         
            +
                  <cc:Work
         
     | 
| 
      
 23 
     | 
    
         
            +
                     rdf:about="">
         
     | 
| 
      
 24 
     | 
    
         
            +
                    <dc:format>image/svg+xml</dc:format>
         
     | 
| 
      
 25 
     | 
    
         
            +
                    <dc:type
         
     | 
| 
      
 26 
     | 
    
         
            +
                       rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
         
     | 
| 
      
 27 
     | 
    
         
            +
                    <dc:title></dc:title>
         
     | 
| 
      
 28 
     | 
    
         
            +
                  </cc:Work>
         
     | 
| 
      
 29 
     | 
    
         
            +
                </rdf:RDF>
         
     | 
| 
      
 30 
     | 
    
         
            +
              </metadata>
         
     | 
| 
      
 31 
     | 
    
         
            +
              <defs
         
     | 
| 
      
 32 
     | 
    
         
            +
                 id="defs6" />
         
     | 
| 
      
 33 
     | 
    
         
            +
              <sodipodi:namedview
         
     | 
| 
      
 34 
     | 
    
         
            +
                 pagecolor="#ffffff"
         
     | 
| 
      
 35 
     | 
    
         
            +
                 bordercolor="#666666"
         
     | 
| 
      
 36 
     | 
    
         
            +
                 borderopacity="1"
         
     | 
| 
      
 37 
     | 
    
         
            +
                 objecttolerance="10"
         
     | 
| 
      
 38 
     | 
    
         
            +
                 gridtolerance="10"
         
     | 
| 
      
 39 
     | 
    
         
            +
                 guidetolerance="10"
         
     | 
| 
      
 40 
     | 
    
         
            +
                 inkscape:pageopacity="0"
         
     | 
| 
      
 41 
     | 
    
         
            +
                 inkscape:pageshadow="2"
         
     | 
| 
      
 42 
     | 
    
         
            +
                 inkscape:window-width="1920"
         
     | 
| 
      
 43 
     | 
    
         
            +
                 inkscape:window-height="1057"
         
     | 
| 
      
 44 
     | 
    
         
            +
                 id="namedview4"
         
     | 
| 
      
 45 
     | 
    
         
            +
                 showgrid="false"
         
     | 
| 
      
 46 
     | 
    
         
            +
                 borderlayer="true"
         
     | 
| 
      
 47 
     | 
    
         
            +
                 inkscape:showpageshadow="false"
         
     | 
| 
      
 48 
     | 
    
         
            +
                 inkscape:zoom="5.7560976"
         
     | 
| 
      
 49 
     | 
    
         
            +
                 inkscape:cx="-82.783211"
         
     | 
| 
      
 50 
     | 
    
         
            +
                 inkscape:cy="-19.01566"
         
     | 
| 
      
 51 
     | 
    
         
            +
                 inkscape:window-x="0"
         
     | 
| 
      
 52 
     | 
    
         
            +
                 inkscape:window-y="0"
         
     | 
| 
      
 53 
     | 
    
         
            +
                 inkscape:window-maximized="1"
         
     | 
| 
      
 54 
     | 
    
         
            +
                 inkscape:current-layer="svg2" />
         
     | 
| 
      
 55 
     | 
    
         
            +
              <path
         
     | 
| 
      
 56 
     | 
    
         
            +
                 style="fill:#187fce;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.75420874"
         
     | 
| 
      
 57 
     | 
    
         
            +
                 d="M 12.5,1 C 6.8467643,0.94037552 0.90011975,5.0932125 1,13 1.101235,21.014031 10.609264,28.121771 12.5,40 14.347762,28.312508 23.976551,21.962273 24,13 24.02093,5.0006739 18.153235,1.0596245 12.5,1 Z m 0.181641,7.3398438 c 2.494371,-3.473e-4 4.516847,2.0212542 4.517578,4.5156252 3.47e-4,2.495133 -2.022445,4.517925 -4.517578,4.517578 C 10.18727,17.372316 8.1656683,15.34984 8.1660156,12.855469 8.1667464,10.361861 10.188033,8.3405745 12.681641,8.3398438 Z"
         
     | 
| 
      
 58 
     | 
    
         
            +
                 id="path4138"
         
     | 
| 
      
 59 
     | 
    
         
            +
                 inkscape:connector-curvature="0"
         
     | 
| 
      
 60 
     | 
    
         
            +
                 sodipodi:nodetypes="sscssccccc" />
         
     | 
| 
      
 61 
     | 
    
         
            +
              <path
         
     | 
| 
      
 62 
     | 
    
         
            +
                 style="fill:#1886d8;fill-opacity:0.85858583;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.53535354"
         
     | 
| 
      
 63 
     | 
    
         
            +
                 d="M 12.509053,0.90052064 C 6.855818,0.84089624 0.90917349,4.9937331 1.0090537,12.900521 c 0.101235,8.014031 9.6092633,15.121771 11.4999993,27 1.847762,-11.687492 11.476551,-18.037727 11.5,-27 0.02093,-7.9993265 -5.846765,-11.94037586 -11.5,-12.00000036 z m 0.181641,7.33984376 c 2.494371,-3.473e-4 4.516847,2.0212546 4.517578,4.5156256 3.47e-4,2.495133 -2.022445,4.517925 -4.517578,4.517578 C 10.196323,17.272837 8.174722,15.250361 8.1750693,12.75599 8.1758001,10.262382 10.197086,8.2410951 12.690694,8.2403644 Z"
         
     | 
| 
      
 64 
     | 
    
         
            +
                 id="path4138-3"
         
     | 
| 
      
 65 
     | 
    
         
            +
                 inkscape:connector-curvature="0"
         
     | 
| 
      
 66 
     | 
    
         
            +
                 sodipodi:nodetypes="sscssccccc" />
         
     | 
| 
      
 67 
     | 
    
         
            +
            </svg>
         
     | 
| 
         Binary file 
     | 
| 
         @@ -0,0 +1,61 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Core extension for vizualisation
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
      
 3 
     | 
    
         
            +
            String.prototype.camelize = () ->
         
     | 
| 
      
 4 
     | 
    
         
            +
              array = jQuery.map this.split("_"), (word)->
         
     | 
| 
      
 5 
     | 
    
         
            +
                word.charAt(0).toUpperCase() + word.slice(1)
         
     | 
| 
      
 6 
     | 
    
         
            +
              return array.join()
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            String.prototype.repeat = (count) ->
         
     | 
| 
      
 9 
     | 
    
         
            +
              return new Array(count + 1).join(this)
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            Math.magnitude = (number, step = 1) ->
         
     | 
| 
      
 12 
     | 
    
         
            +
              value = Math.abs(number)
         
     | 
| 
      
 13 
     | 
    
         
            +
              power = 0
         
     | 
| 
      
 14 
     | 
    
         
            +
              if value > 1
         
     | 
| 
      
 15 
     | 
    
         
            +
                while Math.pow(10, power + step) < value
         
     | 
| 
      
 16 
     | 
    
         
            +
                  power += step
         
     | 
| 
      
 17 
     | 
    
         
            +
              else
         
     | 
| 
      
 18 
     | 
    
         
            +
                while Math.pow(10, power - step) > value
         
     | 
| 
      
 19 
     | 
    
         
            +
                  power -= step
         
     | 
| 
      
 20 
     | 
    
         
            +
              mag = Math.pow(10, power)
         
     | 
| 
      
 21 
     | 
    
         
            +
              result =
         
     | 
| 
      
 22 
     | 
    
         
            +
                power: power
         
     | 
| 
      
 23 
     | 
    
         
            +
                magnitude: mag
         
     | 
| 
      
 24 
     | 
    
         
            +
                base: number / mag
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            Math.round2 = (number, round = 1) ->
         
     | 
| 
      
 27 
     | 
    
         
            +
              return round * Math.round(number / round)
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            Math.humanize = (value, power = 0) ->
         
     | 
| 
      
 30 
     | 
    
         
            +
              return Math.round(value)
         
     | 
| 
      
 31 
     | 
    
         
            +
              # return Math.round(value / Math.pow(10, power)) + "e#{power}"
         
     | 
| 
      
 32 
     | 
    
         
            +
              size = Math.round(power / 3)
         
     | 
| 
      
 33 
     | 
    
         
            +
              return Math.round(value / Math.pow(10, 3 * size)) + "pnµm KMGTPE"[size + 4]
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            Math.ceil2 = (number, round = 1) ->
         
     | 
| 
      
 36 
     | 
    
         
            +
              return round * Math.ceil(number / round)
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            Math.floor2 = (number, round = 1) ->
         
     | 
| 
      
 39 
     | 
    
         
            +
              return round * Math.floor(number / round)
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            # Returns logarithm value in given base (10 by default)
         
     | 
| 
      
 42 
     | 
    
         
            +
            Math.logg = (value, base = 10) ->
         
     | 
| 
      
 43 
     | 
    
         
            +
              return Math.log(value) / Math.log(base)
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
            # Compute number of decimal
         
     | 
| 
      
 46 
     | 
    
         
            +
            # Negative value is return if trailing zero are found.
         
     | 
| 
      
 47 
     | 
    
         
            +
            # Ex: 200 => -2
         
     | 
| 
      
 48 
     | 
    
         
            +
            #     0.12500 => 3
         
     | 
| 
      
 49 
     | 
    
         
            +
            #     0.125 => 3
         
     | 
| 
      
 50 
     | 
    
         
            +
            #     125 => 0
         
     | 
| 
      
 51 
     | 
    
         
            +
            Math.decimalCount = (value) ->
         
     | 
| 
      
 52 
     | 
    
         
            +
              return 0 if value == 0
         
     | 
| 
      
 53 
     | 
    
         
            +
              count = 0
         
     | 
| 
      
 54 
     | 
    
         
            +
              integersCount = Math.ceil(Math.logg(Math.floor(value)))
         
     | 
| 
      
 55 
     | 
    
         
            +
              value /= Math.pow(10, integersCount)
         
     | 
| 
      
 56 
     | 
    
         
            +
              while (value != Math.floor(value))
         
     | 
| 
      
 57 
     | 
    
         
            +
                count += 1
         
     | 
| 
      
 58 
     | 
    
         
            +
                value *= 10
         
     | 
| 
      
 59 
     | 
    
         
            +
                break if count > 100
         
     | 
| 
      
 60 
     | 
    
         
            +
              return count - integersCount
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Add sprockets directives below:
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            #= require jquery
         
     | 
| 
      
 4 
     | 
    
         
            +
            #= require jquery-ui
         
     | 
| 
      
 5 
     | 
    
         
            +
            #= require jquery_ujs
         
     | 
| 
      
 6 
     | 
    
         
            +
            #= require turbolinks
         
     | 
| 
      
 7 
     | 
    
         
            +
            #= require_self
         
     | 
| 
      
 8 
     | 
    
         
            +
            #= require geographiclib
         
     | 
| 
      
 9 
     | 
    
         
            +
            #= require leaflet.js.erb
         
     | 
| 
      
 10 
     | 
    
         
            +
            #= require leaflet/draw
         
     | 
| 
      
 11 
     | 
    
         
            +
            #= require leaflet/fullscreen
         
     | 
| 
      
 12 
     | 
    
         
            +
            #= require leaflet/providers
         
     | 
| 
      
 13 
     | 
    
         
            +
            #= require leaflet/heatmap
         
     | 
| 
      
 14 
     | 
    
         
            +
            #= require leaflet/measure
         
     | 
| 
      
 15 
     | 
    
         
            +
            #= require leaflet/easy-button
         
     | 
| 
      
 16 
     | 
    
         
            +
            #= require leaflet/modal
         
     | 
| 
      
 17 
     | 
    
         
            +
            #= require leaflet/label
         
     | 
| 
      
 18 
     | 
    
         
            +
            #= require rbush
         
     | 
| 
      
 19 
     | 
    
         
            +
            #= require autosize
         
     | 
| 
      
 20 
     | 
    
         
            +
            #= require_tree ./leaflet
         
     | 
| 
      
 21 
     | 
    
         
            +
            #= require foliage/leaf
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            this.Foliage = {};
         
     | 
| 
         @@ -0,0 +1,99 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class Foliage.Band
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              constructor: (@layer, @data, options = {}) ->
         
     | 
| 
      
 4 
     | 
    
         
            +
                @items = []
         
     | 
| 
      
 5 
     | 
    
         
            +
                property = @layer.reference
         
     | 
| 
      
 6 
     | 
    
         
            +
                console.log "Property: ", property
         
     | 
| 
      
 7 
     | 
    
         
            +
                previous = null
         
     | 
| 
      
 8 
     | 
    
         
            +
                minValue = null
         
     | 
| 
      
 9 
     | 
    
         
            +
                maxValue = null
         
     | 
| 
      
 10 
     | 
    
         
            +
                for zone in @data
         
     | 
| 
      
 11 
     | 
    
         
            +
                  minValue ?= zone[property]
         
     | 
| 
      
 12 
     | 
    
         
            +
                  maxValue ?= zone[property]
         
     | 
| 
      
 13 
     | 
    
         
            +
                  minValue = zone[property] if minValue > zone[property]
         
     | 
| 
      
 14 
     | 
    
         
            +
                  maxValue = zone[property] if maxValue < zone[property]
         
     | 
| 
      
 15 
     | 
    
         
            +
                  if previous
         
     | 
| 
      
 16 
     | 
    
         
            +
                    @items.push
         
     | 
| 
      
 17 
     | 
    
         
            +
                      polygon: this.computeTrapez({x: previous.shape.coordinates[1], y: previous.shape.coordinates[0], w: previous.width}, {x: zone.shape.coordinates[1], y: zone.shape.coordinates[0], w: zone.width})
         
     | 
| 
      
 18 
     | 
    
         
            +
                      value: zone[property]
         
     | 
| 
      
 19 
     | 
    
         
            +
                      style:
         
     | 
| 
      
 20 
     | 
    
         
            +
                        stroke: false
         
     | 
| 
      
 21 
     | 
    
         
            +
                        fillOpacity: 1
         
     | 
| 
      
 22 
     | 
    
         
            +
                  previous = zone
         
     | 
| 
      
 23 
     | 
    
         
            +
                if this.valid()
         
     | 
| 
      
 24 
     | 
    
         
            +
                  start = new Foliage.Color(options.startColor)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  stop  = new Foliage.Color(options.stopColor)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  console.log(maxValue, minValue)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  for item in @items
         
     | 
| 
      
 28 
     | 
    
         
            +
                    level = (item.value - minValue) / (maxValue - minValue)
         
     | 
| 
      
 29 
     | 
    
         
            +
                    item.style.fillColor = Foliage.Color.toString
         
     | 
| 
      
 30 
     | 
    
         
            +
                      red:   start.red   + (Math.round(stop.red   - start.red)   * level)
         
     | 
| 
      
 31 
     | 
    
         
            +
                      green: start.green + (Math.round(stop.green - start.green) * level)
         
     | 
| 
      
 32 
     | 
    
         
            +
                      blue:  start.blue  + (Math.round(stop.blue  - start.blue)  * level)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  console.log "Bands computed"
         
     | 
| 
      
 34 
     | 
    
         
            +
                else
         
     | 
| 
      
 35 
     | 
    
         
            +
                  console.warn "Invalid bands"
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
              # Build layer as wanted
         
     | 
| 
      
 38 
     | 
    
         
            +
              buildLayerGroup: (widget, globalStyle = {}) ->
         
     | 
| 
      
 39 
     | 
    
         
            +
                group = []
         
     | 
| 
      
 40 
     | 
    
         
            +
                for item in @items
         
     | 
| 
      
 41 
     | 
    
         
            +
                  edge = new L.polygon(item.polygon, item.style)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  group.push(edge)
         
     | 
| 
      
 43 
     | 
    
         
            +
                group
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
              # Build HTML legend for given bands computed layer
         
     | 
| 
      
 46 
     | 
    
         
            +
              buildLegend: () ->
         
     | 
| 
      
 47 
     | 
    
         
            +
                html  = "<div class='leaflet-legend-item' id='legend-#{@layer.name}'>"
         
     | 
| 
      
 48 
     | 
    
         
            +
                html += "<h3>#{@layer.label}</h3>"
         
     | 
| 
      
 49 
     | 
    
         
            +
                # html += "<div class='leaflet-legend-body leaflet-categories-scale'>"
         
     | 
| 
      
 50 
     | 
    
         
            +
                # html += "<span class='leaflet-categories-items'>"
         
     | 
| 
      
 51 
     | 
    
         
            +
                # html += "<span class='leaflet-categories-item'>"
         
     | 
| 
      
 52 
     | 
    
         
            +
                # html += "<i class='leaflet-categories-sample' style='background-color: #{@items[0].fillColor};'></i>"
         
     | 
| 
      
 53 
     | 
    
         
            +
                # html += " #{@layer.label}"
         
     | 
| 
      
 54 
     | 
    
         
            +
                # html += "</span>"
         
     | 
| 
      
 55 
     | 
    
         
            +
                # html += "</span>"
         
     | 
| 
      
 56 
     | 
    
         
            +
                # html += "</div>"
         
     | 
| 
      
 57 
     | 
    
         
            +
                html += "</div>"
         
     | 
| 
      
 58 
     | 
    
         
            +
                return html
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
              # Returns the item matching the given name
         
     | 
| 
      
 61 
     | 
    
         
            +
              itemFor: (name) ->
         
     | 
| 
      
 62 
     | 
    
         
            +
                back = null
         
     | 
| 
      
 63 
     | 
    
         
            +
                @items.forEach (item, index, array) ->
         
     | 
| 
      
 64 
     | 
    
         
            +
                  back = item if item.name == name
         
     | 
| 
      
 65 
     | 
    
         
            +
                return back
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
              # Check if bands are valid
         
     | 
| 
      
 68 
     | 
    
         
            +
              valid: () ->
         
     | 
| 
      
 69 
     | 
    
         
            +
                @items.length > 0
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
              # http://stackoverflow.com/questions/7854043/drawing-rectangle-between-two-points-with-arbitrary-width
         
     | 
| 
      
 72 
     | 
    
         
            +
              computeTrapez: (a, b) ->
         
     | 
| 
      
 73 
     | 
    
         
            +
                # Calculate a vector between start and end points
         
     | 
| 
      
 74 
     | 
    
         
            +
                v =
         
     | 
| 
      
 75 
     | 
    
         
            +
                  x: b.x - a.x
         
     | 
| 
      
 76 
     | 
    
         
            +
                  y: b.y - a.y
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                # Then calculate a perpendicular to it (just swap X and Y coordinates)
         
     | 
| 
      
 79 
     | 
    
         
            +
                p =
         
     | 
| 
      
 80 
     | 
    
         
            +
                  x:  v.y # Use separate variable otherwise you overwrite X coordinate here
         
     | 
| 
      
 81 
     | 
    
         
            +
                  y: -v.x # Flip the sign of either the X or Y (edit by adam.wulf)
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
                # Normalize that perpendicular
         
     | 
| 
      
 84 
     | 
    
         
            +
                l = Math.sqrt(p.x * p.x + p.y * p.y); # That's length of perpendicular
         
     | 
| 
      
 85 
     | 
    
         
            +
                n =
         
     | 
| 
      
 86 
     | 
    
         
            +
                  x: p.x / l
         
     | 
| 
      
 87 
     | 
    
         
            +
                  y: p.y / l # Now N is normalized perpendicular
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                # Calculate 4 points that form a rectangle by adding normalized perpendicular and multiplying it by half of the desired width
         
     | 
| 
      
 90 
     | 
    
         
            +
                ar = (a.w / 2) * 9 / 1000000
         
     | 
| 
      
 91 
     | 
    
         
            +
                br = (b.w / 2) * 9 / 1000000
         
     | 
| 
      
 92 
     | 
    
         
            +
                r1 = new L.LatLng(a.x + n.x * ar, a.y + n.y * ar)
         
     | 
| 
      
 93 
     | 
    
         
            +
                r2 = new L.LatLng(a.x - n.x * ar, a.y - n.y * ar)
         
     | 
| 
      
 94 
     | 
    
         
            +
                r3 = new L.LatLng(b.x + n.x * br, b.y + n.y * br)
         
     | 
| 
      
 95 
     | 
    
         
            +
                r4 = new L.LatLng(b.x - n.x * br, b.y - n.y * br)
         
     | 
| 
      
 96 
     | 
    
         
            +
                return [r1, r2, r4, r3]
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
            Foliage.registerLayerType "band", Foliage.Band
         
     | 
| 
         @@ -0,0 +1,77 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Add sprockets directives below:
         
     | 
| 
      
 2 
     | 
    
         
            +
            #= require foliage/gradient
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            class Foliage.Bubbles extends Foliage.Gradient
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              constructor: (@layer, @data, options = {}) ->
         
     | 
| 
      
 8 
     | 
    
         
            +
                options.levelNumber ?= 5
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                super @data, @layer.reference, options
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                if this.valid()
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  # Compute radius
         
     | 
| 
      
 15 
     | 
    
         
            +
                  options.startRadius ?= 4
         
     | 
| 
      
 16 
     | 
    
         
            +
                  options.stopRadius  ?= 24
         
     | 
| 
      
 17 
     | 
    
         
            +
                  start = options.startRadius
         
     | 
| 
      
 18 
     | 
    
         
            +
                  stop  = options.stopRadius
         
     | 
| 
      
 19 
     | 
    
         
            +
                  for grade in @grades
         
     | 
| 
      
 20 
     | 
    
         
            +
                    level = grade.index / (@levelNumber - 1.0)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    grade.radius = start + Math.round((stop - start) * level)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    grade.fillColor = options.fillColor
         
     | 
| 
      
 23 
     | 
    
         
            +
                    grade.color  = options.color
         
     | 
| 
      
 24 
     | 
    
         
            +
                    grade.weight = options.weight
         
     | 
| 
      
 25 
     | 
    
         
            +
                    grade.stroke = options.stroke
         
     | 
| 
      
 26 
     | 
    
         
            +
                  console.log "Radiuses computed"
         
     | 
| 
      
 27 
     | 
    
         
            +
                else
         
     | 
| 
      
 28 
     | 
    
         
            +
                  console.warn "Invalid bubbles"
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              # Build layer as wanted
         
     | 
| 
      
 31 
     | 
    
         
            +
              buildLayerGroup: (widget, globalStyle = {}) ->
         
     | 
| 
      
 32 
     | 
    
         
            +
                group = []
         
     | 
| 
      
 33 
     | 
    
         
            +
                # Shadow
         
     | 
| 
      
 34 
     | 
    
         
            +
                for zone in @data
         
     | 
| 
      
 35 
     | 
    
         
            +
                  grade = this.gradeFor(zone[@layer.reference])
         
     | 
| 
      
 36 
     | 
    
         
            +
                  if grade.stroke
         
     | 
| 
      
 37 
     | 
    
         
            +
                    zoneStyle =
         
     | 
| 
      
 38 
     | 
    
         
            +
                      fillColor: grade.color
         
     | 
| 
      
 39 
     | 
    
         
            +
                      radius: grade.radius + grade.weight
         
     | 
| 
      
 40 
     | 
    
         
            +
                      stroke: false
         
     | 
| 
      
 41 
     | 
    
         
            +
                      fillOpacity: 0.8
         
     | 
| 
      
 42 
     | 
    
         
            +
                    group.push new L.CircleMarker(this._centroid(zone.shape), zoneStyle)
         
     | 
| 
      
 43 
     | 
    
         
            +
                # Core
         
     | 
| 
      
 44 
     | 
    
         
            +
                for zone in @data
         
     | 
| 
      
 45 
     | 
    
         
            +
                  grade = this.gradeFor(zone[@layer.reference])
         
     | 
| 
      
 46 
     | 
    
         
            +
                  zoneStyle =
         
     | 
| 
      
 47 
     | 
    
         
            +
                    fillColor: grade.fillColor
         
     | 
| 
      
 48 
     | 
    
         
            +
                    radius: grade.radius
         
     | 
| 
      
 49 
     | 
    
         
            +
                    stroke: false
         
     | 
| 
      
 50 
     | 
    
         
            +
                    fillOpacity: 1
         
     | 
| 
      
 51 
     | 
    
         
            +
                  zoneLayer = new L.CircleMarker(this._centroid(zone.shape), zoneStyle)
         
     | 
| 
      
 52 
     | 
    
         
            +
                  widget._bindPopup(zoneLayer, zone)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  group.push(zoneLayer)
         
     | 
| 
      
 54 
     | 
    
         
            +
                group
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
              # Build HTML legend for given bubbles computed layer
         
     | 
| 
      
 57 
     | 
    
         
            +
              buildLegend: () ->
         
     | 
| 
      
 58 
     | 
    
         
            +
                html  = "<div class='leaflet-legend-item' id='legend-#{@layer.name}'>"
         
     | 
| 
      
 59 
     | 
    
         
            +
                html += "<h3>#{@layer.label}</h3>"
         
     | 
| 
      
 60 
     | 
    
         
            +
                html += "<div class='leaflet-legend-body leaflet-bubbles-scale'>"
         
     | 
| 
      
 61 
     | 
    
         
            +
                html += "<span class='min-value'>#{@grades[0].minLabel}</span>"
         
     | 
| 
      
 62 
     | 
    
         
            +
                html += "<span class='leaflet-bubbles-grades'>"
         
     | 
| 
      
 63 
     | 
    
         
            +
                for grade in @grades
         
     | 
| 
      
 64 
     | 
    
         
            +
                  html += "<i class='leaflet-bubbles-grade' style='width: #{2 * grade.radius}px; height: #{2 * grade.radius}px; background-color: #{grade.fillColor}; border-width: #{grade.weight}px; border-color: #{grade.color}' title='#{grade.minLabel} ~ #{grade.maxLabel}'></i>"
         
     | 
| 
      
 65 
     | 
    
         
            +
                html += "</span>"
         
     | 
| 
      
 66 
     | 
    
         
            +
                html += "<span class='max-value'>#{@grades[@levelNumber - 1].maxLabel}</span>"
         
     | 
| 
      
 67 
     | 
    
         
            +
                html += "</div>"
         
     | 
| 
      
 68 
     | 
    
         
            +
                html += "</div>"
         
     | 
| 
      
 69 
     | 
    
         
            +
                return html
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
              # Compute a centroid based on bounds
         
     | 
| 
      
 72 
     | 
    
         
            +
              # The point can be out of the surface...
         
     | 
| 
      
 73 
     | 
    
         
            +
              _centroid: (shape) ->
         
     | 
| 
      
 74 
     | 
    
         
            +
                geojson = new L.GeoJSON(shape)
         
     | 
| 
      
 75 
     | 
    
         
            +
                return geojson.getBounds().getCenter()
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
            Foliage.registerLayerType "bubbles", Foliage.Bubbles
         
     | 
| 
         @@ -0,0 +1,70 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class Foliage.Categories
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              constructor: (@layer, @data, options = {}) ->
         
     | 
| 
      
 4 
     | 
    
         
            +
                @items = []
         
     | 
| 
      
 5 
     | 
    
         
            +
                property = @layer.reference
         
     | 
| 
      
 6 
     | 
    
         
            +
                for zone in @data
         
     | 
| 
      
 7 
     | 
    
         
            +
                  unless this.itemFor(zone[property])
         
     | 
| 
      
 8 
     | 
    
         
            +
                    @items.push
         
     | 
| 
      
 9 
     | 
    
         
            +
                      name: zone[property],
         
     | 
| 
      
 10 
     | 
    
         
            +
                      color: zone['shapeColor']
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                if this.valid()
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @items = @items.sort (a, b) ->
         
     | 
| 
      
 14 
     | 
    
         
            +
                    a.name > b.name
         
     | 
| 
      
 15 
     | 
    
         
            +
                  @colors = options.colors ? []
         
     | 
| 
      
 16 
     | 
    
         
            +
                  if @items.length > @colors.length
         
     | 
| 
      
 17 
     | 
    
         
            +
                    for x in [@colors.length..@items.length]
         
     | 
| 
      
 18 
     | 
    
         
            +
                      @colors.push(options.parent.options.colors[x] ? "#000000")
         
     | 
| 
      
 19 
     | 
    
         
            +
                  for item, index in @items
         
     | 
| 
      
 20 
     | 
    
         
            +
                    if item.color?
         
     | 
| 
      
 21 
     | 
    
         
            +
                      item.fillColor = item.color
         
     | 
| 
      
 22 
     | 
    
         
            +
                    else
         
     | 
| 
      
 23 
     | 
    
         
            +
                      item.fillColor = @colors[index]
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                  console.log "Categories computed"
         
     | 
| 
      
 26 
     | 
    
         
            +
                else
         
     | 
| 
      
 27 
     | 
    
         
            +
                  console.warn "Invalid categories"
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              # Build layer as wanted
         
     | 
| 
      
 30 
     | 
    
         
            +
              buildLayerGroup: (widget, globalStyle = {}) ->
         
     | 
| 
      
 31 
     | 
    
         
            +
                group = []
         
     | 
| 
      
 32 
     | 
    
         
            +
                for zone in @data
         
     | 
| 
      
 33 
     | 
    
         
            +
                  zoneStyle =
         
     | 
| 
      
 34 
     | 
    
         
            +
                    fillColor: this.itemFor(zone[@layer.reference]).fillColor
         
     | 
| 
      
 35 
     | 
    
         
            +
                  zoneLayer = new L.GeoJSON(zone.shape, $.extend(true, {}, globalStyle, zoneStyle))
         
     | 
| 
      
 36 
     | 
    
         
            +
                  widget._bindPopup(zoneLayer, zone)
         
     | 
| 
      
 37 
     | 
    
         
            +
                  unless @layer.withoutGhostLabel
         
     | 
| 
      
 38 
     | 
    
         
            +
                    label = new L.GhostLabel(className: 'leaflet-ghost-label', toBack: false).setContent(zone.name).toCentroidOfBounds(zoneLayer.getLayers()[0].getLatLngs())
         
     | 
| 
      
 39 
     | 
    
         
            +
                    widget.ghostLabelCluster.bind label, zoneLayer.getLayers()[0]
         
     | 
| 
      
 40 
     | 
    
         
            +
                  group.push(zoneLayer)
         
     | 
| 
      
 41 
     | 
    
         
            +
                group
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
              # Build HTML legend for given categories computed layer
         
     | 
| 
      
 44 
     | 
    
         
            +
              buildLegend: () ->
         
     | 
| 
      
 45 
     | 
    
         
            +
                html  = "<div class='leaflet-legend-item' id='legend-#{@layer.name}'>"
         
     | 
| 
      
 46 
     | 
    
         
            +
                html += "<h3>#{@layer.label}</h3>"
         
     | 
| 
      
 47 
     | 
    
         
            +
                html += "<div class='leaflet-legend-body leaflet-categories-scale'>"
         
     | 
| 
      
 48 
     | 
    
         
            +
                html += "<span class='leaflet-categories-items'>"
         
     | 
| 
      
 49 
     | 
    
         
            +
                for name, item of @items
         
     | 
| 
      
 50 
     | 
    
         
            +
                  html += "<span class='leaflet-categories-item'>"
         
     | 
| 
      
 51 
     | 
    
         
            +
                  html += "<i class='leaflet-categories-sample' style='background-color: #{item.fillColor};'></i>"
         
     | 
| 
      
 52 
     | 
    
         
            +
                  html += " <span class='leaflet-categories-item_label'>#{item.name}</span>"
         
     | 
| 
      
 53 
     | 
    
         
            +
                  html += "</span>"
         
     | 
| 
      
 54 
     | 
    
         
            +
                html += "</span>"
         
     | 
| 
      
 55 
     | 
    
         
            +
                html += "</div>"
         
     | 
| 
      
 56 
     | 
    
         
            +
                html += "</div>"
         
     | 
| 
      
 57 
     | 
    
         
            +
                return html
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
              # Returns the item matching the given name
         
     | 
| 
      
 60 
     | 
    
         
            +
              itemFor: (name) ->
         
     | 
| 
      
 61 
     | 
    
         
            +
                back = null
         
     | 
| 
      
 62 
     | 
    
         
            +
                @items.forEach (item, index, array) ->
         
     | 
| 
      
 63 
     | 
    
         
            +
                  back = item if item.name == name
         
     | 
| 
      
 64 
     | 
    
         
            +
                return back
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
              # Check if categories are valid
         
     | 
| 
      
 67 
     | 
    
         
            +
              valid: () ->
         
     | 
| 
      
 68 
     | 
    
         
            +
                @items.length > 0
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
            Foliage.registerLayerType "categories", Foliage.Categories
         
     |