From 855a4176e2b4f23db9cb2ed256cb9a763fc829e6 Mon Sep 17 00:00:00 2001 From: Gigi Date: Tue, 26 Apr 2022 00:05:09 +0200 Subject: [PATCH] Initial import --- .gitignore | 5 + .ruby-version | 1 + DE.svg | 137 + Gemfile | 23 + Gemfile.lock | 286 + README.md | 14 + _config.yml | 4 + _layouts/core.html | 41 + _layouts/default.html | 67 + _layouts/docs.html | 119 + _layouts/showcase-overview.html | 13 + _layouts/showcase.html | 48 + css/bootstrap.css | 3508 +++++++++ css/bootstrap.min.css | 563 ++ css/jquery.qtip.css | 37 + css/k.css | 386 + css/prettify.css | 51 + data/cities.json | 1001 +++ data/countries.json | 973 +++ favicon.ico | Bin 0 -> 587 bytes index.html | 81 + index.html.bak | 81 + js/chroma.min.js | 1 + js/flashcanvas.js | 28 + js/flashcanvas.swf | Bin 0 -> 21235 bytes js/highlight/LICENSE | 24 + js/highlight/README.md | 143 + js/highlight/README.ru.md | 149 + js/highlight/classref.txt | 553 ++ js/highlight/highlight.pack.js | 1 + js/highlight/styles/arta.css | 155 + js/highlight/styles/ascetic.css | 50 + js/highlight/styles/brown_paper.css | 102 + js/highlight/styles/brown_papersq.png | Bin 0 -> 18198 bytes js/highlight/styles/dark.css | 101 + js/highlight/styles/default.css | 132 + js/highlight/styles/far.css | 111 + js/highlight/styles/github.css | 131 + js/highlight/styles/googlecode.css | 144 + js/highlight/styles/idea.css | 121 + js/highlight/styles/ir_black.css | 98 + js/highlight/styles/magula.css | 119 + js/highlight/styles/monokai.css | 112 + js/highlight/styles/pojoaque.css | 104 + js/highlight/styles/pojoaque.jpg | Bin 0 -> 1186 bytes js/highlight/styles/rainbow.css | 114 + js/highlight/styles/school_book.css | 109 + js/highlight/styles/school_book.png | Bin 0 -> 486 bytes js/highlight/styles/solarized_dark.css | 88 + js/highlight/styles/solarized_light.css | 88 + js/highlight/styles/sunburst.css | 148 + js/highlight/styles/tomorrow-night-blue.css | 42 + js/highlight/styles/tomorrow-night-bright.css | 41 + .../styles/tomorrow-night-eighties.css | 41 + js/highlight/styles/tomorrow-night.css | 42 + js/highlight/styles/tomorrow.css | 39 + js/highlight/styles/vs.css | 85 + js/highlight/styles/xcode.css | 154 + js/highlight/styles/zenburn.css | 113 + js/jquery-1.10.2.min.js | 6 + js/jquery-1.10.2.min.map | 1 + js/jquery.csv.js | 71 + js/jquery.qtip.min.js | 3 + js/kartograph-chroma.min.js | 41 + js/kartograph.js | 6256 +++++++++++++++++ js/kartograph.min.js | 3 + js/prettify.js | 28 + js/raphael-2.1.0.min.js | 11 + js/raphael.min.js | 8 + map/world.svg | 636 ++ source/.html | 0 source/__init__.html | 34 + source/cartogram.html | 858 +++ source/cli.html | 214 + source/errors.html | 94 + source/filter.html | 114 + source/geometry/__init__.html | 50 + source/geometry/bbox.html | 195 + source/geometry/geometry.html | 279 + source/geometry/line.html | 519 ++ source/geometry/point.html | 141 + source/geometry/polygon.html | 625 ++ source/geometry/utils.html | 196 + source/geometry/view.html | 226 + source/img/crop-bbox-01.png | Bin 0 -> 80101 bytes source/img/crop-polygon-1.png | Bin 0 -> 15737 bytes source/img/crop-polygon-minarea.png | Bin 0 -> 28682 bytes source/img/crop-polygon.png | Bin 0 -> 80422 bytes source/img/join.png | Bin 0 -> 35257 bytes source/img/logo.png | Bin 0 -> 15102 bytes source/img/simplify.png | Bin 0 -> 69469 bytes source/kartograph.html | 326 + source/layersource/__init__.html | 68 + source/layersource/layersource.html | 55 + source/layersource/shapefile.html | 2669 +++++++ source/layersource/shplayer.html | 410 ++ source/map.html | 1104 +++ source/maplayer.html | 329 + source/options.html | 499 ++ source/proj/__init__.html | 219 + source/proj/base.html | 432 ++ source/proj/conic.html | 320 + source/proj/cylindrical.html | 426 ++ source/proj/pseudocylindrical.html | 1014 +++ source/pycco.css | 186 + source/renderer/__init__.html | 100 + source/renderer/kml.html | 272 + source/renderer/svg.html | 525 ++ source/simplify/__init__.html | 85 + source/simplify/distance.html | 108 + source/simplify/douglas_peucker.html | 221 + source/simplify/mpoint.html | 133 + source/simplify/unify.html | 152 + source/simplify/visvalingam.html | 218 + 114 files changed, 31402 insertions(+) create mode 100644 .gitignore create mode 100644 .ruby-version create mode 100644 DE.svg create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 README.md create mode 100644 _config.yml create mode 100644 _layouts/core.html create mode 100644 _layouts/default.html create mode 100644 _layouts/docs.html create mode 100644 _layouts/showcase-overview.html create mode 100644 _layouts/showcase.html create mode 100755 css/bootstrap.css create mode 100755 css/bootstrap.min.css create mode 100644 css/jquery.qtip.css create mode 100644 css/k.css create mode 100644 css/prettify.css create mode 100644 data/cities.json create mode 100644 data/countries.json create mode 100644 favicon.ico create mode 100644 index.html create mode 100644 index.html.bak create mode 100644 js/chroma.min.js create mode 100755 js/flashcanvas.js create mode 100755 js/flashcanvas.swf create mode 100644 js/highlight/LICENSE create mode 100644 js/highlight/README.md create mode 100644 js/highlight/README.ru.md create mode 100644 js/highlight/classref.txt create mode 100644 js/highlight/highlight.pack.js create mode 100644 js/highlight/styles/arta.css create mode 100644 js/highlight/styles/ascetic.css create mode 100644 js/highlight/styles/brown_paper.css create mode 100644 js/highlight/styles/brown_papersq.png create mode 100644 js/highlight/styles/dark.css create mode 100644 js/highlight/styles/default.css create mode 100644 js/highlight/styles/far.css create mode 100644 js/highlight/styles/github.css create mode 100644 js/highlight/styles/googlecode.css create mode 100644 js/highlight/styles/idea.css create mode 100644 js/highlight/styles/ir_black.css create mode 100644 js/highlight/styles/magula.css create mode 100644 js/highlight/styles/monokai.css create mode 100644 js/highlight/styles/pojoaque.css create mode 100644 js/highlight/styles/pojoaque.jpg create mode 100644 js/highlight/styles/rainbow.css create mode 100644 js/highlight/styles/school_book.css create mode 100644 js/highlight/styles/school_book.png create mode 100644 js/highlight/styles/solarized_dark.css create mode 100644 js/highlight/styles/solarized_light.css create mode 100644 js/highlight/styles/sunburst.css create mode 100644 js/highlight/styles/tomorrow-night-blue.css create mode 100644 js/highlight/styles/tomorrow-night-bright.css create mode 100644 js/highlight/styles/tomorrow-night-eighties.css create mode 100644 js/highlight/styles/tomorrow-night.css create mode 100644 js/highlight/styles/tomorrow.css create mode 100644 js/highlight/styles/vs.css create mode 100644 js/highlight/styles/xcode.css create mode 100644 js/highlight/styles/zenburn.css create mode 100644 js/jquery-1.10.2.min.js create mode 100644 js/jquery-1.10.2.min.map create mode 100644 js/jquery.csv.js create mode 100644 js/jquery.qtip.min.js create mode 100644 js/kartograph-chroma.min.js create mode 100644 js/kartograph.js create mode 100644 js/kartograph.min.js create mode 100644 js/prettify.js create mode 100644 js/raphael-2.1.0.min.js create mode 100644 js/raphael.min.js create mode 100644 map/world.svg create mode 100644 source/.html create mode 100644 source/__init__.html create mode 100644 source/cartogram.html create mode 100644 source/cli.html create mode 100644 source/errors.html create mode 100644 source/filter.html create mode 100644 source/geometry/__init__.html create mode 100644 source/geometry/bbox.html create mode 100644 source/geometry/geometry.html create mode 100644 source/geometry/line.html create mode 100644 source/geometry/point.html create mode 100644 source/geometry/polygon.html create mode 100644 source/geometry/utils.html create mode 100644 source/geometry/view.html create mode 100644 source/img/crop-bbox-01.png create mode 100644 source/img/crop-polygon-1.png create mode 100644 source/img/crop-polygon-minarea.png create mode 100644 source/img/crop-polygon.png create mode 100644 source/img/join.png create mode 100644 source/img/logo.png create mode 100644 source/img/simplify.png create mode 100644 source/kartograph.html create mode 100644 source/layersource/__init__.html create mode 100644 source/layersource/layersource.html create mode 100644 source/layersource/shapefile.html create mode 100644 source/layersource/shplayer.html create mode 100644 source/map.html create mode 100644 source/maplayer.html create mode 100644 source/options.html create mode 100644 source/proj/__init__.html create mode 100644 source/proj/base.html create mode 100644 source/proj/conic.html create mode 100644 source/proj/cylindrical.html create mode 100644 source/proj/pseudocylindrical.html create mode 100644 source/pycco.css create mode 100644 source/renderer/__init__.html create mode 100644 source/renderer/kml.html create mode 100644 source/renderer/svg.html create mode 100644 source/simplify/__init__.html create mode 100644 source/simplify/distance.html create mode 100644 source/simplify/douglas_peucker.html create mode 100644 source/simplify/mpoint.html create mode 100644 source/simplify/unify.html create mode 100644 source/simplify/visvalingam.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..849fb7e --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +update +update_remote +old/ +_site/ +demos/shp/ diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..ec1cf33 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.6.3 diff --git a/DE.svg b/DE.svg new file mode 100644 index 0000000..4d79970 --- /dev/null +++ b/DE.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..1f7d0a8 --- /dev/null +++ b/Gemfile @@ -0,0 +1,23 @@ +source "https://rubygems.org" + +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +gem "jekyll", "~> 3.7.3" + +gem "github-pages", group: :jekyll_plugins + +# If you have any plugins, put them here! +group :jekyll_plugins do + gem "jekyll-paginate" + gem "jekyll-sitemap" + gem "jekyll-redirect-from" +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..41b99cc --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,286 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (4.2.10) + i18n (~> 0.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + addressable (2.8.0) + public_suffix (>= 2.0.2, < 5.0) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.11.1) + colorator (1.1.0) + commonmarker (0.17.13) + ruby-enum (~> 0.5) + concurrent-ruby (1.1.10) + dnsruby (1.61.9) + simpleidn (~> 0.1) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + ethon (0.15.0) + ffi (>= 1.15.0) + eventmachine (1.2.7) + execjs (2.8.1) + faraday (1.10.0) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) + ruby2_keywords (>= 0.0.4) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.0.3) + multipart-post (>= 1.2, < 3) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) + ffi (1.15.5) + forwardable-extended (2.6.0) + gemoji (3.0.1) + github-pages (197) + activesupport (= 4.2.10) + github-pages-health-check (= 1.16.1) + jekyll (= 3.7.4) + jekyll-avatar (= 0.6.0) + jekyll-coffeescript (= 1.1.1) + jekyll-commonmark-ghpages (= 0.1.5) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.11.0) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.12.1) + jekyll-mentions (= 1.4.1) + jekyll-optional-front-matter (= 0.3.0) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.2.0) + jekyll-redirect-from (= 0.14.0) + jekyll-relative-links (= 0.6.0) + jekyll-remote-theme (= 0.3.1) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.5.0) + jekyll-sitemap (= 1.2.0) + jekyll-swiss (= 0.4.0) + jekyll-theme-architect (= 0.1.1) + jekyll-theme-cayman (= 0.1.1) + jekyll-theme-dinky (= 0.1.1) + jekyll-theme-hacker (= 0.1.1) + jekyll-theme-leap-day (= 0.1.1) + jekyll-theme-merlot (= 0.1.1) + jekyll-theme-midnight (= 0.1.1) + jekyll-theme-minimal (= 0.1.1) + jekyll-theme-modernist (= 0.1.1) + jekyll-theme-primer (= 0.5.3) + jekyll-theme-slate (= 0.1.1) + jekyll-theme-tactile (= 0.1.1) + jekyll-theme-time-machine (= 0.1.1) + jekyll-titles-from-headings (= 0.5.1) + jemoji (= 0.10.2) + kramdown (= 1.17.0) + liquid (= 4.0.0) + listen (= 3.1.5) + mercenary (~> 0.3) + minima (= 2.5.0) + nokogiri (>= 1.8.5, < 2.0) + rouge (= 2.2.1) + terminal-table (~> 1.4) + github-pages-health-check (1.16.1) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (~> 4.0) + public_suffix (~> 3.0) + typhoeus (~> 1.3) + html-pipeline (2.14.1) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.8.0) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + jekyll (3.7.4) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 0.7) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (~> 1.14) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-avatar (0.6.0) + jekyll (~> 3.0) + jekyll-coffeescript (1.1.1) + coffee-script (~> 2.2) + coffee-script-source (~> 1.11.1) + jekyll-commonmark (1.3.1) + commonmarker (~> 0.14) + jekyll (>= 3.7, < 5.0) + jekyll-commonmark-ghpages (0.1.5) + commonmarker (~> 0.17.6) + jekyll-commonmark (~> 1) + rouge (~> 2) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.11.0) + jekyll (~> 3.3) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.12.1) + jekyll (~> 3.4) + octokit (~> 4.0, != 4.4.0) + jekyll-mentions (1.4.1) + html-pipeline (~> 2.3) + jekyll (~> 3.0) + jekyll-optional-front-matter (0.3.0) + jekyll (~> 3.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.2.0) + jekyll (~> 3.0) + jekyll-redirect-from (0.14.0) + jekyll (~> 3.3) + jekyll-relative-links (0.6.0) + jekyll (~> 3.3) + jekyll-remote-theme (0.3.1) + jekyll (~> 3.5) + rubyzip (>= 1.2.1, < 3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.5.0) + jekyll (~> 3.3) + jekyll-sitemap (1.2.0) + jekyll (~> 3.3) + jekyll-swiss (0.4.0) + jekyll-theme-architect (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-cayman (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.5.3) + jekyll (~> 3.5) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.1) + jekyll (~> 3.3) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.10.2) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (~> 3.0) + kramdown (1.17.0) + liquid (4.0.0) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + mercenary (0.3.6) + mini_portile2 (2.8.0) + minima (2.5.0) + jekyll (~> 3.5) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.15.0) + multipart-post (2.1.1) + nokogiri (1.13.4) + mini_portile2 (~> 2.8.0) + racc (~> 1.4) + nokogiri (1.13.4-x86_64-linux) + racc (~> 1.4) + octokit (4.22.0) + faraday (>= 0.9) + sawyer (~> 0.8.0, >= 0.5.3) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (3.1.1) + racc (1.6.0) + rb-fsevent (0.11.1) + rb-inotify (0.10.1) + ffi (~> 1.0) + rouge (2.2.1) + ruby-enum (0.9.0) + i18n + ruby2_keywords (0.0.5) + ruby_dep (1.5.0) + rubyzip (2.3.2) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.8.2) + addressable (>= 2.3.5) + faraday (> 0.8, < 2.0) + simpleidn (0.2.1) + unf (~> 0.1.4) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + thread_safe (0.3.6) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (1.2.9) + thread_safe (~> 0.1) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.1) + unicode-display_width (1.8.0) + +PLATFORMS + ruby + x86_64-linux + +DEPENDENCIES + github-pages + jekyll (~> 3.7.3) + jekyll-paginate + jekyll-redirect-from + jekyll-sitemap + tzinfo-data + +BUNDLED WITH + 2.2.24 diff --git a/README.md b/README.md new file mode 100644 index 0000000..93250c1 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# kartograph.org + +This is the source of the website running at http://kartograph.org. + +This is a [Jekyll](http://jekyllrb.com/) website, so you have to +[install](https://github.com/mojombo/jekyll/wiki/Install/) and +run Jekyll in the root directory. + +It will generate a folder "_site" which contains the fully rendered website. +Make this your document root and it should look fine. + +You can also run it without a webserver by running `jekyll --server` +from the root directory and going to +[http://localhost:4000](http://localhost:4000). diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..38c8650 --- /dev/null +++ b/_config.yml @@ -0,0 +1,4 @@ +markdown: rdiscount +pygments: true +auto: true +title: Kartograph diff --git a/_layouts/core.html b/_layouts/core.html new file mode 100644 index 0000000..cec9b4b --- /dev/null +++ b/_layouts/core.html @@ -0,0 +1,41 @@ + + + + + {{ page.title }} + + + + + + + + + +{% for style in page.styles %} + +{% endfor %} + + + + + + + + + {{ content }} + + + + + + diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..f0710ea --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,67 @@ +--- +layout: core +--- + +
+
+
+   +
+
+
+ + +
+ {% if page.headline %} +
+

{{ page.headline }}

+

{{ page.tagline }}

+
+ {% endif %} +
+ {{ content }} +
+ +
+
+
diff --git a/_layouts/docs.html b/_layouts/docs.html new file mode 100644 index 0000000..f19dfc5 --- /dev/null +++ b/_layouts/docs.html @@ -0,0 +1,119 @@ +--- +class: docs +layout: default +toc: true +styles: ['/js/highlight/styles/github.css'] +--- + + + +
+ Writing documentation (and keeping it up to date) is a lot of work. You can help improving it by submitting any bug you encounter, or, even better, directly patching +this page on Github. Thanks! +
+ +{{ content }} + + diff --git a/_layouts/showcase-overview.html b/_layouts/showcase-overview.html new file mode 100644 index 0000000..353570f --- /dev/null +++ b/_layouts/showcase-overview.html @@ -0,0 +1,13 @@ +--- +layout: default +--- + + diff --git a/_layouts/showcase.html b/_layouts/showcase.html new file mode 100644 index 0000000..83ac139 --- /dev/null +++ b/_layouts/showcase.html @@ -0,0 +1,48 @@ +--- +layout: default +styles: ['/js/highlight/styles/github.css'] +toctitle: Showcases +toc: + Showcases: + - ['/showcase/animated-symbols', 'Animated Symbols'] + - ['/showcase/italia', 'La Bella Italia'] + - ['/showcase/choropleth', 'Choropleth Maps'] + - ['/showcase/symbols', 'Symbol Maps'] + - ['/showcase/clustering', 'Clustering Map Symbols'] + - ['/showcase/charts', 'Chart Maps'] + - ['/showcase/dotgrid', 'Dot-grid Maps'] + - ['/showcase/3d', '3D-Projections'] + - ['/showcase/projections', 'Map Projections'] + - ['/showcase/eastcoast', 'High-res vector mapping'] +--- + + +

(view source){{ page.title }}

+ + {{ content }} + + + + + diff --git a/css/bootstrap.css b/css/bootstrap.css new file mode 100755 index 0000000..bb3c05c --- /dev/null +++ b/css/bootstrap.css @@ -0,0 +1,3508 @@ +/*! + * Bootstrap v2.0.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +.clearfix { + *zoom: 1; +} +.clearfix:before, .clearfix:after { + display: table; + content: ""; +} +.clearfix:after { + clear: both; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} +audio, canvas, video { + display: inline-block; + *display: inline; + *zoom: 1; +} +audio:not([controls]) { + display: none; +} +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +a:hover, a:active { + outline: 0; +} +sub, sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + max-width: 100%; + height: auto; + border: 0; + -ms-interpolation-mode: bicubic; +} +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} +button, input { + *overflow: visible; + line-height: normal; +} +button::-moz-focus-inner, input::-moz-focus-inner { + padding: 0; + border: 0; +} +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} +input[type="search"] { + -webkit-appearance: textfield; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} +textarea { + overflow: auto; + vertical-align: top; +} +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 18px; + color: #333333; + background-color: #ffffff; +} +a { + color: #0088cc; + text-decoration: none; +} +a:hover { + color: #005580; + text-decoration: underline; +} +.row { + margin-left: -20px; + *zoom: 1; +} +.row:before, .row:after { + display: table; + content: ""; +} +.row:after { + clear: both; +} +[class*="span"] { + float: left; + margin-left: 20px; +} +.span1 { + width: 60px; +} +.span2 { + width: 140px; +} +.span3 { + width: 220px; +} +.span4 { + width: 300px; +} +.span5 { + width: 380px; +} +.span6 { + width: 460px; +} +.span7 { + width: 540px; +} +.span8 { + width: 620px; +} +.span9 { + width: 700px; +} +.span10 { + width: 780px; +} +.span11 { + width: 860px; +} +.span12, .container { + width: 940px; +} +.offset1 { + margin-left: 100px; +} +.offset2 { + margin-left: 180px; +} +.offset3 { + margin-left: 260px; +} +.offset4 { + margin-left: 340px; +} +.offset5 { + margin-left: 420px; +} +.offset6 { + margin-left: 500px; +} +.offset7 { + margin-left: 580px; +} +.offset8 { + margin-left: 660px; +} +.offset9 { + margin-left: 740px; +} +.offset10 { + margin-left: 820px; +} +.offset11 { + margin-left: 900px; +} +.row-fluid { + width: 100%; + *zoom: 1; +} +.row-fluid:before, .row-fluid:after { + display: table; + content: ""; +} +.row-fluid:after { + clear: both; +} +.row-fluid > [class*="span"] { + float: left; + margin-left: 2.127659574%; +} +.row-fluid > [class*="span"]:first-child { + margin-left: 0; +} +.row-fluid > .span1 { + width: 6.382978723%; +} +.row-fluid > .span2 { + width: 14.89361702%; +} +.row-fluid > .span3 { + width: 23.404255317%; +} +.row-fluid > .span4 { + width: 31.914893614%; +} +.row-fluid > .span5 { + width: 40.425531911%; +} +.row-fluid > .span6 { + width: 48.93617020799999%; +} +.row-fluid > .span7 { + width: 57.446808505%; +} +.row-fluid > .span8 { + width: 65.95744680199999%; +} +.row-fluid > .span9 { + width: 74.468085099%; +} +.row-fluid > .span10 { + width: 82.97872339599999%; +} +.row-fluid > .span11 { + width: 91.489361693%; +} +.row-fluid > .span12 { + width: 99.99999998999999%; +} +.container { + width: 940px; + margin-left: auto; + margin-right: auto; + *zoom: 1; +} +.container:before, .container:after { + display: table; + content: ""; +} +.container:after { + clear: both; +} +.container-fluid { + padding-left: 20px; + padding-right: 20px; + *zoom: 1; +} +.container-fluid:before, .container-fluid:after { + display: table; + content: ""; +} +.container-fluid:after { + clear: both; +} +p { + margin: 0 0 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 18px; +} +p small { + font-size: 11px; + color: #999999; +} +.lead { + margin-bottom: 18px; + font-size: 20px; + font-weight: 200; + line-height: 27px; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + font-weight: bold; + color: #333333; + text-rendering: optimizelegibility; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + color: #999999; +} +h1 { + font-size: 30px; + line-height: 36px; +} +h1 small { + font-size: 18px; +} +h2 { + font-size: 24px; + line-height: 36px; +} +h2 small { + font-size: 18px; +} +h3 { + line-height: 27px; + font-size: 18px; +} +h3 small { + font-size: 14px; +} +h4, h5, h6 { + line-height: 18px; +} +h4 { + font-size: 14px; +} +h4 small { + font-size: 12px; +} +h5 { + font-size: 12px; +} +h6 { + font-size: 11px; + color: #999999; + text-transform: uppercase; +} +.page-header { + padding-bottom: 17px; + margin: 18px 0; + border-bottom: 1px solid #eeeeee; +} +.page-header h1 { + line-height: 1; +} +ul, ol { + padding: 0; + margin: 0 0 9px 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +ul { + list-style: disc; +} +ol { + list-style: decimal; +} +li { + line-height: 18px; +} +ul.unstyled, ol.unstyled { + margin-left: 0; + list-style: none; +} +dl { + margin-bottom: 18px; +} +dt, dd { + line-height: 18px; +} +dt { + font-weight: bold; +} +dd { + margin-left: 9px; +} +hr { + margin: 18px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} +strong { + font-weight: bold; +} +em { + font-style: italic; +} +.muted { + color: #999999; +} +abbr { + font-size: 90%; + text-transform: uppercase; + border-bottom: 1px dotted #ddd; + cursor: help; +} +blockquote { + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #eeeeee; +} +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 22.5px; +} +blockquote small { + display: block; + line-height: 18px; + color: #999999; +} +blockquote small:before { + content: '\2014 \00A0'; +} +blockquote.pull-right { + float: right; + padding-left: 0; + padding-right: 15px; + border-left: 0; + border-right: 5px solid #eeeeee; +} +blockquote.pull-right p, blockquote.pull-right small { + text-align: right; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} +address { + display: block; + margin-bottom: 18px; + line-height: 18px; + font-style: normal; +} +small { + font-size: 100%; +} +cite { + font-style: normal; +} +code, pre { + padding: 0 3px 2px; + font-family: Menlo, Monaco, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +code { + padding: 3px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} +pre { + display: block; + padding: 8.5px; + margin: 0 0 9px; + font-size: 12px; + line-height: 18px; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + white-space: pre; + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; +} +pre.prettyprint { + margin-bottom: 18px; +} +pre code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.label { + padding: 2px 4px 3px; + font-size: 11.049999999999999px; + font-weight: bold; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #999999; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.label:hover { + color: #ffffff; + text-decoration: none; +} +.label-important { + background-color: #b94a48; +} +.label-important:hover { + background-color: #953b39; +} +.label-warning { + background-color: #f89406; +} +.label-warning:hover { + background-color: #c67605; +} +.label-success { + background-color: #468847; +} +.label-success:hover { + background-color: #356635; +} +.label-info { + background-color: #3a87ad; +} +.label-info:hover { + background-color: #2d6987; +} +table { + max-width: 100%; + border-collapse: collapse; + border-spacing: 0; +} +.table { + width: 100%; + margin-bottom: 18px; +} +.table th, .table td { + padding: 8px; + line-height: 18px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table th { + font-weight: bold; +} +.table thead th { + vertical-align: bottom; +} +.table thead:first-child tr th, .table thead:first-child tr td { + border-top: 0; +} +.table tbody + tbody { + border-top: 2px solid #ddd; +} +.table-condensed th, .table-condensed td { + padding: 4px 5px; +} +.table-bordered { + border: 1px solid #ddd; + border-collapse: separate; + *border-collapse: collapsed; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.table-bordered th + th, +.table-bordered td + td, +.table-bordered th + td, +.table-bordered td + th { + border-left: 1px solid #ddd; +} +.table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} +.table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-radius: 4px 0 0 0; + -moz-border-radius: 4px 0 0 0; + border-radius: 4px 0 0 0; +} +.table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-radius: 0 4px 0 0; + -moz-border-radius: 0 4px 0 0; + border-radius: 0 4px 0 0; +} +.table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; +} +.table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child { + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; +} +.table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} +.table tbody tr:hover td, .table tbody tr:hover th { + background-color: #f5f5f5; +} +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} +form { + margin: 0 0 18px; +} +fieldset { + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 27px; + font-size: 19.5px; + line-height: 36px; + color: #333333; + border: 0; + border-bottom: 1px solid #eee; +} +legend small { + font-size: 13.5px; + color: #999999; +} +label, +input, +button, +select, +textarea { + font-size: 13px; + font-weight: normal; + line-height: 18px; +} +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} +label { + display: block; + margin-bottom: 5px; + color: #333333; +} +input, +textarea, +select, +.uneditable-input { + display: inline-block; + width: 210px; + height: 18px; + padding: 4px; + margin-bottom: 9px; + font-size: 13px; + line-height: 18px; + color: #555555; + border: 1px solid #ccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.uneditable-textarea { + width: auto; + height: auto; +} +label input, label textarea, label select { + display: block; +} +input[type="image"], input[type="checkbox"], input[type="radio"] { + width: auto; + height: auto; + padding: 0; + margin: 3px 0; + *margin-top: 0; + /* IE7 */ + + line-height: normal; + cursor: pointer; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + border: 0 \9; + /* IE9 and down */ + +} +input[type="image"] { + border: 0; +} +input[type="file"] { + width: auto; + padding: initial; + line-height: initial; + border: initial; + background-color: #ffffff; + background-color: initial; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +input[type="button"], input[type="reset"], input[type="submit"] { + width: auto; + height: auto; +} +select, input[type="file"] { + height: 28px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 28px; +} +input[type="file"] { + line-height: 18px \9; +} +select { + width: 220px; + background-color: #ffffff; +} +select[multiple], select[size] { + height: auto; +} +input[type="image"] { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +textarea { + height: auto; +} +input[type="hidden"] { + display: none; +} +.radio, .checkbox { + padding-left: 18px; +} +.radio input[type="radio"], .checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} +.controls > .radio:first-child, .controls > .checkbox:first-child { + padding-top: 5px; +} +.radio.inline, .checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline { + margin-left: 10px; +} +input, textarea { + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} +input:focus, textarea:focus { + border-color: rgba(82, 168, 236, 0.8); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus, +select:focus { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.input-mini { + width: 60px; +} +.input-small { + width: 90px; +} +.input-medium { + width: 150px; +} +.input-large { + width: 210px; +} +.input-xlarge { + width: 270px; +} +.input-xxlarge { + width: 530px; +} +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input { + float: none; + margin-left: 0; +} +input.span1, textarea.span1, .uneditable-input.span1 { + width: 50px; +} +input.span2, textarea.span2, .uneditable-input.span2 { + width: 130px; +} +input.span3, textarea.span3, .uneditable-input.span3 { + width: 210px; +} +input.span4, textarea.span4, .uneditable-input.span4 { + width: 290px; +} +input.span5, textarea.span5, .uneditable-input.span5 { + width: 370px; +} +input.span6, textarea.span6, .uneditable-input.span6 { + width: 450px; +} +input.span7, textarea.span7, .uneditable-input.span7 { + width: 530px; +} +input.span8, textarea.span8, .uneditable-input.span8 { + width: 610px; +} +input.span9, textarea.span9, .uneditable-input.span9 { + width: 690px; +} +input.span10, textarea.span10, .uneditable-input.span10 { + width: 770px; +} +input.span11, textarea.span11, .uneditable-input.span11 { + width: 850px; +} +input.span12, textarea.span12, .uneditable-input.span12 { + width: 930px; +} +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + background-color: #f5f5f5; + border-color: #ddd; + cursor: not-allowed; +} +.control-group.warning > label, .control-group.warning .help-block, .control-group.warning .help-inline { + color: #c09853; +} +.control-group.warning input, .control-group.warning select, .control-group.warning textarea { + color: #c09853; + border-color: #c09853; +} +.control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: 0 0 6px #dbc59e; + -moz-box-shadow: 0 0 6px #dbc59e; + box-shadow: 0 0 6px #dbc59e; +} +.control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} +.control-group.error > label, .control-group.error .help-block, .control-group.error .help-inline { + color: #b94a48; +} +.control-group.error input, .control-group.error select, .control-group.error textarea { + color: #b94a48; + border-color: #b94a48; +} +.control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: 0 0 6px #d59392; + -moz-box-shadow: 0 0 6px #d59392; + box-shadow: 0 0 6px #d59392; +} +.control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} +.control-group.success > label, .control-group.success .help-block, .control-group.success .help-inline { + color: #468847; +} +.control-group.success input, .control-group.success select, .control-group.success textarea { + color: #468847; + border-color: #468847; +} +.control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: 0 0 6px #7aba7b; + -moz-box-shadow: 0 0 6px #7aba7b; + box-shadow: 0 0 6px #7aba7b; +} +.control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} +input:focus:required:invalid, textarea:focus:required:invalid, select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} +input:focus:required:invalid:focus, textarea:focus:required:invalid:focus, select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} +.form-actions { + padding: 17px 20px 18px; + margin-top: 18px; + margin-bottom: 18px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; +} +.uneditable-input { + display: block; + background-color: #ffffff; + border-color: #eee; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + cursor: not-allowed; +} +:-moz-placeholder { + color: #999999; +} +::-webkit-input-placeholder { + color: #999999; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 0; + color: #999999; +} +.help-inline { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-bottom: 9px; + vertical-align: middle; + padding-left: 5px; +} +.input-prepend, .input-append { + margin-bottom: 5px; + *zoom: 1; +} +.input-prepend:before, +.input-append:before, +.input-prepend:after, +.input-append:after { + display: table; + content: ""; +} +.input-prepend:after, .input-append:after { + clear: both; +} +.input-prepend input, +.input-append input, +.input-prepend .uneditable-input, +.input-append .uneditable-input { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-prepend input:focus, +.input-append input:focus, +.input-prepend .uneditable-input:focus, +.input-append .uneditable-input:focus { + position: relative; + z-index: 2; +} +.input-prepend .uneditable-input, .input-append .uneditable-input { + border-left-color: #ccc; +} +.input-prepend .add-on, .input-append .add-on { + float: left; + display: block; + width: auto; + min-width: 16px; + height: 18px; + margin-right: -1px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + color: #999999; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #f5f5f5; + border: 1px solid #ccc; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-prepend .active, .input-append .active { + background-color: #a9dba9; + border-color: #46a546; +} +.input-prepend .add-on { + *margin-top: 1px; + /* IE6-7 */ + +} +.input-append input, .input-append .uneditable-input { + float: left; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-append .uneditable-input { + border-left-color: #eee; + border-right-color: #ccc; +} +.input-append .add-on { + margin-right: 0; + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-append input:first-child { + *margin-left: -160px; +} +.input-append input:first-child + .add-on { + *margin-left: -21px; +} +.search-query { + padding-left: 14px; + padding-right: 14px; + margin-bottom: 0; + -webkit-border-radius: 14px; + -moz-border-radius: 14px; + border-radius: 14px; +} +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input { + display: inline-block; + margin-bottom: 0; +} +.form-search .hide, .form-inline .hide, .form-horizontal .hide { + display: none; +} +.form-search label, +.form-inline label, +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + display: inline-block; +} +.form-search .input-append .add-on, +.form-inline .input-prepend .add-on, +.form-search .input-append .add-on, +.form-inline .input-prepend .add-on { + vertical-align: middle; +} +.form-search .radio, +.form-inline .radio, +.form-search .checkbox, +.form-inline .checkbox { + margin-bottom: 0; + vertical-align: middle; +} +.control-group { + margin-bottom: 9px; +} +legend + .control-group { + margin-top: 18px; + -webkit-margin-top-collapse: separate; +} +.form-horizontal .control-group { + margin-bottom: 18px; + *zoom: 1; +} +.form-horizontal .control-group:before, .form-horizontal .control-group:after { + display: table; + content: ""; +} +.form-horizontal .control-group:after { + clear: both; +} +.form-horizontal .control-label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} +.form-horizontal .controls { + margin-left: 160px; +} +.form-horizontal .form-actions { + padding-left: 160px; +} +.btn { + display: inline-block; + padding: 4px 10px 4px; + margin-bottom: 0; + font-size: 13px; + line-height: 18px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border: 1px solid #ccc; + border-bottom-color: #bbb; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + cursor: pointer; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + *margin-left: .3em; +} +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + background-color: #e6e6e6; +} +.btn:active, .btn.active { + background-color: #cccccc \9; +} +.btn:first-child { + *margin-left: 0; +} +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn.active, .btn:active { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + outline: 0; +} +.btn.disabled, .btn[disabled] { + cursor: default; + background-image: none; + background-color: #e6e6e6; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.btn-large [class^="icon-"] { + margin-top: 1px; +} +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} +.btn-small [class^="icon-"] { + margin-top: -1px; +} +.btn-mini { + padding: 2px 6px; + font-size: 11px; + line-height: 14px; +} +.btn-primary, +.btn-primary:hover, +.btn-warning, +.btn-warning:hover, +.btn-danger, +.btn-danger:hover, +.btn-success, +.btn-success:hover, +.btn-info, +.btn-info:hover, +.btn-inverse, +.btn-inverse:hover { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + color: #ffffff; +} +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-dark.active { + color: rgba(255, 255, 255, 0.75); +} +.btn-primary { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #0044cc; +} +.btn-primary:active, .btn-primary.active { + background-color: #003399 \9; +} +.btn-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #f89406; +} +.btn-warning:active, .btn-warning.active { + background-color: #c67605 \9; +} +.btn-danger { + background-color: #da4f49; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(top, #ee5f5b, #bd362f); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + background-color: #bd362f; +} +.btn-danger:active, .btn-danger.active { + background-color: #942a25 \9; +} +.btn-success { + background-color: #5bb75b; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -ms-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(top, #62c462, #51a351); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #51a351; +} +.btn-success:active, .btn-success.active { + background-color: #408140 \9; +} +.btn-info { + background-color: #49afcd; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(top, #5bc0de, #2f96b4); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + background-color: #2f96b4; +} +.btn-info:active, .btn-info.active { + background-color: #24748c \9; +} +.btn-inverse { + background-color: #393939; + background-image: -moz-linear-gradient(top, #454545, #262626); + background-image: -ms-linear-gradient(top, #454545, #262626); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#454545), to(#262626)); + background-image: -webkit-linear-gradient(top, #454545, #262626); + background-image: -o-linear-gradient(top, #454545, #262626); + background-image: linear-gradient(top, #454545, #262626); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#454545', endColorstr='#262626', GradientType=0); + border-color: #262626 #262626 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + background-color: #262626; +} +.btn-inverse:active, .btn-inverse.active { + background-color: #0c0c0c \9; +} +button.btn, input[type="submit"].btn { + *padding-top: 2px; + *padding-bottom: 2px; +} +button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} +button.btn.large, input[type="submit"].btn.large { + *padding-top: 7px; + *padding-bottom: 7px; +} +button.btn.small, input[type="submit"].btn.small { + *padding-top: 3px; + *padding-bottom: 3px; +} +[class^="icon-"], [class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; + *margin-right: .3em; +} +[class^="icon-"]:last-child, [class*=" icon-"]:last-child { + *margin-left: 0; +} +.icon-white { + background-image: url("../img/glyphicons-halflings-white.png"); +} +.icon-glass { + background-position: 0 0; +} +.icon-music { + background-position: -24px 0; +} +.icon-search { + background-position: -48px 0; +} +.icon-envelope { + background-position: -72px 0; +} +.icon-heart { + background-position: -96px 0; +} +.icon-star { + background-position: -120px 0; +} +.icon-star-empty { + background-position: -144px 0; +} +.icon-user { + background-position: -168px 0; +} +.icon-film { + background-position: -192px 0; +} +.icon-th-large { + background-position: -216px 0; +} +.icon-th { + background-position: -240px 0; +} +.icon-th-list { + background-position: -264px 0; +} +.icon-ok { + background-position: -288px 0; +} +.icon-remove { + background-position: -312px 0; +} +.icon-zoom-in { + background-position: -336px 0; +} +.icon-zoom-out { + background-position: -360px 0; +} +.icon-off { + background-position: -384px 0; +} +.icon-signal { + background-position: -408px 0; +} +.icon-cog { + background-position: -432px 0; +} +.icon-trash { + background-position: -456px 0; +} +.icon-home { + background-position: 0 -24px; +} +.icon-file { + background-position: -24px -24px; +} +.icon-time { + background-position: -48px -24px; +} +.icon-road { + background-position: -72px -24px; +} +.icon-download-alt { + background-position: -96px -24px; +} +.icon-download { + background-position: -120px -24px; +} +.icon-upload { + background-position: -144px -24px; +} +.icon-inbox { + background-position: -168px -24px; +} +.icon-play-circle { + background-position: -192px -24px; +} +.icon-repeat { + background-position: -216px -24px; +} +.icon-refresh { + background-position: -240px -24px; +} +.icon-list-alt { + background-position: -264px -24px; +} +.icon-lock { + background-position: -287px -24px; +} +.icon-flag { + background-position: -312px -24px; +} +.icon-headphones { + background-position: -336px -24px; +} +.icon-volume-off { + background-position: -360px -24px; +} +.icon-volume-down { + background-position: -384px -24px; +} +.icon-volume-up { + background-position: -408px -24px; +} +.icon-qrcode { + background-position: -432px -24px; +} +.icon-barcode { + background-position: -456px -24px; +} +.icon-tag { + background-position: 0 -48px; +} +.icon-tags { + background-position: -25px -48px; +} +.icon-book { + background-position: -48px -48px; +} +.icon-bookmark { + background-position: -72px -48px; +} +.icon-print { + background-position: -96px -48px; +} +.icon-camera { + background-position: -120px -48px; +} +.icon-font { + background-position: -144px -48px; +} +.icon-bold { + background-position: -167px -48px; +} +.icon-italic { + background-position: -192px -48px; +} +.icon-text-height { + background-position: -216px -48px; +} +.icon-text-width { + background-position: -240px -48px; +} +.icon-align-left { + background-position: -264px -48px; +} +.icon-align-center { + background-position: -288px -48px; +} +.icon-align-right { + background-position: -312px -48px; +} +.icon-align-justify { + background-position: -336px -48px; +} +.icon-list { + background-position: -360px -48px; +} +.icon-indent-left { + background-position: -384px -48px; +} +.icon-indent-right { + background-position: -408px -48px; +} +.icon-facetime-video { + background-position: -432px -48px; +} +.icon-picture { + background-position: -456px -48px; +} +.icon-pencil { + background-position: 0 -72px; +} +.icon-map-marker { + background-position: -24px -72px; +} +.icon-adjust { + background-position: -48px -72px; +} +.icon-tint { + background-position: -72px -72px; +} +.icon-edit { + background-position: -96px -72px; +} +.icon-share { + background-position: -120px -72px; +} +.icon-check { + background-position: -144px -72px; +} +.icon-move { + background-position: -168px -72px; +} +.icon-step-backward { + background-position: -192px -72px; +} +.icon-fast-backward { + background-position: -216px -72px; +} +.icon-backward { + background-position: -240px -72px; +} +.icon-play { + background-position: -264px -72px; +} +.icon-pause { + background-position: -288px -72px; +} +.icon-stop { + background-position: -312px -72px; +} +.icon-forward { + background-position: -336px -72px; +} +.icon-fast-forward { + background-position: -360px -72px; +} +.icon-step-forward { + background-position: -384px -72px; +} +.icon-eject { + background-position: -408px -72px; +} +.icon-chevron-left { + background-position: -432px -72px; +} +.icon-chevron-right { + background-position: -456px -72px; +} +.icon-plus-sign { + background-position: 0 -96px; +} +.icon-minus-sign { + background-position: -24px -96px; +} +.icon-remove-sign { + background-position: -48px -96px; +} +.icon-ok-sign { + background-position: -72px -96px; +} +.icon-question-sign { + background-position: -96px -96px; +} +.icon-info-sign { + background-position: -120px -96px; +} +.icon-screenshot { + background-position: -144px -96px; +} +.icon-remove-circle { + background-position: -168px -96px; +} +.icon-ok-circle { + background-position: -192px -96px; +} +.icon-ban-circle { + background-position: -216px -96px; +} +.icon-arrow-left { + background-position: -240px -96px; +} +.icon-arrow-right { + background-position: -264px -96px; +} +.icon-arrow-up { + background-position: -289px -96px; +} +.icon-arrow-down { + background-position: -312px -96px; +} +.icon-share-alt { + background-position: -336px -96px; +} +.icon-resize-full { + background-position: -360px -96px; +} +.icon-resize-small { + background-position: -384px -96px; +} +.icon-plus { + background-position: -408px -96px; +} +.icon-minus { + background-position: -433px -96px; +} +.icon-asterisk { + background-position: -456px -96px; +} +.icon-exclamation-sign { + background-position: 0 -120px; +} +.icon-gift { + background-position: -24px -120px; +} +.icon-leaf { + background-position: -48px -120px; +} +.icon-fire { + background-position: -72px -120px; +} +.icon-eye-open { + background-position: -96px -120px; +} +.icon-eye-close { + background-position: -120px -120px; +} +.icon-warning-sign { + background-position: -144px -120px; +} +.icon-plane { + background-position: -168px -120px; +} +.icon-calendar { + background-position: -192px -120px; +} +.icon-random { + background-position: -216px -120px; +} +.icon-comment { + background-position: -240px -120px; +} +.icon-magnet { + background-position: -264px -120px; +} +.icon-chevron-up { + background-position: -288px -120px; +} +.icon-chevron-down { + background-position: -313px -119px; +} +.icon-retweet { + background-position: -336px -120px; +} +.icon-shopping-cart { + background-position: -360px -120px; +} +.icon-folder-close { + background-position: -384px -120px; +} +.icon-folder-open { + background-position: -408px -120px; +} +.icon-resize-vertical { + background-position: -432px -119px; +} +.icon-resize-horizontal { + background-position: -456px -118px; +} +.btn-group { + position: relative; + *zoom: 1; + *margin-left: .3em; +} +.btn-group:before, .btn-group:after { + display: table; + content: ""; +} +.btn-group:after { + clear: both; +} +.btn-group:first-child { + *margin-left: 0; +} +.btn-group + .btn-group { + margin-left: 5px; +} +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} +.btn-group .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group .btn:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.btn-group .btn:last-child, .btn-group .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.btn-group .btn.large:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} +.btn-group .btn:hover, +.btn-group .btn:focus, +.btn-group .btn:active, +.btn-group .btn.active { + z-index: 2; +} +.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + *padding-top: 5px; + *padding-bottom: 5px; +} +.btn-group.open { + *z-index: 1000; +} +.btn-group.open .dropdown-menu { + display: block; + margin-top: 1px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} +.btn .caret { + margin-top: 7px; + margin-left: 0; +} +.btn:hover .caret, .open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.btn-primary .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} +.btn-small .caret { + margin-top: 4px; +} +.nav { + margin-left: 0; + margin-bottom: 18px; + list-style: none; +} +.nav > li > a { + display: block; +} +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} +.nav .nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} +.nav li + .nav-header { + margin-top: 9px; +} +.nav-list { + padding-left: 14px; + padding-right: 14px; + margin-bottom: 0; +} +.nav-list > li > a, .nav-list .nav-header { + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.nav-list > li > a { + padding: 3px 15px; +} +.nav-list .active > a, .nav-list .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} +.nav-list [class^="icon-"] { + margin-right: 2px; +} +.nav-tabs, .nav-pills { + *zoom: 1; +} +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; +} +.nav-tabs:after, .nav-pills:after { + clear: both; +} +.nav-tabs > li, .nav-pills > li { + float: left; +} +.nav-tabs > li > a, .nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + margin-bottom: -1px; +} +.nav-tabs > li > a { + padding-top: 9px; + padding-bottom: 9px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} +.nav-tabs > .active > a, .nav-tabs > .active > a:hover { + color: #555555; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.nav-pills .active > a, .nav-pills .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; +} +.nav-tabs.nav-stacked { + border-bottom: 0; +} +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.nav-tabs.nav-stacked > li > a:hover { + border-color: #ddd; + z-index: 2; +} +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} +.nav-tabs .dropdown-menu, .nav-pills .dropdown-menu { + margin-top: 1px; + border-width: 1px; +} +.nav-pills .dropdown-menu { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.nav-tabs .dropdown-toggle .caret, .nav-pills .dropdown-toggle .caret { + border-top-color: #0088cc; + margin-top: 6px; +} +.nav-tabs .dropdown-toggle:hover .caret, .nav-pills .dropdown-toggle:hover .caret { + border-top-color: #005580; +} +.nav-tabs .active .dropdown-toggle .caret, .nav-pills .active .dropdown-toggle .caret { + border-top-color: #333333; +} +.nav > .dropdown.active > a:hover { + color: #000000; + cursor: pointer; +} +.nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > .open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} +.nav .open .caret, .nav .open.active .caret, .nav .open a:hover .caret { + border-top-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} +.tabs-stacked .open > a:hover { + border-color: #999999; +} +.tabbable { + *zoom: 1; +} +.tabbable:before, .tabbable:after { + display: table; + content: ""; +} +.tabbable:after { + clear: both; +} +.tab-content { + overflow: hidden; +} +.tabs-below .nav-tabs, .tabs-right .nav-tabs, .tabs-left .nav-tabs { + border-bottom: 0; +} +.tab-content > .tab-pane, .pill-content > .pill-pane { + display: none; +} +.tab-content > .active, .pill-content > .active { + display: block; +} +.tabs-below .nav-tabs { + border-top: 1px solid #ddd; +} +.tabs-below .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} +.tabs-below .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-below .nav-tabs > li > a:hover { + border-bottom-color: transparent; + border-top-color: #ddd; +} +.tabs-below .nav-tabs .active > a, .tabs-below .nav-tabs .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} +.tabs-left .nav-tabs > li, .tabs-right .nav-tabs > li { + float: none; +} +.tabs-left .nav-tabs > li > a, .tabs-right .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} +.tabs-left .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} +.tabs-left .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-left .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} +.tabs-left .nav-tabs .active > a, .tabs-left .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} +.tabs-right .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} +.tabs-right .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-right .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} +.tabs-right .nav-tabs .active > a, .tabs-right .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} +.navbar { + overflow: visible; + margin-bottom: 18px; +} +.navbar-inner { + padding-left: 20px; + padding-right: 20px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} +.btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-left: 5px; + margin-right: 5px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} +.btn-navbar:hover, +.btn-navbar:active, +.btn-navbar.active, +.btn-navbar.disabled, +.btn-navbar[disabled] { + background-color: #222222; +} +.btn-navbar:active, .btn-navbar.active { + background-color: #080808 \9; +} +.btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} +.nav-collapse.collapse { + height: auto; +} +.navbar .brand:hover { + text-decoration: none; +} +.navbar .brand { + float: left; + display: block; + padding: 8px 20px 12px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + line-height: 1; + color: #ffffff; +} +.navbar .navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #999999; +} +.navbar .navbar-text a:hover { + color: #ffffff; + background-color: transparent; +} +.navbar .btn, .navbar .btn-group { + margin-top: 5px; +} +.navbar .btn-group .btn { + margin-top: 0; +} +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} +.navbar-form:before, .navbar-form:after { + display: table; + content: ""; +} +.navbar-form:after { + clear: both; +} +.navbar-form input, .navbar-form select { + display: inline-block; + margin-top: 5px; + margin-bottom: 0; +} +.navbar-form .radio, .navbar-form .checkbox { + margin-top: 5px; +} +.navbar-form input[type="image"], .navbar-form input[type="checkbox"], .navbar-form input[type="radio"] { + margin-top: 3px; +} +.navbar-form .input-append, .navbar-form .input-prepend { + margin-top: 6px; + white-space: nowrap; +} +.navbar-form .input-append input, .navbar-form .input-prepend input { + margin-top: 0; +} +.navbar-search { + position: relative; + float: left; + margin-top: 6px; + margin-bottom: 0; +} +.navbar-search .search-query { + padding: 4px 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + color: #ffffff; + color: rgba(255, 255, 255, 0.75); + background: #666; + background: rgba(255, 255, 255, 0.3); + border: 1px solid #111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} +.navbar-search .search-query :-moz-placeholder { + color: #eeeeee; +} +.navbar-search .search-query::-webkit-input-placeholder { + color: #eeeeee; +} +.navbar-search .search-query:hover { + color: #ffffff; + background-color: #999999; + background-color: rgba(255, 255, 255, 0.5); +} +.navbar-search .search-query:focus, .navbar-search .search-query.focused { + padding: 5px 10px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + outline: 0; +} +.navbar-fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} +.navbar-fixed-top .navbar-inner { + padding-left: 0; + padding-right: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} +.navbar .nav.pull-right { + float: right; +} +.navbar .nav > li { + display: block; + float: left; +} +.navbar .nav > li > a { + float: none; + padding: 10px 10px 11px; + line-height: 19px; + color: #999999; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.navbar .nav > li > a:hover { + background-color: transparent; + color: #ffffff; + text-decoration: none; +} +.navbar .nav .active > a, .navbar .nav .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #222222; +} +.navbar .divider-vertical { + height: 40px; + width: 1px; + margin: 0 9px; + overflow: hidden; + background-color: #222222; + border-right: 1px solid #333333; +} +.navbar .nav.pull-right { + margin-left: 10px; + margin-right: 0; +} +.navbar .dropdown-menu { + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.navbar .dropdown-menu:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 9px; +} +.navbar .dropdown-menu:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 10px; +} +.navbar .nav .dropdown-toggle .caret, .navbar .nav .open.dropdown .caret { + border-top-color: #ffffff; +} +.navbar .nav .active .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.navbar .nav .open > .dropdown-toggle, .navbar .nav .active > .dropdown-toggle, .navbar .nav .open.active > .dropdown-toggle { + background-color: transparent; +} +.navbar .nav .active > .dropdown-toggle:hover { + color: #ffffff; +} +.navbar .nav.pull-right .dropdown-menu { + left: auto; + right: 0; +} +.navbar .nav.pull-right .dropdown-menu:before { + left: auto; + right: 12px; +} +.navbar .nav.pull-right .dropdown-menu:after { + left: auto; + right: 13px; +} +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + background-color: #fbfbfb; + background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); + background-image: linear-gradient(top, #ffffff, #f5f5f5); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); + border: 1px solid #ddd; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} +.breadcrumb li { + display: inline-block; + text-shadow: 0 1px 0 #ffffff; +} +.breadcrumb .divider { + padding: 0 5px; + color: #999999; +} +.breadcrumb .active a { + color: #333333; +} +.pagination { + height: 36px; + margin: 18px 0; +} +.pagination ul { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-left: 0; + margin-bottom: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.pagination li { + display: inline; +} +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + text-decoration: none; + border: 1px solid #ddd; + border-left-width: 0; +} +.pagination a:hover, .pagination .active a { + background-color: #f5f5f5; +} +.pagination .active a { + color: #999999; + cursor: default; +} +.pagination .disabled a, .pagination .disabled a:hover { + color: #999999; + background-color: transparent; + cursor: default; +} +.pagination li:first-child a { + border-left-width: 1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.pagination li:last-child a { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.pagination-centered { + text-align: center; +} +.pagination-right { + text-align: right; +} +.pager { + margin-left: 0; + margin-bottom: 18px; + list-style: none; + text-align: center; + *zoom: 1; +} +.pager:before, .pager:after { + display: table; + content: ""; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager a { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} +.pager .next a { + float: right; +} +.pager .previous a { + float: left; +} +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} +.thumbnails:before, .thumbnails:after { + display: table; + content: ""; +} +.thumbnails:after { + clear: both; +} +.thumbnails > li { + float: left; + margin: 0 0 18px 20px; +} +.thumbnail { + display: block; + padding: 4px; + line-height: 1; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); +} +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} +.thumbnail > img { + display: block; + max-width: 100%; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; +} +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 18px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.alert, .alert-heading { + color: #c09853; +} +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 18px; +} +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success, .alert-success .alert-heading { + color: #468847; +} +.alert-danger, .alert-error { + background-color: #f2dede; + border-color: #eed3d7; +} +.alert-danger, +.alert-error, +.alert-danger .alert-heading, +.alert-error .alert-heading { + color: #b94a48; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info, .alert-info .alert-heading { + color: #3a87ad; +} +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} +.alert-block > p, .alert-block > ul { + margin-bottom: 0; +} +.alert-block p + p { + margin-top: 5px; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@-moz-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +.progress { + overflow: hidden; + height: 18px; + margin-bottom: 18px; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(top, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.progress .bar { + width: 0%; + height: 18px; + color: #ffffff; + font-size: 12px; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -ms-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(top, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -ms-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .bar { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-danger .bar { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(top, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); +} +.progress-danger.progress-striped .bar { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-success .bar { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -ms-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(top, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); +} +.progress-success.progress-striped .bar { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-info .bar { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(top, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); +} +.progress-info.progress-striped .bar { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: #f5f5f5; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; +} +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 27px; +} +/*! + * Bootstrap Responsive v2.0.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +.hidden { + display: none; + visibility: hidden; +} +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 18px; + } + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 28px; + /* Make inputs at least the height of their button counterpart */ + + /* Makes inputs behave like true block-level elements */ + + -webkit-box-sizing: border-box; + /* Older Webkit */ + + -moz-box-sizing: border-box; + /* Older FF */ + + -ms-box-sizing: border-box; + /* IE8 */ + + box-sizing: border-box; + /* CSS3 spec*/ + + } + .input-prepend input[class*="span"], .input-append input[class*="span"] { + width: auto; + } + input[type="checkbox"], input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-group > label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-left: 10px; + padding-right: 10px; + } + .modal { + position: absolute; + top: 10px; + left: 10px; + right: 10px; + width: auto; + margin: 0; + } + .modal.fade.in { + top: auto; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} +@media (max-width: 767px) { + .container { + width: auto; + padding: 0 20px; + } + .row-fluid { + width: 100%; + } + .row { + margin-left: 0; + } + .row > [class*="span"], .row-fluid > [class*="span"] { + float: none; + display: block; + width: auto; + margin: 0; + } +} +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, .row:after { + display: table; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + margin-left: 20px; + } + .span1 { + width: 42px; + } + .span2 { + width: 104px; + } + .span3 { + width: 166px; + } + .span4 { + width: 228px; + } + .span5 { + width: 290px; + } + .span6 { + width: 352px; + } + .span7 { + width: 414px; + } + .span8 { + width: 476px; + } + .span9 { + width: 538px; + } + .span10 { + width: 600px; + } + .span11 { + width: 662px; + } + .span12, .container { + width: 724px; + } + .offset1 { + margin-left: 82px; + } + .offset2 { + margin-left: 144px; + } + .offset3 { + margin-left: 206px; + } + .offset4 { + margin-left: 268px; + } + .offset5 { + margin-left: 330px; + } + .offset6 { + margin-left: 392px; + } + .offset7 { + margin-left: 454px; + } + .offset8 { + margin-left: 516px; + } + .offset9 { + margin-left: 578px; + } + .offset10 { + margin-left: 640px; + } + .offset11 { + margin-left: 702px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, .row-fluid:after { + display: table; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid > [class*="span"] { + float: left; + margin-left: 2.762430939%; + } + .row-fluid > [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid > .span1 { + width: 5.801104972%; + } + .row-fluid > .span2 { + width: 14.364640883%; + } + .row-fluid > .span3 { + width: 22.928176794%; + } + .row-fluid > .span4 { + width: 31.491712705%; + } + .row-fluid > .span5 { + width: 40.055248616%; + } + .row-fluid > .span6 { + width: 48.618784527%; + } + .row-fluid > .span7 { + width: 57.182320438000005%; + } + .row-fluid > .span8 { + width: 65.74585634900001%; + } + .row-fluid > .span9 { + width: 74.30939226%; + } + .row-fluid > .span10 { + width: 82.87292817100001%; + } + .row-fluid > .span11 { + width: 91.436464082%; + } + .row-fluid > .span12 { + width: 99.999999993%; + } + input.span1, textarea.span1, .uneditable-input.span1 { + width: 32px; + } + input.span2, textarea.span2, .uneditable-input.span2 { + width: 94px; + } + input.span3, textarea.span3, .uneditable-input.span3 { + width: 156px; + } + input.span4, textarea.span4, .uneditable-input.span4 { + width: 218px; + } + input.span5, textarea.span5, .uneditable-input.span5 { + width: 280px; + } + input.span6, textarea.span6, .uneditable-input.span6 { + width: 342px; + } + input.span7, textarea.span7, .uneditable-input.span7 { + width: 404px; + } + input.span8, textarea.span8, .uneditable-input.span8 { + width: 466px; + } + input.span9, textarea.span9, .uneditable-input.span9 { + width: 528px; + } + input.span10, textarea.span10, .uneditable-input.span10 { + width: 590px; + } + input.span11, textarea.span11, .uneditable-input.span11 { + width: 652px; + } + input.span12, textarea.span12, .uneditable-input.span12 { + width: 714px; + } +} +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top { + position: static; + margin-bottom: 18px; + } + .navbar-fixed-top .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-left: 10px; + padding-right: 10px; + margin: 0 0 0 -5px; + } + .navbar .nav-collapse { + clear: left; + } + .navbar .nav { + float: none; + margin: 0 0 9px; + } + .navbar .nav > li { + float: none; + } + .navbar .nav > li > a { + margin-bottom: 2px; + } + .navbar .nav > .divider-vertical { + display: none; + } + .navbar .nav .nav-header { + color: #999999; + text-shadow: none; + } + .navbar .nav > li > a, .navbar .dropdown-menu a { + padding: 6px 15px; + font-weight: bold; + color: #999999; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .navbar .dropdown-menu li + li a { + margin-bottom: 2px; + } + .navbar .nav > li > a:hover, .navbar .dropdown-menu a:hover { + background-color: #222222; + } + .navbar .dropdown-menu { + position: static; + top: auto; + left: auto; + float: none; + display: block; + max-width: none; + margin: 0 15px; + padding: 0; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .navbar .dropdown-menu:before, .navbar .dropdown-menu:after { + display: none; + } + .navbar .dropdown-menu .divider { + display: none; + } + .navbar-form, .navbar-search { + float: none; + padding: 9px 15px; + margin: 9px 0; + border-top: 1px solid #222222; + border-bottom: 1px solid #222222; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar .nav.pull-right { + float: none; + margin-left: 0; + } + .navbar-static .navbar-inner { + padding-left: 10px; + padding-right: 10px; + } + .btn-navbar { + display: block; + } + .nav-collapse { + overflow: hidden; + height: 0; + } +} +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + } +} +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, .row:after { + display: table; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + margin-left: 30px; + } + .span1 { + width: 70px; + } + .span2 { + width: 170px; + } + .span3 { + width: 270px; + } + .span4 { + width: 370px; + } + .span5 { + width: 470px; + } + .span6 { + width: 570px; + } + .span7 { + width: 670px; + } + .span8 { + width: 770px; + } + .span9 { + width: 870px; + } + .span10 { + width: 970px; + } + .span11 { + width: 1070px; + } + .span12, .container { + width: 1170px; + } + .offset1 { + margin-left: 130px; + } + .offset2 { + margin-left: 230px; + } + .offset3 { + margin-left: 330px; + } + .offset4 { + margin-left: 430px; + } + .offset5 { + margin-left: 530px; + } + .offset6 { + margin-left: 630px; + } + .offset7 { + margin-left: 730px; + } + .offset8 { + margin-left: 830px; + } + .offset9 { + margin-left: 930px; + } + .offset10 { + margin-left: 1030px; + } + .offset11 { + margin-left: 1130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, .row-fluid:after { + display: table; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid > [class*="span"] { + float: left; + margin-left: 2.564102564%; + } + .row-fluid > [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid > .span1 { + width: 5.982905983%; + } + .row-fluid > .span2 { + width: 14.529914530000001%; + } + .row-fluid > .span3 { + width: 23.076923077%; + } + .row-fluid > .span4 { + width: 31.623931624%; + } + .row-fluid > .span5 { + width: 40.170940171000005%; + } + .row-fluid > .span6 { + width: 48.717948718%; + } + .row-fluid > .span7 { + width: 57.264957265%; + } + .row-fluid > .span8 { + width: 65.81196581200001%; + } + .row-fluid > .span9 { + width: 74.358974359%; + } + .row-fluid > .span10 { + width: 82.905982906%; + } + .row-fluid > .span11 { + width: 91.45299145300001%; + } + .row-fluid > .span12 { + width: 100%; + } + input.span1, textarea.span1, .uneditable-input.span1 { + width: 60px; + } + input.span2, textarea.span2, .uneditable-input.span2 { + width: 160px; + } + input.span3, textarea.span3, .uneditable-input.span3 { + width: 260px; + } + input.span4, textarea.span4, .uneditable-input.span4 { + width: 360px; + } + input.span5, textarea.span5, .uneditable-input.span5 { + width: 460px; + } + input.span6, textarea.span6, .uneditable-input.span6 { + width: 560px; + } + input.span7, textarea.span7, .uneditable-input.span7 { + width: 660px; + } + input.span8, textarea.span8, .uneditable-input.span8 { + width: 760px; + } + input.span9, textarea.span9, .uneditable-input.span9 { + width: 860px; + } + input.span10, textarea.span10, .uneditable-input.span10 { + width: 960px; + } + input.span11, textarea.span11, .uneditable-input.span11 { + width: 1060px; + } + input.span12, textarea.span12, .uneditable-input.span12 { + width: 1160px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } +} diff --git a/css/bootstrap.min.css b/css/bootstrap.min.css new file mode 100755 index 0000000..88428b4 --- /dev/null +++ b/css/bootstrap.min.css @@ -0,0 +1,563 @@ +/*! + * Bootstrap v2.0.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";} +.clearfix:after{clear:both;} +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover{color:#005580;text-decoration:underline;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} +.row:after{clear:both;} +[class*="span"]{float:left;margin-left:20px;} +.span1{width:60px;} +.span2{width:140px;} +.span3{width:220px;} +.span4{width:300px;} +.span5{width:380px;} +.span6{width:460px;} +.span7{width:540px;} +.span8{width:620px;} +.span9{width:700px;} +.span10{width:780px;} +.span11{width:860px;} +.span12,.container{width:940px;} +.offset1{margin-left:100px;} +.offset2{margin-left:180px;} +.offset3{margin-left:260px;} +.offset4{margin-left:340px;} +.offset5{margin-left:420px;} +.offset6{margin-left:500px;} +.offset7{margin-left:580px;} +.offset8{margin-left:660px;} +.offset9{margin-left:740px;} +.offset10{margin-left:820px;} +.offset11{margin-left:900px;} +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} +.row-fluid:after{clear:both;} +.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} +.row-fluid>[class*="span"]:first-child{margin-left:0;} +.row-fluid>.span1{width:6.382978723%;} +.row-fluid>.span2{width:14.89361702%;} +.row-fluid>.span3{width:23.404255317%;} +.row-fluid>.span4{width:31.914893614%;} +.row-fluid>.span5{width:40.425531911%;} +.row-fluid>.span6{width:48.93617020799999%;} +.row-fluid>.span7{width:57.446808505%;} +.row-fluid>.span8{width:65.95744680199999%;} +.row-fluid>.span9{width:74.468085099%;} +.row-fluid>.span10{width:82.97872339599999%;} +.row-fluid>.span11{width:91.489361693%;} +.row-fluid>.span12{width:99.99999998999999%;} +.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} +.container:after{clear:both;} +.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} +.container-fluid:after{clear:both;} +p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} +.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} +h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} +h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} +h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} +h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} +h4,h5,h6{line-height:18px;} +h4{font-size:14px;}h4 small{font-size:12px;} +h5{font-size:12px;} +h6{font-size:11px;color:#999999;text-transform:uppercase;} +.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} +.page-header h1{line-height:1;} +ul,ol{padding:0;margin:0 0 9px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +ul{list-style:disc;} +ol{list-style:decimal;} +li{line-height:18px;} +ul.unstyled,ol.unstyled{margin-left:0;list-style:none;} +dl{margin-bottom:18px;} +dt,dd{line-height:18px;} +dt{font-weight:bold;} +dd{margin-left:9px;} +hr{margin:18px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} +strong{font-weight:bold;} +em{font-style:italic;} +.muted{color:#999999;} +abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} +blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} +blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} +small{font-size:100%;} +cite{font-style:normal;} +code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} +pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;}pre.prettyprint{margin-bottom:18px;} +pre code{padding:0;color:inherit;background-color:transparent;border:0;} +.pre-scrollable{max-height:340px;overflow-y:scroll;} +.label{padding:2px 4px 3px;font-size:11.049999999999999px;font-weight:bold;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.label:hover{color:#ffffff;text-decoration:none;} +.label-important{background-color:#b94a48;} +.label-important:hover{background-color:#953b39;} +.label-warning{background-color:#f89406;} +.label-warning:hover{background-color:#c67605;} +.label-success{background-color:#468847;} +.label-success:hover{background-color:#356635;} +.label-info{background-color:#3a87ad;} +.label-info:hover{background-color:#2d6987;} +table{max-width:100%;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #ddd;} +.table th{font-weight:bold;} +.table thead th{vertical-align:bottom;} +.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} +.table tbody+tbody{border-top:2px solid #ddd;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} +.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +.table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;} +table .span1{float:none;width:44px;margin-left:0;} +table .span2{float:none;width:124px;margin-left:0;} +table .span3{float:none;width:204px;margin-left:0;} +table .span4{float:none;width:284px;margin-left:0;} +table .span5{float:none;width:364px;margin-left:0;} +table .span6{float:none;width:444px;margin-left:0;} +table .span7{float:none;width:524px;margin-left:0;} +table .span8{float:none;width:604px;margin-left:0;} +table .span9{float:none;width:684px;margin-left:0;} +table .span10{float:none;width:764px;margin-left:0;} +table .span11{float:none;width:844px;margin-left:0;} +table .span12{float:none;width:924px;margin-left:0;} +form{margin:0 0 18px;} +fieldset{padding:0;margin:0;border:0;} +legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}legend small{font-size:13.5px;color:#999999;} +label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;} +input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} +label{display:block;margin-bottom:5px;color:#333333;} +input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.uneditable-textarea{width:auto;height:auto;} +label input,label textarea,label select{display:block;} +input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0 \9;} +input[type="image"]{border:0;} +input[type="file"]{width:auto;padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} +select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} +input[type="file"]{line-height:18px \9;} +select{width:220px;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +textarea{height:auto;} +input[type="hidden"]{display:none;} +.radio,.checkbox{padding-left:18px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} +input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} +input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} +input.span1,textarea.span1,.uneditable-input.span1{width:50px;} +input.span2,textarea.span2,.uneditable-input.span2{width:130px;} +input.span3,textarea.span3,.uneditable-input.span3{width:210px;} +input.span4,textarea.span4,.uneditable-input.span4{width:290px;} +input.span5,textarea.span5,.uneditable-input.span5{width:370px;} +input.span6,textarea.span6,.uneditable-input.span6{width:450px;} +input.span7,textarea.span7,.uneditable-input.span7{width:530px;} +input.span8,textarea.span8,.uneditable-input.span8{width:610px;} +input.span9,textarea.span9,.uneditable-input.span9{width:690px;} +input.span10,textarea.span10,.uneditable-input.span10{width:770px;} +input.span11,textarea.span11,.uneditable-input.span11{width:850px;} +input.span12,textarea.span12,.uneditable-input.span12{width:930px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} +.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +:-moz-placeholder{color:#999999;} +::-webkit-input-placeholder{color:#999999;} +.help-block{display:block;margin-top:5px;margin-bottom:0;color:#999999;} +.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} +.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} +.input-prepend:after,.input-append:after{clear:both;} +.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} +.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} +.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on{*margin-top:1px;} +.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-append .uneditable-input{border-left-color:#eee;border-right-color:#ccc;} +.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} +.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} +.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;} +.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} +.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} +.form-search .radio,.form-inline .radio,.form-search .checkbox,.form-inline .checkbox{margin-bottom:0;vertical-align:middle;} +.control-group{margin-bottom:9px;} +legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;} +.form-horizontal .controls{margin-left:160px;} +.form-horizontal .form-actions{padding-left:160px;} +.btn{display:inline-block;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-ms-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(top, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);*margin-left:.3em;}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;} +.btn:active,.btn.active{background-color:#cccccc \9;} +.btn:first-child{*margin-left:0;} +.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;outline:0;} +.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-large [class^="icon-"]{margin-top:1px;} +.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} +.btn-small [class^="icon-"]{margin-top:-1px;} +.btn-mini{padding:2px 6px;font-size:11px;line-height:14px;} +.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-dark.active{color:rgba(255, 255, 255, 0.75);} +.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +.btn-inverse{background-color:#393939;background-image:-moz-linear-gradient(top, #454545, #262626);background-image:-ms-linear-gradient(top, #454545, #262626);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#454545), to(#262626));background-image:-webkit-linear-gradient(top, #454545, #262626);background-image:-o-linear-gradient(top, #454545, #262626);background-image:linear-gradient(top, #454545, #262626);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#454545', endColorstr='#262626', GradientType=0);border-color:#262626 #262626 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#262626;} +.btn-inverse:active,.btn-inverse.active{background-color:#0c0c0c \9;} +button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} +button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} +[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0;} +.icon-white{background-image:url("../img/glyphicons-halflings-white.png");} +.icon-glass{background-position:0 0;} +.icon-music{background-position:-24px 0;} +.icon-search{background-position:-48px 0;} +.icon-envelope{background-position:-72px 0;} +.icon-heart{background-position:-96px 0;} +.icon-star{background-position:-120px 0;} +.icon-star-empty{background-position:-144px 0;} +.icon-user{background-position:-168px 0;} +.icon-film{background-position:-192px 0;} +.icon-th-large{background-position:-216px 0;} +.icon-th{background-position:-240px 0;} +.icon-th-list{background-position:-264px 0;} +.icon-ok{background-position:-288px 0;} +.icon-remove{background-position:-312px 0;} +.icon-zoom-in{background-position:-336px 0;} +.icon-zoom-out{background-position:-360px 0;} +.icon-off{background-position:-384px 0;} +.icon-signal{background-position:-408px 0;} +.icon-cog{background-position:-432px 0;} +.icon-trash{background-position:-456px 0;} +.icon-home{background-position:0 -24px;} +.icon-file{background-position:-24px -24px;} +.icon-time{background-position:-48px -24px;} +.icon-road{background-position:-72px -24px;} +.icon-download-alt{background-position:-96px -24px;} +.icon-download{background-position:-120px -24px;} +.icon-upload{background-position:-144px -24px;} +.icon-inbox{background-position:-168px -24px;} +.icon-play-circle{background-position:-192px -24px;} +.icon-repeat{background-position:-216px -24px;} +.icon-refresh{background-position:-240px -24px;} +.icon-list-alt{background-position:-264px -24px;} +.icon-lock{background-position:-287px -24px;} +.icon-flag{background-position:-312px -24px;} +.icon-headphones{background-position:-336px -24px;} +.icon-volume-off{background-position:-360px -24px;} +.icon-volume-down{background-position:-384px -24px;} +.icon-volume-up{background-position:-408px -24px;} +.icon-qrcode{background-position:-432px -24px;} +.icon-barcode{background-position:-456px -24px;} +.icon-tag{background-position:0 -48px;} +.icon-tags{background-position:-25px -48px;} +.icon-book{background-position:-48px -48px;} +.icon-bookmark{background-position:-72px -48px;} +.icon-print{background-position:-96px -48px;} +.icon-camera{background-position:-120px -48px;} +.icon-font{background-position:-144px -48px;} +.icon-bold{background-position:-167px -48px;} +.icon-italic{background-position:-192px -48px;} +.icon-text-height{background-position:-216px -48px;} +.icon-text-width{background-position:-240px -48px;} +.icon-align-left{background-position:-264px -48px;} +.icon-align-center{background-position:-288px -48px;} +.icon-align-right{background-position:-312px -48px;} +.icon-align-justify{background-position:-336px -48px;} +.icon-list{background-position:-360px -48px;} +.icon-indent-left{background-position:-384px -48px;} +.icon-indent-right{background-position:-408px -48px;} +.icon-facetime-video{background-position:-432px -48px;} +.icon-picture{background-position:-456px -48px;} +.icon-pencil{background-position:0 -72px;} +.icon-map-marker{background-position:-24px -72px;} +.icon-adjust{background-position:-48px -72px;} +.icon-tint{background-position:-72px -72px;} +.icon-edit{background-position:-96px -72px;} +.icon-share{background-position:-120px -72px;} +.icon-check{background-position:-144px -72px;} +.icon-move{background-position:-168px -72px;} +.icon-step-backward{background-position:-192px -72px;} +.icon-fast-backward{background-position:-216px -72px;} +.icon-backward{background-position:-240px -72px;} +.icon-play{background-position:-264px -72px;} +.icon-pause{background-position:-288px -72px;} +.icon-stop{background-position:-312px -72px;} +.icon-forward{background-position:-336px -72px;} +.icon-fast-forward{background-position:-360px -72px;} +.icon-step-forward{background-position:-384px -72px;} +.icon-eject{background-position:-408px -72px;} +.icon-chevron-left{background-position:-432px -72px;} +.icon-chevron-right{background-position:-456px -72px;} +.icon-plus-sign{background-position:0 -96px;} +.icon-minus-sign{background-position:-24px -96px;} +.icon-remove-sign{background-position:-48px -96px;} +.icon-ok-sign{background-position:-72px -96px;} +.icon-question-sign{background-position:-96px -96px;} +.icon-info-sign{background-position:-120px -96px;} +.icon-screenshot{background-position:-144px -96px;} +.icon-remove-circle{background-position:-168px -96px;} +.icon-ok-circle{background-position:-192px -96px;} +.icon-ban-circle{background-position:-216px -96px;} +.icon-arrow-left{background-position:-240px -96px;} +.icon-arrow-right{background-position:-264px -96px;} +.icon-arrow-up{background-position:-289px -96px;} +.icon-arrow-down{background-position:-312px -96px;} +.icon-share-alt{background-position:-336px -96px;} +.icon-resize-full{background-position:-360px -96px;} +.icon-resize-small{background-position:-384px -96px;} +.icon-plus{background-position:-408px -96px;} +.icon-minus{background-position:-433px -96px;} +.icon-asterisk{background-position:-456px -96px;} +.icon-exclamation-sign{background-position:0 -120px;} +.icon-gift{background-position:-24px -120px;} +.icon-leaf{background-position:-48px -120px;} +.icon-fire{background-position:-72px -120px;} +.icon-eye-open{background-position:-96px -120px;} +.icon-eye-close{background-position:-120px -120px;} +.icon-warning-sign{background-position:-144px -120px;} +.icon-plane{background-position:-168px -120px;} +.icon-calendar{background-position:-192px -120px;} +.icon-random{background-position:-216px -120px;} +.icon-comment{background-position:-240px -120px;} +.icon-magnet{background-position:-264px -120px;} +.icon-chevron-up{background-position:-288px -120px;} +.icon-chevron-down{background-position:-313px -119px;} +.icon-retweet{background-position:-336px -120px;} +.icon-shopping-cart{background-position:-360px -120px;} +.icon-folder-close{background-position:-384px -120px;} +.icon-folder-open{background-position:-408px -120px;} +.icon-resize-vertical{background-position:-432px -119px;} +.icon-resize-horizontal{background-position:-456px -118px;} +.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} +.btn-group:after{clear:both;} +.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} +.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} +.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} +.btn .caret{margin-top:7px;margin-left:0;} +.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} +.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} +.btn-small .caret{margin-top:4px;} +.nav{margin-left:0;margin-bottom:18px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} +.nav .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} +.nav li+.nav-header{margin-top:9px;} +.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list>li>a{padding:3px 15px;} +.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.nav-list [class^="icon-"]{margin-right:2px;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} +.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} +.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} +.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} +.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} +.tabbable:after{clear:both;} +.tab-content{overflow:hidden;} +.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below .nav-tabs{border-top:1px solid #ddd;} +.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} +.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} +.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} +.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.navbar{overflow:visible;margin-bottom:18px;} +.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} +.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} +.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} +.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.nav-collapse.collapse{height:auto;} +.navbar .brand:hover{text-decoration:none;} +.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} +.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} +.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;} +.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} +.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} +.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} +.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} +.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;} +.navbar .nav>li{display:block;float:left;} +.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} +.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} +.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;} +.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} +.navbar .nav.pull-right{margin-left:10px;margin-right:0;} +.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} +.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} +.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} +.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} +.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} +.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} +.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline-block;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#999999;} +.breadcrumb .active a{color:#333333;} +.pagination{height:36px;margin:18px 0;} +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination li{display:inline;} +.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} +.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} +.pagination .active a{color:#999999;cursor:default;} +.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} +.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} +.pager:after{clear:both;} +.pager li{display:inline;} +.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.pager a:hover{text-decoration:none;background-color:#f5f5f5;} +.pager .next a{float:right;} +.pager .previous a{float:left;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} +.thumbnails:after{clear:both;} +.thumbnails>li{float:left;margin:0 0 18px 20px;} +.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} +a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;} +.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.alert,.alert-heading{color:#c09853;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} +.alert-success,.alert-success .alert-heading{color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} +.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;} +.alert-info,.alert-info .alert-heading{color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} +.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} +.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} +.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} +.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +.hidden{display:none;visibility:hidden;} +@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:767px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid>.span1{width:5.801104972%;} .row-fluid>.span2{width:14.364640883%;} .row-fluid>.span3{width:22.928176794%;} .row-fluid>.span4{width:31.491712705%;} .row-fluid>.span5{width:40.055248616%;} .row-fluid>.span6{width:48.618784527%;} .row-fluid>.span7{width:57.182320438000005%;} .row-fluid>.span8{width:65.74585634900001%;} .row-fluid>.span9{width:74.30939226%;} .row-fluid>.span10{width:82.87292817100001%;} .row-fluid>.span11{width:91.436464082%;} .row-fluid>.span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav .nav-header{color:#999999;text-shadow:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid>.span1{width:5.982905983%;} .row-fluid>.span2{width:14.529914530000001%;} .row-fluid>.span3{width:23.076923077%;} .row-fluid>.span4{width:31.623931624%;} .row-fluid>.span5{width:40.170940171000005%;} .row-fluid>.span6{width:48.717948718%;} .row-fluid>.span7{width:57.264957265%;} .row-fluid>.span8{width:65.81196581200001%;} .row-fluid>.span9{width:74.358974359%;} .row-fluid>.span10{width:82.905982906%;} .row-fluid>.span11{width:91.45299145300001%;} .row-fluid>.span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/css/jquery.qtip.css b/css/jquery.qtip.css new file mode 100644 index 0000000..dd306e4 --- /dev/null +++ b/css/jquery.qtip.css @@ -0,0 +1,37 @@ +/* qTip2 v2.1.1 basic css3 | qtip2.com | Licensed MIT, GPL | Thu Jul 11 2013 14:03:02 */ +.qtip{position:absolute;left:-28000px;top:-28000px;display:none;max-width:280px;min-width:50px;font-size:10.5px;line-height:12px;direction:ltr;box-shadow:none;padding:0}.qtip-content{position:relative;padding:5px 9px;overflow:hidden;text-align:left;word-wrap:break-word}.qtip-titlebar{position:relative;padding:5px 35px 5px 10px;overflow:hidden;border-width:0 0 1px;font-weight:700}.qtip-titlebar+.qtip-content{border-top-width:0!important}.qtip-close{position:absolute;right:-9px;top:-9px;cursor:pointer;outline:medium none;border-width:1px;border-style:solid;border-color:transparent}.qtip-titlebar .qtip-close{right:4px;top:50%;margin-top:-9px}* html .qtip-titlebar .qtip-close{top:16px}.qtip-titlebar .ui-icon,.qtip-icon .ui-icon{display:block;text-indent:-1000em;direction:ltr}.qtip-icon,.qtip-icon .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;text-decoration:none}.qtip-icon .ui-icon{width:18px;height:14px;line-height:14px;text-align:center;text-indent:0;font:400 bold 10px/13px Tahoma,sans-serif;color:inherit;background:transparent none no-repeat -100em -100em}.qtip-focus{}.qtip-hover{}.qtip-default{border-width:1px;border-style:solid;border-color:#F1D031;background-color:#FFFFA3;color:#555}.qtip-default .qtip-titlebar{background-color:#FFEF93}.qtip-default .qtip-icon{border-color:#CCC;background:#F1F1F1;color:#777}.qtip-default .qtip-titlebar .qtip-close{border-color:#AAA;color:#111} .qtip-light{background-color:#fff;border-color:#E2E2E2;color:#454545}.qtip-light .qtip-titlebar{background-color:#f1f1f1} .qtip-dark{background-color:#505050;border-color:#303030;color:#f3f3f3}.qtip-dark .qtip-titlebar{background-color:#404040}.qtip-dark .qtip-icon{border-color:#444}.qtip-dark .qtip-titlebar .ui-state-hover{border-color:#303030} .qtip-cream{background-color:#FBF7AA;border-color:#F9E98E;color:#A27D35}.qtip-cream .qtip-titlebar{background-color:#F0DE7D}.qtip-cream .qtip-close .qtip-icon{background-position:-82px 0} .qtip-red{background-color:#F78B83;border-color:#D95252;color:#912323}.qtip-red .qtip-titlebar{background-color:#F06D65}.qtip-red .qtip-close .qtip-icon{background-position:-102px 0}.qtip-red .qtip-icon{border-color:#D95252}.qtip-red .qtip-titlebar .ui-state-hover{border-color:#D95252} .qtip-green{background-color:#CAED9E;border-color:#90D93F;color:#3F6219}.qtip-green .qtip-titlebar{background-color:#B0DE78}.qtip-green .qtip-close .qtip-icon{background-position:-42px 0} .qtip-blue{background-color:#E5F6FE;border-color:#ADD9ED;color:#5E99BD}.qtip-blue .qtip-titlebar{background-color:#D0E9F5}.qtip-blue .qtip-close .qtip-icon{background-position:-2px 0}.qtip-shadow{-webkit-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);-moz-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);box-shadow:1px 1px 3px 1px rgba(0,0,0,.15)}.qtip-rounded,.qtip-tipsy,.qtip-bootstrap{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.qtip-rounded .qtip-titlebar{-moz-border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.qtip-youtube{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;box-shadow:0 0 3px #333;color:#fff;border-width:0;background:#4A4A4A;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,#000));background-image:-webkit-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-moz-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-ms-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-o-linear-gradient(top,#4A4A4A 0,#000 100%)}.qtip-youtube .qtip-titlebar{background-color:#4A4A4A;background-color:rgba(0,0,0,0)}.qtip-youtube .qtip-content{padding:.75em;font:12px arial,sans-serif;filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);-ms-filter:"progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);"}.qtip-youtube .qtip-icon{border-color:#222}.qtip-youtube .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-jtools{background:#232323;background:rgba(0,0,0,.7);background-image:-webkit-gradient(linear,left top,left bottom,from(#717171),to(#232323));background-image:-moz-linear-gradient(top,#717171,#232323);background-image:-webkit-linear-gradient(top,#717171,#232323);background-image:-ms-linear-gradient(top,#717171,#232323);background-image:-o-linear-gradient(top,#717171,#232323);border:2px solid #ddd;border:2px solid rgba(241,241,241,1);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 12px #333;-moz-box-shadow:0 0 12px #333;box-shadow:0 0 12px #333}.qtip-jtools .qtip-titlebar{background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A)"}.qtip-jtools .qtip-content{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323)"}.qtip-jtools .qtip-titlebar,.qtip-jtools .qtip-content{background:transparent;color:#fff;border:0 dashed transparent}.qtip-jtools .qtip-icon{border-color:#555}.qtip-jtools .qtip-titlebar .ui-state-hover{border-color:#333}.qtip-cluetip{-webkit-box-shadow:4px 4px 5px rgba(0,0,0,.4);-moz-box-shadow:4px 4px 5px rgba(0,0,0,.4);box-shadow:4px 4px 5px rgba(0,0,0,.4);background-color:#D9D9C2;color:#111;border:0 dashed transparent}.qtip-cluetip .qtip-titlebar{background-color:#87876A;color:#fff;border:0 dashed transparent}.qtip-cluetip .qtip-icon{border-color:#808064}.qtip-cluetip .qtip-titlebar .ui-state-hover{border-color:#696952;color:#696952}.qtip-tipsy{background:#000;background:rgba(0,0,0,.87);color:#fff;border:0 solid transparent;font-size:11px;font-family:'Lucida Grande',sans-serif;font-weight:700;line-height:16px;text-shadow:0 1px #000}.qtip-tipsy .qtip-titlebar{padding:6px 35px 0 10px;background-color:transparent}.qtip-tipsy .qtip-content{padding:6px 10px}.qtip-tipsy .qtip-icon{border-color:#222;text-shadow:none}.qtip-tipsy .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-tipped{border:3px solid #959FA9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-color:#F9F9F9;color:#454545;font-weight:400;font-family:serif}.qtip-tipped .qtip-titlebar{border-bottom-width:0;color:#fff;background:#3A79B8;background-image:-webkit-gradient(linear,left top,left bottom,from(#3A79B8),to(#2E629D));background-image:-webkit-linear-gradient(top,#3A79B8,#2E629D);background-image:-moz-linear-gradient(top,#3A79B8,#2E629D);background-image:-ms-linear-gradient(top,#3A79B8,#2E629D);background-image:-o-linear-gradient(top,#3A79B8,#2E629D);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D)"}.qtip-tipped .qtip-icon{border:2px solid #285589;background:#285589}.qtip-tipped .qtip-icon .ui-icon{background-color:#FBFBFB;color:#555}.qtip-bootstrap{font-size:14px;line-height:20px;color:#333;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.qtip-bootstrap .qtip-titlebar{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.qtip-bootstrap .qtip-titlebar .qtip-close{right:11px;top:45%;border-style:none}.qtip-bootstrap .qtip-content{padding:9px 14px}.qtip-bootstrap .qtip-icon{background:transparent}.qtip-bootstrap .qtip-icon .ui-icon{width:auto;height:auto;float:right;font-size:20px;font-weight:700;line-height:18px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.qtip-bootstrap .qtip-icon .ui-icon:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}.qtip:not(.ie9haxors) div.qtip-content,.qtip:not(.ie9haxors) div.qtip-titlebar{filter:none;-ms-filter:none}.qtip .qtip-tip{margin:0 auto;overflow:hidden;z-index:10}x:-o-prefocus,.qtip .qtip-tip{visibility:hidden}.qtip .qtip-tip,.qtip .qtip-tip .qtip-vml,.qtip .qtip-tip canvas{position:absolute;color:#123456;background:transparent;border:0 dashed transparent}.qtip .qtip-tip canvas{top:0;left:0}.qtip .qtip-tip .qtip-vml{behavior:url(#default#VML);display:inline-block;visibility:visible}#qtip-overlay{position:fixed;left:-10000em;top:-10000em}#qtip-overlay.blurs{cursor:pointer}#qtip-overlay div{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#000;opacity:.7;filter:alpha(opacity=70);-ms-filter:"alpha(Opacity=70)"}.qtipmodal-ie6fix{position:absolute!important} + + +/** + * Twitter Bootstrap style. + * + * Tested with IE 8, IE 9, Chrome 18, Firefox 9, Opera 11. + * Does not work with IE 7. + */ +.ui-tooltip-bootstrap{ + font-size: 16px; + line-height: 22px; + + color: #333333; + background-color: #ffffff; + + + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + + *border-right-width: 2px; + *border-bottom-width: 2px; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + diff --git a/css/k.css b/css/k.css new file mode 100644 index 0000000..c29942e --- /dev/null +++ b/css/k.css @@ -0,0 +1,386 @@ + +body { + font-family: Georgia, serif; + font-size: 14px; + line-height: 1.6; + padding-top: 10px; + padding-bottom: 10px; + background-color: white; + padding: 30px; +} + +.sidebar { + text-align: center; +} + +.sidebar .tagline { + font-style: italic; + font-size: 15px; + text-align: center; + color: #888; + padding: 5px 18% 20px; +} + +.sidebar h3 { + font-weight: normal; + font-size: 24px; + line-height: 32px; + margin-top: 20px; +} + +.nav-tabs.nav-stacked > li > a:hover { + border: none!important; +} + +.k-menu ul.nav { + margin: 30px 0; +} + +.k-menu ul.nav li { + text-align: center; + list-style: none; + font-size: 18px; + line-height: 20px; + margin-bottom: 1ex; +} + +.hero-unit h1 { + font-weight: 100; +} + +.hero-unit p { + margin-left: 0.4em; +} + +.content i { + font-family: Baskerville, Garamond; + font-style: italic; + font-size: 1.1; +} + +.content p, .content li, .content label { + font-family: Georgia, serif; + font-size: 15px; + line-height: 25px; +} + +.content label.checkbox input { + position: relative; + top: 5px; +} + +pre { + background: none; + border: none; + margin: 20px 0; + padding: 0; +} + +pre code { + padding: 10px!important; + background: #F6f6f6!important; +} + +p > code { + color: #000; + padding:2px; + margin: 0 3px; + border: 1px solid #eee; +} + +.content ul, .content ol { + margin-top: 15px; + margin-bottom: 15px; +} + +.content li { + margin-bottom: 0.4ex; + line-height: 25px; +} + +.sidebar p { + color: #555; + padding: 0 30px; + font-family: Georgia, serif; + font-size: 14px; +} + +.btn-custom { background-color: hsl(29, 29%, 40%) !important; background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#af8d6e", endColorstr="#836548"); background-image: -khtml-gradient(linear, left top, left bottom, from(#af8d6e), to(#836548)); background-image: -moz-linear-gradient(top, #af8d6e, #836548); background-image: -ms-linear-gradient(top, #af8d6e, #836548); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #af8d6e), color-stop(100%, #836548)); background-image: -webkit-linear-gradient(top, #af8d6e, #836548); background-image: -o-linear-gradient(top, #af8d6e, #836548); background-image: linear-gradient(#af8d6e, #836548); border-color: #836548 #836548 hsl(29, 29%, 36%); color: #fff !important; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.26); -webkit-font-smoothing: antialiased; } + +.btn-github { background-color: hsl(29, 0%, 29%) !important; background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#727272", endColorstr="#494949"); background-image: -khtml-gradient(linear, left top, left bottom, from(#727272), to(#494949)); background-image: -moz-linear-gradient(top, #727272, #494949); background-image: -ms-linear-gradient(top, #727272, #494949); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #727272), color-stop(100%, #494949)); background-image: -webkit-linear-gradient(top, #727272, #494949); background-image: -o-linear-gradient(top, #727272, #494949); background-image: linear-gradient(#727272, #494949); border-color: #494949 #494949 hsl(29, 0%, 25%); color: #fff !important; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.26); -webkit-font-smoothing: antialiased; } + +ul.thumbnails li { + margin-bottom: 25px; +} + +.content h1, .content h2, .content h3, +.sidebar h3, .sidebar .tagline +{ + font-family: Garamond, 'Garamond classico', Baskerville, "Baskerville Old Face", "Hoefler Text", "Times New Roman", serif; +} + +.content.docs h2 { + border-bottom: 1px solid #ddd; + padding-bottom: 5px; +} + +.content.docs h3 { + margin: 30px 0 20px; + font-size: 28px; + font-weight: normal; +} + +.content.docs .source { + font-size: 13px; + text-align: right; + color: #999; +} + +.content.docs .source a { + color: #888; + border-bottom: 1px dotted #888; + +} + +.toc ul { + text-align: center; + margin: 0; +} + +.toc a { + color: #68a; + border-bottom: 1px dotted #68a; +} + +.toc > ul > li > a { + border-bottom: 1px solid #68a; +} + +.toc > ul > li { + list-style: none; + padding: 3px; +} + +.toc li > ul { + margin-top: 3px; +} +.toc li > ul > li { + list-style: none; + padding: 2px; +} + +.toc li a { + background: #fff; + -webkit-transition: background-color 0.3s ease-in-out; + -moz-transition: background-color 0.3s ease-in-out; + -o-transition: background-color 0.3s ease-in-out; + transition: background-color 0.3s ease-in-out; +} + +.toc li.active a { + background: #eee; + padding: 0 1ex; + color: #000; + border-bottom: 0; +} + +.toc { + position: relative; + +-webkit-transition: top 1000ms cubic-bezier(0.090, 1, 0.135, 1.000); /* older webkit */ +-webkit-transition: top 1000ms cubic-bezier(0.090, 1.015, 0.135, 1.000); + -moz-transition: top 1000ms cubic-bezier(0.090, 1.015, 0.135, 1.000); + -ms-transition: top 1000ms cubic-bezier(0.090, 1.015, 0.135, 1.000); + -o-transition: top 1000ms cubic-bezier(0.090, 1.015, 0.135, 1.000); + transition: top 1000ms cubic-bezier(0.090, 1.015, 0.135, 1.000); /* custom */ + +-webkit-transition-timing-function: cubic-bezier(0.090, 1, 0.135, 1.000); /* older webkit */ +-webkit-transition-timing-function: cubic-bezier(0.090, 1.015, 0.135, 1.000); + -moz-transition-timing-function: cubic-bezier(0.090, 1.015, 0.135, 1.000); + -ms-transition-timing-function: cubic-bezier(0.090, 1.015, 0.135, 1.000); + -o-transition-timing-function: cubic-bezier(0.090, 1.015, 0.135, 1.000); + transition-timing-function: cubic-bezier(0.090, 1.015, 0.135, 1.000); /* custom */ +} + +.headerlink { + color: #ccc; + font-family: Georgia; + padding: 0 5px; + visibility: hidden; +} + +.headerlink:hover { + text-decoration: none; + background: #f9f9f9; + color: #bbb; +} + +h2:hover .headerlink, +h3:hover .headerlink { + visibility: visible; +} + +.nav-tabs.nav-stacked > li > a { + border: 0; +} + + +.content h1 { + margin: 0 0 0.5em; + font-size: 42px; + font-weight: normal; +} + +.content h2 { + font-size: 30px; + margin: 1em 0 0.4em; + font-weight: normal; +} + +.page-header h1 { + margin: 0; + font-weight: 300; +} + +.k-footer div { + text-align: right; + color: #888; + font-size: 12px; + margin: 1.5em 0; + padding: 1ex 0; +} + +.k-donate { + margin: 40px 0 0 12px; +} + +.k-donate h2 { + font-size: 20px; + margin-bottom: 10px; +} +.k-donate .k-donate-buttons { + margin-top: 20px; +} + +.k-flattr { + background-image: url(/img/donate.png); + background-position: 0px 0px; + width: 86px; + height: 22px; + display: block; + cursor: pointer; + float: left; + margin-right: 10px; +} +.k-flattr:hover { + background-position: 0 -22px; +} +.k-flattr span { + display: none; +} +.k-paypal { + display: block; + border: none!important; + border-radius: 0; + cursor: pointer; + -moz-box-shadow: none; + -webkit-box-shadow: none; +} + +.k-howto { + margin-bottom: 2em; +} +.k-big-number span { + font-size: 30px; + border-radius: 25px; + width: 50px; + height: 50px; + text-align: center; + font-weight: 100; + color: #fff; + display: block; + background: #69d; + line-height: 50px; +} +.k-gui .dg { + color: #000; + text-shadow: 0 1px 0 #ccc; +} +.k-gui .dg .c input[type="text"] { + background-color: #DDD; +} +.k-gui .dg .cr.number input[type="text"] { + color: #356; + height: 12px; +} +.k-gui .dg .c .slider { + background-color: #ddd; +} +.k-gui .dg .c:hover .slider { + background-color: #fff; +} +.k-gui .dg .close-button { + display: none; +} +.k-gui .dg li:not(.folder) { + background: #eee; + border-bottom: 1px solid #ccc; +} +.k-gui .dg .save-row { + border-radius: 6px 6px 0 0; +} +.k-gui .dg .save-row select { + margin-top: 6px; +} +.k-gui .dg .cr.boolean:hover { + background: #ddd; +} + +.k-gui .dg .c input[type="checkbox"] { + margin-top: 0; +} +.k-gui .dg .closed li.title { + background-image: none; + background-color: #e4e4e4; +} +.k-gui .dg .cr.number input[type="text"]:hover, +.k-gui .dg .cr.number input[type="text"]:focus { + color: #eee; +} + +.footer { + text-align: right; + color: #888; + font-size: 13px; +} + +.footer a { + color: #888; + border-bottom: 1px dotted #888; +} + +.footer a:hover { + text-decoration: none; + border-bottom: 1px solid #555; + color: #555; +} + +@media screen and (max-width: 979px) { + + .sidebar .tagline { + padding: 5px 0 10px; + } + + .content p, .content li { + font-size: 13px; + line-height: 19px; + } + + .content h1 { + font-size: 32px; + } + + .content h2 { + font-size: 23px; + } +} \ No newline at end of file diff --git a/css/prettify.css b/css/prettify.css new file mode 100644 index 0000000..3e6e41b --- /dev/null +++ b/css/prettify.css @@ -0,0 +1,51 @@ +/* Pretty printing styles. Used with prettify.js. */ +/* Vim sunburst theme by David Leibovic */ + +pre .str, code .str { color: #65B042; } /* string - green */ +pre .kwd, code .kwd { color: #E28964; } /* keyword - dark pink */ +pre .com, code .com { color: #AEAEAE; font-style: italic; } /* comment - gray */ +pre .typ, code .typ { color: #89bdff; } /* type - light blue */ +pre .lit, code .lit { color: #3387CC; } /* literal - blue */ +pre .pun, code .pun { color: #fff; } /* punctuation - white */ +pre .pln, code .pln { color: #fff; } /* plaintext - white */ +pre .tag, code .tag { color: #89bdff; } /* html/xml tag - light blue */ +pre .atn, code .atn { color: #bdb76b; } /* html/xml attribute name - khaki */ +pre .atv, code .atv { color: #65B042; } /* html/xml attribute value - green */ +pre .dec, code .dec { color: #3387CC; } /* decimal - blue */ + +pre.prettyprint, code.prettyprint { + background-color: #000; + -moz-border-radius: 8px; + -webkit-border-radius: 8px; + -o-border-radius: 8px; + -ms-border-radius: 8px; + -khtml-border-radius: 8px; + border-radius: 8px; +} + +pre.prettyprint { + width: 95%; + margin: 1em auto; + padding: 1em; + white-space: pre-wrap; +} + + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { margin-top: 0; margin-bottom: 0; color: #AEAEAE; } /* IE indents via margin-left */ +li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none } +/* Alternate shading for lines */ +li.L1,li.L3,li.L5,li.L7,li.L9 { } + +@media print { + pre .str, code .str { color: #060; } + pre .kwd, code .kwd { color: #006; font-weight: bold; } + pre .com, code .com { color: #600; font-style: italic; } + pre .typ, code .typ { color: #404; font-weight: bold; } + pre .lit, code .lit { color: #044; } + pre .pun, code .pun { color: #440; } + pre .pln, code .pln { color: #000; } + pre .tag, code .tag { color: #006; font-weight: bold; } + pre .atn, code .atn { color: #404; } + pre .atv, code .atv { color: #060; } +} diff --git a/data/cities.json b/data/cities.json new file mode 100644 index 0000000..00568dd --- /dev/null +++ b/data/cities.json @@ -0,0 +1,1001 @@ +[{ + "city_name": "Berlin", + "lat": "52.517", + "long": "13.4", + "nb_visits": 1496 +}, { + "city_name": "Hamburg", + "lat": "53.55", + "long": "10", + "nb_visits": 489 +}, { + "city_name": "Munich", + "lat": "48.15", + "long": "11.583", + "nb_visits": 456 +}, { + "city_name": "K\u00f6ln", + "lat": "50.933", + "long": "6.95", + "nb_visits": 376 +}, { + "city_name": "Magdeburg", + "lat": "52.167", + "long": "11.667", + "nb_visits": 217 +}, { + "city_name": "Dresden", + "lat": "51.05", + "long": "13.75", + "nb_visits": 143 +}, { + "city_name": "Frankfurt Am Main", + "lat": "50.117", + "long": "8.683", + "nb_visits": 134 +}, { + "city_name": "Leipzig", + "lat": "51.3", + "long": "12.333", + "nb_visits": 130 +}, { + "city_name": "Nuremberg", + "lat": "49.448", + "long": "11.068", + "nb_visits": 113 +}, { + "city_name": "Hanover", + "lat": "52.367", + "long": "9.717", + "nb_visits": 106 +}, { + "city_name": "Stuttgart", + "lat": "48.767", + "long": "9.183", + "nb_visits": 106 +}, { + "city_name": "Bonn", + "lat": "50.733", + "long": "7.1", + "nb_visits": 95 +}, { + "city_name": "K\u00f6nigsbrunn", + "lat": "48.583", + "long": "10", + "nb_visits": 87 +}, { + "city_name": "Bochum", + "lat": "51.483", + "long": "7.217", + "nb_visits": 85 +}, { + "city_name": "Karlsruhe", + "lat": "49.005", + "long": "8.386", + "nb_visits": 76 +}, { + "city_name": "Freiburg", + "lat": "48", + "long": "7.85", + "nb_visits": 75 +}, { + "city_name": "Bremen", + "lat": "53.083", + "long": "8.8", + "nb_visits": 74 +}, { + "city_name": "D\u00fcsseldorf", + "lat": "51.217", + "long": "6.767", + "nb_visits": 74 +}, { + "city_name": "Mainz", + "lat": "50", + "long": "8.271", + "nb_visits": 60 +}, { + "city_name": "Mannheim", + "lat": "49.488", + "long": "8.465", + "nb_visits": 55 +}, { + "city_name": "Potsdam", + "lat": "52.4", + "long": "13.067", + "nb_visits": 51 +}, { + "city_name": "Aachen", + "lat": "50.771", + "long": "6.105", + "nb_visits": 47 +}, { + "city_name": "Wiesbaden", + "lat": "50.083", + "long": "8.25", + "nb_visits": 46 +}, { + "city_name": "Oldenburg", + "lat": "53.167", + "long": "8.2", + "nb_visits": 45 +}, { + "city_name": "Helmstedt", + "lat": "52.233", + "long": "11", + "nb_visits": 43 +}, { + "city_name": "Konstanz", + "lat": "47.667", + "long": "9.183", + "nb_visits": 42 +}, { + "city_name": "M\u00fcnster", + "lat": "51.967", + "long": "7.633", + "nb_visits": 41 +}, { + "city_name": "Augsburg", + "lat": "48.367", + "long": "10.883", + "nb_visits": 40 +}, { + "city_name": "Essen", + "lat": "51.45", + "long": "7.017", + "nb_visits": 40 +}, { + "city_name": "Dortmund", + "lat": "51.517", + "long": "7.45", + "nb_visits": 37 +}, { + "city_name": "Goslar", + "lat": "51.9", + "long": "10.433", + "nb_visits": 35 +}, { + "city_name": "Ulm", + "lat": "48.4", + "long": "10", + "nb_visits": 33 +}, { + "city_name": "Cottbus", + "lat": "51.767", + "long": "14.333", + "nb_visits": 31 +}, { + "city_name": "Kiel", + "lat": "54.333", + "long": "10.133", + "nb_visits": 30 +}, { + "city_name": "Bielefeld", + "lat": "52.033", + "long": "8.533", + "nb_visits": 29 +}, { + "city_name": "G\u00f6ttingen", + "lat": "51.533", + "long": "9.933", + "nb_visits": 29 +}, { + "city_name": "Ladenburg", + "lat": "49.475", + "long": "8.607", + "nb_visits": 28 +}, { + "city_name": "Paderborn", + "lat": "51.717", + "long": "8.767", + "nb_visits": 27 +}, { + "city_name": "Brunswick", + "lat": "52.267", + "long": "10.533", + "nb_visits": 26 +}, { + "city_name": "Darmstadt", + "lat": "49.871", + "long": "8.649", + "nb_visits": 26 +}, { + "city_name": "Jena", + "lat": "50.933", + "long": "11.583", + "nb_visits": 25 +}, { + "city_name": "Ludwigsburg", + "lat": "48.9", + "long": "9.183", + "nb_visits": 25 +}, { + "city_name": "Erfurt", + "lat": "50.983", + "long": "11.033", + "nb_visits": 24 +}, { + "city_name": "Gr\u00f6benzell", + "lat": "48.2", + "long": "11.367", + "nb_visits": 23 +}, { + "city_name": "Saarbr\u00fccken", + "lat": "49.233", + "long": "7", + "nb_visits": 23 +}, { + "city_name": "Bad Harzburg", + "lat": "51.883", + "long": "10.567", + "nb_visits": 21 +}, { + "city_name": "Duisburg", + "lat": "51.433", + "long": "6.75", + "nb_visits": 20 +}, { + "city_name": "Kaiserslautern", + "lat": "49.45", + "long": "7.75", + "nb_visits": 20 +}, { + "city_name": "Pforzheim", + "lat": "48.883", + "long": "8.7", + "nb_visits": 20 +}, { + "city_name": "Salzgitter", + "lat": "52.083", + "long": "10.333", + "nb_visits": 20 +}, { + "city_name": "Wilhelmshaven", + "lat": "53.517", + "long": "8.133", + "nb_visits": 20 +}, { + "city_name": "Rengsdorf", + "lat": "50.5", + "long": "7.5", + "nb_visits": 19 +}, { + "city_name": "Freital", + "lat": "51.017", + "long": "13.65", + "nb_visits": 18 +}, { + "city_name": "Riemerling", + "lat": "48.067", + "long": "11.667", + "nb_visits": 18 +}, { + "city_name": "Rostock", + "lat": "54.083", + "long": "12.133", + "nb_visits": 18 +}, { + "city_name": "Stralsund", + "lat": "54.3", + "long": "13.1", + "nb_visits": 18 +}, { + "city_name": "M\u00f6nchengladbach", + "lat": "51.2", + "long": "6.433", + "nb_visits": 17 +}, { + "city_name": "Recke", + "lat": "52.383", + "long": "7.717", + "nb_visits": 17 +}, { + "city_name": "Ribbesb\u00fcttel", + "lat": "52.433", + "long": "10.517", + "nb_visits": 17 +}, { + "city_name": "Wolfsburg", + "lat": "52.433", + "long": "10.8", + "nb_visits": 17 +}, { + "city_name": "Chemnitz", + "lat": "50.833", + "long": "12.917", + "nb_visits": 16 +}, { + "city_name": "Clausthal-zellerfeld", + "lat": "51.8", + "long": "10.333", + "nb_visits": 16 +}, { + "city_name": "Erlangen", + "lat": "49.59", + "long": "11.004", + "nb_visits": 16 +}, { + "city_name": "Halle", + "lat": "51.5", + "long": "12", + "nb_visits": 16 +}, { + "city_name": "Ingolstadt", + "lat": "48.767", + "long": "11.433", + "nb_visits": 16 +}, { + "city_name": "Offenbach", + "lat": "50.1", + "long": "8.767", + "nb_visits": 16 +}, { + "city_name": "Ratisbon", + "lat": "49.015", + "long": "12.096", + "nb_visits": 16 +}, { + "city_name": "Wuppertal", + "lat": "51.267", + "long": "7.183", + "nb_visits": 16 +}, { + "city_name": "Hellenthal", + "lat": "50.483", + "long": "6.433", + "nb_visits": 14 +}, { + "city_name": "Karlsfeld", + "lat": "48.217", + "long": "11.467", + "nb_visits": 14 +}, { + "city_name": "Katlenburg-lindau", + "lat": "51.683", + "long": "10.1", + "nb_visits": 14 +}, { + "city_name": "Krefeld", + "lat": "51.333", + "long": "6.567", + "nb_visits": 14 +}, { + "city_name": "Bruchsal", + "lat": "49.128", + "long": "8.584", + "nb_visits": 13 +}, { + "city_name": "Gelsenkirchen", + "lat": "51.517", + "long": "7.05", + "nb_visits": 13 +}, { + "city_name": "Trier", + "lat": "49.75", + "long": "6.633", + "nb_visits": 13 +}, { + "city_name": "Ettlingen", + "lat": "48.95", + "long": "8.4", + "nb_visits": 12 +}, { + "city_name": "Grasberg", + "lat": "53.183", + "long": "8.983", + "nb_visits": 12 +}, { + "city_name": "Lahnstein", + "lat": "50.3", + "long": "7.617", + "nb_visits": 12 +}, { + "city_name": "Marburg", + "lat": "50.817", + "long": "8.767", + "nb_visits": 12 +}, { + "city_name": "Metzingen", + "lat": "48.533", + "long": "9.267", + "nb_visits": 12 +}, { + "city_name": "Neulu\u00dfheim", + "lat": "49.298", + "long": "8.518", + "nb_visits": 12 +}, { + "city_name": "Neuss", + "lat": "51.2", + "long": "6.683", + "nb_visits": 12 +}, { + "city_name": "Sonthofen", + "lat": "47.517", + "long": "10.283", + "nb_visits": 12 +}, { + "city_name": "Wahrenholz", + "lat": "52.617", + "long": "10.6", + "nb_visits": 12 +}, { + "city_name": "Waltrop", + "lat": "51.633", + "long": "7.4", + "nb_visits": 12 +}, { + "city_name": "Bamberg", + "lat": "49.867", + "long": "10.867", + "nb_visits": 11 +}, { + "city_name": "Gaggenau", + "lat": "48.8", + "long": "8.333", + "nb_visits": 11 +}, { + "city_name": "Gie\u00dfen", + "lat": "50.583", + "long": "8.65", + "nb_visits": 11 +}, { + "city_name": "Hagen", + "lat": "51.35", + "long": "7.467", + "nb_visits": 11 +}, { + "city_name": "Hennef", + "lat": "50.783", + "long": "7.283", + "nb_visits": 11 +}, { + "city_name": "Langelsheim", + "lat": "51.933", + "long": "10.333", + "nb_visits": 11 +}, { + "city_name": "Langenhagen", + "lat": "52.45", + "long": "9.75", + "nb_visits": 11 +}, { + "city_name": "Luckenwalde", + "lat": "52.083", + "long": "13.167", + "nb_visits": 11 +}, { + "city_name": "L\u00fcbeck", + "lat": "53.867", + "long": "10.7", + "nb_visits": 11 +}, { + "city_name": "Passau", + "lat": "48.583", + "long": "13.483", + "nb_visits": 11 +}, { + "city_name": "Pfullingen", + "lat": "48.45", + "long": "9.233", + "nb_visits": 11 +}, { + "city_name": "Siegen", + "lat": "50.867", + "long": "8.033", + "nb_visits": 11 +}, { + "city_name": "T\u00fcbingen", + "lat": "48.533", + "long": "9.05", + "nb_visits": 11 +}, { + "city_name": "Ahlen", + "lat": "51.75", + "long": "7.917", + "nb_visits": 10 +}, { + "city_name": "Buxtehude", + "lat": "53.45", + "long": "9.7", + "nb_visits": 10 +}, { + "city_name": "Delmenhorst", + "lat": "53.05", + "long": "8.617", + "nb_visits": 10 +}, { + "city_name": "Dormagen", + "lat": "51.1", + "long": "6.833", + "nb_visits": 10 +}, { + "city_name": "Fehrbellin", + "lat": "52.8", + "long": "12.767", + "nb_visits": 10 +}, { + "city_name": "Gro\u00df-gerau", + "lat": "49.924", + "long": "8.494", + "nb_visits": 10 +}, { + "city_name": "Leverkusen", + "lat": "51.017", + "long": "6.983", + "nb_visits": 10 +}, { + "city_name": "Recklinghausen", + "lat": "51.617", + "long": "7.2", + "nb_visits": 10 +}, { + "city_name": "Sarstedt", + "lat": "52.233", + "long": "9.85", + "nb_visits": 10 +}, { + "city_name": "Tangerm\u00fcnde", + "lat": "52.55", + "long": "11.95", + "nb_visits": 10 +}, { + "city_name": "Weimar", + "lat": "50.983", + "long": "11.317", + "nb_visits": 10 +}, { + "city_name": "Burgheim", + "lat": "48.7", + "long": "11.017", + "nb_visits": 9 +}, { + "city_name": "Elsterberg", + "lat": "50.6", + "long": "12.167", + "nb_visits": 9 +}, { + "city_name": "Erftstadt", + "lat": "50.817", + "long": "6.767", + "nb_visits": 9 +}, { + "city_name": "Garching", + "lat": "48.25", + "long": "11.65", + "nb_visits": 9 +}, { + "city_name": "Germering", + "lat": "48.133", + "long": "11.367", + "nb_visits": 9 +}, { + "city_name": "H\u00f6xter", + "lat": "51.767", + "long": "9.383", + "nb_visits": 9 +}, { + "city_name": "Neustadt", + "lat": "52.5", + "long": "9.467", + "nb_visits": 9 +}, { + "city_name": "Oberasbach", + "lat": "49.433", + "long": "10.95", + "nb_visits": 9 +}, { + "city_name": "Ostfildern", + "lat": "48.717", + "long": "9.267", + "nb_visits": 9 +}, { + "city_name": "Ratingen", + "lat": "51.3", + "long": "6.85", + "nb_visits": 9 +}, { + "city_name": "Rheinbach", + "lat": "50.633", + "long": "6.95", + "nb_visits": 9 +}, { + "city_name": "Seevetal", + "lat": "53.4", + "long": "9.967", + "nb_visits": 9 +}, { + "city_name": "Stuhr", + "lat": "53.033", + "long": "8.75", + "nb_visits": 9 +}, { + "city_name": "Allmendingen", + "lat": "48.333", + "long": "9.717", + "nb_visits": 8 +}, { + "city_name": "Detmold", + "lat": "51.933", + "long": "8.883", + "nb_visits": 8 +}, { + "city_name": "Dreieich", + "lat": "50", + "long": "8.7", + "nb_visits": 8 +}, { + "city_name": "Garbsen", + "lat": "52.417", + "long": "9.6", + "nb_visits": 8 +}, { + "city_name": "Gifhorn", + "lat": "52.483", + "long": "10.55", + "nb_visits": 8 +}, { + "city_name": "Halberstadt", + "lat": "51.9", + "long": "11.05", + "nb_visits": 8 +}, { + "city_name": "Hanau", + "lat": "50.133", + "long": "8.917", + "nb_visits": 8 +}, { + "city_name": "Heidelberg", + "lat": "49.417", + "long": "8.7", + "nb_visits": 8 +}, { + "city_name": "Herne", + "lat": "51.55", + "long": "7.217", + "nb_visits": 8 +}, { + "city_name": "H\u00fcrth", + "lat": "50.867", + "long": "6.867", + "nb_visits": 8 +}, { + "city_name": "Kassel", + "lat": "51.317", + "long": "9.5", + "nb_visits": 8 +}, { + "city_name": "L\u00f6\u00dfnitz", + "lat": "50.617", + "long": "12.717", + "nb_visits": 8 +}, { + "city_name": "M\u00fclheim", + "lat": "51.433", + "long": "6.883", + "nb_visits": 8 +}, { + "city_name": "Neu Isenburg", + "lat": "50.05", + "long": "8.7", + "nb_visits": 8 +}, { + "city_name": "Pinneberg", + "lat": "53.65", + "long": "9.8", + "nb_visits": 8 +}, { + "city_name": "R\u00f6vershagen", + "lat": "54.183", + "long": "12.233", + "nb_visits": 8 +}, { + "city_name": "Sankt Augustin", + "lat": "50.767", + "long": "7.183", + "nb_visits": 8 +}, { + "city_name": "Schwerin", + "lat": "53.633", + "long": "11.383", + "nb_visits": 8 +}, { + "city_name": "Troisdorf", + "lat": "50.817", + "long": "7.167", + "nb_visits": 8 +}, { + "city_name": "Wedel", + "lat": "53.583", + "long": "9.717", + "nb_visits": 8 +}, { + "city_name": "Wegeleben", + "lat": "51.883", + "long": "11.167", + "nb_visits": 8 +}, { + "city_name": "Aalen", + "lat": "48.833", + "long": "10.1", + "nb_visits": 7 +}, { + "city_name": "Bad Kreuznach", + "lat": "49.833", + "long": "7.867", + "nb_visits": 7 +}, { + "city_name": "Bensheim", + "lat": "49.68", + "long": "8.616", + "nb_visits": 7 +}, { + "city_name": "Bergisch Gladbach", + "lat": "50.983", + "long": "7.133", + "nb_visits": 7 +}, { + "city_name": "Bietigheim-bissingen", + "lat": "48.967", + "long": "9.133", + "nb_visits": 7 +}, { + "city_name": "Burg", + "lat": "52.267", + "long": "11.85", + "nb_visits": 7 +}, { + "city_name": "Gera", + "lat": "50.867", + "long": "12.083", + "nb_visits": 7 +}, { + "city_name": "Gotha", + "lat": "50.95", + "long": "10.717", + "nb_visits": 7 +}, { + "city_name": "Heilbronn", + "lat": "49.14", + "long": "9.22", + "nb_visits": 7 +}, { + "city_name": "Honnef", + "lat": "50.633", + "long": "7.233", + "nb_visits": 7 +}, { + "city_name": "Koblenz", + "lat": "50.35", + "long": "7.6", + "nb_visits": 7 +}, { + "city_name": "L\u00fcnen", + "lat": "51.617", + "long": "7.517", + "nb_visits": 7 +}, { + "city_name": "Rheda-wiedenbr\u00fcck", + "lat": "51.833", + "long": "8.317", + "nb_visits": 7 +}, { + "city_name": "R\u00f6srath", + "lat": "50.9", + "long": "7.2", + "nb_visits": 7 +}, { + "city_name": "Sandhausen", + "lat": "49.343", + "long": "8.659", + "nb_visits": 7 +}, { + "city_name": "Schwabach", + "lat": "49.329", + "long": "11.026", + "nb_visits": 7 +}, { + "city_name": "Sch\u00f6nefeld", + "lat": "51.983", + "long": "12.833", + "nb_visits": 7 +}, { + "city_name": "Solingen", + "lat": "51.183", + "long": "7.083", + "nb_visits": 7 +}, { + "city_name": "Velbert", + "lat": "51.333", + "long": "7.05", + "nb_visits": 7 +}, { + "city_name": "Wei\u00dfwasser", + "lat": "51.517", + "long": "14.633", + "nb_visits": 7 +}, { + "city_name": "W\u00fcrzburg", + "lat": "49.788", + "long": "9.936", + "nb_visits": 7 +}, { + "city_name": "Achim", + "lat": "53.033", + "long": "9.017", + "nb_visits": 6 +}, { + "city_name": "Alsdorf", + "lat": "50.883", + "long": "6.167", + "nb_visits": 6 +}, { + "city_name": "Attendorn", + "lat": "51.117", + "long": "7.9", + "nb_visits": 6 +}, { + "city_name": "D\u00fcren", + "lat": "50.8", + "long": "6.483", + "nb_visits": 6 +}, { + "city_name": "F\u00fcrth", + "lat": "49.467", + "long": "10.967", + "nb_visits": 6 +}, { + "city_name": "Hattersheim", + "lat": "50.067", + "long": "8.467", + "nb_visits": 6 +}, { + "city_name": "Homburg", + "lat": "49.317", + "long": "7.333", + "nb_visits": 6 +}, { + "city_name": "Ilmenau", + "lat": "50.683", + "long": "10.9", + "nb_visits": 6 +}, { + "city_name": "Kaarst", + "lat": "51.233", + "long": "6.617", + "nb_visits": 6 +}, { + "city_name": "Kaufbeuren", + "lat": "47.883", + "long": "10.617", + "nb_visits": 6 +}, { + "city_name": "Kempten", + "lat": "47.717", + "long": "10.317", + "nb_visits": 6 +}, { + "city_name": "Kornwestheim", + "lat": "48.867", + "long": "9.183", + "nb_visits": 6 +}, { + "city_name": "Langenfeld", + "lat": "51.1", + "long": "6.95", + "nb_visits": 6 +}, { + "city_name": "Lauenburg", + "lat": "53.367", + "long": "10.567", + "nb_visits": 6 +}, { + "city_name": "Lehrte", + "lat": "52.383", + "long": "9.967", + "nb_visits": 6 +}, { + "city_name": "Memmingen", + "lat": "47.983", + "long": "10.167", + "nb_visits": 6 +}, { + "city_name": "Nehren", + "lat": "48.433", + "long": "9.067", + "nb_visits": 6 +}, { + "city_name": "Nellingen", + "lat": "48.533", + "long": "9.783", + "nb_visits": 6 +}, { + "city_name": "Neukirchen-vluyn", + "lat": "51.783", + "long": "6.4", + "nb_visits": 6 +}, { + "city_name": "Neuwied", + "lat": "50.433", + "long": "7.467", + "nb_visits": 6 +}, { + "city_name": "Remscheid", + "lat": "51.183", + "long": "7.2", + "nb_visits": 6 +}, { + "city_name": "Rheine", + "lat": "52.283", + "long": "7.45", + "nb_visits": 6 +}, { + "city_name": "Rosenheim", + "lat": "47.85", + "long": "12.133", + "nb_visits": 6 +}, { + "city_name": "Senftenberg", + "lat": "51.517", + "long": "14.017", + "nb_visits": 6 +}, { + "city_name": "Thalham", + "lat": "47.8", + "long": "11.783", + "nb_visits": 6 +}, { + "city_name": "Waldkraiburg", + "lat": "48.217", + "long": "12.4", + "nb_visits": 6 +}, { + "city_name": "Witten", + "lat": "51.433", + "long": "7.333", + "nb_visits": 6 +}, { + "city_name": "Allmannsweier", + "lat": "48.367", + "long": "7.783", + "nb_visits": 5 +}, { + "city_name": "Angerm\u00fcnde", + "lat": "53.033", + "long": "14", + "nb_visits": 5 +}, { + "city_name": "Arnsberg", + "lat": "51.383", + "long": "8.083", + "nb_visits": 5 +}, { + "city_name": "Bad Hersfeld", + "lat": "50.867", + "long": "9.7", + "nb_visits": 5 +}, { + "city_name": "Bad Homburg", + "lat": "50.217", + "long": "8.617", + "nb_visits": 5 +}, { + "city_name": "Bad Neuenahr", + "lat": "50.55", + "long": "7.133", + "nb_visits": 5 +}, { + "city_name": "Bayreuth", + "lat": "49.948", + "long": "11.578", + "nb_visits": 5 +}, { + "city_name": "Bornheim", + "lat": "50.767", + "long": "7", + "nb_visits": 5 +}, { + "city_name": "Bottrop", + "lat": "51.517", + "long": "6.917", + "nb_visits": 5 +}] diff --git a/data/countries.json b/data/countries.json new file mode 100644 index 0000000..d3f7455 --- /dev/null +++ b/data/countries.json @@ -0,0 +1,973 @@ +[{ + "name": "Afghanistan", + "code": "AF" + }, + { + "name": "Åland Islands", + "code": "AX" + }, + { + "name": "Albania", + "code": "AL" + }, + { + "name": "Algeria", + "code": "DZ" + }, + { + "name": "American Samoa", + "code": "AS" + }, + { + "name": "AndorrA", + "code": "AD" + }, + { + "name": "Angola", + "code": "AO" + }, + { + "name": "Anguilla", + "code": "AI" + }, + { + "name": "Antarctica", + "code": "AQ" + }, + { + "name": "Antigua and Barbuda", + "code": "AG" + }, + { + "name": "Argentina", + "code": "AR" + }, + { + "name": "Armenia", + "code": "AM" + }, + { + "name": "Aruba", + "code": "AW" + }, + { + "name": "Australia", + "code": "AU" + }, + { + "name": "Austria", + "code": "AT" + }, + { + "name": "Azerbaijan", + "code": "AZ" + }, + { + "name": "Bahamas", + "code": "BS" + }, + { + "name": "Bahrain", + "code": "BH" + }, + { + "name": "Bangladesh", + "code": "BD" + }, + { + "name": "Barbados", + "code": "BB" + }, + { + "name": "Belarus", + "code": "BY" + }, + { + "name": "Belgium", + "code": "BE" + }, + { + "name": "Belize", + "code": "BZ" + }, + { + "name": "Benin", + "code": "BJ" + }, + { + "name": "Bermuda", + "code": "BM" + }, + { + "name": "Bhutan", + "code": "BT" + }, + { + "name": "Bolivia", + "code": "BO" + }, + { + "name": "Bosnia and Herzegovina", + "code": "BA" + }, + { + "name": "Botswana", + "code": "BW" + }, + { + "name": "Bouvet Island", + "code": "BV" + }, + { + "name": "Brazil", + "code": "BR" + }, + { + "name": "British Indian Ocean Territory", + "code": "IO" + }, + { + "name": "Brunei Darussalam", + "code": "BN" + }, + { + "name": "Bulgaria", + "code": "BG" + }, + { + "name": "Burkina Faso", + "code": "BF" + }, + { + "name": "Burundi", + "code": "BI" + }, + { + "name": "Cambodia", + "code": "KH" + }, + { + "name": "Cameroon", + "code": "CM" + }, + { + "name": "Canada", + "code": "CA" + }, + { + "name": "Cape Verde", + "code": "CV" + }, + { + "name": "Cayman Islands", + "code": "KY" + }, + { + "name": "Central African Republic", + "code": "CF" + }, + { + "name": "Chad", + "code": "TD" + }, + { + "name": "Chile", + "code": "CL" + }, + { + "name": "China", + "code": "CN" + }, + { + "name": "Christmas Island", + "code": "CX" + }, + { + "name": "Cocos (Keeling) Islands", + "code": "CC" + }, + { + "name": "Colombia", + "code": "CO" + }, + { + "name": "Comoros", + "code": "KM" + }, + { + "name": "Congo", + "code": "CG" + }, + { + "name": "Congo, The Democratic Republic of the", + "code": "CD" + }, + { + "name": "Cook Islands", + "code": "CK" + }, + { + "name": "Costa Rica", + "code": "CR" + }, + { + "name": "Cote D'Ivoire", + "code": "CI" + }, + { + "name": "Croatia", + "code": "HR" + }, + { + "name": "Cuba", + "code": "CU" + }, + { + "name": "Cyprus", + "code": "CY" + }, + { + "name": "Czech Republic", + "code": "CZ" + }, + { + "name": "Denmark", + "code": "DK" + }, + { + "name": "Djibouti", + "code": "DJ" + }, + { + "name": "Dominica", + "code": "DM" + }, + { + "name": "Dominican Republic", + "code": "DO" + }, + { + "name": "Ecuador", + "code": "EC" + }, + { + "name": "Egypt", + "code": "EG" + }, + { + "name": "El Salvador", + "code": "SV" + }, + { + "name": "Equatorial Guinea", + "code": "GQ" + }, + { + "name": "Eritrea", + "code": "ER" + }, + { + "name": "Estonia", + "code": "EE" + }, + { + "name": "Ethiopia", + "code": "ET" + }, + { + "name": "Falkland Islands (Malvinas)", + "code": "FK" + }, + { + "name": "Faroe Islands", + "code": "FO" + }, + { + "name": "Fiji", + "code": "FJ" + }, + { + "name": "Finland", + "code": "FI" + }, + { + "name": "France", + "code": "FR" + }, + { + "name": "French Guiana", + "code": "GF" + }, + { + "name": "French Polynesia", + "code": "PF" + }, + { + "name": "French Southern Territories", + "code": "TF" + }, + { + "name": "Gabon", + "code": "GA" + }, + { + "name": "Gambia", + "code": "GM" + }, + { + "name": "Georgia", + "code": "GE" + }, + { + "name": "Germany", + "code": "DE", + "city_name": "Munich", + "lat": "48.15", + "long": "11.583", + "nb_visits": 456 + }, + { + "name": "Ghana", + "code": "GH" + }, + { + "name": "Gibraltar", + "code": "GI" + }, + { + "name": "Greece", + "code": "GR" + }, + { + "name": "Greenland", + "code": "GL" + }, + { + "name": "Grenada", + "code": "GD" + }, + { + "name": "Guadeloupe", + "code": "GP" + }, + { + "name": "Guam", + "code": "GU" + }, + { + "name": "Guatemala", + "code": "GT" + }, + { + "name": "Guernsey", + "code": "GG" + }, + { + "name": "Guinea", + "code": "GN" + }, + { + "name": "Guinea-Bissau", + "code": "GW" + }, + { + "name": "Guyana", + "code": "GY" + }, + { + "name": "Haiti", + "code": "HT" + }, + { + "name": "Heard Island and Mcdonald Islands", + "code": "HM" + }, + { + "name": "Holy See (Vatican City State)", + "code": "VA" + }, + { + "name": "Honduras", + "code": "HN" + }, + { + "name": "Hong Kong", + "code": "HK" + }, + { + "name": "Hungary", + "code": "HU" + }, + { + "name": "Iceland", + "code": "IS" + }, + { + "name": "India", + "code": "IN" + }, + { + "name": "Indonesia", + "code": "ID" + }, + { + "name": "Iran, Islamic Republic Of", + "code": "IR" + }, + { + "name": "Iraq", + "code": "IQ" + }, + { + "name": "Ireland", + "code": "IE" + }, + { + "name": "Isle of Man", + "code": "IM" + }, + { + "name": "Israel", + "code": "IL" + }, + { + "name": "Italy", + "code": "IT" + }, + { + "name": "Jamaica", + "code": "JM" + }, + { + "name": "Japan", + "code": "JP" + }, + { + "name": "Jersey", + "code": "JE" + }, + { + "name": "Jordan", + "code": "JO" + }, + { + "name": "Kazakhstan", + "code": "KZ" + }, + { + "name": "Kenya", + "code": "KE" + }, + { + "name": "Kiribati", + "code": "KI" + }, + { + "name": "Korea", + "code": "KR" + }, + { + "name": "Kuwait", + "code": "KW" + }, + { + "name": "Kyrgyzstan", + "code": "KG" + }, + { + "name": "Laos", + "code": "LA" + }, + { + "name": "Latvia", + "code": "LV" + }, + { + "name": "Lebanon", + "code": "LB" + }, + { + "name": "Lesotho", + "code": "LS" + }, + { + "name": "Liberia", + "code": "LR" + }, + { + "name": "Libyan Arab Jamahiriya", + "code": "LY" + }, + { + "name": "Liechtenstein", + "code": "LI" + }, + { + "name": "Lithuania", + "code": "LT" + }, + { + "name": "Luxembourg", + "code": "LU" + }, + { + "name": "Macao", + "code": "MO" + }, + { + "name": "Macedonia", + "code": "MK" + }, + { + "name": "Madagascar", + "code": "MG" + }, + { + "name": "Malawi", + "code": "MW" + }, + { + "name": "Malaysia", + "code": "MY" + }, + { + "name": "Maldives", + "code": "MV" + }, + { + "name": "Mali", + "code": "ML" + }, + { + "name": "Malta", + "code": "MT" + }, + { + "name": "Marshall Islands", + "code": "MH" + }, + { + "name": "Martinique", + "code": "MQ" + }, + { + "name": "Mauritania", + "code": "MR" + }, + { + "name": "Mauritius", + "code": "MU" + }, + { + "name": "Mayotte", + "code": "YT" + }, + { + "name": "Mexico", + "code": "MX" + }, + { + "name": "Micronesia", + "code": "FM" + }, + { + "name": "Moldova", + "code": "MD" + }, + { + "name": "Monaco", + "code": "MC" + }, + { + "name": "Mongolia", + "code": "MN" + }, + { + "name": "Montserrat", + "code": "MS" + }, + { + "name": "Morocco", + "code": "MA" + }, + { + "name": "Mozambique", + "code": "MZ" + }, + { + "name": "Myanmar", + "code": "MM" + }, + { + "name": "Namibia", + "code": "NA" + }, + { + "name": "Nauru", + "code": "NR" + }, + { + "name": "Nepal", + "code": "NP" + }, + { + "name": "Netherlands", + "code": "NL" + }, + { + "name": "Netherlands Antilles", + "code": "AN" + }, + { + "name": "New Caledonia", + "code": "NC" + }, + { + "name": "New Zealand", + "code": "NZ" + }, + { + "name": "Nicaragua", + "code": "NI" + }, + { + "name": "Niger", + "code": "NE" + }, + { + "name": "Nigeria", + "code": "NG" + }, + { + "name": "Niue", + "code": "NU" + }, + { + "name": "Norfolk Island", + "code": "NF" + }, + { + "name": "Northern Mariana Islands", + "code": "MP" + }, + { + "name": "Norway", + "code": "NO" + }, + { + "name": "Oman", + "code": "OM" + }, + { + "name": "Pakistan", + "code": "PK" + }, + { + "name": "Palau", + "code": "PW" + }, + { + "name": "Palestinian Territory, Occupied", + "code": "PS" + }, + { + "name": "Panama", + "code": "PA" + }, + { + "name": "Papua New Guinea", + "code": "PG" + }, + { + "name": "Paraguay", + "code": "PY" + }, + { + "name": "Peru", + "code": "PE" + }, + { + "name": "Philippines", + "code": "PH" + }, + { + "name": "Pitcairn", + "code": "PN" + }, + { + "name": "Poland", + "code": "PL" + }, + { + "name": "Portugal", + "code": "PT" + }, + { + "name": "Puerto Rico", + "code": "PR" + }, + { + "name": "Qatar", + "code": "QA" + }, + { + "name": "Reunion", + "code": "RE" + }, + { + "name": "Romania", + "code": "RO" + }, + { + "name": "Russian Federation", + "code": "RU" + }, + { + "name": "RWANDA", + "code": "RW" + }, + { + "name": "Saint Helena", + "code": "SH" + }, + { + "name": "Saint Kitts and Nevis", + "code": "KN" + }, + { + "name": "Saint Lucia", + "code": "LC" + }, + { + "name": "Saint Pierre and Miquelon", + "code": "PM" + }, + { + "name": "Saint Vincent and the Grenadines", + "code": "VC" + }, + { + "name": "Samoa", + "code": "WS" + }, + { + "name": "San Marino", + "code": "SM" + }, + { + "name": "Sao Tome and Principe", + "code": "ST" + }, + { + "name": "Saudi Arabia", + "code": "SA" + }, + { + "name": "Senegal", + "code": "SN" + }, + { + "name": "Serbia and Montenegro", + "code": "CS" + }, + { + "name": "Seychelles", + "code": "SC" + }, + { + "name": "Sierra Leone", + "code": "SL" + }, + { + "name": "Singapore", + "code": "SG" + }, + { + "name": "Slovakia", + "code": "SK" + }, + { + "name": "Slovenia", + "code": "SI" + }, + { + "name": "Solomon Islands", + "code": "SB" + }, + { + "name": "Somalia", + "code": "SO" + }, + { + "name": "South Africa", + "code": "ZA" + }, + { + "name": "South Georgia and the South Sandwich Islands", + "code": "GS" + }, + { + "name": "Spain", + "code": "ES" + }, + { + "name": "Sri Lanka", + "code": "LK" + }, + { + "name": "Sudan", + "code": "SD" + }, + { + "name": "Suriname", + "code": "SR" + }, + { + "name": "Svalbard and Jan Mayen", + "code": "SJ" + }, + { + "name": "Swaziland", + "code": "SZ" + }, + { + "name": "Sweden", + "code": "SE" + }, + { + "name": "Switzerland", + "code": "CH" + }, + { + "name": "Syrian Arab Republic", + "code": "SY" + }, + { + "name": "Taiwan, Province of China", + "code": "TW" + }, + { + "name": "Tajikistan", + "code": "TJ" + }, + { + "name": "Tanzania, United Republic of", + "code": "TZ" + }, + { + "name": "Thailand", + "code": "TH" + }, + { + "name": "Timor-Leste", + "code": "TL" + }, + { + "name": "Togo", + "code": "TG" + }, + { + "name": "Tokelau", + "code": "TK" + }, + { + "name": "Tonga", + "code": "TO" + }, + { + "name": "Trinidad and Tobago", + "code": "TT" + }, + { + "name": "Tunisia", + "code": "TN" + }, + { + "name": "Turkey", + "code": "TR" + }, + { + "name": "Turkmenistan", + "code": "TM" + }, + { + "name": "Turks and Caicos Islands", + "code": "TC" + }, + { + "name": "Tuvalu", + "code": "TV" + }, + { + "name": "Uganda", + "code": "UG" + }, + { + "name": "Ukraine", + "code": "UA" + }, + { + "name": "United Arab Emirates", + "code": "AE" + }, + { + "name": "United Kingdom", + "code": "GB" + }, + { + "name": "United States", + "code": "US" + }, + { + "name": "United States Minor Outlying Islands", + "code": "UM" + }, + { + "name": "Uruguay", + "code": "UY" + }, + { + "name": "Uzbekistan", + "code": "UZ" + }, + { + "name": "Vanuatu", + "code": "VU" + }, + { + "name": "Venezuela", + "code": "VE" + }, + { + "name": "Viet Nam", + "code": "VN" + }, + { + "name": "Virgin Islands, British", + "code": "VG" + }, + { + "name": "Virgin Islands, U.S.", + "code": "VI" + }, + { + "name": "Wallis and Futuna", + "code": "WF" + }, + { + "name": "Western Sahara", + "code": "EH" + }, + { + "name": "Yemen", + "code": "YE" + }, + { + "name": "Zambia", + "code": "ZM" + }, + { + "name": "Zimbabwe", + "code": "ZW" + } +] diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4ccec4479c4edab3e90dee4daa5795b9978f1494 GIT binary patch literal 587 zcmV-R0<`^!P)DQNK?jK^T2Iv$q;TvPNMGbDQBuu-gnaSb)hkMwh!nJ8L4gTuWz9WB4oV zOlYt)#Db8JNNkLW1QIKBgG03kVb{VH(ICh9l2^=pZ{GJN5BLXSvDodrIhi+1r_imvORl zM%RMD;A%3NT(T?+s;WW=fl8%|yXFRRt+nZ!B2aU4faBoaUJ`FwzL z4#wV_>vp>n6IE4Fuh-G(bWkpr9a)xbX*!N!7{4`5+arW*5kgq0R0lxpl;1qx;6bg>#d7f#SPXIi>g%9|uMh1Yj+id{=p65LP*aUEb1!}zX z3EQ@NtyW8uW%&xP)$T8nU;;^!?rOCfdcEF-fA#EhF=R5CW6t^Cg&%x|q9~DgJpMRO Z^8%|yihUyBU-SR~002ovPDHLkV1mQt@u2_! literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..8725221 --- /dev/null +++ b/index.html @@ -0,0 +1,81 @@ +--- +layout: showcase +title: Twentyone World +jsplugins: + qtip: '/js/jquery.qtip.min.js' +--- + + + + + + + + +
+
+ +

Lorem ipsum, add your stuff.

diff --git a/index.html.bak b/index.html.bak new file mode 100644 index 0000000..f1a6e74 --- /dev/null +++ b/index.html.bak @@ -0,0 +1,81 @@ +--- +layout: showcase +title: Twentyone World +jsplugins: + qtip: '/js/jquery.qtip.min.js' +--- + + + + + + + + +
+
+ +

Lorem ipsum, add your stuff.

diff --git a/js/chroma.min.js b/js/chroma.min.js new file mode 100644 index 0000000..62db419 --- /dev/null +++ b/js/chroma.min.js @@ -0,0 +1 @@ +(function(){var Color,ColorScale,K,PITHIRD,TWOPI,X,Y,Z,brewer,chroma,clip_rgb,colors,cos,css2rgb,hex2rgb,hsi2rgb,hsl2rgb,hsv2rgb,lab2lch,lab2rgb,lab_xyz,lch2lab,lch2rgb,limit,luminance,luminance_x,rgb2hex,rgb2hsi,rgb2hsl,rgb2hsv,rgb2lab,rgb2lch,rgb_xyz,root,type,unpack,xyz_lab,xyz_rgb,_ref,_ref1,_ref2,_ref3,_ref4,_ref5;root=typeof exports!=="undefined"&&exports!==null?exports:this;chroma=(_ref=root.chroma)!=null?_ref:root.chroma={};if(typeof module!=="undefined"&&module!==null){module.exports=chroma}Color=function(){function Color(x,y,z,m){var me,me_rgb,_ref1;me=this;if(x==null&&y==null&&z==null&&m==null){x=[255,0,255]}if(type(x)==="array"&&x.length===3){if(m==null){m=y}_ref1=x,x=_ref1[0],y=_ref1[1],z=_ref1[2]}if(type(x)==="string"){m="hex"}else{if(m==null){m="rgb"}}if(m==="rgb"){me._rgb=[x,y,z]}else if(m==="hsl"){me._rgb=hsl2rgb(x,y,z)}else if(m==="hsv"){me._rgb=hsv2rgb(x,y,z)}else if(m==="hex"){me._rgb=hex2rgb(x)}else if(m==="lab"){me._rgb=lab2rgb(x,y,z)}else if(m==="lch"){me._rgb=lch2rgb(x,y,z)}else if(m==="hsi"){me._rgb=hsi2rgb(x,y,z)}me_rgb=clip_rgb(me._rgb)}Color.prototype.rgb=function(){return this._rgb};Color.prototype.hex=function(){return rgb2hex(this._rgb)};Color.prototype.toString=function(){return this.hex()};Color.prototype.hsl=function(){return rgb2hsl(this._rgb)};Color.prototype.hsv=function(){return rgb2hsv(this._rgb)};Color.prototype.lab=function(){return rgb2lab(this._rgb)};Color.prototype.lch=function(){return rgb2lch(this._rgb)};Color.prototype.hsi=function(){return rgb2hsi(this._rgb)};Color.prototype.luminance=function(){return luminance(this._rgb)};Color.prototype.name=function(){var h,k;h=this.hex();for(k in chroma.colors){if(h===chroma.colors[k]){return k}}return h};Color.prototype.interpolate=function(f,col,m){var dh,hue,hue0,hue1,lbv,lbv0,lbv1,me,sat,sat0,sat1,xyz0,xyz1;me=this;if(m==null){m="rgb"}if(type(col)==="string"){col=new Color(col)}if(m==="hsl"||m==="hsv"||m==="lch"||m==="hsi"){if(m==="hsl"){xyz0=me.hsl();xyz1=col.hsl()}else if(m==="hsv"){xyz0=me.hsv();xyz1=col.hsv()}else if(m==="hsi"){xyz0=me.hsi();xyz1=col.hsi()}else if(m==="lch"){xyz0=me.lch();xyz1=col.lch()}if(m.substr(0,1)==="h"){hue0=xyz0[0],sat0=xyz0[1],lbv0=xyz0[2];hue1=xyz1[0],sat1=xyz1[1],lbv1=xyz1[2]}else{lbv0=xyz0[0],sat0=xyz0[1],hue0=xyz0[2];lbv1=xyz1[0],sat1=xyz1[1],hue1=xyz1[2]}if(!isNaN(hue0)&&!isNaN(hue1)){if(hue1>hue0&&hue1-hue0>180){dh=hue1-(hue0+360)}else if(hue1180){dh=hue1+360-hue0}else{dh=hue1-hue0}hue=hue0+f*dh}else if(!isNaN(hue0)){hue=hue0;if(lbv1===1||lbv1===0){sat=sat0}}else if(!isNaN(hue1)){hue=hue1;if(lbv0===1||lbv0===0){sat=sat1}}else{hue=void 0}if(sat==null){sat=sat0+f*(sat1-sat0)}lbv=lbv0+f*(lbv1-lbv0);if(m.substr(0,1)==="h"){return new Color(hue,sat,lbv,m)}else{return new Color(lbv,sat,hue,m)}}else if(m==="rgb"){xyz0=me._rgb;xyz1=col._rgb;return new Color(xyz0[0]+f*(xyz1[0]-xyz0[0]),xyz0[1]+f*(xyz1[1]-xyz0[1]),xyz0[2]+f*(xyz1[2]-xyz0[2]),m)}else if(m==="lab"){xyz0=me.lab();xyz1=col.lab();return new Color(xyz0[0]+f*(xyz1[0]-xyz0[0]),xyz0[1]+f*(xyz1[1]-xyz0[1]),xyz0[2]+f*(xyz1[2]-xyz0[2]),m)}else{throw"color mode "+m+" is not supported"}};Color.prototype.darker=function(amount){var lch,me;if(amount==null){amount=20}me=this;lch=me.lch();lch[0]-=amount;return chroma.lch(lch)};Color.prototype.brighter=function(amount){if(amount==null){amount=20}return this.darker(-amount)};Color.prototype.saturate=function(amount){var lch,me;if(amount==null){amount=20}me=this;lch=me.lch();lch[1]+=amount;return chroma.lch(lch)};Color.prototype.desaturate=function(amount){if(amount==null){amount=20}return this.saturate(-amount)};return Color}();hex2rgb=function(hex){var b,g,r,rgb,u;if(hex.match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/)){if(hex.length===4||hex.length===7){hex=hex.substr(1)}if(hex.length===3){hex=hex.split("");hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]}u=parseInt(hex,16);r=u>>16;g=u>>8&255;b=u&255;return[r,g,b]}if(rgb=css2rgb(hex)){return rgb}throw"unknown color: "+hex};css2rgb=function(css){var hsl,i,m,rgb;if(chroma.colors!=null&&chroma.colors[css]){return hex2rgb(chroma.colors[css])}if(m=css.match(/rgb\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*\)/)){return m.slice(1,4)}if(m=css.match(/rgb\(\s*(\-?\d+)%,\s*(\-?\d+)%\s*,\s*(\-?\d+)%\s*\)/)){rgb=m.slice(1,4);for(i in rgb){rgb[i]=Math.round(rgb[i]*2.55)}return rgb}if(m=css.match(/hsl\(\s*(\-?\d+),\s*(\-?\d+)%\s*,\s*(\-?\d+)%\s*\)/)){hsl=m.slice(1,4);hsl[1]*=.01;hsl[2]*=.01;return hsl2rgb(hsl)}};rgb2hex=function(){var b,g,r,str,u,_ref1;_ref1=unpack(arguments),r=_ref1[0],g=_ref1[1],b=_ref1[2];u=r<<16|g<<8|b;str="000000"+u.toString(16);return"#"+str.substr(str.length-6)};hsv2rgb=function(){var b,f,g,h,i,p,q,r,s,t,v,_ref1,_ref2,_ref3,_ref4,_ref5,_ref6,_ref7;_ref1=unpack(arguments),h=_ref1[0],s=_ref1[1],v=_ref1[2];v*=255;if(s===0){r=g=b=v}else{if(h===360){h=0}if(h>360){h-=360}if(h<0){h+=360}h/=60;i=Math.floor(h);f=h-i;p=v*(1-s);q=v*(1-s*f);t=v*(1-s*(1-f));switch(i){case 0:_ref2=[v,t,p],r=_ref2[0],g=_ref2[1],b=_ref2[2];break;case 1:_ref3=[q,v,p],r=_ref3[0],g=_ref3[1],b=_ref3[2];break;case 2:_ref4=[p,v,t],r=_ref4[0],g=_ref4[1],b=_ref4[2];break;case 3:_ref5=[p,q,v],r=_ref5[0],g=_ref5[1],b=_ref5[2];break;case 4:_ref6=[t,p,v],r=_ref6[0],g=_ref6[1],b=_ref6[2];break;case 5:_ref7=[v,p,q],r=_ref7[0],g=_ref7[1],b=_ref7[2]}}r=Math.round(r);g=Math.round(g);b=Math.round(b);return[r,g,b]};rgb2hsv=function(){var b,delta,g,h,max,min,r,s,v,_ref1;_ref1=unpack(arguments),r=_ref1[0],g=_ref1[1],b=_ref1[2];min=Math.min(r,g,b);max=Math.max(r,g,b);delta=max-min;v=max/255;if(max===0){h=void 0;s=0}else{s=delta/max;if(r===max){h=(g-b)/delta}if(g===max){h=2+(b-r)/delta}if(b===max){h=4+(r-g)/delta}h*=60;if(h<0){h+=360}}return[h,s,v]};hsl2rgb=function(){var b,c,g,h,i,l,r,s,t1,t2,t3,_i,_ref1,_ref2;_ref1=unpack(arguments),h=_ref1[0],s=_ref1[1],l=_ref1[2];if(s===0){r=g=b=l*255}else{t3=[0,0,0];c=[0,0,0];t2=l<.5?l*(1+s):l+s-l*s;t1=2*l-t2;h/=360;t3[0]=h+1/3;t3[1]=h;t3[2]=h-1/3;for(i=_i=0;_i<=2;i=++_i){if(t3[i]<0){t3[i]+=1}if(t3[i]>1){t3[i]-=1}if(6*t3[i]<1){c[i]=t1+(t2-t1)*6*t3[i]}else if(2*t3[i]<1){c[i]=t2}else if(3*t3[i]<2){c[i]=t1+(t2-t1)*(2/3-t3[i])*6}else{c[i]=t1}}_ref2=[Math.round(c[0]*255),Math.round(c[1]*255),Math.round(c[2]*255)],r=_ref2[0],g=_ref2[1],b=_ref2[2]}return[r,g,b]};rgb2hsl=function(r,g,b){var h,l,max,min,s,_ref1;if(r!==void 0&&r.length===3){_ref1=r,r=_ref1[0],g=_ref1[1],b=_ref1[2]}r/=255;g/=255;b/=255;min=Math.min(r,g,b);max=Math.max(r,g,b);l=(max+min)/2;if(max===min){s=0;h=void 0}else{s=l<.5?(max-min)/(max+min):(max-min)/(2-max-min)}if(r===max){h=(g-b)/(max-min)}else if(g===max){h=2+(b-r)/(max-min)}else if(b===max){h=4+(r-g)/(max-min)}h*=60;if(h<0){h+=360}return[h,s,l]};K=18;X=.95047;Y=1;Z=1.08883;lab2rgb=function(l,a,b){var g,r,x,y,z,_ref1,_ref2;if(l!==void 0&&l.length===3){_ref1=l,l=_ref1[0],a=_ref1[1],b=_ref1[2]}if(l!==void 0&&l.length===3){_ref2=l,l=_ref2[0],a=_ref2[1],b=_ref2[2]}y=(l+16)/116;x=y+a/500;z=y-b/200;x=lab_xyz(x)*X;y=lab_xyz(y)*Y;z=lab_xyz(z)*Z;r=xyz_rgb(3.2404542*x-1.5371385*y-.4985314*z);g=xyz_rgb(-.969266*x+1.8760108*y+.041556*z);b=xyz_rgb(.0556434*x-.2040259*y+1.0572252*z);return[limit(r,0,255),limit(g,0,255),limit(b,0,255)]};rgb2lab=function(){var b,g,r,x,y,z,_ref1;_ref1=unpack(arguments),r=_ref1[0],g=_ref1[1],b=_ref1[2];r=rgb_xyz(r);g=rgb_xyz(g);b=rgb_xyz(b);x=xyz_lab((.4124564*r+.3575761*g+.1804375*b)/X);y=xyz_lab((.2126729*r+.7151522*g+.072175*b)/Y);z=xyz_lab((.0193339*r+.119192*g+.9503041*b)/Z);return[116*y-16,500*(x-y),200*(y-z)]};lch2lab=function(){var c,h,l,_ref1;_ref1=unpack(arguments),l=_ref1[0],c=_ref1[1],h=_ref1[2];h=h*Math.PI/180;return[l,Math.cos(h)*c,Math.sin(h)*c]};lch2rgb=function(l,c,h){var L,a,b,g,r,_ref1,_ref2;_ref1=lch2lab(l,c,h),L=_ref1[0],a=_ref1[1],b=_ref1[2];_ref2=lab2rgb(L,a,b),r=_ref2[0],g=_ref2[1],b=_ref2[2];return[limit(r,0,255),limit(g,0,255),limit(b,0,255)]};lab_xyz=function(x){if(x>.206893034){return x*x*x}else{return(x-4/29)/7.787037}};xyz_lab=function(x){if(x>.008856){return Math.pow(x,1/3)}else{return 7.787037*x+4/29}};xyz_rgb=function(r){return Math.round(255*(r<=.00304?12.92*r:1.055*Math.pow(r,1/2.4)-.055))};rgb_xyz=function(r){if((r/=255)<=.04045){return r/12.92}else{return Math.pow((r+.055)/1.055,2.4)}};lab2lch=function(){var a,b,c,h,l,_ref1;_ref1=unpack(arguments),l=_ref1[0],a=_ref1[1],b=_ref1[2];c=Math.sqrt(a*a+b*b);h=Math.atan2(b,a)/Math.PI*180;return[l,c,h]};rgb2lch=function(){var a,b,g,l,r,_ref1,_ref2;_ref1=unpack(arguments),r=_ref1[0],g=_ref1[1],b=_ref1[2];_ref2=rgb2lab(r,g,b),l=_ref2[0],a=_ref2[1],b=_ref2[2];return lab2lch(l,a,b)};rgb2hsi=function(){var TWOPI,b,g,h,i,min,r,s,_ref1;_ref1=unpack(arguments),r=_ref1[0],g=_ref1[1],b=_ref1[2];TWOPI=Math.PI*2;r/=255;g/=255;b/=255;min=Math.min(r,g,b);i=(r+g+b)/3;s=1-min/i;if(s===0){h=0}else{h=(r-g+(r-b))/2;h/=Math.sqrt((r-g)*(r-g)+(r-b)*(g-b));h=Math.acos(h);if(b>g){h=TWOPI-h}h/=TWOPI}return[h*360,s,i]};hsi2rgb=function(h,s,i){var b,g,r,_ref1;_ref1=unpack(arguments),h=_ref1[0],s=_ref1[1],i=_ref1[2];h/=360;if(h<1/3){b=(1-s)/3;r=(1+s*cos(TWOPI*h)/cos(PITHIRD-TWOPI*h))/3;g=1-(b+r)}else if(h<2/3){h-=1/3;r=(1-s)/3;g=(1+s*cos(TWOPI*h)/cos(PITHIRD-TWOPI*h))/3;b=1-(r+g)}else{h-=2/3;g=(1-s)/3;b=(1+s*cos(TWOPI*h)/cos(PITHIRD-TWOPI*h))/3;r=1-(g+b)}r=limit(i*r*3);g=limit(i*g*3);b=limit(i*b*3);return[r*255,g*255,b*255]};clip_rgb=function(rgb){var i;for(i in rgb){if(rgb[i]<0){rgb[i]=0}if(rgb[i]>255){rgb[i]=255}}return rgb};luminance=function(r,g,b){var _ref1;_ref1=unpack(arguments),r=_ref1[0],g=_ref1[1],b=_ref1[2];r=luminance_x(r);g=luminance_x(g);b=luminance_x(b);return.2126*r+.7152*g+.0722*b};luminance_x=function(x){x/=255;if(x<=.03928){return x/12.92}else{return Math.pow((x+.055)/1.055,2.4)}};chroma.Color=Color;chroma.color=function(x,y,z,m){return new Color(x,y,z,m)};chroma.hsl=function(h,s,l){return new Color(h,s,l,"hsl")};chroma.hsv=function(h,s,v){return new Color(h,s,v,"hsv")};chroma.rgb=function(r,g,b){return new Color(r,g,b,"rgb")};chroma.hex=function(x){return new Color(x)};chroma.css=function(x){return new Color(x)};chroma.lab=function(l,a,b){return new Color(l,a,b,"lab")};chroma.lch=function(l,c,h){return new Color(l,c,h,"lch")};chroma.hsi=function(h,s,i){return new Color(h,s,i,"hsi")};chroma.interpolate=function(a,b,f,m){if(a==null||b==null){return"#000"}if(type(a)==="string"){a=new Color(a)}if(type(b)==="string"){b=new Color(b)}return a.interpolate(f,b,m)};chroma.contrast=function(a,b){var l1,l2;if(type(a)==="string"){a=new Color(a)}if(type(b)==="string"){b=new Color(b)}l1=a.luminance();l2=b.luminance();if(l1>l2){return(l1+.05)/(l2+.05)}else{return(l2+.05)/(l1+.05)}};root=typeof exports!=="undefined"&&exports!==null?exports:this;chroma=(_ref1=root.chroma)!=null?_ref1:root.chroma={};Color=chroma.Color;ColorScale=function(){function ColorScale(opts){var me,_ref2,_ref3;if(opts==null){opts={}}me=this;me.range(opts.colors,opts.positions);me._mode=(_ref2=opts.mode)!=null?_ref2:"rgb";me._nacol=chroma.hex((_ref3=opts.nacol)!=null?_ref3:chroma.hex("#ccc"));me.domain([0,1]);me}ColorScale.prototype.range=function(colors,positions){var c,col,me,_i,_j,_ref2,_ref3,_ref4;me=this;if(colors==null){colors=["#ddd","#222"]}if(colors!=null&&type(colors)==="string"&&((_ref2=chroma.brewer)!=null?_ref2[colors]:void 0)!=null){colors=chroma.brewer[colors].slice(0)}for(c=_i=0,_ref3=colors.length-1;0<=_ref3?_i<=_ref3:_i>=_ref3;c=0<=_ref3?++_i:--_i){col=colors[c];if(type(col)==="string"){colors[c]=new Color(col)}}me._colors=colors;if(positions!=null){me._pos=positions}else{me._pos=[];for(c=_j=0,_ref4=colors.length-1;0<=_ref4?_j<=_ref4:_j>=_ref4;c=0<=_ref4?++_j:--_j){me._pos.push(c/(colors.length-1))}}return me};ColorScale.prototype.domain=function(domain){var me;if(domain==null){domain=[]}me=this;me._domain=domain;me._min=domain[0];me._max=domain[domain.length-1];if(domain.length===2){me._numClasses=0}else{me._numClasses=domain.length-1}return me};ColorScale.prototype.get=function(value){var c,f,f0,me;me=this;if(isNaN(value)){return me._nacol}if(me._domain.length>2){c=me.getClass(value);f=c/(me._numClasses-1)}else{f=f0=(value-me._min)/(me._max-me._min);f=Math.min(1,Math.max(0,f))}return me.fColor(f)};ColorScale.prototype.fColor=function(f){var col,cols,i,me,p,_i,_ref2;me=this;cols=me._colors;for(i=_i=0,_ref2=me._pos.length-1;0<=_ref2?_i<=_ref2:_i>=_ref2;i=0<=_ref2?++_i:--_i){p=me._pos[i];if(f<=p){col=cols[i];break}if(f>=p&&i===me._pos.length-1){col=cols[i];break}if(f>p&&f2){n=domain.length-1;i=me.getClass(value);val=domain[i]+(domain[i+1]-domain[i])*.5;minc=domain[0];maxc=domain[n-1];val=me._min+(val-minc)/(maxc-minc)*(me._max-me._min)}return val};ColorScale.prototype.getClass=function(value){var domain,i,n,self;self=this;domain=self._domain;if(domain!=null){n=domain.length-1;i=0;while(i=domain[i]){i++}return i-1}return 0};ColorScale.prototype.validValue=function(value){return!isNaN(value)};return ColorScale}();chroma.ColorScale=ColorScale;chroma.scale=function(colors,positions){var colscale,f,out;colscale=new chroma.ColorScale;colscale.range(colors,positions);out=false;f=function(v){var c;c=colscale.get(v);if(out&&c[out]){return c[out]()}else{return c}};f.domain=function(domain,classes,mode,key){var d;if(mode==null){mode="e"}if(classes!=null){d=chroma.analyze(domain,key);if(classes===0){domain=[d.min,d.max]}else{domain=chroma.limits(d,mode,classes)}}colscale.domain(domain);return f};f.mode=function(_m){colscale._mode=_m;return f};f.range=function(_colors,_pos){colscale.range(_colors,_pos);return f};f.out=function(_o){out=_o;return f};f.getColor=function(val){return f(val)};return f};if((_ref2=chroma.scales)==null){chroma.scales={}}chroma.scales.cool=function(){return chroma.scale([chroma.hsl(180,1,.9),chroma.hsl(250,.7,.4)])};chroma.scales.hot=function(){return chroma.scale(["#000","#f00","#ff0","#fff"],[0,.25,.75,1]).mode("rgb")};chroma.analyze=function(data,key,filter){var add,k,r,val,visit,_i,_len;r={min:Number.MAX_VALUE,max:Number.MAX_VALUE*-1,sum:0,values:[],count:0};if(filter==null){filter=function(){return true}}add=function(val){if(val!=null&&!isNaN(val)){r.values.push(val);r.sum+=val;if(valr.max){r.max=val}r.count+=1}};visit=function(val,k){if(filter(val,k)){if(key!=null&&type(key)==="function"){return add(key(val))}else if(key!=null&&type(key)==="string"||type(key)==="number"){return add(val[key])}else{return add(val)}}};if(type(data)==="array"){for(_i=0,_len=data.length;_i<_len;_i++){val=data[_i];visit(val)}}else{for(k in data){val=data[k];visit(val,k)}}r.domain=[r.min,r.max];r.limits=function(mode,num){return chroma.limits(r,mode,num)};return r};chroma.limits=function(data,mode,num){var assignments,best,centroids,cluster,clusterSizes,dist,i,j,kClusters,limits,max,max_log,min,min_log,mindist,n,nb_iters,newCentroids,p,pb,pr,repeat,sum,tmpKMeansBreaks,value,values,_i,_j,_k,_l,_m,_n,_o,_p,_q,_r,_ref10,_ref11,_ref12,_ref13,_ref14,_ref15,_ref16,_ref17,_ref3,_ref4,_ref5,_ref6,_ref7,_ref8,_ref9,_s,_t,_u,_v,_w;if(mode==null){mode="equal"}if(num==null){num=7}if(data.values==null){data=chroma.analyze(data)}min=data.min;max=data.max;sum=data.sum;values=data.values.sort(function(a,b){return a-b});limits=[];if(mode.substr(0,1)==="c"){limits.push(min);limits.push(max)}if(mode.substr(0,1)==="e"){limits.push(min);for(i=_i=1,_ref3=num-1;1<=_ref3?_i<=_ref3:_i>=_ref3;i=1<=_ref3?++_i:--_i){limits.push(min+i/num*(max-min))}limits.push(max)}else if(mode.substr(0,1)==="l"){if(min<=0){throw"Logarithmic scales are only possible for values > 0"}min_log=Math.LOG10E*Math.log(min);max_log=Math.LOG10E*Math.log(max);limits.push(min);for(i=_j=1,_ref4=num-1;1<=_ref4?_j<=_ref4:_j>=_ref4;i=1<=_ref4?++_j:--_j){limits.push(Math.pow(10,min_log+i/num*(max_log-min_log)))}limits.push(max)}else if(mode.substr(0,1)==="q"){limits.push(min);for(i=_k=1,_ref5=num-1;1<=_ref5?_k<=_ref5:_k>=_ref5;i=1<=_ref5?++_k:--_k){p=values.length*i/num;pb=Math.floor(p);if(pb===p){limits.push(values[pb])}else{pr=p-pb;limits.push(values[pb]*pr+values[pb+1]*(1-pr))}}limits.push(max)}else if(mode.substr(0,1)==="k"){n=values.length;assignments=new Array(n);clusterSizes=new Array(num);repeat=true;nb_iters=0;centroids=null;centroids=[];centroids.push(min);for(i=_l=1,_ref6=num-1;1<=_ref6?_l<=_ref6:_l>=_ref6;i=1<=_ref6?++_l:--_l){centroids.push(min+i/num*(max-min))}centroids.push(max);while(repeat){for(j=_m=0,_ref7=num-1;0<=_ref7?_m<=_ref7:_m>=_ref7;j=0<=_ref7?++_m:--_m){clusterSizes[j]=0}for(i=_n=0,_ref8=n-1;0<=_ref8?_n<=_ref8:_n>=_ref8;i=0<=_ref8?++_n:--_n){value=values[i];mindist=Number.MAX_VALUE;for(j=_o=0,_ref9=num-1;0<=_ref9?_o<=_ref9:_o>=_ref9;j=0<=_ref9?++_o:--_o){dist=Math.abs(centroids[j]-value);if(dist=_ref10;j=0<=_ref10?++_p:--_p){newCentroids[j]=null}for(i=_q=0,_ref11=n-1;0<=_ref11?_q<=_ref11:_q>=_ref11;i=0<=_ref11?++_q:--_q){cluster=assignments[i];if(newCentroids[cluster]===null){newCentroids[cluster]=values[i]}else{newCentroids[cluster]+=values[i]}}for(j=_r=0,_ref12=num-1;0<=_ref12?_r<=_ref12:_r>=_ref12;j=0<=_ref12?++_r:--_r){newCentroids[j]*=1/clusterSizes[j]}repeat=false;for(j=_s=0,_ref13=num-1;0<=_ref13?_s<=_ref13:_s>=_ref13;j=0<=_ref13?++_s:--_s){if(newCentroids[j]!==centroids[i]){repeat=true;break}}centroids=newCentroids;nb_iters++;if(nb_iters>200){repeat=false}}kClusters={};for(j=_t=0,_ref14=num-1;0<=_ref14?_t<=_ref14:_t>=_ref14;j=0<=_ref14?++_t:--_t){kClusters[j]=[]}for(i=_u=0,_ref15=n-1;0<=_ref15?_u<=_ref15:_u>=_ref15;i=0<=_ref15?++_u:--_u){cluster=assignments[i];kClusters[cluster].push(values[i])}tmpKMeansBreaks=[];for(j=_v=0,_ref16=num-1;0<=_ref16?_v<=_ref16:_v>=_ref16;j=0<=_ref16?++_v:--_v){tmpKMeansBreaks.push(kClusters[j][0]);tmpKMeansBreaks.push(kClusters[j][kClusters[j].length-1])}tmpKMeansBreaks=tmpKMeansBreaks.sort(function(a,b){return a-b});limits.push(tmpKMeansBreaks[0]);for(i=_w=1,_ref17=tmpKMeansBreaks.length-1;_w<=_ref17;i=_w+=2){if(!isNaN(tmpKMeansBreaks[i])){limits.push(tmpKMeansBreaks[i])}}}return limits};root=typeof exports!=="undefined"&&exports!==null?exports:this;type=function(){var classToType,name,_i,_len,_ref3;classToType={};_ref3="Boolean Number String Function Array Date RegExp Undefined Null".split(" ");for(_i=0,_len=_ref3.length;_i<_len;_i++){name=_ref3[_i];classToType["[object "+name+"]"]=name.toLowerCase()}return function(obj){var strType;strType=Object.prototype.toString.call(obj);return classToType[strType]||"object"}}();if((_ref3=root.type)==null){root.type=type}Array.max=function(array){return Math.max.apply(Math,array)};Array.min=function(array){return Math.min.apply(Math,array)};limit=function(x,min,max){if(min==null){min=0}if(max==null){max=1}if(xmax){x=max}return x};unpack=function(args){if(args.length===3){return args}else{return args[0]}};TWOPI=Math.PI*2;PITHIRD=Math.PI/3;cos=Math.cos;root=typeof exports!=="undefined"&&exports!==null?exports:this;chroma=(_ref4=root.chroma)!=null?_ref4:root.chroma={};chroma.brewer=brewer={OrRd:["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#b30000","#7f0000"],PuBu:["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#045a8d","#023858"],BuPu:["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#810f7c","#4d004b"],Oranges:["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#a63603","#7f2704"],BuGn:["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#006d2c","#00441b"],YlOrBr:["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#993404","#662506"],YlGn:["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#006837","#004529"],Reds:["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#a50f15","#67000d"],RdPu:["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177","#49006a"],Greens:["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#006d2c","#00441b"],YlGnBu:["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"],Purples:["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#54278f","#3f007d"],GnBu:["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#0868ac","#084081"],Greys:["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525","#000000"],YlOrRd:["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#bd0026","#800026"],PuRd:["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#980043","#67001f"],Blues:["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#08519c","#08306b"],PuBuGn:["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016c59","#014636"],Spectral:["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"],RdYlGn:["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"],RdBu:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"],PiYG:["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"],PRGn:["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"],RdYlBu:["#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"],BrBG:["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"],RdGy:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"],PuOr:["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"],Set2:["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f","#e5c494","#b3b3b3"],Accent:["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f","#bf5b17","#666666"],Set1:["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf","#999999"],Set3:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd","#ccebc5","#ffed6f"],Dark2:["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d","#666666"],Paired:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a","#ffff99","#b15928"],Pastel2:["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae","#f1e2cc","#cccccc"],Pastel1:["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd","#fddaec","#f2f2f2"]};root=typeof exports!=="undefined"&&exports!==null?exports:this;chroma=(_ref5=root.chroma)!=null?_ref5:root.chroma={};chroma.colors=colors={indigo:"#4b0082",gold:"#ffd700",hotpink:"#ff69b4",firebrick:"#b22222",indianred:"#cd5c5c",yellow:"#ffff00",mistyrose:"#ffe4e1",darkolivegreen:"#556b2f",olive:"#808000",darkseagreen:"#8fbc8f",pink:"#ffc0cb",tomato:"#ff6347",lightcoral:"#f08080",orangered:"#ff4500",navajowhite:"#ffdead",lime:"#00ff00",palegreen:"#98fb98",darkslategrey:"#2f4f4f",greenyellow:"#adff2f",burlywood:"#deb887",seashell:"#fff5ee",mediumspringgreen:"#00fa9a",fuchsia:"#ff00ff",papayawhip:"#ffefd5",blanchedalmond:"#ffebcd",chartreuse:"#7fff00",dimgray:"#696969",black:"#000000",peachpuff:"#ffdab9",springgreen:"#00ff7f",aquamarine:"#7fffd4",white:"#ffffff",orange:"#ffa500",lightsalmon:"#ffa07a",darkslategray:"#2f4f4f",brown:"#a52a2a",ivory:"#fffff0",dodgerblue:"#1e90ff",peru:"#cd853f",lawngreen:"#7cfc00",chocolate:"#d2691e",crimson:"#dc143c",forestgreen:"#228b22",darkgrey:"#a9a9a9",lightseagreen:"#20b2aa",cyan:"#00ffff",mintcream:"#f5fffa",silver:"#c0c0c0",antiquewhite:"#faebd7",mediumorchid:"#ba55d3",skyblue:"#87ceeb",gray:"#808080",darkturquoise:"#00ced1",goldenrod:"#daa520",darkgreen:"#006400",floralwhite:"#fffaf0",darkviolet:"#9400d3",darkgray:"#a9a9a9",moccasin:"#ffe4b5",saddlebrown:"#8b4513",grey:"#808080",darkslateblue:"#483d8b",lightskyblue:"#87cefa",lightpink:"#ffb6c1",mediumvioletred:"#c71585",slategrey:"#708090",red:"#ff0000",deeppink:"#ff1493",limegreen:"#32cd32",darkmagenta:"#8b008b",palegoldenrod:"#eee8aa",plum:"#dda0dd",turquoise:"#40e0d0",lightgrey:"#d3d3d3",lightgoldenrodyellow:"#fafad2",darkgoldenrod:"#b8860b",lavender:"#e6e6fa",maroon:"#800000",yellowgreen:"#9acd32",sandybrown:"#f4a460",thistle:"#d8bfd8",violet:"#ee82ee",navy:"#000080",magenta:"#ff00ff",dimgrey:"#696969",tan:"#d2b48c",rosybrown:"#bc8f8f",olivedrab:"#6b8e23",blue:"#0000ff",lightblue:"#add8e6",ghostwhite:"#f8f8ff",honeydew:"#f0fff0",cornflowerblue:"#6495ed",slateblue:"#6a5acd",linen:"#faf0e6",darkblue:"#00008b",powderblue:"#b0e0e6",seagreen:"#2e8b57",darkkhaki:"#bdb76b",snow:"#fffafa",sienna:"#a0522d",mediumblue:"#0000cd",royalblue:"#4169e1",lightcyan:"#e0ffff",green:"#008000",mediumpurple:"#9370db",midnightblue:"#191970",cornsilk:"#fff8dc",paleturquoise:"#afeeee",bisque:"#ffe4c4",slategray:"#708090",darkcyan:"#008b8b",khaki:"#f0e68c",wheat:"#f5deb3",teal:"#008080",darkorchid:"#9932cc",deepskyblue:"#00bfff",salmon:"#fa8072",darkred:"#8b0000",steelblue:"#4682b4",palevioletred:"#db7093",lightslategray:"#778899",aliceblue:"#f0f8ff",lightslategrey:"#778899",lightgreen:"#90ee90",orchid:"#da70d6",gainsboro:"#dcdcdc",mediumseagreen:"#3cb371",lightgray:"#d3d3d3",mediumturquoise:"#48d1cc",lemonchiffon:"#fffacd",cadetblue:"#5f9ea0",lightyellow:"#ffffe0",lavenderblush:"#fff0f5",coral:"#ff7f50",purple:"#800080",aqua:"#00ffff",whitesmoke:"#f5f5f5",mediumslateblue:"#7b68ee",darkorange:"#ff8c00",mediumaquamarine:"#66cdaa",darksalmon:"#e9967a",beige:"#f5f5dc",blueviolet:"#8a2be2",azure:"#f0ffff",lightsteelblue:"#b0c4de",oldlace:"#fdf5e6"}}).call(this); \ No newline at end of file diff --git a/js/flashcanvas.js b/js/flashcanvas.js new file mode 100755 index 0000000..dc0eee0 --- /dev/null +++ b/js/flashcanvas.js @@ -0,0 +1,28 @@ +/* + * FlashCanvas + * + * Copyright (c) 2009 Tim Cameron Ryan + * Copyright (c) 2009-2011 FlashCanvas Project + * Released under the MIT/X License + */ +window.ActiveXObject&&!window.CanvasRenderingContext2D&&function(h,j){function D(a){this.code=a;this.message=T[a]}function U(a){this.width=a}function E(a){this.id=a.C++}function t(a){this.G=a;this.id=a.C++}function u(a,b){this.canvas=a;this.B=b;this.d=a.uniqueID;this.D();this.C=0;this.t="";var c=this;setInterval(function(){n[c.d]===0&&c.e()},30)}function A(){if(j.readyState==="complete"){j.detachEvent(F,A);for(var a=j.getElementsByTagName(r),b=0,c=a.length;b=8?a.src:a.getAttribute("src",4)}function v(a){return(""+a).replace(/&/g,"&").replace(/0)return eval(this.B.CallFunction(''+a.join("�")+""))},I:function(a,b){this.e();this.D();if(a>0)this.B.width=a;if(b>0)this.B.height=b;this.a.push(e.resize,a,b)}};t.prototype={addColorStop:function(a,b){if(isNaN(a)||a<0||a>1)i(1);this.G.a.push(e.addColorStop,this.id,a,b)}};D.prototype=Error();var T={1:"INDEX_SIZE_ERR",9:"NOT_SUPPORTED_ERR",11:"INVALID_STATE_ERR", +12:"SYNTAX_ERR",17:"TYPE_MISMATCH_ERR",18:"SECURITY_ERR"},B={initElement:function(a){if(a.getContext)return a;var b=a.uniqueID,c="external"+b;x[b]=false;n[b]=1;Q(a);a.innerHTML=''; +s[b]=a;var d=a.firstChild;y[b]=a.lastChild;var f=j.body.contains;if(f(a))d.movie=w;else var g=setInterval(function(){if(f(a)){clearInterval(g);d.movie=w}},0);if(j.compatMode==="BackCompat"||!h.XMLHttpRequest)y[b].style.overflow="hidden";var o=new u(a,d);a.getContext=function(l){return l==="2d"?o:k};a.toDataURL=function(l,z){(""+l).replace(/[A-Z]+/g,W)==="image/jpeg"?o.a.push(e.toDataURL,l,typeof z==="number"?z:""):o.a.push(e.toDataURL,l);return o.e()};d.attachEvent(K,G);return a},saveImage:function(a){a.firstChild.saveImage()}, +setOptions:function(){},trigger:function(a,b){s[a].fireEvent("on"+b)},unlock:function(a,b){n[a]&&--n[a];if(b){var c=s[a],d=c.firstChild,f,g;Q(c);f=c.width;g=c.height;c.style.width=f+"px";c.style.height=g+"px";if(f>0)d.width=f;if(g>0)d.height=g;d.resize(f,g);c.attachEvent(L,H);x[a]=true}}};j.createElement(r);j.createStyleSheet().cssText=r+"{display:inline-block;overflow:hidden;width:300px;height:150px}";j.readyState==="complete"?A():j.attachEvent(F,A);h.attachEvent(J,I);if(w.indexOf(location.protocol+ +"//"+location.host+"/")===0){var S=new ActiveXObject("Microsoft.XMLHTTP");S.open("GET",w,false);S.send(k)}h[M]=u;h[N]=t;h[O]=E;h[C]=B;h[P]={init:function(){},init_:function(){},initElement:B.initElement};keep=u.measureText}(window,document); diff --git a/js/flashcanvas.swf b/js/flashcanvas.swf new file mode 100755 index 0000000000000000000000000000000000000000..66ff213fb9b86811d17f032be3c73df61547e597 GIT binary patch literal 21235 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 literal 0 HcmV?d00001 diff --git a/js/highlight/LICENSE b/js/highlight/LICENSE new file mode 100644 index 0000000..422deb7 --- /dev/null +++ b/js/highlight/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2006, Ivan Sagalaev +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of highlight.js nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/js/highlight/README.md b/js/highlight/README.md new file mode 100644 index 0000000..89792b8 --- /dev/null +++ b/js/highlight/README.md @@ -0,0 +1,143 @@ +# Highlight.js + +Highlight.js highlights syntax in code examples on blogs, forums and, +in fact, on any web page. It's very easy to use because it works +automatically: finds blocks of code, detects a language, highlights it. + +Autodetection can be fine tuned when it fails by itself (see "Heuristics"). + + +## Basic usage + +Link the library and a stylesheet from your page and hook highlighting to +the page load event: + +```html + + + +``` + +This will highlight all code on the page marked up as `
 .. 
`. +If you use different markup or need to apply highlighting dynamically, read +"Custom initialization" below. + +- You can download your own customized version of "highlight.pack.js" or + use the hosted one as described on the download page: + + +- Style themes are available in the download package or as hosted files. + To create a custom style for your site see the class reference in the file + [classref.txt][cr] from the downloaded package. + +[cr]: http://github.com/isagalaev/highlight.js/blob/master/classref.txt + + +## node.js + +Highlight.js can be used under node.js. The package with all supported languages is +installable from NPM: + + npm install highlight.js + +Alternatively, you can build it from the source with only languages you need: + + python tools/build.py -tnode lang1 lang2 .. + +Using the library: + +```javascript +var hljs = require('highlight.js'); + +// If you know the language +hljs.highlight(lang, code).value; + +// Automatic language detection +hljs.highlightAuto(code).value; +``` + +## Tab replacement + +You can replace TAB ('\x09') characters used for indentation in your code +with some fixed number of spaces or with a `` to give them special +styling: + +```html + +``` + +## Custom initialization + +If you use different markup for code blocks you can initialize them manually +with `highlightBlock(code, tabReplace, useBR)` function. It takes a DOM element +containing the code to highlight and optionally a string with which to replace +TAB characters. + +Initialization using, for example, jQuery might look like this: + +```javascript +$(document).ready(function() { + $('pre code').each(function(i, e) {hljs.highlightBlock(e)}); +}); +``` + +You can use `highlightBlock` to highlight blocks dynamically inserted into +the page. Just make sure you don't do it twice for already highlighted +blocks. + +If your code container relies on `
` tags instead of line breaks (i.e. if +it's not `
`) pass `true` into the third parameter of `highlightBlock`
+to make highlight.js use `
` in the output: + +```javascript +$('div.code').each(function(i, e) {hljs.highlightBlock(e, null, true)}); +``` + + +## Heuristics + +Autodetection of a code's language is done using a simple heuristic: +the program tries to highlight a fragment with all available languages and +counts all syntactic structures that it finds along the way. The language +with greatest count wins. + +This means that in short fragments the probability of an error is high +(and it really happens sometimes). In this cases you can set the fragment's +language explicitly by assigning a class to the `` element: + +```html +
...
+``` + +You can use class names recommended in HTML5: "language-html", +"language-php". Classes also can be assigned to the `
` element.
+
+To disable highlighting of a fragment altogether use "no-highlight" class:
+
+```html
+
...
+``` + + +## Export + +File export.html contains a little program that allows you to paste in a code +snippet and then copy and paste the resulting HTML code generated by the +highlighter. This is useful in situations when you can't use the script itself +on a site. + + +## Meta + +- Version: 7.1 +- URL: http://softwaremaniacs.org/soft/highlight/en/ +- Author: Ivan Sagalaev () + +For the license terms see LICENSE files. +For the list of contributors see AUTHORS.en.txt file. diff --git a/js/highlight/README.ru.md b/js/highlight/README.ru.md new file mode 100644 index 0000000..bb29a24 --- /dev/null +++ b/js/highlight/README.ru.md @@ -0,0 +1,149 @@ +# Highlight.js + +Highlight.js нужен для подсветки синтаксиса в примерах кода в блогах, +форумах и вообще на любых веб-страницах. Пользоваться им очень просто, +потому что работает он автоматически: сам находит блоки кода, сам +определяет язык, сам подсвечивает. + +Автоопределением языка можно управлять, когда оно не справляется само (см. +дальше "Эвристика"). + + +## Простое использование + +Подключите библиотеку и стиль на страницу и повесть вызов подсветки на +загрузку страницы: + +```html + + + +``` + +Весь код на странице, обрамлённый в теги `
 .. 
` +будет автоматически подсвечен. Если вы используете другие теги или хотите +подсвечивать блоки кода динамически, читайте "Инициализацию вручную" ниже. + +- Вы можете скачать собственную версию "highlight.pack.js" или сослаться + на захостенный файл, как описано на странице загрузки: + + +- Стилевые темы можно найти в загруженном архиве или также использовать + захостенные. Чтобы сделать собственный стиль для своего сайта, вам + будет полезен справочник классов в файле [classref.txt][cr], который тоже + есть в архиве. + +[cr]: http://github.com/isagalaev/highlight.js/blob/master/classref.txt + + +## node.js + +Highlight.js можно использовать в node.js. Библиотеку со всеми возможными языками можно +установить с NPM: + + npm install highlight.js + +Также её можно собрать из исходников с только теми языками, которые нужны: + + python tools/build.py -tnode lang1 lang2 .. + +Использование библиотеки: + +```javascript +var hljs = require('highlight.js'); + +// Если вы знаете язык +hljs.highlight(lang, code).value; + +// Автоопределение языка +hljs.highlightAuto(code).value; +``` + + +## Замена TABов + +Также вы можете заменить символы TAB ('\x09'), используемые для отступов, на +фиксированное количество пробелов или на отдельный ``, чтобы задать ему +какой-нибудь специальный стиль: + +```html + +``` + + +## Инициализация вручную + +Если вы используете другие теги для блоков кода, вы можете инициализировать их +явно с помощью функции `highlightBlock(code, tabReplace, useBR)`. Она принимает +DOM-элемент с текстом расцвечиваемого кода и опционально - строчку для замены +символов TAB. + +Например с использованием jQuery код инициализации может выглядеть так: + +```javascript +$(document).ready(function() { + $('pre code').each(function(i, e) {hljs.highlightBlock(e)}); +}); +``` + +`highlightBlock` можно также использовать, чтобы подсветить блоки кода, +добавленные на страницу динамически. Только убедитесь, что вы не делаете этого +повторно для уже раскрашенных блоков. + +Если ваш блок кода использует `
` вместо переводов строки (т.е. если это не +`
`), передайте `true` третьим параметром в `highlightBlock`:
+
+```javascript
+$('div.code').each(function(i, e) {hljs.highlightBlock(e, null, true)});
+```
+
+
+## Эвристика
+
+Определение языка, на котором написан фрагмент, делается с помощью
+довольно простой эвристики: программа пытается расцветить фрагмент всеми
+языками подряд, и для каждого языка считает количество подошедших
+синтаксически конструкций и ключевых слов. Для какого языка нашлось больше,
+тот и выбирается.
+
+Это означает, что в коротких фрагментах высока вероятность ошибки, что
+периодически и случается. Чтобы указать язык фрагмента явно, надо написать
+его название в виде класса к элементу ``:
+
+```html
+
...
+``` + +Можно использовать рекомендованные в HTML5 названия классов: +"language-html", "language-php". Также можно назначать классы на элемент +`
`.
+
+Чтобы запретить расцветку фрагмента вообще, используется класс "no-highlight":
+
+```html
+
...
+``` + + +## Экспорт + +В файле export.html находится небольшая программка, которая показывает и дает +скопировать непосредственно HTML-код подсветки для любого заданного фрагмента кода. +Это может понадобится например на сайте, на котором нельзя подключить сам скрипт +highlight.js. + + +## Координаты + +- Версия: 7.1 +- URL: http://softwaremaniacs.org/soft/highlight/ +- Автор: Иван Сагалаев () + +Лицензионное соглашение читайте в файле LICENSE. +Список соавторов читайте в файле AUTHORS.ru.txt diff --git a/js/highlight/classref.txt b/js/highlight/classref.txt new file mode 100644 index 0000000..9c9ac28 --- /dev/null +++ b/js/highlight/classref.txt @@ -0,0 +1,553 @@ +This is a full list of available classes corresponding to languages' +syntactic structures. The parentheses after language name contain identifiers +used as class names in `` element. + +Python ("python"): + + keyword keyword + built_in built-in objects (None, False, True and Ellipsis) + number number + string string (of any type) + comment comment + decorator @-decorator for functions + function function header "def some_name(...):" + class class header "class SomeName(...):" + title name of a function or a class inside a header + params everything inside parentheses in a function's or class' header + +Python profiler results ("profile"): + + number number + string string + builtin builtin function entry + filename filename in an entry + summary profiling summary + header header of table of results + keyword column header + function function name in an entry (including parentheses) + title actual name of a function in an entry (excluding parentheses) + +Ruby ("ruby"): + + keyword keyword + string string + subst in-string substitution (#{...}) + comment comment + yardoctag YARD tag + function function header "def some_name(...):" + class class header "class SomeName(...):" + title name of a function or a class inside a header + parent name of a parent class + symbol symbol + +Perl ("perl"): + + keyword keyword + comment comment + number number + string string + regexp regular expression + sub subroutine header (from "sub" till "{") + variable variable starting with "$", "%", "@" + operator operator + pod plain old doc + +PHP ("php"): + + keyword keyword + number number + string string (of any type) + comment comment + phpdoc phpdoc params in comments + variable variable starting with "$" + preprocessor preprocessor marks: "" + +Scala ("scala"): + + keyword keyword + number number + string string + comment comment + annotaion annotation + javadoc javadoc comment + javadoctag @-tag in javadoc + class class header + title class name inside a header + params everything in parentheses inside a class header + inheritance keywords "extends" and "with" inside class header + +Go language ("go"): + comment comment + string string constant + number number + keyword language keywords + constant true false nil iota + typename built-in plain types (int, string etc.) + built_in built-in functions + +XML ("xml"): + + tag any tag from "<" till ">" + comment comment + pi processing instruction () + cdata CDATA section + attribute attribute + value attribute's value + +HTML ("html"): + + keyword HTML tag + tag any tag from "<" till ">" + comment comment + doctype declaration + attribute tag's attribute with or without value + value attribute's value + +CSS ("css"): + + tag HTML tag in selectors + id #some_name in selectors + class .some_name in selectors + at_rule @-rule till first "{" or ";" + attr_selector attribute selector (square brackets in a[href^=http://]) + pseudo pseudo classes and elemens (:after, ::after etc.) + comment comment + rules everything from "{" till "}" + property property name inside a rule + value property value inside a rule, from ":" till ";" or + till the end of rule block + number number within a value + string string within a value + hexcolor hex color (#FFFFFF) within a value + function CSS function within a value + params everything between "(" and ")" within a function + important "!important" symbol + +Markdown ("markdown"): + + header header + bullet list bullet + emphasis emphasis + strong strong emphasis + blockquote blockquote + code code + horizontal_rule horizontal rule + link_label link label + link_url link url + +Django ("django"): + + keyword HTML tag in HTML, default tags and default filters in templates + tag any tag from "<" till ">" + comment comment + doctype declaration + attribute tag's attribute with or withou value + value attribute's value + template_tag template tag {% .. %} + variable template variable {{ .. }} + template_comment template comment, both {# .. #} and {% comment %} + filter filter from "|" till the next filter or the end of tag + argument filter argument + +JSON ("json"): + + number number + literal "true", "false" and "null" + string string value + attribute name of an object property + value value of an object property + +JavaScript ("javascript"): + + keyword keyword + comment comment + number number + literal special literal: "true", "false" and "null" + string string + regexp regular expression + function header of a function + title name of a function inside a header + params parentheses and everything inside them in a function's header + +CoffeeScript ("coffeescript"): + + keyword keyword + comment comment + number number + literal special literal: "true", "false" and "null" + string string + regexp regular expression + function header of a function + title name of a function variable inside a header + params parentheses and everything inside them in a function's header + +ActionScript ("actionscript"): + + comment comment + string string + number number + keyword keywords + literal literal + reserved reserved keyword + title name of declaration (package, class or function) + preprocessor preprocessor directive (import, include) + type type of returned value (for functions) + package package (named or not) + class class/interface + function function + param params of function + rest_arg rest argument of function + +VBScript ("vbscript"): + + keyword keyword + number number + string string + comment comment + built_in built-in function + +HTTP ("http"): + + request first line of a request + status first line of a response + attribute header name + string header value or query string in a request line + number status code + +Lua ("lua"): + + keyword keyword + number number + string string + comment comment + built_in built-in operator + function header of a function + title name of a function inside a header + params everything inside parentheses in a function's header + long_brackets multiline string in [=[ .. ]=] + +Delphi ("delphi"): + + keyword keyword + comment comment (of any type) + number number + string string + function header of a function, procedure, constructor and destructor + title name of a function, procedure, constructor or destructor + inside a header + params everything inside parentheses in a function's header + class class' body from "= class" till "end;" + +Java ("java"): + + keyword keyword + number number + string string + comment commment + annotaion annotation + javadoc javadoc comment + class class header from "class" till "{" + title class name inside a header + params everything in parentheses inside a class header + inheritance keywords "extends" and "implements" inside class header + +C++ ("cpp"): + + keyword keyword + number number + string string and character + comment comment + preprocessor preprocessor directive + stl_container instantiation of STL containers ("vector<...>") + +Objective C ("objectivec"): + keyword keyword + built_in Cocoa/Cocoa Touch constants and classes + number number + string string + comment comment + preprocessor preprocessor directive + class interface/implementation, protocol and forward class declaration + variable properties and struct accesors + +Vala ("vala"): + + keyword keyword + number number + string string + comment comment + class class definitions + title in class definition + constant ALL_UPPER_CASE + +C# ("cs"): + + keyword keyword + number number + string string + comment commment + xmlDocTag xmldoc tag ("///", "", "<..>") + +D language ("d"): + + comment comment + string string constant + number number + keyword language keywords (including @attributes) + constant true false null + built_in built-in plain types (int, string etc.) + +RenderMan RSL ("rsl"): + + keyword keyword + number number + string string (including @"..") + comment comment + preprocessor preprocessor directive + shader sahder keywords + shading shading keywords + built_in built-in function + +RenderMan RIB ("rib"): + + keyword keyword + number number + string string + comment comment + commands command + +Maya Embedded Language ("mel"): + + keyword keyword + number number + string string + comment comment + variable variable + +SQL ("sql"): + + keyword keyword (mostly SQL'92 and SQL'99) + number number + string string (of any type: "..", '..', `..`) + comment comment + aggregate aggregate function + +Smalltalk ("smalltalk"): + + keyword keyword + number number + string string + comment commment + symbol symbol + array array + class name of a class + char char + localvars block of local variables + +Lisp ("lisp"): + + keyword keyword + number number + string string + comment commment + variable variable + literal b, t and nil + list non-quoted list + title first symbol in a non-quoted list + body remainder of the non-quoted list + quoted quoted list, both "(quote .. )" and "'(..)" + +Clojure ("clojure"): + + comment comments and hints + string string + number number + collection collections + attribute :keyword + title function name (built-in or user defined) + built_in built-in function name + +Ini ("ini"): + + title title of a section + value value of a setting of any type + string string + number number + keyword boolean value keyword + +Apache ("apache"): + + keyword keyword + number number + comment commment + literal On and Off + sqbracket variables in rewrites "%{..}" + cbracket options in rewrites "[..]" + tag begin and end of a configuration section + +Nginx ("nginx"): + + title directive title + string string + number number + comment comment + built_in built-in constant + variable $-variable + regexp regexp + +Diff ("diff"): + + header file header + chunk chunk header within a file + addition added lines + deletion deleted lines + change changed lines + +DOS ("dos"): + + keyword keyword + flow batch control keyword + stream DOS special files ("con", "prn", ...) + winutils some commands (see dos.js specifically) + envvar environment variables + +Bash ("bash"): + + keyword keyword + string string + number number + comment comment + literal special literal: "true" и "false" + variable variable + shebang script interpreter header + +CMake ("cmake") + + keyword keyword + number number + string string + comment commment + envvar $-variable + +Axapta ("axapta"): + + keyword keyword + number number + string string + comment commment + class class header from "class" till "{" + title class name inside a header + params everything in parentheses inside a class header + inheritance keywords "extends" and "implements" inside class header + preprocessor preprocessor directive + +1C ("1c"): + + keyword keyword + number number + date date + string string + comment commment + function header of function or procudure + title function name inside a header + params everything in parentheses inside a function header + preprocessor preprocessor directive + +AVR assembler ("avrasm"): + + keyword keyword + built_in pre-defined register + number number + string string + comment commment + label label + preprocessor preprocessor directive + localvars substitution in .macro + +VHDL ("vhdl") + + keyword keyword + number number + string string + comment commment + literal signal logical value + typename typename + attribute signal attribute + +Parser3 ("parser3"): + + keyword keyword + number number + comment commment + variable variable starting with "$" + preprocessor preprocessor directive + title user-defined name starting with "@" + +TeX ("tex"): + + comment comment + number number + command command + parameter parameter + formula formula + special special symbol + +Haskell ("haskell"): + + keyword keyword + number number + string string + comment comment + class type classes and other data types + title function name + type type class name + typedef definition of types (type, newtype, data) + +Erlang ("erlang"): + + comment comment + string string + number number + keyword keyword + record_name record access (#record_name) + title name of declaration function + variable variable (starts with capital letter or with _) + pp.keywords module's attribute (-attribute) + function_name atom or atom:atom in case of function call + +Rust ("rust"): + + comment comment + string string + number number + keyword keyword + title name of declaration + preprocessor preprocessor directive + +Matlab ("matlab"): + + comment comment + string string + number number + keyword keyword + title function name + function function + param params of function + +R ("r"): + + comment comment + string string constant + number number + keyword language keywords (function, if) plus "structural" + functions (attach, require, setClass) + literal special literal: TRUE, FALSE, NULL, NA, etc. + +OpenGL Shading Language ("glsl"): + + comment comment + number number + preprocessor preprocessor directive + keyword keyword + built_in GLSL built-in functions and variables + literal true false diff --git a/js/highlight/highlight.pack.js b/js/highlight/highlight.pack.js new file mode 100644 index 0000000..b98095f --- /dev/null +++ b/js/highlight/highlight.pack.js @@ -0,0 +1 @@ +var hljs=new function(){function o(r){return r.replace(/&/gm,"&").replace(/"}while(A.length||y.length){var x=w().splice(0,1)[0];B+=o(z.substr(s,x.offset-s));s=x.offset;if(x.event=="start"){B+=v(x.node);u.push(x.node)}else{if(x.event=="stop"){var r,t=u.length;do{t--;r=u[t];B+=("")}while(r!=x.node);u.splice(t,1);while(t'+P[0]+""}else{r+=P[0]}R=S.lR.lastIndex;P=S.lR.exec(O)}return r+O.substr(R)}function D(O,P){var r;if(P.sL==""){r=i(O)}else{r=f(P.sL,O)}if(P.r>0){A+=r.keyword_count;E+=r.r}return''+r.value+""}function M(r,O){if(O.sL&&g[O.sL]||O.sL==""){return D(r,O)}else{return I(r,O)}}function L(P,r){var O=P.cN?'':"";if(P.rB){B+=O;P.buffer=""}else{if(P.eB){B+=o(r)+O;P.buffer=""}else{B+=O;P.buffer=r}}s.push(P);E+=P.r}function J(Q,P,T){var U=s[s.length-1];if(T){B+=M(U.buffer+Q,U);return false}var S=u(P,U);if(S){B+=M(U.buffer+Q,U);L(S,P);return S.rB}var O=y(s.length-1,P);if(O){var R=U.cN?"":"";if(U.rE){B+=M(U.buffer+Q,U)+R}else{if(U.eE){B+=M(U.buffer+Q,U)+R+o(P)}else{B+=M(U.buffer+Q+P,U)+R}}while(O>1){R=s[s.length-2].cN?"":"";B+=R;O--;s.length--}var r=s[s.length-1];s.length--;s[s.length-1].buffer="";if(r.starts){L(r.starts,"")}return U.rE}if(z(P,U)){throw"Illegal"}}var H=g[F];var s=[H.dM];var E=0;var A=0;var B="";try{var v,x=0;H.dM.buffer="";do{v=t(G,x);var w=J(v[0],v[1],v[2]);x+=v[0].length;if(!w){x+=v[1].length}}while(!v[2]);return{r:E,keyword_count:A,value:B,language:F}}catch(K){if(K=="Illegal"){return{r:0,keyword_count:0,value:o(G)}}else{throw K}}}function i(v){var r={keyword_count:0,r:0,value:o(v)};var t=r;for(var s in g){if(!g.hasOwnProperty(s)){continue}var u=f(s,v);u.language=s;if(u.keyword_count+u.r>t.keyword_count+t.r){t=u}if(u.keyword_count+u.r>r.keyword_count+r.r){t=r;r=u}}if(t.language){r.second_best=t}return r}function k(t,s,r){if(s){t=t.replace(/^((<[^>]+>|\t)+)/gm,function(u,x,w,v){return x.replace(/\t/g,s)})}if(r){t=t.replace(/\n/g,"
")}return t}function p(v,y,t){var z=j(v,t);var x=a(v);var A,u;if(x=="no-highlight"){return}if(x){A=f(x,z)}else{A=i(z);x=A.language}var s=e(v);if(s.length){u=document.createElement("pre");u.innerHTML=A.value;A.value=m(s,e(u),z)}A.value=k(A.value,y,t);var w=v.className;if(!w.match("(\\s|^)(language-)?"+x+"(\\s|$)")){w=w?(w+" "+x):x}if(c&&v.tagName=="CODE"&&v.parentNode.tagName=="PRE"){u=v.parentNode;var r=document.createElement("div");r.innerHTML="
"+A.value+"
";v=r.firstChild.firstChild;r.firstChild.cN=u.cN;u.parentNode.replaceChild(r.firstChild,u)}else{v.innerHTML=A.value}v.className=w;v.result={language:x,kw:A.keyword_count,re:A.r};if(A.second_best){v.second_best={language:A.second_best.language,kw:A.second_best.keyword_count,re:A.second_best.r}}}function q(){if(q.called){return}q.called=true;var t=document.getElementsByTagName("pre");for(var r=0;r|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(t,u){var r={};for(var s in t){r[s]=t[s]}if(u){for(var s in u){r[s]=u[s]}}return r}}();hljs.LANGUAGES.javascript=function(a){return{dM:{k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield",literal:"true false null undefined NaN Infinity"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,{cN:"regexp",b:"/",e:"/[gim]*",c:[{b:"\\\\/"}]}],r:0},{cN:"function",bWK:true,e:"{",k:"function",c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[a.CLCM,a.CBLCLM],i:"[\"'\\(]"}],i:"\\[|%"}]}}}(hljs);hljs.LANGUAGES.css=function(a){var b={cN:"function",b:a.IR+"\\(",e:"\\)",c:[a.NM,a.ASM,a.QSM]};return{cI:true,dM:{i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:"import page media charset",c:[b,a.ASM,a.QSM,a.NM]},{cN:"tag",b:a.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,dM:{c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"|$)",e:">",k:{title:"style"},c:[b],starts:{e:"",rE:true,sL:"css"}},{cN:"tag",b:"|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"",c:[{cN:"title",b:"[^ />]+"},b]}]}}}(hljs);hljs.LANGUAGES.python=function(a){var c=[{cN:"string",b:"(u|b)?r?'''",e:"'''",r:10},{cN:"string",b:'(u|b)?r?"""',e:'"""',r:10},{cN:"string",b:"(u|r|ur)'",e:"'",c:[a.BE],r:10},{cN:"string",b:'(u|r|ur)"',e:'"',c:[a.BE],r:10},{cN:"string",b:"(b|br)'",e:"'",c:[a.BE]},{cN:"string",b:'(b|br)"',e:'"',c:[a.BE]}].concat([a.ASM,a.QSM]);var e={cN:"title",b:a.UIR};var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM].concat(c)};var b={bWK:true,e:":",i:"[${=;\\n]",c:[e,d],r:10};return{dM:{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10",built_in:"None True False Ellipsis NotImplemented"},i:"(|\\?)",c:c.concat([a.HCM,a.inherit(b,{cN:"function",k:"def"}),a.inherit(b,{cN:"class",k:"class"}),a.CNM,{cN:"decorator",b:"@",e:"$"},{b:"\\b(print|exec)\\("}])}}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{dM:{c:d,k:e,i:"\\S"}}}(hljs); \ No newline at end of file diff --git a/js/highlight/styles/arta.css b/js/highlight/styles/arta.css new file mode 100644 index 0000000..0f15d46 --- /dev/null +++ b/js/highlight/styles/arta.css @@ -0,0 +1,155 @@ +/* +Date: 17.V.2011 +Author: pumbur +*/ + +pre code +{ + display: block; padding: 0.5em; + background: #222; +} + +pre .profile .header *, +pre .ini .title, +pre .nginx .title +{ + color: #fff; +} + +pre .comment, +pre .javadoc, +pre .preprocessor, +pre .preprocessor .title, +pre .shebang, +pre .profile .summary, +pre .diff, +pre .pi, +pre .doctype, +pre .tag, +pre .template_comment, +pre .css .rules, +pre .tex .special +{ + color: #444; +} + +pre .string, +pre .symbol, +pre .diff .change, +pre .regexp, +pre .xml .attribute, +pre .smalltalk .char, +pre .xml .value, +pre .ini .value, +pre .clojure .attribute +{ + color: #ffcc33; +} + +pre .number, +pre .addition +{ + color: #00cc66; +} + +pre .built_in, +pre .literal, +pre .vhdl .typename, +pre .go .constant, +pre .go .typename, +pre .ini .keyword, +pre .lua .title, +pre .perl .variable, +pre .php .variable, +pre .mel .variable, +pre .django .variable, +pre .css .funtion, +pre .smalltalk .method, +pre .hexcolor, +pre .important, +pre .flow, +pre .inheritance, +pre .parser3 .variable +{ + color: #32AAEE; +} + +pre .keyword, +pre .tag .title, +pre .css .tag, +pre .css .class, +pre .css .id, +pre .css .pseudo, +pre .css .attr_selector, +pre .lisp .title, +pre .clojure .built_in, +pre .winutils, +pre .tex .command, +pre .request, +pre .status +{ + color: #6644aa; +} + +pre .title, +pre .ruby .constant, +pre .vala .constant, +pre .parent, +pre .deletion, +pre .template_tag, +pre .css .keyword, +pre .objectivec .class .id, +pre .smalltalk .class, +pre .lisp .keyword, +pre .apache .tag, +pre .nginx .variable, +pre .envvar, +pre .bash .variable, +pre .go .built_in, +pre .vbscript .built_in, +pre .lua .built_in, +pre .rsl .built_in, +pre .tail, +pre .avrasm .label, +pre .tex .formula, +pre .tex .formula * +{ + color: #bb1166; +} + +pre .yardoctag, +pre .phpdoc, +pre .profile .header, +pre .ini .title, +pre .apache .tag, +pre .parser3 .title +{ + font-weight: bold; +} + +pre .coffeescript .javascript, +pre .xml .javascript, +pre .xml .css, +pre .xml .cdata +{ + opacity: 0.6; +} + +pre code, +pre .javascript, +pre .css, +pre .xml, +pre .subst, +pre .diff .chunk, +pre .css .value, +pre .css .attribute, +pre .lisp .string, +pre .lisp .number, +pre .tail .params, +pre .container, +pre .haskell *, +pre .erlang *, +pre .erlang_repl * +{ + color: #aaa; +} diff --git a/js/highlight/styles/ascetic.css b/js/highlight/styles/ascetic.css new file mode 100644 index 0000000..63349b7 --- /dev/null +++ b/js/highlight/styles/ascetic.css @@ -0,0 +1,50 @@ +/* + +Original style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +pre code { + display: block; padding: 0.5em; + background: white; color: black; +} + +pre .string, +pre .tag .value, +pre .filter .argument, +pre .addition, +pre .change, +pre .apache .tag, +pre .apache .cbracket, +pre .nginx .built_in, +pre .tex .formula { + color: #888; +} + +pre .comment, +pre .template_comment, +pre .shebang, +pre .doctype, +pre .pi, +pre .javadoc, +pre .deletion, +pre .apache .sqbracket { + color: #CCC; +} + +pre .keyword, +pre .tag .title, +pre .ini .title, +pre .lisp .title, +pre .clojure .title, +pre .http .title, +pre .nginx .title, +pre .css .tag, +pre .winutils, +pre .flow, +pre .apache .tag, +pre .tex .command, +pre .request, +pre .status { + font-weight: bold; +} diff --git a/js/highlight/styles/brown_paper.css b/js/highlight/styles/brown_paper.css new file mode 100644 index 0000000..bc00a8f --- /dev/null +++ b/js/highlight/styles/brown_paper.css @@ -0,0 +1,102 @@ +/* + +Brown Paper style from goldblog.com.ua (c) Zaripov Yura + +*/ + +pre code { + display: block; padding: 0.5em; + background:#b7a68e url(./brown_papersq.png); +} + +pre .keyword, +pre .literal, +pre .change, +pre .winutils, +pre .flow, +pre .lisp .title, +pre .clojure .built_in, +pre .nginx .title, +pre .tex .special, +pre .request, +pre .status { + color:#005599; + font-weight:bold; +} + +pre code, +pre .ruby .subst, +pre .tag .keyword { + color: #363C69; +} + +pre .string, +pre .title, +pre .haskell .type, +pre .tag .value, +pre .css .rules .value, +pre .preprocessor, +pre .ruby .symbol, +pre .ruby .symbol .string, +pre .ruby .class .parent, +pre .built_in, +pre .sql .aggregate, +pre .django .template_tag, +pre .django .variable, +pre .smalltalk .class, +pre .javadoc, +pre .ruby .string, +pre .django .filter .argument, +pre .smalltalk .localvars, +pre .smalltalk .array, +pre .attr_selector, +pre .pseudo, +pre .addition, +pre .stream, +pre .envvar, +pre .apache .tag, +pre .apache .cbracket, +pre .tex .number { + color: #2C009F; +} + +pre .comment, +pre .java .annotation, +pre .python .decorator, +pre .template_comment, +pre .pi, +pre .doctype, +pre .deletion, +pre .shebang, +pre .apache .sqbracket, +pre .nginx .built_in, +pre .tex .formula { + color: #802022; +} + +pre .keyword, +pre .literal, +pre .css .id, +pre .phpdoc, +pre .title, +pre .haskell .type, +pre .vbscript .built_in, +pre .sql .aggregate, +pre .rsl .built_in, +pre .smalltalk .class, +pre .diff .header, +pre .chunk, +pre .winutils, +pre .bash .variable, +pre .apache .tag, +pre .tex .command { + font-weight: bold; +} + +pre .coffeescript .javascript, +pre .xml .css, +pre .xml .javascript, +pre .xml .vbscript, +pre .tex .formula { + opacity: 0.8; +} diff --git a/js/highlight/styles/brown_papersq.png b/js/highlight/styles/brown_papersq.png new file mode 100644 index 0000000000000000000000000000000000000000..3813903dbf9fa7b1fb5bd11d9534c06667d9056f GIT binary patch literal 18198 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
G3S-EN>9CM!{YB*|;6wg-K3V?)eR((z#1 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 literal 0 HcmV?d00001 diff --git a/js/highlight/styles/dark.css b/js/highlight/styles/dark.css new file mode 100644 index 0000000..03a6f18 --- /dev/null +++ b/js/highlight/styles/dark.css @@ -0,0 +1,101 @@ +/* + +Dark style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +pre code { + display: block; padding: 0.5em; + background: #444; +} + +pre .keyword, +pre .literal, +pre .change, +pre .winutils, +pre .flow, +pre .lisp .title, +pre .clojure .built_in, +pre .nginx .title, +pre .tex .special { + color: white; +} + +pre code, +pre .ruby .subst { + color: #DDD; +} + +pre .string, +pre .title, +pre .haskell .type, +pre .ini .title, +pre .tag .value, +pre .css .rules .value, +pre .preprocessor, +pre .ruby .symbol, +pre .ruby .symbol .string, +pre .ruby .class .parent, +pre .built_in, +pre .sql .aggregate, +pre .django .template_tag, +pre .django .variable, +pre .smalltalk .class, +pre .javadoc, +pre .ruby .string, +pre .django .filter .argument, +pre .smalltalk .localvars, +pre .smalltalk .array, +pre .attr_selector, +pre .pseudo, +pre .addition, +pre .stream, +pre .envvar, +pre .apache .tag, +pre .apache .cbracket, +pre .tex .command, +pre .input_number { + color: #D88; +} + +pre .comment, +pre .java .annotation, +pre .python .decorator, +pre .template_comment, +pre .pi, +pre .doctype, +pre .deletion, +pre .shebang, +pre .apache .sqbracket, +pre .tex .formula { + color: #777; +} + +pre .keyword, +pre .literal, +pre .title, +pre .css .id, +pre .phpdoc, +pre .haskell .type, +pre .vbscript .built_in, +pre .sql .aggregate, +pre .rsl .built_in, +pre .smalltalk .class, +pre .diff .header, +pre .chunk, +pre .winutils, +pre .bash .variable, +pre .apache .tag, +pre .tex .special, +pre .request, +pre .status { + font-weight: bold; +} + +pre .coffeescript .javascript, +pre .xml .css, +pre .xml .javascript, +pre .xml .vbscript, +pre .tex .formula { + opacity: 0.5; +} diff --git a/js/highlight/styles/default.css b/js/highlight/styles/default.css new file mode 100644 index 0000000..ea6437c --- /dev/null +++ b/js/highlight/styles/default.css @@ -0,0 +1,132 @@ +/* + +Original style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +pre code { + display: block; padding: 0.5em; + background: #F0F0F0; +} + +pre code, +pre .ruby .subst, +pre .tag .title, +pre .lisp .title, +pre .clojure .built_in, +pre .nginx .title { + color: black; +} + +pre .string, +pre .title, +pre .constant, +pre .parent, +pre .tag .value, +pre .rules .value, +pre .rules .value .number, +pre .preprocessor, +pre .ruby .symbol, +pre .ruby .symbol .string, +pre .aggregate, +pre .template_tag, +pre .django .variable, +pre .smalltalk .class, +pre .addition, +pre .flow, +pre .stream, +pre .bash .variable, +pre .apache .tag, +pre .apache .cbracket, +pre .tex .command, +pre .tex .special, +pre .erlang_repl .function_or_atom, +pre .markdown .header { + color: #800; +} + +pre .comment, +pre .annotation, +pre .template_comment, +pre .diff .header, +pre .chunk, +pre .markdown .blockquote { + color: #888; +} + +pre .number, +pre .date, +pre .regexp, +pre .literal, +pre .smalltalk .symbol, +pre .smalltalk .char, +pre .go .constant, +pre .change, +pre .markdown .bullet, +pre .markdown .link_url { + color: #080; +} + +pre .label, +pre .javadoc, +pre .ruby .string, +pre .decorator, +pre .filter .argument, +pre .localvars, +pre .array, +pre .attr_selector, +pre .important, +pre .pseudo, +pre .pi, +pre .doctype, +pre .deletion, +pre .envvar, +pre .shebang, +pre .apache .sqbracket, +pre .nginx .built_in, +pre .tex .formula, +pre .erlang_repl .reserved, +pre .input_number, +pre .markdown .link_label, +pre .vhdl .attribute, +pre .clojure .attribute { + color: #88F +} + +pre .keyword, +pre .id, +pre .phpdoc, +pre .title, +pre .built_in, +pre .aggregate, +pre .css .tag, +pre .javadoctag, +pre .phpdoc, +pre .yardoctag, +pre .smalltalk .class, +pre .winutils, +pre .bash .variable, +pre .apache .tag, +pre .go .typename, +pre .tex .command, +pre .markdown .strong, +pre .request, +pre .status { + font-weight: bold; +} + +pre .markdown .emphasis { + font-style: italic; +} + +pre .nginx .built_in { + font-weight: normal; +} + +pre .coffeescript .javascript, +pre .xml .css, +pre .xml .javascript, +pre .xml .vbscript, +pre .tex .formula { + opacity: 0.5; +} diff --git a/js/highlight/styles/far.css b/js/highlight/styles/far.css new file mode 100644 index 0000000..e78021e --- /dev/null +++ b/js/highlight/styles/far.css @@ -0,0 +1,111 @@ +/* + +FAR Style (c) MajestiC + +*/ + +pre code { + display: block; padding: 0.5em; + background: #000080; +} + +pre code, +.ruby .subst { + color: #0FF; +} + +pre .string, +pre .ruby .string, +pre .haskell .type, +pre .tag .value, +pre .css .rules .value, +pre .css .rules .value .number, +pre .preprocessor, +pre .ruby .symbol, +pre .ruby .symbol .string, +pre .built_in, +pre .sql .aggregate, +pre .django .template_tag, +pre .django .variable, +pre .smalltalk .class, +pre .addition, +pre .apache .tag, +pre .apache .cbracket, +pre .tex .command, +pre .clojure .title { + color: #FF0; +} + +pre .keyword, +pre .css .id, +pre .title, +pre .haskell .type, +pre .vbscript .built_in, +pre .sql .aggregate, +pre .rsl .built_in, +pre .smalltalk .class, +pre .xml .tag .title, +pre .winutils, +pre .flow, +pre .change, +pre .envvar, +pre .bash .variable, +pre .tex .special, +pre .clojure .built_in { + color: #FFF; +} + +pre .comment, +pre .phpdoc, +pre .javadoc, +pre .java .annotation, +pre .template_comment, +pre .deletion, +pre .apache .sqbracket, +pre .tex .formula { + color: #888; +} + +pre .number, +pre .date, +pre .regexp, +pre .literal, +pre .smalltalk .symbol, +pre .smalltalk .char, +pre .clojure .attribute { + color: #0F0; +} + +pre .python .decorator, +pre .django .filter .argument, +pre .smalltalk .localvars, +pre .smalltalk .array, +pre .attr_selector, +pre .pseudo, +pre .xml .pi, +pre .diff .header, +pre .chunk, +pre .shebang, +pre .nginx .built_in, +pre .input_number { + color: #008080; +} + +pre .keyword, +pre .css .id, +pre .title, +pre .haskell .type, +pre .vbscript .built_in, +pre .sql .aggregate, +pre .rsl .built_in, +pre .smalltalk .class, +pre .winutils, +pre .flow, +pre .apache .tag, +pre .nginx .built_in, +pre .tex .command, +pre .tex .special, +pre .request, +pre .status { + font-weight: bold; +} diff --git a/js/highlight/styles/github.css b/js/highlight/styles/github.css new file mode 100644 index 0000000..f52627c --- /dev/null +++ b/js/highlight/styles/github.css @@ -0,0 +1,131 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +pre code { + display: block; padding: 0.5em; + color: #333; + background: #f8f8ff +} + +pre .comment, +pre .template_comment, +pre .diff .header, +pre .javadoc { + color: #998; + font-style: italic +} + +pre .keyword, +pre .css .rule .keyword, +pre .winutils, +pre .javascript .title, +pre .nginx .title, +pre .subst, +pre .request, +pre .status { + color: #333; + font-weight: bold +} + +pre .number, +pre .hexcolor, +pre .ruby .constant { + color: #099; +} + +pre .string, +pre .tag .value, +pre .phpdoc, +pre .tex .formula { + color: #d14 +} + +pre .title, +pre .id { + color: #900; + font-weight: bold +} + +pre .javascript .title, +pre .lisp .title, +pre .clojure .title, +pre .subst { + font-weight: normal +} + +pre .class .title, +pre .haskell .type, +pre .vhdl .literal, +pre .tex .command { + color: #458; + font-weight: bold +} + +pre .tag, +pre .tag .title, +pre .rules .property, +pre .django .tag .keyword { + color: #000080; + font-weight: normal +} + +pre .attribute, +pre .variable, +pre .lisp .body { + color: #008080 +} + +pre .regexp { + color: #009926 +} + +pre .class { + color: #458; + font-weight: bold +} + +pre .symbol, +pre .ruby .symbol .string, +pre .lisp .keyword, +pre .tex .special, +pre .input_number { + color: #990073 +} + +pre .built_in, +pre .lisp .title, +pre .clojure .built_in { + color: #0086b3 +} + +pre .preprocessor, +pre .pi, +pre .doctype, +pre .shebang, +pre .cdata { + color: #999; + font-weight: bold +} + +pre .deletion { + background: #fdd +} + +pre .addition { + background: #dfd +} + +pre .diff .change { + background: #0086b3 +} + +pre .chunk { + color: #aaa +} + +pre .tex .formula { + opacity: 0.5; +} diff --git a/js/highlight/styles/googlecode.css b/js/highlight/styles/googlecode.css new file mode 100644 index 0000000..7cd2345 --- /dev/null +++ b/js/highlight/styles/googlecode.css @@ -0,0 +1,144 @@ +/* + +Google Code style (c) Aahan Krish + +*/ + +pre code { + display: block; padding: 0.5em; + background: white; color: black; +} + +pre .comment, +pre .template_comment, +pre .javadoc, +pre .comment * { + color: #800; +} + +pre .keyword, +pre .method, +pre .list .title, +pre .clojure .built_in, +pre .nginx .title, +pre .tag .title, +pre .setting .value, +pre .winutils, +pre .tex .command, +pre .http .title, +pre .request, +pre .status { + color: #008; +} + +pre .envvar, +pre .tex .special { + color: #660; +} + +pre .string, +pre .tag .value, +pre .cdata, +pre .filter .argument, +pre .attr_selector, +pre .apache .cbracket, +pre .date, +pre .regexp { + color: #080; +} + +pre .sub .identifier, +pre .pi, +pre .tag, +pre .tag .keyword, +pre .decorator, +pre .ini .title, +pre .shebang, +pre .input_number, +pre .hexcolor, +pre .rules .value, +pre .css .value .number, +pre .literal, +pre .symbol, +pre .ruby .symbol .string, +pre .number, +pre .css .function, +pre .clojure .attribute { + color: #066; +} + +pre .class .title, +pre .haskell .type, +pre .smalltalk .class, +pre .javadoctag, +pre .yardoctag, +pre .phpdoc, +pre .typename, +pre .tag .attribute, +pre .doctype, +pre .class .id, +pre .built_in, +pre .setting, +pre .params, +pre .variable, +pre .clojure .title { + color: #606; +} + +pre .css .tag, +pre .rules .property, +pre .pseudo, +pre .subst { + color: #000; +} + +pre .css .class, pre .css .id { + color: #9B703F; +} + +pre .value .important { + color: #ff7700; + font-weight: bold; +} + +pre .rules .keyword { + color: #C5AF75; +} + +pre .annotation, +pre .apache .sqbracket, +pre .nginx .built_in { + color: #9B859D; +} + +pre .preprocessor, +pre .preprocessor * { + color: #444; +} + +pre .tex .formula { + background-color: #EEE; + font-style: italic; +} + +pre .diff .header, +pre .chunk { + color: #808080; + font-weight: bold; +} + +pre .diff .change { + background-color: #BCCFF9; +} + +pre .addition { + background-color: #BAEEBA; +} + +pre .deletion { + background-color: #FFC8BD; +} + +pre .comment .yardoctag { + font-weight: bold; +} diff --git a/js/highlight/styles/idea.css b/js/highlight/styles/idea.css new file mode 100644 index 0000000..cb6a109 --- /dev/null +++ b/js/highlight/styles/idea.css @@ -0,0 +1,121 @@ +/* + +Intellij Idea-like styling (c) Vasily Polovnyov + +*/ + +pre code { + display: block; padding: 0.5em; + color: #000; + background: #fff; +} + +pre .subst, +pre .title { + font-weight: normal; + color: #000; +} + +pre .comment, +pre .template_comment, +pre .javadoc, +pre .diff .header { + color: #808080; + font-style: italic; +} + +pre .annotation, +pre .decorator, +pre .preprocessor, +pre .doctype, +pre .pi, +pre .chunk, +pre .shebang, +pre .apache .cbracket, +pre .input_number, +pre .http .title { + color: #808000; +} + +pre .tag, +pre .pi { + background: #efefef; +} + +pre .tag .title, +pre .id, +pre .attr_selector, +pre .pseudo, +pre .literal, +pre .keyword, +pre .hexcolor, +pre .css .function, +pre .ini .title, +pre .css .class, +pre .list .title, +pre .clojure .title, +pre .nginx .title, +pre .tex .command, +pre .request, +pre .status { + font-weight: bold; + color: #000080; +} + +pre .attribute, +pre .rules .keyword, +pre .number, +pre .date, +pre .regexp, +pre .tex .special { + font-weight: bold; + color: #0000ff; +} + +pre .number, +pre .regexp { + font-weight: normal; +} + +pre .string, +pre .value, +pre .filter .argument, +pre .css .function .params, +pre .apache .tag { + color: #008000; + font-weight: bold; +} + +pre .symbol, +pre .ruby .symbol .string, +pre .char, +pre .tex .formula { + color: #000; + background: #d0eded; + font-style: italic; +} + +pre .phpdoc, +pre .yardoctag, +pre .javadoctag { + text-decoration: underline; +} + +pre .variable, +pre .envvar, +pre .apache .sqbracket, +pre .nginx .built_in { + color: #660e7a; +} + +pre .addition { + background: #baeeba; +} + +pre .deletion { + background: #ffc8bd; +} + +pre .diff .change { + background: #bccff9; +} diff --git a/js/highlight/styles/ir_black.css b/js/highlight/styles/ir_black.css new file mode 100644 index 0000000..dd67e11 --- /dev/null +++ b/js/highlight/styles/ir_black.css @@ -0,0 +1,98 @@ +/* + IR_Black style (c) Vasily Mikhailitchenko +*/ + +pre code { + display: block; padding: 0.5em; + background: #000; color: #f8f8f8; +} + +pre .shebang, +pre .comment, +pre .template_comment, +pre .javadoc { + color: #7c7c7c; +} + +pre .keyword, +pre .tag, +pre .tex .command, +pre .request, +pre .status, +pre .clojure .attribute { + color: #96CBFE; +} + +pre .sub .keyword, +pre .method, +pre .list .title, +pre .nginx .title { + color: #FFFFB6; +} + +pre .string, +pre .tag .value, +pre .cdata, +pre .filter .argument, +pre .attr_selector, +pre .apache .cbracket, +pre .date { + color: #A8FF60; +} + +pre .subst { + color: #DAEFA3; +} + +pre .regexp { + color: #E9C062; +} + +pre .title, +pre .sub .identifier, +pre .pi, +pre .decorator, +pre .tex .special, +pre .haskell .type, +pre .constant, +pre .smalltalk .class, +pre .javadoctag, +pre .yardoctag, +pre .phpdoc, +pre .nginx .built_in { + color: #FFFFB6; +} + +pre .symbol, +pre .ruby .symbol .string, +pre .number, +pre .variable, +pre .vbscript, +pre .literal { + color: #C6C5FE; +} + +pre .css .tag { + color: #96CBFE; +} + +pre .css .rules .property, +pre .css .id { + color: #FFFFB6; +} + +pre .css .class { + color: #FFF; +} + +pre .hexcolor { + color: #C6C5FE; +} + +pre .number { + color:#FF73FD; +} + +pre .tex .formula { + opacity: 0.7; +} diff --git a/js/highlight/styles/magula.css b/js/highlight/styles/magula.css new file mode 100644 index 0000000..b24f6d7 --- /dev/null +++ b/js/highlight/styles/magula.css @@ -0,0 +1,119 @@ +/* +Description: Magula style for highligh.js +Author: Ruslan Keba +Website: http://rukeba.com/ +Version: 1.0 +Date: 2009-01-03 +Music: Aphex Twin / Xtal +*/ + +pre code { + display: block; padding: 0.5em; + background-color: #f4f4f4; +} + +pre code, +pre .ruby .subst, +pre .lisp .title, +pre .clojure .built_in { + color: black; +} + +pre .string, +pre .title, +pre .parent, +pre .tag .value, +pre .rules .value, +pre .rules .value .number, +pre .preprocessor, +pre .ruby .symbol, +pre .ruby .symbol .string, +pre .aggregate, +pre .template_tag, +pre .django .variable, +pre .smalltalk .class, +pre .addition, +pre .flow, +pre .stream, +pre .bash .variable, +pre .apache .cbracket { + color: #050; +} + +pre .comment, +pre .annotation, +pre .template_comment, +pre .diff .header, +pre .chunk { + color: #777; +} + +pre .number, +pre .date, +pre .regexp, +pre .literal, +pre .smalltalk .symbol, +pre .smalltalk .char, +pre .change, +pre .tex .special { + color: #800; +} + +pre .label, +pre .javadoc, +pre .ruby .string, +pre .decorator, +pre .filter .argument, +pre .localvars, +pre .array, +pre .attr_selector, +pre .pseudo, +pre .pi, +pre .doctype, +pre .deletion, +pre .envvar, +pre .shebang, +pre .apache .sqbracket, +pre .nginx .built_in, +pre .tex .formula, +pre .input_number, +pre .clojure .attribute { + color: #00e; +} + +pre .keyword, +pre .id, +pre .phpdoc, +pre .title, +pre .built_in, +pre .aggregate, +pre .smalltalk .class, +pre .winutils, +pre .bash .variable, +pre .apache .tag, +pre .xml .tag, +pre .tex .command, +pre .request, +pre .status { + font-weight: bold; + color: navy; +} + +pre .nginx .built_in { + font-weight: normal; +} + +pre .coffeescript .javascript, +pre .xml .css, +pre .xml .javascript, +pre .xml .vbscript, +pre .tex .formula { + opacity: 0.5; +} + +/* --- */ +pre .apache .tag { + font-weight: bold; + color: blue; +} + diff --git a/js/highlight/styles/monokai.css b/js/highlight/styles/monokai.css new file mode 100644 index 0000000..2052ad9 --- /dev/null +++ b/js/highlight/styles/monokai.css @@ -0,0 +1,112 @@ +/* +Monokai style - ported by Luigi Maselli - http://grigio.org +*/ + +pre code { + display: block; padding: 0.5em; + background: #272822; +} + +pre .tag, +pre .tag .title, +pre .keyword, +pre .literal, +pre .change, +pre .winutils, +pre .flow, +pre .lisp .title, +pre .clojure .built_in, +pre .nginx .title, +pre .tex .special { + color: #F92672; +} + +pre code { + color: #DDD; +} + +pre code .constant { + color: #66D9EF; +} + +pre .class .title { + color: white; +} + +pre .attribute, +pre .symbol, +pre .symbol .string, +pre .value, +pre .regexp { + color: #BF79DB; +} + +pre .tag .value, +pre .string, +pre .ruby .subst, +pre .title, +pre .haskell .type, +pre .preprocessor, +pre .ruby .class .parent, +pre .built_in, +pre .sql .aggregate, +pre .django .template_tag, +pre .django .variable, +pre .smalltalk .class, +pre .javadoc, +pre .django .filter .argument, +pre .smalltalk .localvars, +pre .smalltalk .array, +pre .attr_selector, +pre .pseudo, +pre .addition, +pre .stream, +pre .envvar, +pre .apache .tag, +pre .apache .cbracket, +pre .tex .command, +pre .input_number { + color: #A6E22E; +} + +pre .comment, +pre .java .annotation, +pre .python .decorator, +pre .template_comment, +pre .pi, +pre .doctype, +pre .deletion, +pre .shebang, +pre .apache .sqbracket, +pre .tex .formula { + color: #75715E; +} + +pre .keyword, +pre .literal, +pre .css .id, +pre .phpdoc, +pre .title, +pre .haskell .type, +pre .vbscript .built_in, +pre .sql .aggregate, +pre .rsl .built_in, +pre .smalltalk .class, +pre .diff .header, +pre .chunk, +pre .winutils, +pre .bash .variable, +pre .apache .tag, +pre .tex .special, +pre .request, +pre .status { + font-weight: bold; +} + +pre .coffeescript .javascript, +pre .xml .css, +pre .xml .javascript, +pre .xml .vbscript, +pre .tex .formula { + opacity: 0.5; +} diff --git a/js/highlight/styles/pojoaque.css b/js/highlight/styles/pojoaque.css new file mode 100644 index 0000000..b9d20c2 --- /dev/null +++ b/js/highlight/styles/pojoaque.css @@ -0,0 +1,104 @@ +/* + +Pojoaque Style by Jason Tate +http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html +Based on Solarized Style from http://ethanschoonover.com/solarized + +*/ + +pre code { + display: block; padding: 0.5em; + color: #DCCF8F; + background: url(./pojoaque.jpg) repeat scroll left top #181914; +} + +pre .comment, +pre .template_comment, +pre .diff .header, +pre .doctype, +pre .lisp .string, +pre .javadoc { + color: #586e75; + font-style: italic; +} + +pre .keyword, +pre .css .rule .keyword, +pre .winutils, +pre .javascript .title, +pre .method, +pre .addition, +pre .css .tag, +pre .clojure .title, +pre .nginx .title { + color: #B64926; +} + +pre .number, +pre .command, +pre .string, +pre .tag .value, +pre .phpdoc, +pre .tex .formula, +pre .regexp, +pre .hexcolor { + color: #468966; +} + +pre .title, +pre .localvars, +pre .function .title, +pre .chunk, +pre .decorator, +pre .built_in, +pre .lisp .title, +pre .clojure .built_in, +pre .identifier, +pre .id { + color: #FFB03B; +} + +pre .attribute, +pre .variable, +pre .lisp .body, +pre .smalltalk .number, +pre .constant, +pre .class .title, +pre .parent, +pre .haskell .type { + color: #b58900; +} + +pre .css .attribute { + color: #b89859; +} + +pre .css .number,pre .css .hexcolor{ + color: #DCCF8F; +} + +pre .css .class { + color: #d3a60c; +} + +pre .preprocessor, +pre .pi, +pre .shebang, +pre .symbol, +pre .symbol .string, +pre .diff .change, +pre .special, +pre .attr_selector, +pre .important, +pre .subst, +pre .cdata { + color: #cb4b16; +} + +pre .deletion { + color: #dc322f; +} + +pre .tex .formula { + background: #073642; +} diff --git a/js/highlight/styles/pojoaque.jpg b/js/highlight/styles/pojoaque.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c07d4ab40b6d77e90ff69f0012bcd33b21d31c3 GIT binary patch literal 1186 zcmZXSe^8Tk9LK-kXFs3)f@f?)Cddzw3v4wdZyXQ;4x3=;Ja*N#%n9ik!UGmt9H3k0 zJST|5jOc(ID$FQt3C?jQZBws#kXolO1lg9Pba9BB=Q+UEBX!nY@6Uhl&+ofe$Q$y5 z@ci`~)&qzDP(lOiQ5p?p z(`j^e7!yUAVHk%K#^GQXn?s0=VLYCI$HRoe=xCuZ>A6A3@sxEP#XqNFpIb=0)KQ#Nss_tD17;m4@$JKL;LR|K|QF3f%!L5+s(9Ft8SQ zG|~pGpEGFW5Z|OA)-O@mNHy-g@7m8JTf?kl@vUKBGmw)Y*9sDRNr3PN!IKefWaydTe1D zjzpyzPnD3}hBNaS4aFX7=0&~I*Hu7#4au@qVBglH#-m;QFOx_`=j z{EqRY#Eh*yoWP^pa4H>8GH{rO?!_+xwL0(k4yL^D%^nBkJ*UI;Lx;ped8d|f*S_s@ z3~ilcRC(&NT#9Gn#UD;o^EYSMXDMf%XcUi3>;WXXD-QX3P9wMyP7eA&RS{)h5{??W3^Rq=goFJ>?lA~J- zdYe>!xvYLW*fPT0RK7wsJRg^?x#W1*GP9_f`6t>QD_X>0d!owyN>nO2?U5}|3?hX_UZYT@^>S!9eB~bZ9U`q;`U)@L670o1g z`Hd}h<_WRvUc|n*%v4Hbb-4tJD40iyF^q%g*&!6>hkYDvi-{Uc4yTM zzcthN4Z{ka!+F_KzYV#yWi;c^X^q6g`pD8cp?$Kl?hCz0s^a|mH%P!CF%*<6k^~i` zT5Mi-t5-frUcHkk^Qh}+N)Kz1&Bi95`oNc|quI>tUi~BY>xcF9(%tv2i{G6kE9*q~ qCoAGl20`)w0rdgp9H%Q=M5|p`hOhFz6$I%Y&ncY8>c?7PXyh+SL&XXJ literal 0 HcmV?d00001 diff --git a/js/highlight/styles/rainbow.css b/js/highlight/styles/rainbow.css new file mode 100644 index 0000000..e8e098f --- /dev/null +++ b/js/highlight/styles/rainbow.css @@ -0,0 +1,114 @@ +/* + +Style with support for rainbow parens + +*/ + +pre ::-moz-selection{ background: #FF5E99; color:#fff; text-shadow: none; } +pre ::selection { background:#FF5E99; color:#fff; text-shadow: none; } + +pre code { + display: block; padding: 0.5em; + background: #474949; color: #D1D9E1; +} + + +pre .body, +pre .collection { + color: #D1D9E1; +} + +pre .comment, +pre .template_comment, +pre .diff .header, +pre .doctype, +pre .lisp .string, +pre .javadoc { + color: #969896; + font-style: italic; +} + +pre .keyword, +pre .clojure .attribute, +pre .winutils, +pre .javascript .title, +pre .addition, +pre .css .tag { + color: #cc99cc; +} + +pre .number { color: #f99157; } + +pre .command, +pre .string, +pre .tag .value, +pre .phpdoc, +pre .tex .formula, +pre .regexp, +pre .hexcolor { + color: #8abeb7; +} + +pre .title, +pre .localvars, +pre .function .title, +pre .chunk, +pre .decorator, +pre .built_in, +pre .lisp .title, +pre .identifier +{ + color: #b5bd68; +} + +pre .class .keyword +{ + color: #f2777a; +} + +pre .variable, +pre .lisp .body, +pre .smalltalk .number, +pre .constant, +pre .class .title, +pre .parent, +pre .haskell .label, +pre .id, +pre .lisp .title, +pre .clojure .title .built_in { + color: #ffcc66; +} + +pre .tag .title, +pre .rules .property, +pre .django .tag .keyword, +pre .clojure .title .built_in { + font-weight: bold; +} + +pre .attribute, +pre .clojure .title { + color: #81a2be; +} + +pre .preprocessor, +pre .pi, +pre .shebang, +pre .symbol, +pre .symbol .string, +pre .diff .change, +pre .special, +pre .attr_selector, +pre .important, +pre .subst, +pre .cdata { + color: #f99157; +} + +pre .deletion { + color: #dc322f; +} + +pre .tex .formula { + background: #eee8d5; +} diff --git a/js/highlight/styles/school_book.css b/js/highlight/styles/school_book.css new file mode 100644 index 0000000..47e0f60 --- /dev/null +++ b/js/highlight/styles/school_book.css @@ -0,0 +1,109 @@ +/* + +School Book style from goldblog.com.ua (c) Zaripov Yura + +*/ + +pre code { + display: block; padding: 15px 0.5em 0.5em 30px; + font-size: 11px !important; + line-height:16px !important; +} + +pre{ + background:#f6f6ae url(./school_book.png); + border-top: solid 2px #d2e8b9; + border-bottom: solid 1px #d2e8b9; +} + +pre .keyword, +pre .literal, +pre .change, +pre .winutils, +pre .flow, +pre .lisp .title, +pre .clojure .built_in, +pre .nginx .title, +pre .tex .special { + color:#005599; + font-weight:bold; +} + +pre code, +pre .ruby .subst, +pre .tag .keyword { + color: #3E5915; +} + +pre .string, +pre .title, +pre .haskell .type, +pre .tag .value, +pre .css .rules .value, +pre .preprocessor, +pre .ruby .symbol, +pre .ruby .symbol .string, +pre .ruby .class .parent, +pre .built_in, +pre .sql .aggregate, +pre .django .template_tag, +pre .django .variable, +pre .smalltalk .class, +pre .javadoc, +pre .ruby .string, +pre .django .filter .argument, +pre .smalltalk .localvars, +pre .smalltalk .array, +pre .attr_selector, +pre .pseudo, +pre .addition, +pre .stream, +pre .envvar, +pre .apache .tag, +pre .apache .cbracket, +pre .nginx .built_in, +pre .tex .command { + color: #2C009F; +} + +pre .comment, +pre .java .annotation, +pre .python .decorator, +pre .template_comment, +pre .pi, +pre .doctype, +pre .deletion, +pre .shebang, +pre .apache .sqbracket { + color: #E60415; +} + +pre .keyword, +pre .literal, +pre .css .id, +pre .phpdoc, +pre .title, +pre .haskell .type, +pre .vbscript .built_in, +pre .sql .aggregate, +pre .rsl .built_in, +pre .smalltalk .class, +pre .xml .tag .title, +pre .diff .header, +pre .chunk, +pre .winutils, +pre .bash .variable, +pre .apache .tag, +pre .tex .command, +pre .request, +pre .status { + font-weight: bold; +} + +pre .coffeescript .javascript, +pre .xml .css, +pre .xml .javascript, +pre .xml .vbscript, +pre .tex .formula { + opacity: 0.5; +} diff --git a/js/highlight/styles/school_book.png b/js/highlight/styles/school_book.png new file mode 100644 index 0000000000000000000000000000000000000000..956e9790a0e2c079b3d568348ff3accd1d9cac30 GIT binary patch literal 486 zcmeAS@N?(olHy`uVBq!ia0y~yV7?7x3vjRjNjAS6Ga$v1?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|R4)r;B4q#jQ7Ycl#YS5MfK$ z?b^fh#qmaEhFDxvyThwfhdfkOPApt1lr{NA;Vr%uzxJuVIyzm(ed_8_-0$LLU})H&o5Re&aDemE>EG#(|F^t9_pa-H z_Mf?rMVrs}-M?S|?ZdY@c6s41zy8~}@a{v&#Ea7V)wJ$+#K|u$5UvWCdFLwGac}6w{_s*=8A6L7Rfc|9gboFyt I=akR{0OLZ+qyPW_ literal 0 HcmV?d00001 diff --git a/js/highlight/styles/solarized_dark.css b/js/highlight/styles/solarized_dark.css new file mode 100644 index 0000000..8d3a238 --- /dev/null +++ b/js/highlight/styles/solarized_dark.css @@ -0,0 +1,88 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +pre code { + display: block; padding: 0.5em; + background: #002b36; color: #839496; +} + +pre .comment, +pre .template_comment, +pre .diff .header, +pre .doctype, +pre .pi, +pre .lisp .string, +pre .javadoc { + color: #586e75; + font-style: italic; +} + +pre .keyword, +pre .winutils, +pre .method, +pre .addition, +pre .css .tag, +pre .request, +pre .status, +pre .nginx .title { + color: #859900; +} + +pre .number, +pre .command, +pre .string, +pre .tag .value, +pre .phpdoc, +pre .tex .formula, +pre .regexp, +pre .hexcolor { + color: #2aa198; +} + +pre .title, +pre .localvars, +pre .chunk, +pre .decorator, +pre .built_in, +pre .identifier, +pre .vhdl .literal, +pre .id { + color: #268bd2; +} + +pre .attribute, +pre .variable, +pre .lisp .body, +pre .smalltalk .number, +pre .constant, +pre .class .title, +pre .parent, +pre .haskell .type { + color: #b58900; +} + +pre .preprocessor, +pre .preprocessor .keyword, +pre .shebang, +pre .symbol, +pre .symbol .string, +pre .diff .change, +pre .special, +pre .attr_selector, +pre .important, +pre .subst, +pre .cdata, +pre .clojure .title { + color: #cb4b16; +} + +pre .deletion { + color: #dc322f; +} + +pre .tex .formula { + background: #073642; +} diff --git a/js/highlight/styles/solarized_light.css b/js/highlight/styles/solarized_light.css new file mode 100644 index 0000000..a92ecac --- /dev/null +++ b/js/highlight/styles/solarized_light.css @@ -0,0 +1,88 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +pre code { + display: block; padding: 0.5em; + background: #fdf6e3; color: #657b83; +} + +pre .comment, +pre .template_comment, +pre .diff .header, +pre .doctype, +pre .pi, +pre .lisp .string, +pre .javadoc { + color: #93a1a1; + font-style: italic; +} + +pre .keyword, +pre .winutils, +pre .method, +pre .addition, +pre .css .tag, +pre .request, +pre .status, +pre .nginx .title { + color: #859900; +} + +pre .number, +pre .command, +pre .string, +pre .tag .value, +pre .phpdoc, +pre .tex .formula, +pre .regexp, +pre .hexcolor { + color: #2aa198; +} + +pre .title, +pre .localvars, +pre .chunk, +pre .decorator, +pre .built_in, +pre .identifier, +pre .vhdl .literal, +pre .id { + color: #268bd2; +} + +pre .attribute, +pre .variable, +pre .lisp .body, +pre .smalltalk .number, +pre .constant, +pre .class .title, +pre .parent, +pre .haskell .type { + color: #b58900; +} + +pre .preprocessor, +pre .preprocessor .keyword, +pre .shebang, +pre .symbol, +pre .symbol .string, +pre .diff .change, +pre .special, +pre .attr_selector, +pre .important, +pre .subst, +pre .cdata, +pre .clojure .title { + color: #cb4b16; +} + +pre .deletion { + color: #dc322f; +} + +pre .tex .formula { + background: #eee8d5; +} diff --git a/js/highlight/styles/sunburst.css b/js/highlight/styles/sunburst.css new file mode 100644 index 0000000..7f15779 --- /dev/null +++ b/js/highlight/styles/sunburst.css @@ -0,0 +1,148 @@ +/* + +Sunburst-like style (c) Vasily Polovnyov + +*/ + +pre code { + display: block; padding: 0.5em; + background: #000; color: #f8f8f8; +} + +pre .comment, +pre .template_comment, +pre .javadoc { + color: #aeaeae; + font-style: italic; +} + +pre .keyword, +pre .ruby .function .keyword, +pre .request, +pre .status, +pre .nginx .title { + color: #E28964; +} + +pre .function .keyword, +pre .sub .keyword, +pre .method, +pre .list .title { + color: #99CF50; +} + +pre .string, +pre .tag .value, +pre .cdata, +pre .filter .argument, +pre .attr_selector, +pre .apache .cbracket, +pre .date, +pre .tex .command { + color: #65B042; +} + +pre .subst { + color: #DAEFA3; +} + +pre .regexp { + color: #E9C062; +} + +pre .title, +pre .sub .identifier, +pre .pi, +pre .tag, +pre .tag .keyword, +pre .decorator, +pre .shebang, +pre .input_number { + color: #89BDFF; +} + +pre .class .title, +pre .haskell .type, +pre .smalltalk .class, +pre .javadoctag, +pre .yardoctag, +pre .phpdoc { + text-decoration: underline; +} + +pre .symbol, +pre .ruby .symbol .string, +pre .number { + color: #3387CC; +} + +pre .params, +pre .variable, +pre .clojure .attribute { + color: #3E87E3; +} + +pre .css .tag, +pre .rules .property, +pre .pseudo, +pre .tex .special { + color: #CDA869; +} + +pre .css .class { + color: #9B703F; +} + +pre .rules .keyword { + color: #C5AF75; +} + +pre .rules .value { + color: #CF6A4C; +} + +pre .css .id { + color: #8B98AB; +} + +pre .annotation, +pre .apache .sqbracket, +pre .nginx .built_in { + color: #9B859D; +} + +pre .preprocessor { + color: #8996A8; +} + +pre .hexcolor, +pre .css .value .number { + color: #DD7B3B; +} + +pre .css .function { + color: #DAD085; +} + +pre .diff .header, +pre .chunk, +pre .tex .formula { + background-color: #0E2231; + color: #F8F8F8; + font-style: italic; +} + +pre .diff .change { + background-color: #4A410D; + color: #F8F8F8; +} + +pre .addition { + background-color: #253B22; + color: #F8F8F8; +} + +pre .deletion { + background-color: #420E09; + color: #F8F8F8; +} diff --git a/js/highlight/styles/tomorrow-night-blue.css b/js/highlight/styles/tomorrow-night-blue.css new file mode 100644 index 0000000..5c22e85 --- /dev/null +++ b/js/highlight/styles/tomorrow-night-blue.css @@ -0,0 +1,42 @@ +/* Tomorrow Night Blue Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +.tomorrow-comment, pre .comment, pre .title { + color: #7285b7; +} + +.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo { + color: #ff9da4; +} + +.tomorrow-orange, pre .number, pre .preprocessor, pre .built_in, pre .literal, pre .params, pre .constant { + color: #ffc58f; +} + +.tomorrow-yellow, pre .class, pre .ruby .class .title, pre .css .rules .attribute { + color: #ffeead; +} + +.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata { + color: #d1f1a9; +} + +.tomorrow-aqua, pre .css .hexcolor { + color: #99ffff; +} + +.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title { + color: #bbdaff; +} + +.tomorrow-purple, pre .keyword, pre .javascript .function { + color: #ebbbff; +} + +pre code { + display: block; + background: #002451; + color: white; + padding: 0.5em; +} diff --git a/js/highlight/styles/tomorrow-night-bright.css b/js/highlight/styles/tomorrow-night-bright.css new file mode 100644 index 0000000..046fe17 --- /dev/null +++ b/js/highlight/styles/tomorrow-night-bright.css @@ -0,0 +1,41 @@ +/* Tomorrow Night Bright Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +.tomorrow-comment, pre .comment, pre .title { + color: #969896; +} + +.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo { + color: #d54e53; +} + +.tomorrow-orange, pre .number, pre .preprocessor, pre .built_in, pre .literal, pre .params, pre .constant { + color: #e78c45; +} + +.tomorrow-yellow, pre .class, pre .ruby .class .title, pre .css .rules .attribute { + color: #e7c547; +} + +.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata { + color: #b9ca4a; +} + +.tomorrow-aqua, pre .css .hexcolor { + color: #70c0b1; +} + +.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title { + color: #7aa6da; +} + +.tomorrow-purple, pre .keyword, pre .javascript .function { + color: #c397d8; +} + +pre code { + display: block; + background: black; + color: #eaeaea; + padding: 0.5em; +} diff --git a/js/highlight/styles/tomorrow-night-eighties.css b/js/highlight/styles/tomorrow-night-eighties.css new file mode 100644 index 0000000..4bd9b32 --- /dev/null +++ b/js/highlight/styles/tomorrow-night-eighties.css @@ -0,0 +1,41 @@ +/* Tomorrow Night Eighties Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +.tomorrow-comment, pre .comment, pre .title { + color: #999999; +} + +.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo { + color: #f2777a; +} + +.tomorrow-orange, pre .number, pre .preprocessor, pre .built_in, pre .literal, pre .params, pre .constant { + color: #f99157; +} + +.tomorrow-yellow, pre .class, pre .ruby .class .title, pre .css .rules .attribute { + color: #ffcc66; +} + +.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata { + color: #99cc99; +} + +.tomorrow-aqua, pre .css .hexcolor { + color: #66cccc; +} + +.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title { + color: #6699cc; +} + +.tomorrow-purple, pre .keyword, pre .javascript .function { + color: #cc99cc; +} + +pre code { + display: block; + background: #2d2d2d; + color: #cccccc; + padding: 0.5em; +} diff --git a/js/highlight/styles/tomorrow-night.css b/js/highlight/styles/tomorrow-night.css new file mode 100644 index 0000000..37ae1cb --- /dev/null +++ b/js/highlight/styles/tomorrow-night.css @@ -0,0 +1,42 @@ +/* Tomorrow Night Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +.tomorrow-comment, pre .comment, pre .title { + color: #969896; +} + +.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo { + color: #cc6666; +} + +.tomorrow-orange, pre .number, pre .preprocessor, pre .built_in, pre .literal, pre .params, pre .constant { + color: #de935f; +} + +.tomorrow-yellow, pre .class, pre .ruby .class .title, pre .css .rules .attribute { + color: #f0c674; +} + +.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata { + color: #b5bd68; +} + +.tomorrow-aqua, pre .css .hexcolor { + color: #8abeb7; +} + +.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title { + color: #81a2be; +} + +.tomorrow-purple, pre .keyword, pre .javascript .function { + color: #b294bb; +} + +pre code { + display: block; + background: #1d1f21; + color: #c5c8c6; + padding: 0.5em; +} diff --git a/js/highlight/styles/tomorrow.css b/js/highlight/styles/tomorrow.css new file mode 100644 index 0000000..1a4a7ad --- /dev/null +++ b/js/highlight/styles/tomorrow.css @@ -0,0 +1,39 @@ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +.tomorrow-comment, pre .comment, pre .title { + color: #8e908c; +} + +.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo { + color: #c82829; +} + +.tomorrow-orange, pre .number, pre .preprocessor, pre .built_in, pre .literal, pre .params, pre .constant { + color: #f5871f; +} + +.tomorrow-yellow, pre .class, pre .ruby .class .title, pre .css .rules .attribute { + color: #eab700; +} + +.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata { + color: #718c00; +} + +.tomorrow-aqua, pre .css .hexcolor { + color: #3e999f; +} + +.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title { + color: #4271ae; +} + +.tomorrow-purple, pre .keyword, pre .javascript .function { + color: #8959a8; +} + +pre code { + display: block; + background: white; + color: #4d4d4c; + padding: 0.5em; +} diff --git a/js/highlight/styles/vs.css b/js/highlight/styles/vs.css new file mode 100644 index 0000000..45c3ecb --- /dev/null +++ b/js/highlight/styles/vs.css @@ -0,0 +1,85 @@ +/* + +Visual Studio-like style based on original C# coloring by Jason Diamond + +*/ +pre code { + display: block; padding: 0.5em; +} + +pre .comment, +pre .annotation, +pre .template_comment, +pre .diff .header, +pre .chunk, +pre .apache .cbracket { + color: rgb(0, 128, 0); +} + +pre .keyword, +pre .id, +pre .built_in, +pre .smalltalk .class, +pre .winutils, +pre .bash .variable, +pre .tex .command, +pre .request, +pre .status, +pre .nginx .title, +pre .xml .tag { + color: rgb(0, 0, 255); +} + +pre .string, +pre .title, +pre .parent, +pre .tag .value, +pre .rules .value, +pre .rules .value .number, +pre .ruby .symbol, +pre .ruby .symbol .string, +pre .aggregate, +pre .template_tag, +pre .django .variable, +pre .addition, +pre .flow, +pre .stream, +pre .apache .tag, +pre .date, +pre .tex .formula { + color: rgb(163, 21, 21); +} + +pre .ruby .string, +pre .decorator, +pre .filter .argument, +pre .localvars, +pre .array, +pre .attr_selector, +pre .pseudo, +pre .pi, +pre .doctype, +pre .deletion, +pre .envvar, +pre .shebang, +pre .preprocessor, +pre .userType, +pre .apache .sqbracket, +pre .nginx .built_in, +pre .tex .special, +pre .input_number { + color: rgb(43, 145, 175); +} + +pre .phpdoc, +pre .javadoc, +pre .xmlDocTag { + color: rgb(128, 128, 128); +} + +pre .vhdl .typename { font-weight: bold; } +pre .vhdl .string { color: #666666; } +pre .vhdl .literal { color: rgb(163, 21, 21); } +pre .vhdl .attribute { color: #00B0E8; } + +pre .xml .attribute { color: rgb(255, 0, 0); } diff --git a/js/highlight/styles/xcode.css b/js/highlight/styles/xcode.css new file mode 100644 index 0000000..060e5d7 --- /dev/null +++ b/js/highlight/styles/xcode.css @@ -0,0 +1,154 @@ +/* + +XCode style (c) Angel Garcia + +*/ + +pre code { + display: block; padding: 0.5em; + background: #fff; color: black; +} + +pre .comment, +pre .template_comment, +pre .javadoc, +pre .comment * { + color: rgb(0,106,0); +} + +pre .keyword, +pre .literal, +pre .nginx .title { + color: rgb(170,13,145); +} +pre .method, +pre .list .title, +pre .tag .title, +pre .setting .value, +pre .winutils, +pre .tex .command, +pre .http .title, +pre .request, +pre .status { + color: #008; +} + +pre .envvar, +pre .tex .special { + color: #660; +} + +pre .string { + color: rgb(196,26,22); +} +pre .tag .value, +pre .cdata, +pre .filter .argument, +pre .attr_selector, +pre .apache .cbracket, +pre .date, +pre .regexp { + color: #080; +} + +pre .sub .identifier, +pre .pi, +pre .tag, +pre .tag .keyword, +pre .decorator, +pre .ini .title, +pre .shebang, +pre .input_number, +pre .hexcolor, +pre .rules .value, +pre .css .value .number, +pre .symbol, +pre .symbol .string, +pre .number, +pre .css .function, +pre .clojure .title, +pre .clojure .built_in { + color: rgb(28,0,207); +} + +pre .class .title, +pre .haskell .type, +pre .smalltalk .class, +pre .javadoctag, +pre .yardoctag, +pre .phpdoc, +pre .typename, +pre .tag .attribute, +pre .doctype, +pre .class .id, +pre .built_in, +pre .setting, +pre .params, +pre .clojure .attribute { + color: rgb(92,38,153); +} + +pre .variable { + color: rgb(63,110,116); +} +pre .css .tag, +pre .rules .property, +pre .pseudo, +pre .subst { + color: #000; +} + +pre .css .class, pre .css .id { + color: #9B703F; +} + +pre .value .important { + color: #ff7700; + font-weight: bold; +} + +pre .rules .keyword { + color: #C5AF75; +} + +pre .annotation, +pre .apache .sqbracket, +pre .nginx .built_in { + color: #9B859D; +} + +pre .preprocessor, +pre .preprocessor * { + color: rgb(100,56,32); +} + +pre .tex .formula { + background-color: #EEE; + font-style: italic; +} + +pre .diff .header, +pre .chunk { + color: #808080; + font-weight: bold; +} + +pre .diff .change { + background-color: #BCCFF9; +} + +pre .addition { + background-color: #BAEEBA; +} + +pre .deletion { + background-color: #FFC8BD; +} + +pre .comment .yardoctag { + font-weight: bold; +} + +pre .method .id { + color: #000; +} diff --git a/js/highlight/styles/zenburn.css b/js/highlight/styles/zenburn.css new file mode 100644 index 0000000..380a76a --- /dev/null +++ b/js/highlight/styles/zenburn.css @@ -0,0 +1,113 @@ +/* + +Zenburn style from voldmar.ru (c) Vladimir Epifanov +based on dark.css by Ivan Sagalaev + +*/ + +pre code { + display: block; padding: 0.5em; + background: #3F3F3F; + color: #DCDCDC; +} + +pre .keyword, +pre .tag, +pre .css .class, +pre .css .id, +pre .lisp .title, +pre .nginx .title, +pre .request, +pre .status, +pre .clojure .attribute { + color: #E3CEAB; +} + +pre .django .template_tag, +pre .django .variable, +pre .django .filter .argument { + color: #DCDCDC; +} + +pre .number, +pre .date { + color: #8CD0D3; +} + +pre .dos .envvar, +pre .dos .stream, +pre .variable, +pre .apache .sqbracket { + color: #EFDCBC; +} + +pre .dos .flow, +pre .diff .change, +pre .python .exception, +pre .python .built_in, +pre .literal, +pre .tex .special { + color: #EFEFAF; +} + +pre .diff .chunk, +pre .ruby .subst { + color: #8F8F8F; +} + +pre .dos .keyword, +pre .python .decorator, +pre .title, +pre .haskell .type, +pre .diff .header, +pre .ruby .class .parent, +pre .apache .tag, +pre .nginx .built_in, +pre .tex .command, +pre .input_number { + color: #efef8f; +} + +pre .dos .winutils, +pre .ruby .symbol, +pre .ruby .symbol .string, +pre .ruby .string { + color: #DCA3A3; +} + +pre .diff .deletion, +pre .string, +pre .tag .value, +pre .preprocessor, +pre .built_in, +pre .sql .aggregate, +pre .javadoc, +pre .smalltalk .class, +pre .smalltalk .localvars, +pre .smalltalk .array, +pre .css .rules .value, +pre .attr_selector, +pre .pseudo, +pre .apache .cbracket, +pre .tex .formula { + color: #CC9393; +} + +pre .shebang, +pre .diff .addition, +pre .comment, +pre .java .annotation, +pre .template_comment, +pre .pi, +pre .doctype { + color: #7F9F7F; +} + +pre .coffeescript .javascript, +pre .xml .css, +pre .xml .javascript, +pre .xml .vbscript, +pre .tex .formula { + opacity: 0.5; +} + diff --git a/js/jquery-1.10.2.min.js b/js/jquery-1.10.2.min.js new file mode 100644 index 0000000..76d21a4 --- /dev/null +++ b/js/jquery-1.10.2.min.js @@ -0,0 +1,6 @@ +/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery-1.10.2.min.map +*/ +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
t
",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t +}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("';o.extend(q.prototype,{_scroll:function(){var e=this.qtip.elements.overlay;e&&(e[0].style.top=o(t).scrollTop()+"px")},init:function(i){var s=i.tooltip;1>o("select, object").length&&(this.bgiframe=i.elements.bgiframe=o(qe).appendTo(s),i._bind(s,"tooltipmove",this.adjustBGIFrame,this._ns,this)),this.redrawContainer=o("
",{id:$+"-rcontainer"}).appendTo(e.body),i.elements.overlay&&i.elements.overlay.addClass("qtipmodal-ie6fix")&&(i._bind(t,["scroll","resize"],this._scroll,this._ns,this),i._bind(s,["tooltipshow"],this._scroll,this._ns,this)),this.redraw()},adjustBGIFrame:function(){var t,e,i=this.qtip.tooltip,s={height:i.outerHeight(S),width:i.outerWidth(S)},o=this.qtip.plugins.tip,n=this.qtip.elements.tip;e=parseInt(i.css("borderLeftWidth"),10)||0,e={left:-e,top:-e},o&&n&&(t="x"===o.corner.precedance?[I,L]:[k,B],e[t[1]]-=n[t[0]]()),this.bgiframe.css(e).css(s)},redraw:function(){if(1>this.qtip.rendered||this.drawing)return self;var t,e,i,s,o=this.qtip.tooltip,n=this.qtip.options.style,r=this.qtip.options.position.container;return this.qtip.drawing=1,n.height&&o.css(k,n.height),n.width?o.css(I,n.width):(o.css(I,"").appendTo(this.redrawContainer),e=o.width(),1>e%2&&(e+=1),i=o.css("maxWidth")||"",s=o.css("minWidth")||"",t=(i+s).indexOf("%")>-1?r.width()/100:0,i=(i.indexOf("%")>-1?t:1)*parseInt(i,10)||e,s=(s.indexOf("%")>-1?t:1)*parseInt(s,10)||0,e=i+s?Math.min(Math.max(e,s),i):e,o.css(I,Math.round(e)).appendTo(r)),this.drawing=0,self},destroy:function(){this.bgiframe&&this.bgiframe.remove(),this.qtip._unbind([t,this.qtip.tooltip],this._ns)}}),_e=N.ie6=function(t){return 6===BROWSER.ie?new q(t):S},_e.initialize="render",z.ie6={"^content|style$":function(){this.redraw()}}})})(window,document); \ No newline at end of file diff --git a/js/kartograph-chroma.min.js b/js/kartograph-chroma.min.js new file mode 100644 index 0000000..00808c5 --- /dev/null +++ b/js/kartograph-chroma.min.js @@ -0,0 +1,41 @@ +/*! + * + * kartograph - a svg mapping library + * Copyright (C) 2011,2012 Gregor Aisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + */(function(){var a,b,c,d,e,f,g,h,i,j,k,l,n,o,p,q,r,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,_,ba,bb,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,bm,bn,bo,bp,bq,br,bs,bt,bu,bv,bw,bx,by,bz,bA,bB,bC,bD,bE,bF,bG,bH,bI,bJ,bK,bL,bM,bN,bO,bP,bQ,bR,bS=function(a,b){return function(){return a.apply(b,arguments)}},bT=Object.prototype.hasOwnProperty,bU=function(a,b){function d(){this.constructor=a}for(var c in b)bT.call(b,c)&&(a[c]=b[c]);d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype;return a};bw=typeof exports!="undefined"&&exports!==null?exports:this,bp=bw.$K=(bF=bw.kartograph)!=null?bF:bw.kartograph={},bp.version="0.1.7",bC=!1,by=function(a){if(bC)return console.warn("kartograph ("+bp.version+"): ",a)},bq=function(a){if(bC)return console.log("kartograph ("+bp.version+"): ",a)},(bK=(bD=String.prototype).trim)==null&&(bD.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){"use strict";if(this==null)throw new TypeError;var b=Object(this),c=b.length>>>0;if(c===0)return-1;var d=0;arguments.length>0&&(d=Number(arguments[1]),d!=d?d=0:d!=0&&d!=Infinity&&d!=-Infinity&&(d=(d>0||-1)*Math.floor(Math.abs(d))));if(d>=c)return-1;var e=d>=0?d:Math.max(c-Math.abs(d),0);for(;es.left&&a.tops.top},a.prototype.inside=function(a,b){var c;c=this;return a>=c.left&&a<=c.right&&b>=c.top&&b<=c.bottom},a.prototype.join=function(a){var b;b=this,b.update(a.left,a.top),b.update(a.right,a.bottom);return this};return a}(),c.fromXML=function(a){var b,c,d,e;d=Number(a.getAttribute("x")),e=Number(a.getAttribute("y")),c=Number(a.getAttribute("w")),b=Number(a.getAttribute("h"));return new bp.BBox(d,e,c,b)},bp.BBox=c,(bL=bp.geom)==null&&(bp.geom={}),(bM=(bE=bp.geom).clipping)==null&&(bE.clipping={}),k=function(){function f(){}var a,b,c,d,e;b=0,c=1,d=2,a=4,e=8,f.prototype.compute_out_code=function(a,b,c){var d,e;e=this,d=e.INSIDE,ba.right&&(d|=e.RIGHT),ca.bottom&&(d|=e.BOTTOM);return d},f.prototype.clip=function(a,b,c,d,e){var f,g,h,i,j,k,l;j=this,g=j.compute_out_code(a,b,c),h=j.compute_out_code(a,d,e),f=False;while(True){if(!(g|h)){f=True;break}if(g&h)break;i=code===0?h:g,i&j.TOP?(k=b+(d-b)*(a.top-c)/(e-c),l=a.top):i&j.BOTTOM?(k=b+(d-b)*(a.bottom-c)/(e-c),l=a.bottom):i&j.RIGHT?(l=c+(e-c)*(a.right-b)/(d-b),k=a.right):i&j.LEFT&&(l=c+(e-c)*(a.left-b)/(d-b),k=a.left),i===g?(b=k,c=l,g=j.compute_out_code(a,b,c)):(d=k,e=l,h=j.compute_out_code(a,d,e))}return f?[b,c,d,e]:null};return f}(),bp.geom.clipping.CohenSutherland=k,A=function(){function a(a,b,d){var e,f;f=this,f.container=e=$(a),b==null&&(b=e.width()),d==null&&(d=e.height()),d===0&&(d=b*.5),f.viewport=new c(0,0,b,d),f.paper=f.createSVGLayer(),f.markers=[],f.pathById={},f.container.addClass("kartograph")}a.prototype.createSVGLayer=function(a){var b,c,d,e,f,g,h,i;e=this,(i=e._layerCnt)==null&&(e._layerCnt=0),d=e._layerCnt++,h=e.viewport,c=e.container,f=Raphael(c[0],h.width,h.height),g=$(f.canvas),g.css({position:"absolute",top:"0px",left:"0px","z-index":d+5}),c.css("position")==="static"&&c.css({position:"relative",height:h.height+"px"}),g.addClass(a),b=$("desc",f.canvas).text(),$("desc",f.canvas).text(b.replace("with ","with kartograph "+bp.version+" and "));return f},a.prototype.createHTMLLayer=function(a){var b,c,d,e,f,g;e=this,f=e.viewport,b=e.container,(g=e._layerCnt)==null&&(e._layerCnt=0),d=e._layerCnt++,c=$('
'),c.css({position:"absolute",top:"0px",left:"0px",width:f.width+"px",height:f.height+"px","z-index":d+5}),b.append(c);return c},a.prototype.loadMap=function(a,b,c){var d,e,f;d=this,d.clear(),d.opts=c!=null?c:{},(f=(e=d.opts).zoom)==null&&(e.zoom=1),d.mapLoadCallback=b,d._lastMapUrl=a,d.cacheMaps&&bp.__mapCache[a]!=null?d._mapLoaded(bp.__mapCache[a]):$.ajax({url:a,dataType:"text",success:d._mapLoaded,context:d,error:function(a,b,c){return by(a,b,c)}})},a.prototype._mapLoaded=function(a){var b,c,d,e,f,g,h,i,j,k,l;e=this,e.cacheMaps&&((i=bp.__mapCache)==null&&(bp.__mapCache={}),bp.__mapCache[e._lastMapUrl]=a);try{a=$(a)}catch(m){by("something went horribly wrong while parsing svg");return}e.svgSrc=a,h=e.viewport,b=$("view",a)[0],e.viewAB=c=bp.View.fromXML(b),f=(j=e.opts.padding)!=null?j:0,d=(k=e.opts.halign)!=null?k:"center",g=(l=e.opts.valign)!=null?l:"center",e.viewBC=new bp.View(c.asBBox(),h.width,h.height,f,d,g),e.proj=bp.Proj.fromXML($("proj",b)[0]);return e.mapLoadCallback(e)},a.prototype.addLayer=function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;h=this,(q=h.layerIds)==null&&(h.layerIds=[]),(r=h.layers)==null&&(h.layers={}),bB(a)==="object"?(i=a,a=i.id,b=i.className,c=i.key,l=i.title):i={},b==null&&(b=a),j=$("#"+a,h.svgSrc);if(j.length!==0){g=new J(b,c,h,i.filter),d=$("*",j[0]);for(m=0,o=d.length;m0&&(h.layers[b]=g,h.layerIds.push(b)),e=["click"];for(n=0,p=e.length;n');return b()},a.prototype.applyStyles=function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;e=this;if(e.styles==null)return a;(n=e._pathTypes)==null&&(e._pathTypes=["path","circle","rectangle","ellipse"]),(o=e._regardStyles)==null&&(e._regardStyles=["fill","stroke","fill-opacity","stroke-width","stroke-opacity"]);for(h in e.styles){f=h,p=f.split(",");for(j=0,l=p.length;j1)continue;f=f[0].split("."),c=f.slice(1);if(c.length>0&&c.indexOf(b)<0)continue;f=f[0];if(e._pathTypes.indexOf(f)>=0&&f!==a.type)continue;g=e.styles[h],q=e._regardStyles;for(k=0,m=q.length;k=p;0<=p?g++:g--)e=a.attributes[g],e.name.substr(0,5)==="data-"&&(m=e.value,o=Number(m),m.trim()!==""&&o===m&&!isNaN(o)&&(m=o),f[e.name.substr(5)]=m);h.data=f,bB(d)==="string"?k=d:bB(d)==="function"&&(k=d(f)),k!=null&&h.svgPath.attr("title",k)}a.prototype.setView=function(a){var b,c,d;b=this,c=a.projectPath(b.path),b.vpath=c;if(b.path.type==="path"){d=c.svgString();return b.svgPath.attr({path:d})}if(b.path.type==="circle")return b.svgPath.attr({cx:c.x,cy:c.y,r:c.r})},a.prototype.remove=function(){var a;a=this;return a.svgPath.remove()};return a}(),bw=typeof exports!="undefined"&&exports!==null?exports:this,bp=(bO=bw.kartograph)!=null?bO:bw.kartograph={},bp.parsecss=function(a,b){var c,d,e,f,g,h,i,j;f={},a=bs(a),j=a.split("`b%");for(h=0,i=j.length;h=g;0<=g?c++:c--)a+=b[c][0]*b[c+1][1]-b[c+1][0]*b[c][1];a*=.5,a=a,d.areas.push(a),d._area+=a}return d._area},a.prototype.centroid=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;m=this;if(m._centroid!=null)return m._centroid;b=m.area(),d=e=0;for(h=0,w=m.contours.length-1;0<=w?h<=w:h>=w;0<=w?h++:h--){c=m.contours[h],a=m.areas[h],r=s=0,k=c.length,t=[],p=0;for(i=0,u=k-1;0<=u?i<=u:i>=u;0<=u?i++:i--)n=c[i],o=c[(i+1)%k],f=o[0]-n[0],g=o[1]-n[1],l=Math.sqrt(f*f+g*g),t.push(l),p+=l;for(i=0,v=k-1;0<=v?i<=v:i>=v;0<=v?i++:i--)n=c[i],o=c[(i+1)%k],q=t[i]/p,r+=q*n[0],s+=q*n[1];j=a/b,d+=r*j,e+=s*j}m._centroid=[d,e];return m._centroid},a.prototype.isInside=function(a,b){var c,d,e,f,g;f=this,c=f._bbox;if(ac[2]||bc[3])return!1;for(e=0,g=f.contours.length-1;0<=g?e<=g:e>=g;0<=g?e++:e--){d=f.contours[e];if(bz(d,[a,b]))return!0}return!1};return a}(),bp.geom.Path=R,j=function(){function a(b,c,d){this.x=b,this.y=c,this.r=d,a.__super__.constructor.call(this,"circle",null,!0)}bU(a,R),a.prototype.toSVG=function(a){var b;b=this;return a.circle(b.x,b.y,b.r)},a.prototype.centroid=function(){var a;a=this;return[a.x,a.y]},a.prototype.area=function(){var a;a=this;return Math.PI*a.r*m.r};return a}(),bp.geom.Circle=j,R.fromSVG=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;e=[],m=a.nodeName,k=null;if(m==="path"){h=a.getAttribute("d").trim(),b=h[h.length-1]==="Z",l=b?"Z M":"M",h=h.substring(1,h.length-(b?1:0)),v=h.split(l);for(p=0,r=v.length;p=t;0<=t?d++:d--){q=l.points[d],g=q[0],h=q[1],r=l.points[d+1],i=r[0],j=r[1];try{s=c(b,g,h,i,j),m=s[0],o=s[1],n=s[2],p=s[3],e=!0,k.push([m,o]),(i!==n||j!==o||d===len(l.points)-2)&&k.push([n,p])}catch(u){e&&k.length>1&&(f.push(new a(k)),k=[]),e=!1}}k.length>1&&f.push(new a(k));return f},a.prototype.toSVG=function(){var a,b,c,d,e,f,g,h;b=this,a=[],h=b.points;for(e=0,f=h.length;e=p;0<=p?f++:f--){l=a[f][0]-b[0],n=a[f][1]-b[1],m=a[(f+1)%g][0]-b[0],o=a[(f+1)%g][1]-b[1],i=d(n,l),j=d(o,m),e=j-i;while(e>h)e-=k;while(e<-h)e+=k;c+=e}return Math.abs(c)>=h},bw=typeof exports!="undefined"&&exports!==null?exports:this,bp=(bR=bw.kartograph)!=null?bR:bw.kartograph={},bA=bp.proj={},Function.prototype.bind=function(a){var b;b=this;return function(){return b.apply(a,arguments)}},T=function(){function a(a){var b,c,d;b=this,b.lon0=(c=a.lon0)!=null?c:0,b.lat0=(d=a.lat0)!=null?d:0,b.PI=Math.PI,b.HALFPI=b.PI*.5,b.QUARTERPI=b.PI*.25,b.RAD=b.PI/180,b.DEG=180/b.PI,b.lam0=b.rad(this.lon0),b.phi0=b.rad(this.lat0),b.minLat=-90,b.maxLat=90}a.parameters=[],a.title="Projection",a.prototype.rad=function(a){return a*this.RAD},a.prototype.deg=function(a){return a*this.DEG},a.prototype.plot=function(a,b){var c,d,e,f,g,h,i,j,k,l,m;b==null&&(b=!0),f=[],c=!0;for(j=0,k=a.length;j=h;g<=h?b++:b--)d.push(e(180,b));for(c=180;c>=-180;c--)d.push(e(c,f.minLat));for(b=i=f.minLat,j=f.maxLat;i<=j?b<=j:b>=j;i<=j?b++:b--)d.push(e(-180,b));f.lon0=a;return d},a.prototype.world_bbox=function(){var a,b,c,d,e,f;b=this.project.bind(this),d=this.sea(),a=new bp.BBox;for(e=0,f=d.length;e=g;0<=g?c++:c--)b=a.attributes[c],b.name!=="id"&&(e[b.name]=b.value);f=new bp.proj[d](e),f.name=d;return f},bp.Proj=T,n=function(){function a(b){var c,d,e;b==null&&(b={}),c=this,c.flip=Number((d=b.flip)!=null?d:0),c.flip===1&&(b.lon0=(e=-b.lon0)!=null?e:0),a.__super__.constructor.call(this,b)}bU(a,T),a.parameters=["lon0","flip"],a.title="Cylindrical Projection",a.prototype._visible=function(a,b){return!0},a.prototype.clon=function(a){a-=this.lon0,a<-180?a+=360:a>180&&(a-=360);return a},a.prototype.ll=function(a,b){return this.flip===1?[-a,-b]:[a,b]};return a}(),q=function(){function a(){a.__super__.constructor.apply(this,arguments)}bU(a,n),a.title="Equirectangular Projection",a.prototype.project=function(a,b){var c;c=this.ll(a,b),a=c[0],b=c[1],a=this.clon(a);return[a*Math.cos(this.phi0)*1e3,b*-1*1e3]};return a}(),bA.lonlat=q,h=function(){function a(b){var c;a.__super__.constructor.call(this,b),this.lat1=(c=b.lat1)!=null?c:0,this.phi1=this.rad(this.lat1)}bU(a,n),a.parameters=["lon0","lat1","flip"],a.title="Cylindrical Equal Area",a.prototype.project=function(a,b){var c,d,e,f,g;g=this.ll(a,b),a=g[0],b=g[1],c=this.rad(this.clon(a)),d=this.rad(b*-1),e=c*Math.cos(this.phi1),f=Math.sin(d)/Math.cos(this.phi1);return[e*1e3,f*1e3]};return a}(),bA.cea=h,t=function(){function a(b){b.lat1=45,a.__super__.constructor.call(this,b)}bU(a,h),a.title="Gall-Peters Projection",a.parameters=["lon0","flip"];return a}(),bA.gallpeters=t,x=function(){function a(b){b.lat1=37.7,a.__super__.constructor.call(this,b)}bU(a,h),a.title="Hobo-Dyer Projection",a.parameters=["lon0","flip"];return a}(),bA.hobodyer=x,e=function(){function a(b){b.lat1=30,a.__super__.constructor.call(this,b)}bU(a,h),a.title="Behrmann Projection",a.parameters=["lon0","flip"];return a}(),bA.behrmann=e,d=function(){function a(b){b.lat1=50,a.__super__.constructor.call(this,b)}bU(a,h),a.title="Balthasart Projection",a.parameters=["lon0","flip"];return a}(),bA.balthasart=d,L=function(){function a(b){a.__super__.constructor.call(this,b),this.minLat=-85,this.maxLat=85}bU(a,n),a.title="Mercator Projection",a.prototype.project=function(a,b){var c,d,e,f,g,h,i;f=this,i=f.ll(a,b),a=i[0],b=i[1],d=Math,c=f.rad(f.clon(a)),e=f.rad(b*-1),g=c*1e3,h=d.log((1+d.sin(e))/d.cos(e))*1e3;return[g,h]};return a}(),bA.mercator=L,V=function(){function a(){a.__super__.constructor.apply(this,arguments)}bU(a,n),a.title="Pseudo-Cylindrical Projection";return a}(),N=function(){function a(b){var c;a.__super__.constructor.call(this,b),c=this,c.A0=.8707,c.A1=-0.131979,c.A2=-0.013791,c.A3=.003971,c.A4=-0.001529,c.B0=1.007226,c.B1=.015085,c.B2=-0.044475,c.B3=.028874,c.B4=-0.005916,c.C0=c.B0,c.C1=3*c.B1,c.C2=7*c.B2,c.C3=9*c.B3,c.C4=11*c.B4,c.EPS=1e-11,c.MAX_Y=.8707*.52*Math.PI;return}bU(a,V),a.title="Natural Earth Projection",a.prototype.project=function(a,b){var c,d,e,f,g,h,i,j;g=this,j=g.ll(a,b),a=j[0],b=j[1],c=g.rad(g.clon(a)),d=g.rad(b*-1),e=d*d,f=e*e,h=c*(g.A0+e*(g.A1+e*(g.A2+f*e*(g.A3+e*g.A4))))*180+500,i=d*(g.B0+e*(g.B1+f*(g.B2+g.B3*e+g.B4*f)))*180+270;return[h,i]};return a}(),bA.naturalearth=N,ba=function(){function a(b){var c;a.__super__.constructor.call(this,b),c=this,c.X=[1,-5.67239e-12,-0.0000715511,311028e-11,.9986,-0.000482241,-0.000024897,-0.00000133094,.9954,-0.000831031,-0.000044861,-9.86588e-7,.99,-0.00135363,-0.0000596598,367749e-11,.9822,-0.00167442,-0.0000044975,-0.00000572394,.973,-0.00214869,-0.0000903565,1.88767e-8,.96,-0.00305084,-0.0000900732,164869e-11,.9427,-0.00382792,-0.0000653428,-0.00000261493,.9216,-0.00467747,-0.000104566,48122e-10,.8962,-0.00536222,-0.0000323834,-0.00000543445,.8679,-0.00609364,-0.0001139,332521e-11,.835,-0.00698325,-0.0000640219,9.34582e-7,.7986,-0.00755337,-0.0000500038,9.35532e-7,.7597,-0.00798325,-0.0000359716,-0.00000227604,.7186,-0.00851366,-0.000070112,-0.00000863072,.6732,-0.00986209,-0.000199572,191978e-10,.6213,-0.010418,883948e-10,624031e-11,.5722,-0.00906601,181999e-9,624033e-11,.5322,0,0,0],c.Y=[0,.0124,3.72529e-10,1.15484e-9,.062,.0124001,1.76951e-8,-5.92321e-9,.124,.0123998,-7.09668e-8,2.25753e-8,.186,.0124008,2.66917e-7,-8.44523e-8,.248,.0123971,-9.99682e-7,3.15569e-7,.31,.0124108,373349e-11,-0.0000011779,.372,.0123598,-0.000013935,439588e-11,.434,.0125501,520034e-10,-0.0000100051,.4968,.0123198,-0.0000980735,922397e-11,.5571,.0120308,402857e-10,-0.0000052901,.6176,.0120369,-0.0000390662,7.36117e-7,.6769,.0117015,-0.0000280246,-8.54283e-7,.7346,.0113572,-0.0000408389,-5.18524e-7,.7903,.0109099,-0.0000486169,-0.0000010718,.8435,.0103433,-0.0000646934,5.36384e-9,.8936,.00969679,-0.0000646129,-0.00000854894,.9394,.00840949,-0.000192847,-0.00000421023,.9761,.00616525,-0.000256001,-0.00000421021,1,0,0,0],c.NODES=18,c.FXC=.8487,c.FYC=1.3523,c.C1=11.459155902616464,c.RC1=.08726646259971647,c.ONEEPS=1.000001,c.EPS=1e-8;return}bU(a,V),a.title="Robinson Projection",a.prototype._poly=function(a,b,c){return a[b]+c*(a[b+1]+c*(a[b+2]+c*a[b+3]))},a.prototype.project=function(a,b){var c,d,e,f,g,h,i,j;g=this,j=g.ll(a,b),a=j[0],b=j[1],a=g.clon(a),d=g.rad(a),e=g.rad(b*-1),f=Math.abs(e),c=Math.floor(f*g.C1),c>=g.NODES&&(c=g.NODES-1),f=g.deg(f-g.RC1*c),c*=4,h=g._poly(g.X,c,f)*g.FXC*d,i=g._poly(g.Y,c,f)*g.FYC,e<0&&(i=-i);return[h,i]};return a}(),bA.robinson=ba,o=function(){function a(b){var c;a.__super__.constructor.call(this,b),c=this,c.C_x=.4222382003157712,c.C_y=1.3265004281770023,c.RC_y=.7538633073600218,c.C_p=3.5707963267948966,c.RC_p=.2800495767557787,c.EPS=1e-7,c.NITER=6}bU(a,V),a.title="Eckert IV Projection",a.prototype.project=function(a,b){var c,d,e,f,g,h,i,j,k,l,m;h=this,m=h.ll(a,b),a=m[0],b=m[1],f=h.rad(h.clon(a)),g=h.rad(b*-1),i=h.C_p*Math.sin(g),c=g*g,g*=.895168+c*(.0218849+c*.00826809),e=h.NITER;while(e>0){d=Math.cos(g),j=Math.sin(g),c=(g+j*(d+2)-i)/(1+d*(d+2)-j*j),g-=c;if(Math.abs(c)=0?h.HALFPI:-h.HALFPI:i*=.5,k=1e3*h.cx*f*g.cos(i),l=1e3*h.cy*g.sin(i);return[k,l*-1]};return a}(),bA.mollweide=M,bk=function(){function a(b){a.__super__.constructor.call(this,b,1.0471975511965976)}bU(a,M),a.title="Wagner IV Projection";return a}(),bA.wagner4=bk,bl=function(){function a(b){a.__super__.constructor.call(this,b,null,.90977,1.65014,3.00896)}bU(a,M),a.title="Wagner V Projection";return a}(),bA.wagner5=bl,I=function(){function c(){c.__super__.constructor.apply(this,arguments)}var a,b;bU(c,V),b=-89,a=89,c.parameters=["lon0","lat0","flip"],c.title="Loximuthal Projection (equidistant)",c.prototype.project=function(a,b){var c,d,e,f,g,h,i;e=this,i=e.ll(a,b),a=i[0],b=i[1],d=Math,c=e.rad(e.clon(a)),f=e.rad(b),f===e.phi0?g=c*d.cos(e.phi0):g=c*(f-e.phi0)/(d.log(d.tan(e.QUARTERPI+f*.5))-d.log(d.tan(e.QUARTERPI+e.phi0*.5))),g*=1e3,h=1e3*(f-e.phi0);return[g,h*-1]};return c}(),bA.loximuthal=I,i=function(){function f(){f.__super__.constructor.apply(this,arguments)}var a,b,c,d,e;bU(f,V),f.title="Canters Modified Sinusoidal I",f.parameters=["lon0"],a=1.1966,b=-0.129,c=3*b,d=-0.0076,e=5*d,f.prototype.project=function(f,g){var h,i,j,k,l,m;h=this,m=h.ll(f,g),f=m[0],g=m[1],f=h.rad(h.clon(f)),g=h.rad(g),k=g*g,l=k*k,i=1e3*f*Math.cos(g)/(a+c*k+e*l),j=1e3*g*(a+b*k+d*l);return[i,j*-1]};return f}(),bA.canters1=i,w=function(){function n(a){n.__super__.constructor.call(this,a)}var a,b,c,d,e,f,g,h,i,j,k,l,m;bU(n,V),n.title="Hatano Projection",g=20,c=1e-7,h=1.000001,a=2.67595,b=2.43763,i=.3736990601468637,j=.4102345310814193,e=1.75859,f=1.93052,l=.5686373742600607,m=.5179951515653813,d=.85,k=1.1764705882352942,n.prototype.project=function(h,i){var j,k,l,m,n,o,p,q,r;m=this,r=m.ll(h,i),h=r[0],i=r[1],l=m.rad(m.clon(h)),n=m.rad(i),j=Math.sin(n)*(n<0?b:a);for(k=g;k>=1;k+=-1){o=(n+Math.sin(n)-j)/(1+Math.cos(n)),n-=o;if(Math.abs(o)c.lat1?c.p1.project(a,b):c.p0.project(a,b)};return a}(),bA.goodehomolosine=v,O=function(){function b(a){b.__super__.constructor.call(this,a),this.r=this.HALFPI*100}var a;bU(b,V),b.title="Nicolosi Globular Projection",b.parameters=["lon0"],a=1e-10,b.prototype._visible=function(a,b){var c;c=this,a=c.clon(a);return a>-90&&a<90},b.prototype.project=function(b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p;h=this,p=h.ll(b,c),b=p[0],c=p[1],f=h.rad(h.clon(b)),j=h.rad(c),Math.abs(f)=0},a.prototype._truncate=function(a,b){var c,d,e,f,g;c=Math,d=this.r,e=c.atan2(b-d,a-d),f=d+d*c.cos(e),g=d+d*c.sin(e);return[f,g]},a.prototype.sea=function(){var a,b,c,d;b=[],d=this.r,a=Math;for(c=0;c<=360;c++)b.push([d+a.cos(this.rad(c))*d,d+a.sin(this.rad(c))*d]);return b},a.prototype.world_bbox=function(){var a;a=this.r;return new bp.BBox(0,0,a*2,a*2)};return a}(),P=function(){function a(){a.__super__.constructor.apply(this,arguments)}bU(a,b),a.title="Orthographic Projection",a.prototype.project=function(a,b){var c,d,e,f,g,h,i,j;f=this,e=Math,d=f.to_elevation(b),c=f.to_azimuth(a),h=f.r*e.cos(d)*e.sin(c-f.azimuth0),j=-f.r*(e.cos(f.elevation0)*e.sin(d)-e.sin(f.elevation0)*e.cos(d)*e.cos(c-f.azimuth0)),g=f.r+h,i=f.r+j;return[g,i]};return a}(),bA.ortho=P,B=function(){function a(b){a.__super__.constructor.call(this,b),this.scale=Math.sqrt(2)*.5}bU(a,b),a.title="Lambert Azimuthal Equal-Area Projection",a.prototype.project=function(a,b){var c,d,e,f,g,h,i,j,k,l;g=this.rad(b),e=this.rad(a),f=Math,h=f.sin,c=f.cos,d=f.pow(2/(1+h(this.phi0)*h(g)+c(this.phi0)*c(g)*c(e-this.lam0)),.5),d*=this.scale,j=this.r*d*c(g)*h(e-this.lam0),l=-this.r*d*(c(this.phi0)*h(g)-h(this.phi0)*c(g)*c(e-this.lam0)),i=this.r+j,k=this.r+l;return[i,k]};return a}(),bA.laea=B,bf=function(){function a(){a.__super__.constructor.apply(this,arguments)}bU(a,b),a.title="Stereographic Projection",a.prototype.project=function(a,b){var c,d,e,f,g,h,i,j,k,l,m;h=this.rad(b),f=this.rad(a),g=Math,i=g.sin,c=g.cos,e=.5,d=2*e/(1+i(this.phi0)*i(h)+c(this.phi0)*c(h)*c(f-this. +lam0)),k=this.r*d*c(h)*i(f-this.lam0),m=-this.r*d*(c(this.phi0)*i(h)-i(this.phi0)*c(h)*c(f-this.lam0)),j=this.r+k,l=this.r+m;return[j,l]};return a}(),bA.stereo=bf,bb=function(){function a(b){var c,d,e,f,g,h,i,j;a.__super__.constructor.call(this,{lon0:0,lat0:0}),this.dist=(h=b.dist)!=null?h:3,this.up=this.rad((i=b.up)!=null?i:0),this.tilt=this.rad((j=b.tilt)!=null?j:0),this.scale=1,f=Number.MAX_VALUE,e=Number.MAX_VALUE*-1;for(c=0;c<=179;c++)for(d=0;d<=360;d++)g=this.project(d-180,c-90),f=Math.min(g[0],f),e=Math.max(g[0],e);this.scale=this.r*2/(e-f),a.__super__.constructor.call(this,b);return}bU(a,b),a.parameters=["lon0","lat0","tilt","dist","up"],a.title="Satellite Projection",a.prototype.project=function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;c==null&&(c=0),m=this.rad(b),k=this.rad(a),l=Math,p=l.sin,f=l.cos,n=this.r,o=n*(c+6371)/3671,g=p(this.phi0)*p(m)+f(this.phi0)*f(m)*f(k-this.lam0),j=(this.dist-1)/(this.dist-g),j=(this.dist-1)/(this.dist-g),j*=this.scale,t=o*j*f(m)*p(k-this.lam0),w=-o*j*(f(this.phi0)*p(m)-p(this.phi0)*f(m)*f(k-this.lam0)),i=f(this.up),r=p(this.up),h=f(this.tilt),q=p(this.tilt),e=o*(this.dist-1),d=(w*i+t*r)*p(this.tilt/e)+h,u=(t*i-w*r)*f(this.tilt/d),x=(w*i+t*r)/d,s=n+u,v=n+x;return[s,v]},a.prototype._visible=function(a,b){var c,d,e,f;e=this.to_elevation(b),c=this.to_azimuth(a),f=Math,d=f.sin(e)*f.sin(this.elevation0)+f.cos(this.elevation0)*f.cos(e)*f.cos(c-this.azimuth0);return d>=1/this.dist},a.prototype.sea=function(){var a,b,c,d;b=[],d=this.r,a=Math;for(c=0;c<=360;c++)b.push([d+a.cos(this.rad(c))*d,d+a.sin(this.rad(c))*d]);return b};return a}(),bA.satellite=bb,p=function(){function a(){a.__super__.constructor.apply(this,arguments)}bU(a,b),a.title="Equidistant Azimuthal Projection",a.prototype.project=function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;i=this,j=i.rad(b),g=i.rad(a),h=Math,k=h.sin,d=h.cos,e=k(this.phi0)*k(j)+d(this.phi0)*d(j)*d(g-this.lam0),c=h.acos(e),f=.325*c/k(c),m=this.r*f*d(j)*k(g-this.lam0),o=-this.r*f*(d(this.phi0)*k(j)-k(this.phi0)*d(j)*d(g-this.lam0)),l=this.r+m,n=this.r+o;return[l,n]},a.prototype._visible=function(a,b){return!0};return a}(),bA.equi=p,a=function(){function b(a){var c;c=this,a.lat0=0,b.__super__.constructor.call(this,a),c.lam0=0}var a;bU(b,V),b.title="Aitoff Projection",b.parameters=["lon0"],a=.6366197723675814,b.prototype.project=function(b,c){var d,e,f,g,h,i,j,k;g=this,k=g.ll(b,c),b=k[0],c=k[1],b=g.clon(b),f=g.rad(b),h=g.rad(c),d=.5*f,e=Math.acos(Math.cos(h)*Math.cos(d)),e!==0?(j=1/Math.sin(e),i=2*e*Math.cos(h)*Math.sin(d)*j,j*=e*Math.sin(h)):i=j=0,g.winkel&&(i=(i+f*a)*.5,j=(j+h)*.5);return[i*1e3,j*-1e3]},b.prototype._visible=function(a,b){return!0};return b}(),bA.aitoff=a,bm=function(){function b(a){b.__super__.constructor.call(this,a),this.winkel=!0}bU(b,a),b.title="Winkel Tripel Projection";return b}(),bA.winkel3=bm,l=function(){function a(b){var c,d,e;c=this,a.__super__.constructor.call(this,b),c.lat1=(d=b.lat1)!=null?d:30,c.phi1=c.rad(c.lat1),c.lat2=(e=b.lat2)!=null?e:50,c.phi2=c.rad(c.lat2)}bU(a,T),a.title="Conic Projection",a.parameters=["lon0","lat0","lat1","lat2"],a.prototype._visible=function(a,b){var c;c=this;return b>c.minLat&&b180&&(a-=360);return a};return a}(),C=function(){function a(b){var c,d,e,f,g,h,i,j,k,l,m,n,o;k=this,a.__super__.constructor.call(this,b),g=Math,o=[g.sin,g.cos,g.abs,g.log,g.tan,g.pow],l=o[0],e=o[1],c=o[2],bq=o[3],n=o[4],i=o[5],k.n=h=m=l(k.phi1),f=e(k.phi1),j=c(k.phi1-k.phi2)>=1e-10,j&&(h=bq(f/e(k.phi2))/bq(n(k.QUARTERPI+.5*k.phi2)/n(k.QUARTERPI+.5*k.phi1))),k.c=d=f*i(n(k.QUARTERPI+.5*k.phi1),h)/h,c(c(k.phi0)-k.HALFPI)<1e-10?k.rho0=0:k.rho0=d*i(n(k.QUARTERPI+.5*k.phi0),-h),k.minLat=-60,k.maxLat=85}bU(a,l),a.title="Lambert Conformal Conic Projection",a.prototype.project=function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;l=this,i=l.rad(b),e=l.rad(l.clon(a)),g=Math,q=[g.sin,g.cos,g.abs,g.log,g.tan,g.pow],m=q[0],d=q[1],c=q[2],bq=q[3],n=q[4],j=q[5],h=l.n,c(c(i)-l.HALFPI)<1e-10?k=0:k=l.c*j(n(l.QUARTERPI+.5*i),-h),f=e*h,o=1e3*k*m(f),p=1e3*(l.rho0-k*d(f));return[o,p*-1]};return a}(),bA.lcc=C,U=function(){function a(){a.__super__.constructor.apply(this,arguments)}bU(a,l);return a}(),bj=function(){function a(a,b,c,d,e,f){var g;g=this,g.bbox=a,g.width=b,g.padding=d!=null?d:0,g.halign=e!=null?e:"center",g.valign=f!=null?f:"center",g.height=c,g.scale=Math.min((b-d*2)/a.width,(c-d*2)/a.height)}a.prototype.project=function(a,b){var c,d,e,f,g,h,i;b==null&&(b=a[1],a=a[0]),e=this,f=e.scale,c=e.bbox,d=e.height,g=e.width,h=e.halign==="center"?(g-c.width*f)*.5:e.halign==="left"?e.padding*f:g-(c.width-e.padding)*f,i=e.valign==="center"?(d-c.height*f)*.5:e.valign==="top"?e.padding*f:0,a=(a-c.left)*f+h,b=(b-c.top)*f+i;return[a,b]},a.prototype.projectPath=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;e=this;if(a.type==="path"){d=[],b=[99999,99999,-99999,-99999],o=a.contours;for(k=0,m=o.length;k0?(bB(a.duration)==="function"?i=a.duration(q):i=a.duration,a.delay!=null?bB(a.delay)==="function"?h=a.delay(q):h=a.delay:h=0,n.svgPath.attrs.fill==="none"&&(m=d(null,n.data),n.svgPath.attr("fill",m)),b=Raphael.animation({fill:c},i),n.svgPath.animate(b.delay(h))):n.svgPath.attr("fill",c)}}},bp.Kartograph.prototype.dotgrid=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V;r=this,q=(J=a.layer)!=null?J:r.layerIds[r.layerIds.length-1];if(!r.layers.hasOwnProperty(q))by('dotgrid error: layer "'+q+'" not found');else{p=r.layers[q],c=a.data,d=a.value,e=a.key,t={};if(e!=null&&bB(c)==="array")for(B=0,F=c.length;B0){if(h.grid.length===0)for(z=0,O=r.viewport.width;0<=O?z<=O:z>=O;z+=n)for(A=0,P=r.viewport.height;0<=P?A<=P:A>=P;A+=n){m={x:z+(Math.random()-.5)*n*.2,y:A+(Math.random()-.5)*n*.2,pathid:!1},l=!1,Q=p.pathsById;for(o in Q){u=Q[o];for(D=0,H=u.length;D0&&Raphael.svg?(b=Raphael.animation({r:x*.5},k),m.shape.animate(b.delay(g))):m.shape.attr({r:x*.5}),bB(i)==="function"?j=i(v):j=i,m.shape.attr(j))}}},bo=(bI=bp.filter)!=null?bI:bp.filter={},bo.__knownFilter={},bo.__patternFills=0,J.prototype.SVG=function(a,b){var c,d;typeof a=="string"&&(a=window.document.createElementNS("http://www.w3.org/2000/svg",a));if(b)for(c in b)d=b[c],a.setAttribute(c,d);return a},bp.Kartograph.prototype.addFilter=function(a,b,c){var d,e,f;c==null&&(c={}),f=this,d=window.document;if(bp.filter[b]!=null)e=(new bp.filter[b](c)).getFilter(a);else throw"unknown filter type "+b;return f.paper.defs.appendChild(e)},J.prototype.applyFilter=function(a){var b;b=this;return $("."+b.id,b.paper.canvas).attr({filter:"url(#"+a+")"})},J.prototype.applyTexture=function(a,b,c,d){var e,f,g,h,i,j;d==null&&(d="#fff"),f=this,bo.__patternFills+=1,i=f.paths,j=[];for(g=0,h=i.length;g0&&(m=g("feMorphology",{"in":"mask",radius:c,operator:"dilate",result:"mask"}),a.appendChild(m)),j=g("feColorMatrix",{"in":"mask",type:"matrix",values:"0 0 0 0 "+d[0]/255+" 0 0 0 0 "+d[1]/255+" 0 0 0 0 "+d[2]/255+" 0 0 0 1 0",result:"r0"}),a.appendChild(j),h=g("feGaussianBlur",{"in":"r0",stdDeviation:b,result:"r1"}),a.appendChild(h),i=g("feComposite",{operator:"out","in":"r1",in2:"mask",result:"comp"}),a.appendChild(i),l=g("feMerge"),f||l.appendChild(g("feMergeNode",{"in":"SourceGraphic"})),l.appendChild(g("feMergeNode",{"in":"r1"}));return a.appendChild(l)},a.prototype.innerGlow=function(a,b,c,d,e,f){var g,h,i,j,k,l,m;k=this,g=k.SVG,bq("innerglow"),j=g("feColorMatrix",{"in":"SourceGraphic",type:"matrix",values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0",result:"mask"}),a.appendChild(j),m=g("feMorphology",{"in":"mask",radius:c,operator:"erode",result:"r1"}),a.appendChild(m),h=g("feGaussianBlur",{"in":"r1",stdDeviation:b,result:"r2"}),a.appendChild(h),j=g("feColorMatrix",{type:"matrix","in":"r2",values:"1 0 0 0 "+d[0]/255+" 0 1 0 0 "+d[1]/255+" 0 0 1 0 "+d[2]/255+" 0 0 0 -1 1",result:"r3"}),a.appendChild(j),i=g("feComposite",{operator:"in","in":"r3",in2:"mask",result:"comp"}),a.appendChild(i),l=g("feMerge"),f||l.appendChild(g("feMergeNode",{"in":"SourceGraphic"})),l.appendChild(g("feMergeNode",{"in":"comp"}));return a.appendChild(l)};return a}(),bo.glow=u,bw=typeof exports!="undefined"&&exports!==null?exports:this,bp=bw.$K=(bJ=bw.kartograph)!=null?bJ:bw.kartograph={},bp.Kartograph.prototype.addGeoPath=function(a,b,c){var d,e,f;b==null&&(b=[]),c==null&&(c=""),d=this,f=d.getGeoPathStr(a,b),e=d.paper.path(f),c!==""&&e.node.setAttribute("class",c);return e},bp.Kartograph.prototype.getGeoPathStr=function(a,b){var c,d,e,f,g,h,i;b==null&&(b=[]),e=this,type(b)==="string"&&(b=b.split("")),b.length===0&&b.push("M"),f="";for(d in a){g=a[d],c=(i=b[d])!=null?i:"L",h=e.lonlat2xy(g);if(isNaN(h[0])||isNaN(h[1]))continue;f+=c+h[0]+","+h[1]}return f},Q=function(){function a(a){this.zoomOut=bS(this.zoomOut,this),this.zoomIn=bS(this.zoomIn,this);var b,c,d,e,f,g,h,i;e=this,e.map=a,b=a.container,c=function(a,b){var c,d,e,f;b==null&&(b=[]),d=$('
');for(e=0,f=b.length;ef&&ah+f||g+ej+f||i+e(e+f)*(e+f)?!1:!0},a.prototype.render=function(a){var b;b=this,b.path=b.layers.mapcanvas.circle(b.x,b.y,b.radius),b.update(),b.map.applyStyles(b.path);return b},a.prototype.update=function(){var a,b;a=this,a.path.attr({x:a.x,y:a.y,r:a.radius}),b=a.path,b.node.setAttribute("style",a.style),b.node.setAttribute("class",a["class"]),a.title!=null&&b.attr("title",a.title);return a},a.prototype.clear=function(){var a;a=this,a.path.remove();return a},a.prototype.nodes=function(){var a;a=this;return[a.path.node]};return a}(),g.props=["radius","style","class","title"],g.layers=[],bp.Bubble=g,z=function(){function a(b){var c,d,e,f,g,h;c=this,a.__super__.constructor.call(this,b),c.icon=(d=b.icon)!=null?d:"",c.offset=(e=b.offset)!=null?e:[0,0],c.iconsize=(f=b.iconsize)!=null?f:[10,10],c["class"]=(g=b["class"])!=null?g:"",c.title=(h=b.title)!=null?h:""}bU(a,bp.Symbol),a.prototype.render=function(a){var b,c;c=this,b=c.map.container,c.img=$(""),c.img.attr({src:c.icon,title:c.title,alt:c.title,width:c.iconsize[0],height:c.iconsize[1]}),c.img.addClass(c["class"]),c.img.css({position:"absolute","z-index":1e3,cursor:"pointer"}),c.img[0].symbol=c,b.append(c.img);return c.update()},a.prototype.update=function(){var a;a=this;return a.img.css({left:a.x+a.offset[0]+"px",top:a.y+a.offset[1]+"px"})},a.prototype.clear=function(){var a;a=this,a.img.remove();return a},a.prototype.nodes=function(){var a;a=this;return[a.img]};return a}(),z.props=["icon","offset","class","title","iconsize"],z.layers=[],bp.Icon=z,bg=function(){function a(b){var c,d,e,f,g;c=this,a.__super__.constructor.call(this,b),c.text=(d=b.text)!=null?d:"",c.style=(e=b.style)!=null?e:"",c["class"]=(f=b["class"])!=null?f:"",c.offset=(g=b.offset)!=null?g:[0,0]}bU(a,bp.Symbol),a.prototype.render=function(a){var b,c;c=this,c.lbl=b=c.layers.mapcanvas.text(c.x,c.y,c.text),c.update();return c},a.prototype.update=function(){var a;a=this,a.lbl.attr({x:a.x+a.offset[0],y:a.y+a.offset[1]}),a.lbl.node.setAttribute("style",a.style);return a.lbl.node.setAttribute("class",a["class"])},a.prototype.clear=function(){var a;a=this,a.lbl.remove();return a},a.prototype.nodes=function(){var a;a=this;return[a.lbl.node]};return a}(),bg.props=["text","style","class","offset"],bg.layers=[],bp.Label=bg,y=function(){function a(b){var c,d,e,f;c=this,a.__super__.constructor.call(this,b),c.text=(d=b.text)!=null?d:"",c.style=(e=b.style)!=null?e:"",c["class"]=(f=b["class"])!=null?f:""}bU(a,bp.Symbol),a.prototype.render=function(a){var b,c,d;d=this,b=$("
"+d.text+"
"),b.css({width:"50px",position:"absolute",left:"-25px","text-align":"center"}),d.lbl=c=$('
'),c.append(b),d.layers.lbl.append(c),b.css({height:b.height()+"px",top:b.height()*-0.4+"px"}),d.update();return d},a.prototype.update=function(){var a;a=this;return a.lbl.css({position:"absolute",left:a.x+"px",top:a.y+"px"})},a.prototype.clear=function(){var a;a=this,a.lbl.remove();return a},a.prototype.nodes=function(){var a;a=this;return[a.lbl[0]]};return a}(),y.props=["text","style","class"],y.layers=[{id:"lbl",type:"html"}],bp.HtmlLabel=y,S=function(){function b(c){var d,e,f,g,h,i,j,k,l,m;a=this,b.__super__.constructor.call(this,c),a.radius=(e=c.radius)!=null?e:4,a.styles=(f=c.styles)!=null?f:"",a.colors=(g=c.colors)!=null?g:["#3cc","#c3c","#33c","#cc3"],a.titles=(h=c.titles)!=null?h:["","","","",""],a.values=(i=c.values)!=null?i:[],a.border=(j=c.border)!=null?j:!1,a.borderWidth=(k=c.borderWidth)!=null?k:2,a["class"]=(l=c["class"])!=null?l:"piechart",(m=(d=Raphael.fn).pieChart)==null&&(d.pieChart=bn)}var a;bU(b,bh),a=null,b.prototype.overlaps=function(b){var c,d,e,f,g,h,i,j,k,l;k=[a.x,a.y,a.radius],g=k[0],i=k[1],e=k[2],l=[b.x,b.y,b.radius],h=l[0],j=l[1],f=l[2];if(g-e>h+f||g+ej+f||i+e(e+f)*(e+f)?!1:!0},b.prototype.render=function(b){var c;a=this,a.border!=null&&(c=a.layers.mapcanvas.circle(a.x,a.y,a.radius+a.borderWidth).attr({stroke:"none",fill:a.border})),a.chart=a.layers.mapcanvas.pieChart(a.x,a.y,a.radius,a.values,a.titles,a.colors,"none"),a.chart.push(c);return a},b.prototype.update=function(b){var c;return},b.prototype.clear=function(){var b,c,d,e;a=this,e=a.chart;for(c=0,d=e.length;c180),0,h,j,"z"]).attr(f)},h=-270,o=0,l=function(e){var j,k,l,m,p,q,r;r=d[e],j=360*r/o,q=h+j*.5,k=f[e],m=500,l=30,p=n(a,b,c,h,h+j,{fill:k,stroke:g,"stroke-width":1}),p.mouseover(function(){p.stop().animate({transform:"s1.1 1.1 "+a+" "+b},m,"elastic")}),p.mouseout(function(){p.stop().animate({transform:""},m,"elastic")}),h+=j,i.push(p)};for(q=0,r=d.length;qh+f||g+ej+f||i+e(e+f)*(e+f)?!1:!0},a.prototype.render=function(a){var b,c,d,e,f,g;d=this,e=d.width,c=d.height,f=d.x,g=d.y,b=d.layers.mapcanvas.rect(f-e*.5-2,g-c*.5-2,e+4,c+4).attr({stroke:"none",fill:"#fff"}),d.chart=d.layers.mapcanvas.drawStackedBarChart(d.x,d.y,d.width,d.height,d.values,d.titles,d.colors,"none"),d.chart.push(b);return d},a.prototype.update=function(){var a,b;a=this;return},a.prototype.clear=function(){var a,b,c,d,e;a=this,e=a.chart;for(c=0,d=e.length;cg&&h-g>180?e=h-(g+360):h180?e=h+360-g:e=h-g,f=g+b*e;else if(!isNaN(g)){f=g;if(l===1||l===0)n=o}else if(!isNaN(h)){f=h;if(k===1||k===0)n=p}else f=void 0;n==null&&(n=o+b*(p-o)),j=k+b*(l-k);return new a(f,n,j,d)}if(d==="rgb"){q=m.rgb,r=c.rgb;return new a(q[0]+b*(r[0]-q[0]),q[1]+b*(r[1]-q[1]),q[2]+b*(r[2]-q[2]),d)}if(d==="lab"){q=m.lab(),r=c.lab();return new a(q[0]+b*(r[0]-q[0]),q[1]+b*(r[1]-q[1]),q[2]+b*(r[2]-q[2]),d)}throw"color mode "+d+" is not supported"};return a}(),c.hex2rgb=function(a){var b,c,d,e;if(!a.match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/))if(g.colors!=null&&g.colors[a])a=g.colors[a];else throw"unknown color format: "+a;if(a.length===4||a.length===7)a=a.substr(1);a.length===3&&(a=a[0]+a[0]+a[1]+a[1]+a[2]+a[2]),e=parseInt(a,16),d=e>>16,c=e>>8&255,b=e&255;return[d,c,b]},c.rgb2hex=function(a,b,c){var d,e,f;a!==void 0&&a.length===3&&(f=a,a=f[0],b=f[1],c=f[2]),e=a<<16|b<<8|c,d="000000"+e.toString(16).toUpperCase();return"#"+d.substr(d.length-6)},c.hsv2rgb=function(a,b,c){var d,e,f,g,h,j,k,l,m,n,o,p,q,r,s,t;i(a)==="array"&&a.length===3&&(n=a,a=n[0],b=n[1],h=n[2]),c*=255;if(b===0&&isNaN(a))l=f=d=c;else{a===360&&(a=0),a>360&&(a-=360),a<0&&(a+=360),a/=60,g=Math.floor(a),e=a-g,j=c*(1-b),k=c*(1-b*e),m=c*(1-b*(1-e));switch(g){case 0:o=[c,m,j],l=o[0],f=o[1],d=o[2];break;case 1:p=[k,c,j],l=p[0],f=p[1],d=p[2];break;case 2:q=[j,c,m],l=q[0],f=q[1],d=q[2];break;case 3:r=[j,k,c],l=r[0],f=r[1],d=r[2];break;case 4:s=[m,j,c],l=s[0],f=s[1],d=s[2];break;case 5:t=[c,j,k],l=t[0],f=t[1],d=t[2]}}l=Math.round(l),f=Math.round(f),d=Math.round(d);return[l,f,d]},c.rgb2hsv=function(a,b,c){var d,e,f,g,h,i,j;a!==void 0&&a.length===3&&(j=a,a=j[0],b=j[1],c=j[2]),g=Math.min(a,b,c),f=Math.max(a,b,c),d=f-g,i=f/255,h=d/f,h===0?(e=void 0,h=0):(a===f&&(e=(b-c)/d),b===f&&(e=2+(c-a)/d),c===f&&(e=4+(a-b)/d),e*=60,e<0&&(e+=360));return[e,h,i]},c.hsl2rgb=function(a,b,c){var d,e,f,g,h,i,j,k,l,m;a!==void 0&&a.length===3&&(l=a,a=l[0],b=l[1],c=l[2]);if(b===0)h=f=d=c*255;else{k=[0,0,0],e=[0,0,0],j=c<.5?c*(1+b):c+b-c*b,i=2*c-j,a/=360,k[0]=a+1/3,k[1]=a,k[2]=a-1/3;for(g=0;g<=2;g++)k[g]<0&&(k[g]+=1),k[g]>1&&(k[g]-=1),6*k[g]<1?e[g]=i+(j-i)*6*k[g]:2*k[g]<1?e[g]=j:3*k[g]<2?e[g]=i+(j-i)*(2/3-k[g])*6:e[g]=i;m=[Math.round(e[0]*255),Math.round(e[1]*255),Math.round(e[2]*255)],h=m[0],f=m[1],d=m[2]}return[h,f,d]},c.rgb2hsl=function(a,b,c){var d,e,f,g,h,i;a!==void 0&&a.length===3&&(i=a,a=i[0],b=i[1],c=i[2]),a/=255,b/=255,c/=255,g=Math.min(a,b,c),f=Math.max(a,b,c),e=(f+g)/2,f===g?(h=0,d=void 0):h=e<.5?(f-g)/(f+g):(f-g)/(2-f-g),a===f?d=(b-c)/(f-g):b===f?d=2+(c-a)/(f-g):c===f&&(d=4+(a-b)/(f-g)),d*=60,d<0&&(d+=360);return[d,h,e]},c.lab2xyz=function(a,b,c){var d,e,f,g,h,j,k;i(a)==="array"&&a.length===3&&(k=a,a=k[0],b=k[1],c=k[2]),d=function(a){return a>6/29?a*a*a:3*(6/29)*(6/29)*(a-4/29)},f=(a+.16)/1.16,e=[.96421,1,.82519],h=e[1]*d(f),g=e[0]*d(f+b/5),j=e[2]*d(f-c/2);return[g,h,j]},c.xyz2rgb=function(a,b,c){var d,e,f,g,h,j,k,l,m,n;i(a)==="array"&&a.length===3&&(m=a,a=m[0],b=m[1],c=m[2]),l=3.2406*a-1.5372*b-.4986*c,j=-0.9689*a+1.8758*b+.0415*c,e=.0557*a-.204*b+1.057*c,f=Math.min(l,j,e)<-0.001||Math.max(l,j,e)>1.001,f&&(l=l<0?0:l>1?1:l,j=j<0?0:j>1?1:j,e=e<0?0:e>1?1:e),f&&(n=[void 0,void 0,void 0],l=n[0],j=n[1],e=n[2]),g=function(a){var b;b=.055;return a<=.0031308?12.92*a:(1+b)*Math.pow(a,1/2.4)-b},k=Math.round(255*g(l)),h=Math.round(255*g(j)),d=Math.round(255*g(e));return[k,h,d]},c.lab2rgb=function(a,b,d){var e,f,g,h,i,j;a!==void 0&&a.length===3&&(h=a,a=h[0],b=h[1],d=h[2]),a!==void 0&&a.length===3&&(i=a,a=i[0],b=i[1],d=i[2]),j=c.lab2xyz(a,b,d),e=j[0],f=j[1],g=j[2];return c.xyz2rgb(e,f,g)},c.csl2lab=function(a,b,c){var d,e,f,g,h,j,k;i(a)==="array"&&a.length===3&&(k=a,a=k[0],b=k[1],c=k[2]),a/=360,e=6.283185307179586,d=c*.61+.09,g=e/6-a*e,j=(c*.311+.125)*b,f=Math.sin(g)*j,h=Math.cos(g)*j;return[d,f,h]},c.csl2rgb=function(a,b,d){var e,f,g,h;h=c.csl2lab(a,b,d),e=h[0],f=h[1],g=h[2];return c.lab2rgb(e,f,g)},c.rgb2xyz=function(a,b,c){var d,e,f,g,h,i,j,k;a!==void 0&&a.length===3&&(k=a,a=k[0],b=k[1],c=k[2]),e=function(a){var b;b=.055;return a<=.04045?a/12.92:Math.pow((a+b)/(1+b),2.4)},g=e(a/255),f=e(b/255),d=e(c/255),h=.4124*g+.3576*f+.1805*d,i=.2126*g+.7152*f+.0722*d,j=.0193*g+.1192*f+.9505*d;return[h,i,j]},c.xyz2lab=function(a,b,c){var d,e,f,g,h,i;a!==void 0&&a.length===3&&(i=a,a=i[0],b=i[1],c=i[2]),g=[.96421,1,.82519],f=function(a){return a>Math.pow(6/29,3)?Math.pow(a,1/3):7.787037037037035*a+4/29},h=1.16*f(b/g[1])-.16,d=5*(f(a/g[0])-f(b/g[1])),e=2*(f(b/g[1])-f(c/g[2]));return[h,d,e]},c.rgb2lab=function(a,b,d){var e,f,g,h,i;a!==void 0&&a.length===3&&(h=a,a=h[0],b=h[1],d=h[2]),i=c.rgb2xyz(a,b,d),e=i[0],f=i[1],g=i[2];return c.xyz2lab(e,f,g)},c.lab2csl=function(a,b,c){var d,e,f,g,h,j,k;i(a)==="array"&&a.length===3&&(k=a,a=k[0],b=k[1],c=k[2]),d=a,a=(a-.09)/.61,h=Math.sqrt(b*b+c*c),j=h/(a*.311+.125),e=6.283185307179586,f=Math.atan2(b,c),g=(e/6-f)/e,g*=360,g<0&&(g+=360);return[g,j,a]},c.rgb2csl=function(a,b,d){var e,f,g,h;i(a)==="array"&&a.length===3&&(g=a,a=g[0],b=g[1],d=g[2]),h=c.rgb2lab(a,b,d),f=h[0],e=h[1],d=h[2];return c.lab2csl(f,e,d)},c.rgb2hsi=function(a,b,c){var d,e,f,g,h,j;i(a)==="array"&&a.length===3&&(j=a,a=j[0],b=j[1],c=j[2]),d=Math.PI*2,a/=255,b/=255,c/=255,g=Math.min(a,b,c),f=(a+b+c)/3,h=1-g/f,h===0?e=0:(e=(a-b+(a-c))/2,e/=Math.sqrt((a-b)*(a-b)+(a-c)*(b-c)),e=Math.acos(e),c>b&&(e=d-e),e/=d);return[e*360,h,f]},c.hsi2rgb=function(a,b,c){var d,e,f,g,h,j,k;i(a)==="array"&&a.length===3&&(k=a,a=k[0],b=k[1],c=k[2]),e=Math.PI*2,d=Math.PI/3,g=Math.cos,a<0&&(a+=360),a>360&&(a-=360),a/=360,a<1/3?(f=(1-b)/3,j=(1+b*g(e*a)/g(d-e*a))/3,h=1-(f+j)):a<2/3?(a-=1/3,j=(1-b)/3,h=(1+b*g(e*a)/g(d-e*a))/3,f=1-(j+h)):(a-=2/3,h=(1-b)/3,f=(1+b*g(e*a)/g(d-e*a))/3,j=1-(h+f)),j=c*j*3,h=c*h*3,f=c*f*3;return[j*255,h*255,f*255]},g.Color=c,g.hsl=function(a,b,d){return new c(a,b,d,"hsl")},g.hsv=function(a,b,d){return new c(a,b,d,"hsv")},g.rgb=function(a,b,d){return new c(a,b,d,"rgb")},g.hex=function(a){return new c(a)},g.lab=function(a,b,d){return new c(a,b,d,"lab")},g.csl=function(a,b,d){return new c(a,b,d,"csl")},g.hsi=function(a,b,d){return new c(a,b,d,"hsi")},g.interpolate=function(a,b,d,e){i(a)==="string"&&(a=new c(a)),i(b)==="string"&&(b=new c(b));return a.interpolate(d,b,e)},d=function(){function a(a){var b,d,e,f,g,h,j,k,l,m;f=this,f.colors=e=(g=a.colors)!=null?g:["#ddd","#222"];for(b=0,h=e.length-1;0<=h?b<=h:b>=h;0<=h?b++:b--)d=e[b],i(d)==="string"&&(e[b]=new c(d));if(a.positions!=null)f.pos=a.positions;else{f.pos=[];for(b=0,j=e.length-1;0<=j?b<=j:b>=j;0<=j?b++:b--)f.pos.push(b/(e.length-1))}f.mode=(k=a.mode)!=null?k:"hsv",f.nacol=(l=a.nacol)!=null?l:"#ccc",f.setClasses((m=a.limits)!=null?m:[0,1]),f}a.prototype.getColor=function(a){var b,c,d,e;e=this;if(isNaN(a))return e.nacol;e.classLimits.length>2?(b=e.getClass(a),c=b/(e.numClasses-1)):(c=d=(a-e.min)/(e.max-e.min),c=Math.min(1,Math.max(0,c)));return e.fColor(c)},a.prototype.fColor=function(a){var b,c,d,e,f,h;e=this,c=e.colors;for(d=0,h=e.pos.length-1;0<=h?d<=h:d>=h;0<=h?d++:d--){f=e.pos[d];if(a<=f){b=c[d];break}if(a>=f&&d===e.pos.length-1){b=c[d];break}if(a>f&&a2&&(f=c.length-1,b=g.getClass(a),a=c[b]+(c[b+1]-c[b])*.5,e=c[0],d=c[f-1],a=g.min+(a-e)/(d-e)*(g.max-g.min));return a},a.prototype.setClasses=function(a){var b;a==null&&(a=[]),b=this,b.classLimits=a,b.min=a[0],b.max=a[a.length-1];return a.length===2?b.numClasses=0:b.numClasses=a.length-1},a.prototype.getClass=function(a){var b,c,d,e;e=this,c=e.classLimits;if(c!=null){d=c.length-1,b=0;while(b=c[b])b++;return b-1}},a.prototype.validValue=function(a){return!isNaN(a)};return a}(),g.ColorScale=d,f=function(){function a(b,c,d){b==null&&(b="#fe0000"),c==null&&(c="#feeeee"),d==null&&(d="hsl"),a.__super__.constructor.call(this,[b,c],[0,1],d)}m(a,d);return a}(),g.Ramp=f,e=function(){function a(b,c,d,e,f){var g;b==null&&(b="#d73027"),c==null&&(c="#ffffbf"),d==null&&(d="#1E6189"),e==null&&(e="mean"),f==null&&(f="hsl"),g=this,g.mode=f,g.center=e,a.__super__.constructor.call(this,[b,c,d],[0,.5,1],f)}m(a,d),a.prototype.parseData=function(b,c){var d,e;a.__super__.parseData.call(this,b,c),e=this,d=e.center,d==="median"?d=e.median:d==="mean"&&(d=e.mean);return e.pos[1]=(d-e.min)/(e.max-e.min)};return a}(),g.Diverging=e,b=function(){function a(a){var b;b=this,b.colors=a}m(a,d),a.prototype.parseData=function(a,b){},a.prototype.getColor=function(a){var b;b=this;return b.colors.hasOwnProperty(a)?b.colors[a]:"#cccccc"},a.prototype.validValue=function(a){return this.colors.hasOwnProperty(a)};return a}(),g.Categories=b,a=function(){function a(a){var b;b=this,b.name=a,b.setClasses(7),b}m(a,d),a.prototype.getColor=function(a){var b,c;c=this,b=c.getClass(a);return c.name+" l"+c.numClasses+" c"+b};return a}(),g.CSSColors=a,(k=g.scales)==null&&(g.scales={}),g.scales.cool=function(){return new f(g.hsl(180,1,.9),g.hsl(250,.7,.4))},g.scales.hot=function(){return new d({colors:["#000000","#ff0000","#ffff00","#ffffff"],positions:[0,.25,.75,1],mode:"rgb"})},g.scales.BlWhOr=function(){return new e(g.hsl(30,1,.55),"#ffffff",new c(220,1,.55))},g.scales.GrWhPu=function(){return new e(g.hsl(120,.8,.4),"#ffffff",new c(280,.8,.4))},g.limits=function(a,b,c,d){var e,f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z;b==null&&(b="equal"),c==null&&(c=7),d==null&&(d=null),r=Number.MAX_VALUE,q=Number.MAX_VALUE*-1,B=0,F=[];if(i(a)==="array")if(i(a[0])!=="object"&&i(a[0])!=="array")for(G=0,J=a.length;Gq&&(q=D),B+=D;else continue}F=F.sort(),p=[],b.substr(0,1)==="c"&&(p.push(r),p.push(q));if(b.substr(0,1)==="e"){p.push(r);for(l=1,T=c-1;1<=T?l<=T:l>=T;1<=T?l++:l--)p.push(r+l/c*(q-r));p.push(q)}else if(b.substr(0,1)==="q"){p.push(r);for(l=1,U=c-1;1<=U?l<=U:l>=U;1<=U?l++:l--)w=F.length*l/c,x=Math.floor(w),x===w?p.push(F[x]):(y=w-x,p.push(F[x]*y+F[x+1]*(1-y)));p.push(q)}else if(b.substr(0,1)==="k"){t=F.length,e=Array(t),j=Array(c),z=!0,u=0,g=null,g=[],g.push(r);for(l=1,V=c-1;1<=V?l<=V:l>=V;1<=V?l++:l--)g.push(r+l/c*(q-r));g.push(q);while(z){for(m=0,W=c-1;0<=W?m<=W:m>=W;0<=W?m++:m--)j[m]=0;for(l=0,X=t-1;0<=X?l<=X:l>=X;0<=X?l++:l--){E=F[l],s=Number.MAX_VALUE;for(m=0,Y=c-1;0<=Y?m<=Y:m>=Y;0<=Y?m++:m--)k=Math.abs(g[m]-E),k=Z;0<=Z?m++:m--)v[m]=null;for(l=0,M=t-1;0<=M?l<=M:l>=M;0<=M?l++:l--)h=e[l],v[h]===null?v[h]=F[l]:v[h]+=F[l];for(m=0,N=c-1;0<=N?m<=N:m>=N;0<=N?m++:m--)v[m]*=1/j[m];z=!1;for(m=0,O=c-1;0<=O?m<=O:m>=O;0<=O?m++:m--)if(v[m]!==g[l]){z=!0;break}g=v,u++,u>200&&(z=!1)}o={};for(m=0,P=c-1;0<=P?m<=P:m>=P;0<=P?m++:m--)o[m]=[];for(l=0,Q=t-1;0<=Q?l<=Q:l>=Q;0<=Q?l++:l--)h=e[l],o[h].push(F[l]);C=[];for(m=0,R=c-1;0<=R?m<=R:m>=R;0<=R?m++:m--)C.push(o[m][0]),C.push(o[m][o[m].length-1]);C=C.sort(function(a,b){return a-b}),p.push(C[0]);for(l=1,S=C.length-1;l<=S;l+=2)isNaN(C[l])||p.push(C[l])}return p},i=function(){var a,b,c,d,e;a={},e="Boolean Number String Function Array Date RegExp Undefined Null".split(" ");for(c=0,d=e.length;c. + * +*/ + + +(function() { + var $, Aitoff, Azimuthal, BBox, Balthasart, Behrmann, BlurFilter, Bubble, CEA, CantersModifiedSinusoidalI, Circle, CohenSutherland, Conic, Cylindrical, EckertIV, EquidistantAzimuthal, Equirectangular, Filter, GallPeters, GlowFilter, GoodeHomolosine, Hatano, HoboDyer, HtmlLabel, Icon, K, Kartograph, LAEA, LAEA_Alaska, LAEA_Hawaii, LAEA_USA, LCC, LabeledBubble, LatLon, Line, LinearScale, LogScale, LonLat, Loximuthal, MapLayer, MapLayerPath, Mercator, Mollweide, NaturalEarth, Nicolosi, Orthographic, Path, PieChart, Proj, PseudoConic, PseudoCylindrical, QuantileScale, REbraces, REcomment_string, REfull, REmunged, Robinson, Satellite, Scale, Sinusoidal, SqrtScale, StackedBarChart, Stereographic, SvgLabel, Symbol, SymbolGroup, View, WagnerIV, WagnerV, Winkel3, drawPieChart, filter, geom, hex2rgb, kartograph, log, map_layer_path_uid, munge, munged, parsedeclarations, proj, resolve, restore, root, scale, uid, warn, __area, __is_clockwise, __point_in_polygon, __type, _base, _base1, _ref, _ref1, _ref10, _ref11, _ref12, _ref13, _ref14, _ref15, _ref16, _ref17, _ref18, _ref19, _ref2, _ref20, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + root = typeof exports !== "undefined" && exports !== null ? exports : this; + + kartograph = root.$K = (_ref = root.kartograph) != null ? _ref : root.kartograph = {}; + + kartograph.version = "0.8.7"; + + $ = root.jQuery; + + kartograph.__verbose = false; + + warn = function(s) { + var e; + + try { + return console.warn.apply(console, arguments); + } catch (_error) { + e = _error; + try { + return opera.postError.apply(opera, arguments); + } catch (_error) { + e = _error; + return alert(Array.prototype.join.call(arguments, ' ')); + } + } + }; + + log = function(s) { + var e; + + if (kartograph.__verbose) { + try { + return console.debug.apply(console, arguments); + } catch (_error) { + e = _error; + try { + return opera.postError.apply(opera, arguments); + } catch (_error) { + e = _error; + return alert(Array.prototype.join.call(arguments, ' ')); + } + } + } + }; + + if ((_ref1 = (_base = String.prototype).trim) == null) { + _base.trim = function() { + return this.replace(/^\s+|\s+$/g, ""); + }; + } + + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { + "use strict"; + if (this == null) { + throw new TypeError(); + } + var t = Object(this); + var len = t.length >>> 0; + if (len === 0) { + return -1; + } + var n = 0; + if (arguments.length > 0) { + n = Number(arguments[1]); + if (n != n) { // shortcut for verifying if it's NaN + n = 0; + } else if (n != 0 && n != Infinity && n != -Infinity) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + } + if (n >= len) { + return -1; + } + var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); + for (; k < len; k++) { + if (k in t && t[k] === searchElement) { + return k; + } + } + return -1; + } +}; + + __type = (function() { + /* + for browser-safe type checking+ + ported from jQuery's $.type + */ + + var classToType, name, _i, _len, _ref2; + + classToType = {}; + _ref2 = "Boolean Number String Function Array Date RegExp Undefined Null".split(" "); + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + name = _ref2[_i]; + classToType["[object " + name + "]"] = name.toLowerCase(); + } + return function(obj) { + var strType; + + strType = Object.prototype.toString.call(obj); + return classToType[strType] || "object"; + }; + })(); + + /* + kartograph - a svg mapping library + Copyright (C) 2011 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + BBox = (function() { + /* + 2D bounding box + */ + function BBox(left, top, width, height) { + var s; + + if (left == null) { + left = 0; + } + if (top == null) { + top = 0; + } + if (width == null) { + width = null; + } + if (height == null) { + height = null; + } + s = this; + if (width === null) { + s.xmin = Number.MAX_VALUE; + s.xmax = Number.MAX_VALUE * -1; + } else { + s.xmin = s.left = left; + s.xmax = s.right = left + width; + s.width = width; + } + if (height === null) { + s.ymin = Number.MAX_VALUE; + s.ymax = Number.MAX_VALUE * -1; + } else { + s.ymin = s.top = top; + s.ymax = s.bottom = height + top; + s.height = height; + } + return; + } + + BBox.prototype.update = function(x, y) { + var s; + + if (y == null) { + y = x[1]; + x = x[0]; + } + s = this; + s.xmin = Math.min(s.xmin, x); + s.ymin = Math.min(s.ymin, y); + s.xmax = Math.max(s.xmax, x); + s.ymax = Math.max(s.ymax, y); + s.left = s.xmin; + s.top = s.ymin; + s.right = s.xmax; + s.bottom = s.ymax; + s.width = s.xmax - s.xmin; + s.height = s.ymax - s.ymin; + return this; + }; + + BBox.prototype.intersects = function(bbox) { + return bbox.left < s.right && bbox.right > s.left && bbox.top < s.bottom && bbox.bottom > s.top; + }; + + BBox.prototype.inside = function(x, y) { + var s; + + s = this; + return x >= s.left && x <= s.right && y >= s.top && y <= s.bottom; + }; + + BBox.prototype.join = function(bbox) { + var s; + + s = this; + s.update(bbox.left, bbox.top); + s.update(bbox.right, bbox.bottom); + return this; + }; + + return BBox; + + })(); + + BBox.fromXML = function(xml) { + var h, w, x, y; + + x = Number(xml.getAttribute('x')); + y = Number(xml.getAttribute('y')); + w = Number(xml.getAttribute('w')); + h = Number(xml.getAttribute('h')); + return new BBox(x, y, w, h); + }; + + kartograph.BBox = BBox; + + /* + kartograph - a svg mapping library + Copyright (C) 2011 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + if ((_ref2 = kartograph.geom) == null) { + kartograph.geom = {}; + } + + if ((_ref3 = (_base1 = kartograph.geom).clipping) == null) { + _base1.clipping = {}; + } + + CohenSutherland = (function() { + var BOTTOM, INSIDE, LEFT, RIGHT, TOP; + + function CohenSutherland() {} + + INSIDE = 0; + + LEFT = 1; + + RIGHT = 2; + + BOTTOM = 4; + + TOP = 8; + + CohenSutherland.prototype.compute_out_code = function(bbox, x, y) { + var code, self; + + self = this; + code = self.INSIDE; + if (x < bbox.left) { + code |= self.LEFT; + } else if (x > bbox.right) { + code |= self.RIGHT; + } + if (y < bbox.top) { + code |= self.TOP; + } else if (y > bbox.bottom) { + code |= self.BOTTOM; + } + return code; + }; + + CohenSutherland.prototype.clip = function(bbox, x0, y0, x1, y1) { + var accept, code0, code1, cout, self, x, y; + + self = this; + code0 = self.compute_out_code(bbox, x0, y0); + code1 = self.compute_out_code(bbox, x1, y1); + accept = False; + while (True) { + if (!(code0 | code1)) { + accept = True; + break; + } else if (code0 & code1) { + break; + } else { + cout = code === 0 ? code1 : code0; + if (cout & self.TOP) { + x = x0 + (x1 - x0) * (bbox.top - y0) / (y1 - y0); + y = bbox.top; + } else if (cout & self.BOTTOM) { + x = x0 + (x1 - x0) * (bbox.bottom - y0) / (y1 - y0); + y = bbox.bottom; + } else if (cout & self.RIGHT) { + y = y0 + (y1 - y0) * (bbox.right - x0) / (x1 - x0); + x = bbox.right; + } else if (cout & self.LEFT) { + y = y0 + (y1 - y0) * (bbox.left - x0) / (x1 - x0); + x = bbox.left; + } + if (cout === code0) { + x0 = x; + y0 = y; + code0 = self.compute_out_code(bbox, x0, y0); + } else { + x1 = x; + y1 = y; + code1 = self.compute_out_code(bbox, x1, y1); + } + } + } + if (accept) { + return [x0, y0, x1, y1]; + } else { + return null; + } + }; + + return CohenSutherland; + + })(); + + kartograph.geom.clipping.CohenSutherland = CohenSutherland; + + /* + kartograph - a svg mapping library + Copyright (C) 2011,2012 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + Kartograph = (function() { + function Kartograph(container, width, height) { + var cnt, me; + + me = this; + me.container = cnt = $(container); + if (width == null) { + width = cnt.width(); + } + if (height == null) { + height = cnt.height(); + } + if (height === 0) { + height = 'auto'; + } + me.size = { + h: height, + w: width + }; + me.markers = []; + me.pathById = {}; + me.container.addClass('kartograph'); + } + + Kartograph.prototype.createSVGLayer = function(id) { + var about, cnt, lid, me, paper, svg, vp, _ref4; + + me = this; + if ((_ref4 = me._layerCnt) == null) { + me._layerCnt = 0; + } + lid = me._layerCnt++; + vp = me.viewport; + cnt = me.container; + paper = Raphael(cnt[0], vp.width, vp.height); + svg = $(paper.canvas); + svg.css({ + position: 'absolute', + top: '0px', + left: '0px', + 'z-index': lid + 5 + }); + if (cnt.css('position') === 'static') { + cnt.css({ + position: 'relative', + height: vp.height + 'px' + }); + } + svg.addClass(id); + about = $('desc', paper.canvas).text(); + $('desc', paper.canvas).text(about.replace('with ', 'with kartograph ' + kartograph.version + ' and ')); + return paper; + }; + + Kartograph.prototype.createHTMLLayer = function(id) { + var cnt, div, lid, me, vp, _ref4; + + me = this; + vp = me.viewport; + cnt = me.container; + if ((_ref4 = me._layerCnt) == null) { + me._layerCnt = 0; + } + lid = me._layerCnt++; + div = $('
'); + div.css({ + position: 'absolute', + top: '0px', + left: '0px', + width: vp.width + 'px', + height: vp.height + 'px', + 'z-index': lid + 5 + }); + cnt.append(div); + return div; + }; + + Kartograph.prototype.load = function(mapurl, callback, opts) { + var def, me, _base2, _ref4; + + me = this; + def = $.Deferred(); + me.clear(); + me.opts = opts != null ? opts : {}; + if ((_ref4 = (_base2 = me.opts).zoom) == null) { + _base2.zoom = 1; + } + me.mapLoadCallback = callback; + me._loadMapDeferred = def; + me._lastMapUrl = mapurl; + if (me.cacheMaps && (kartograph.__mapCache[mapurl] != null)) { + me._mapLoaded(kartograph.__mapCache[mapurl]); + } else { + $.ajax({ + url: mapurl, + dataType: "text", + success: me._mapLoaded, + context: me, + error: function(a, b, c) { + return warn(a, b, c); + } + }); + } + return def.promise(); + }; + + Kartograph.prototype.loadMap = function() { + return this.load.apply(this, arguments); + }; + + Kartograph.prototype.setMap = function(svg, opts) { + var me, _base2, _ref4; + + me = this; + me.opts = opts != null ? opts : {}; + if ((_ref4 = (_base2 = me.opts).zoom) == null) { + _base2.zoom = 1; + } + me._lastMapUrl = 'string'; + me._mapLoaded(svg); + }; + + Kartograph.prototype._mapLoaded = function(xml) { + var $view, AB, err, h, halign, me, padding, ratio, valign, vp, w, zoom, _ref4, _ref5, _ref6, _ref7, _ref8; + + me = this; + if (me.cacheMaps) { + if ((_ref4 = kartograph.__mapCache) == null) { + kartograph.__mapCache = {}; + } + kartograph.__mapCache[me._lastMapUrl] = xml; + } + try { + xml = $(xml); + } catch (_error) { + err = _error; + warn('something went horribly wrong while parsing svg'); + me._loadMapDeferred.reject('could not parse svg'); + return; + } + me.svgSrc = xml; + $view = $('view', xml); + if (me.paper == null) { + w = me.size.w; + h = me.size.h; + if (h === 'auto') { + ratio = $view.attr('w') / $view.attr('h'); + h = w / ratio; + } + me.viewport = new BBox(0, 0, w, h); + } + vp = me.viewport; + me.viewAB = AB = View.fromXML($view[0]); + padding = (_ref5 = me.opts.padding) != null ? _ref5 : 0; + halign = (_ref6 = me.opts.halign) != null ? _ref6 : 'center'; + valign = (_ref7 = me.opts.valign) != null ? _ref7 : 'center'; + zoom = (_ref8 = me.opts.zoom) != null ? _ref8 : 1; + me.viewBC = new View(me.viewAB.asBBox(), vp.width * zoom, vp.height * zoom, padding, halign, valign); + me.proj = kartograph.Proj.fromXML($('proj', $view)[0]); + if (me.mapLoadCallback != null) { + me.mapLoadCallback(me); + } + if (me._loadMapDeferred != null) { + me._loadMapDeferred.resolve(me); + } + }; + + Kartograph.prototype.addLayer = function(id, opts) { + var $paths, chunkSize, iter, layer, layer_id, layer_paper, me, moveOn, nextPaths, path_id, rows, src_id, svgLayer, titles, _ref4, _ref5, _ref6; + + if (opts == null) { + opts = {}; + } + /* + add new layer + */ + + me = this; + if ((_ref4 = me.layerIds) == null) { + me.layerIds = []; + } + if ((_ref5 = me.layers) == null) { + me.layers = {}; + } + if (me.paper == null) { + me.paper = me.createSVGLayer(); + } + src_id = id; + if (__type(opts) === 'object') { + layer_id = opts.name; + path_id = opts.key; + titles = opts.title; + } else { + opts = {}; + } + layer_paper = me.paper; + if (opts.add_svg_layer) { + layer_paper = me.createSVGLayer(); + } + if (layer_id == null) { + layer_id = src_id; + } + svgLayer = $('#' + src_id, me.svgSrc); + if (svgLayer.length === 0) { + return; + } + layer = new MapLayer(layer_id, path_id, me, opts.filter, layer_paper); + $paths = $('*', svgLayer[0]); + rows = $paths.length; + chunkSize = (_ref6 = opts.chunks) != null ? _ref6 : rows; + iter = 0; + nextPaths = function() { + var base, i, prop, val, _i, _ref7; + + base = chunkSize * iter; + for (i = _i = 0; 0 <= chunkSize ? _i < chunkSize : _i > chunkSize; i = 0 <= chunkSize ? ++_i : --_i) { + if (base + i < rows) { + layer.addPath($paths.get(base + i), titles); + } + } + if (opts.styles != null) { + _ref7 = opts.styles; + for (prop in _ref7) { + val = _ref7[prop]; + layer.style(prop, val); + } + } + iter++; + if (iter * chunkSize < rows) { + return setTimeout(nextPaths, 0); + } else { + return moveOn(); + } + }; + moveOn = function() { + var checkEvents, evt, _i, _len; + + if (layer.paths.length > 0) { + me.layers[layer_id] = layer; + me.layerIds.push(layer_id); + } + checkEvents = ['click', 'mouseenter', 'mouseleave', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mouseout']; + for (_i = 0, _len = checkEvents.length; _i < _len; _i++) { + evt = checkEvents[_i]; + if (__type(opts[evt]) === 'function') { + layer.on(evt, opts[evt]); + } + } + if (opts.tooltips != null) { + layer.tooltips(opts.tooltips); + } + if (opts.done != null) { + return opts.done(); + } + }; + if (opts.chunks != null) { + setTimeout(nextPaths, 0); + } else { + nextPaths(); + } + return me; + }; + + Kartograph.prototype.getLayer = function(layer_id) { + /* returns a map layer + */ + + var me; + + me = this; + if (me.layers[layer_id] == null) { + warn('could not find layer ' + layer_id); + return null; + } + return me.layers[layer_id]; + }; + + Kartograph.prototype.getLayerPath = function(layer_id, path_id) { + var layer, me; + + me = this; + layer = me.getLayer(layer_id); + if (layer != null) { + if (__type(path_id) === 'object') { + return layer.getPaths(path_id)[0]; + } else { + return layer.getPath(path_id); + } + } + return null; + }; + + Kartograph.prototype.onLayerEvent = function(event, callback, layerId) { + var me; + + me = this; + me.getLayer(layerId).on(event, callback); + return me; + }; + + Kartograph.prototype.addMarker = function(marker) { + var me, xy; + + me = this; + me.markers.push(marker); + xy = me.viewBC.project(me.viewAB.project(me.proj.project(marker.lonlat.lon, marker.lonlat.lat))); + return marker.render(xy[0], xy[1], me.container, me.paper); + }; + + Kartograph.prototype.clearMarkers = function() { + var marker, me, _i, _len, _ref4; + + me = this; + _ref4 = me.markers; + for (_i = 0, _len = _ref4.length; _i < _len; _i++) { + marker = _ref4[_i]; + marker.clear(); + } + return me.markers = []; + }; + + Kartograph.prototype.fadeIn = function(opts) { + var dur, duration, id, layer_id, me, path, paths, _ref4, _ref5, _ref6, _results; + + if (opts == null) { + opts = {}; + } + me = this; + layer_id = (_ref4 = opts.layer) != null ? _ref4 : me.layerIds[me.layerIds.length - 1]; + duration = (_ref5 = opts.duration) != null ? _ref5 : 500; + _ref6 = me.layers[layer_id].pathsById; + _results = []; + for (id in _ref6) { + paths = _ref6[id]; + _results.push((function() { + var _i, _len, _results1; + + _results1 = []; + for (_i = 0, _len = paths.length; _i < _len; _i++) { + path = paths[_i]; + if (__type(duration) === "function") { + dur = duration(path.data); + } else { + dur = duration; + } + path.svgPath.attr('opacity', 0); + _results1.push(path.svgPath.animate({ + opacity: 1 + }, dur)); + } + return _results1; + })()); + } + return _results; + }; + + /* + end of public API + */ + + + Kartograph.prototype.loadCoastline = function() { + var me; + + me = this; + return $.ajax({ + url: 'coastline.json', + success: me.renderCoastline, + context: me + }); + }; + + Kartograph.prototype.resize = function(w, h) { + /* + forces redraw of every layer + */ + + var cnt, halign, id, layer, me, padding, sg, valign, vp, zoom, _i, _len, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9; + + me = this; + cnt = me.container; + if (w == null) { + w = cnt.width(); + } + if (h == null) { + h = cnt.height(); + } + me.viewport = vp = new BBox(0, 0, w, h); + if (me.paper != null) { + me.paper.setSize(vp.width, vp.height); + } + _ref4 = me.layers; + for (id in _ref4) { + layer = _ref4[id]; + if ((layer.paper != null) && layer.paper !== me.paper) { + layer.paper.setSize(vp.width, vp.height); + } + } + padding = (_ref5 = me.opts.padding) != null ? _ref5 : 0; + halign = (_ref6 = me.opts.halign) != null ? _ref6 : 'center'; + valign = (_ref7 = me.opts.valign) != null ? _ref7 : 'center'; + zoom = me.opts.zoom; + me.viewBC = new View(me.viewAB.asBBox(), vp.width * zoom, vp.height * zoom, padding, halign, valign); + _ref8 = me.layers; + for (id in _ref8) { + layer = _ref8[id]; + layer.setView(me.viewBC); + } + if (me.symbolGroups != null) { + _ref9 = me.symbolGroups; + for (_i = 0, _len = _ref9.length; _i < _len; _i++) { + sg = _ref9[_i]; + sg.onResize(); + } + } + }; + + Kartograph.prototype.lonlat2xy = function(lonlat) { + var a, me; + + me = this; + if (lonlat.length === 2) { + lonlat = new LonLat(lonlat[0], lonlat[1]); + } + if (lonlat.length === 3) { + lonlat = new LonLat(lonlat[0], lonlat[1], lonlat[2]); + } + a = me.proj.project(lonlat.lon, lonlat.lat, lonlat.alt); + return me.viewBC.project(me.viewAB.project(a)); + }; + + Kartograph.prototype.addSymbolGroup = function(symbolgroup) { + var me, _ref4; + + me = this; + if ((_ref4 = me.symbolGroups) == null) { + me.symbolGroups = []; + } + return me.symbolGroups.push(symbolgroup); + }; + + Kartograph.prototype.removeSymbols = function(index) { + var me, sg, _i, _len, _ref4, _results; + + me = this; + if (index != null) { + return me.symbolGroups[index].remove(); + } else { + _ref4 = me.symbolGroups; + _results = []; + for (_i = 0, _len = _ref4.length; _i < _len; _i++) { + sg = _ref4[_i]; + _results.push(sg.remove()); + } + return _results; + } + }; + + Kartograph.prototype.clear = function() { + var id, me, sg, _i, _len, _ref4; + + me = this; + if (me.layers != null) { + for (id in me.layers) { + me.layers[id].remove(); + } + me.layers = {}; + me.layerIds = []; + } + if (me.symbolGroups != null) { + _ref4 = me.symbolGroups; + for (_i = 0, _len = _ref4.length; _i < _len; _i++) { + sg = _ref4[_i]; + sg.remove(); + } + me.symbolGroups = []; + } + if (me.paper != null) { + $(me.paper.canvas).remove(); + return me.paper = void 0; + } + }; + + Kartograph.prototype.loadCSS = function(url, callback) { + /* + loads a stylesheet + */ + + var me; + + me = this; + if (!Raphael.svg) { + return $.ajax({ + url: url, + dataType: 'text', + success: function(resp) { + me.styles = kartograph.parsecss(resp); + return callback(); + }, + error: function(a, b, c) { + return warn('error while loading ' + url, a, b, c); + } + }); + } else { + $('body').append(''); + return callback(); + } + }; + + Kartograph.prototype.applyCSS = function(el, className) { + /* + applies pre-loaded css styles to + raphael elements + */ + + var classes, k, me, p, props, sel, selectors, _i, _j, _len, _len1, _ref4, _ref5, _ref6, _ref7; + + me = this; + if (me.styles == null) { + return el; + } + if ((_ref4 = me._pathTypes) == null) { + me._pathTypes = ["path", "circle", "rectangle", "ellipse"]; + } + if ((_ref5 = me._regardStyles) == null) { + me._regardStyles = ["fill", "stroke", "fill-opacity", "stroke-width", "stroke-opacity"]; + } + for (sel in me.styles) { + p = sel; + _ref6 = p.split(','); + for (_i = 0, _len = _ref6.length; _i < _len; _i++) { + selectors = _ref6[_i]; + p = selectors.split(' '); + p = p[p.length - 1]; + p = p.split(':'); + if (p.length > 1) { + continue; + } + p = p[0].split('.'); + classes = p.slice(1); + if (classes.length > 0 && classes.indexOf(className) < 0) { + continue; + } + p = p[0]; + if (me._pathTypes.indexOf(p) >= 0 && p !== el.type) { + continue; + } + props = me.styles[sel]; + _ref7 = me._regardStyles; + for (_j = 0, _len1 = _ref7.length; _j < _len1; _j++) { + k = _ref7[_j]; + if (props[k] != null) { + el.attr(k, props[k]); + } + } + } + } + return el; + }; + + Kartograph.prototype.style = function(layer, prop, value, duration, delay) { + var me; + + me = this; + layer = me.getLayer(layer); + if (layer != null) { + return layer.style(prop, value, duration, delay); + } + }; + + return Kartograph; + + })(); + + K = kartograph; + + root.kartograph = function(container, width, height) { + return new Kartograph(container, width, height); + }; + + kartograph.map = function(container, width, height) { + return new Kartograph(container, width, height); + }; + + kartograph.__mapCache = {}; + + $.extend(root.kartograph, K); + + /* + kartograph - a svg mapping library + Copyright (C) 2011 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + LonLat = (function() { + /* + represents a Point + */ + function LonLat(lon, lat, alt) { + if (alt == null) { + alt = 0; + } + this.lon = Number(lon); + this.lat = Number(lat); + this.alt = Number(alt); + } + + LonLat.prototype.distance = function(ll) { + var R, a, c, dLat, dLon, deg2rad, lat1, lat2, me; + + me = this; + R = 6371; + deg2rad = Math.PI / 180; + dLat = (ll.lat - me.lat) * deg2rad; + dLon = (ll.lon - me.lon) * deg2rad; + lat1 = me.lat * deg2rad; + lat2 = ll.lat * deg2rad; + a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2); + c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + return R * c; + }; + + return LonLat; + + })(); + + LatLon = (function(_super) { + __extends(LatLon, _super); + + function LatLon(lat, lon, alt) { + if (alt == null) { + alt = 0; + } + LatLon.__super__.constructor.call(this, lon, lat, alt); + } + + return LatLon; + + })(LonLat); + + root.kartograph.LonLat = LonLat; + + root.kartograph.LatLon = LatLon; + + /* + kartograph - a svg mapping library + Copyright (C) 2011,2012 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + MapLayer = (function() { + function MapLayer(layer_id, path_id, map, filter, paper) { + var me; + + me = this; + me.id = layer_id; + me.path_id = path_id; + me.paper = paper != null ? paper : map.paper; + me.view = map.viewBC; + me.map = map; + me.filter = filter; + } + + MapLayer.prototype.addPath = function(svg_path, titles) { + var layerPath, me, _base2, _name, _ref4, _ref5, _ref6; + + me = this; + if ((_ref4 = me.paths) == null) { + me.paths = []; + } + layerPath = new MapLayerPath(svg_path, me.id, me, titles); + if (__type(me.filter) === 'function') { + if (me.filter(layerPath.data) === false) { + layerPath.remove(); + return; + } + } + me.paths.push(layerPath); + if (me.path_id != null) { + if ((_ref5 = me.pathsById) == null) { + me.pathsById = {}; + } + if ((_ref6 = (_base2 = me.pathsById)[_name = layerPath.data[me.path_id]]) == null) { + _base2[_name] = []; + } + return me.pathsById[layerPath.data[me.path_id]].push(layerPath); + } + }; + + MapLayer.prototype.hasPath = function(id) { + var me; + + me = this; + return (me.pathsById != null) && (me.pathsById[id] != null); + }; + + MapLayer.prototype.getPathsData = function() { + /* returns a list of all shape data dictionaries + */ + + var me, path, pd, _i, _len, _ref4; + + me = this; + pd = []; + _ref4 = me.paths; + for (_i = 0, _len = _ref4.length; _i < _len; _i++) { + path = _ref4[_i]; + pd.push(path.data); + } + return pd; + }; + + MapLayer.prototype.getPath = function(id) { + var me; + + me = this; + if (me.hasPath(id)) { + return me.pathsById[id][0]; + } + return null; + }; + + MapLayer.prototype.getPaths = function(query) { + var key, match, matches, me, path, _i, _len, _ref4; + + me = this; + matches = []; + if (__type(query) === 'object') { + _ref4 = me.paths; + for (_i = 0, _len = _ref4.length; _i < _len; _i++) { + path = _ref4[_i]; + match = true; + for (key in query) { + match = match && path.data[key] === query[key]; + } + if (match) { + matches.push(path); + } + } + } + return matches; + }; + + MapLayer.prototype.setView = function(view) { + /* + # after resizing of the map, each layer gets a new view + */ + + var me, path, _i, _len, _ref4; + + me = this; + _ref4 = me.paths; + for (_i = 0, _len = _ref4.length; _i < _len; _i++) { + path = _ref4[_i]; + path.setView(view); + } + return me; + }; + + MapLayer.prototype.remove = function() { + /* + removes every path + */ + + var me, path, _i, _len, _ref4, _results; + + me = this; + _ref4 = me.paths; + _results = []; + for (_i = 0, _len = _ref4.length; _i < _len; _i++) { + path = _ref4[_i]; + _results.push(path.remove()); + } + return _results; + }; + + MapLayer.prototype.style = function(props, value, duration, delay) { + var key, me; + + me = this; + if (__type(props) === "string") { + key = props; + props = {}; + props[key] = value; + } else if (__type(props) === "object") { + delay = duration; + duration = value; + } + if (duration == null) { + duration = 0; + } + $.each(me.paths, function(i, path) { + var anim, attrs, dly, dur, prop, val; + + attrs = {}; + for (prop in props) { + val = props[prop]; + attrs[prop] = resolve(val, path.data); + } + dur = resolve(duration, path.data); + dly = resolve(delay, path.data); + if (dly == null) { + dly = 0; + } + if (dur > 0) { + anim = Raphael.animation(attrs, dur * 1000); + return path.svgPath.animate(anim.delay(dly * 1000)); + } else { + if (delay === 0) { + return setTimeout(function() { + return path.svgPath.attr(attrs); + }, 0); + } else { + return path.svgPath.attr(attrs); + } + } + }); + return me; + }; + + MapLayer.prototype.on = function(event, callback) { + var EventContext, ctx, me, path, _i, _len, _ref4; + + me = this; + EventContext = (function() { + function EventContext(type, cb, layer) { + this.type = type; + this.cb = cb; + this.layer = layer; + this.handle = __bind(this.handle, this); + } + + EventContext.prototype.handle = function(e) { + var path; + + me = this; + path = me.layer.map.pathById[e.target.getAttribute('id')]; + return me.cb(path.data, path.svgPath, e); + }; + + return EventContext; + + })(); + ctx = new EventContext(event, callback, me); + _ref4 = me.paths; + for (_i = 0, _len = _ref4.length; _i < _len; _i++) { + path = _ref4[_i]; + $(path.svgPath.node).bind(event, ctx.handle); + } + return me; + }; + + MapLayer.prototype.tooltips = function(content, delay) { + var me, path, setTooltip, tt, _i, _len, _ref4; + + me = this; + setTooltip = function(path, tt) { + var cfg; + + cfg = { + position: { + target: 'mouse', + viewport: $(window), + adjust: { + x: 7, + y: 7 + } + }, + show: { + delay: delay != null ? delay : 20 + }, + events: { + show: function(evt, api) { + return $('.qtip').filter(function() { + return this !== api.elements.tooltip.get(0); + }).hide(); + } + }, + content: {} + }; + if (tt != null) { + if (typeof tt === "string") { + cfg.content.text = tt; + } else if ($.isArray(tt)) { + cfg.content.title = tt[0]; + cfg.content.text = tt[1]; + } + } else { + cfg.content.text = 'n/a'; + } + return $(path.svgPath.node).qtip(cfg); + }; + _ref4 = me.paths; + for (_i = 0, _len = _ref4.length; _i < _len; _i++) { + path = _ref4[_i]; + tt = resolve(content, path.data); + setTooltip(path, tt); + } + return me; + }; + + MapLayer.prototype.sort = function(sortBy) { + var lp, me, path, _i, _len, _ref4; + + me = this; + me.paths.sort(function(a, b) { + var av, bv, _ref4; + + av = sortBy(a.data); + bv = sortBy(b.data); + if (av === bv) { + return 0; + } + return (_ref4 = av > bv) != null ? _ref4 : { + 1: -1 + }; + }); + lp = false; + _ref4 = me.paths; + for (_i = 0, _len = _ref4.length; _i < _len; _i++) { + path = _ref4[_i]; + if (lp) { + path.svgPath.insertAfter(lp.svgPath); + } + lp = path; + } + return me; + }; + + return MapLayer; + + })(); + + resolve = function(prop, data) { + if (__type(prop) === 'function') { + return prop(data); + } + return prop; + }; + + map_layer_path_uid = 0; + + /* + kartograph - a svg mapping library + Copyright (C) 2011,2012 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + MapLayerPath = (function() { + function MapLayerPath(svg_path, layer_id, layer, titles) { + var attr, data, i, map, me, paper, path, title, uid, v, view, vn, _i, _ref4; + + me = this; + paper = layer.paper; + map = layer.map; + view = map.viewBC; + me.path = path = kartograph.geom.Path.fromSVG(svg_path); + me.vpath = view.projectPath(path); + me.svgPath = me.vpath.toSVG(paper); + me.svgPath.data('path', me); + if (map.styles == null) { + if (Raphael.svg) { + me.svgPath.node.setAttribute('class', layer_id); + } + } else { + map.applyCSS(me.svgPath, layer_id); + } + uid = 'path_' + map_layer_path_uid++; + me.svgPath.node.setAttribute('id', uid); + map.pathById[uid] = me; + data = {}; + for (i = _i = 0, _ref4 = svg_path.attributes.length - 1; 0 <= _ref4 ? _i <= _ref4 : _i >= _ref4; i = 0 <= _ref4 ? ++_i : --_i) { + attr = svg_path.attributes[i]; + if (attr.name.substr(0, 5) === "data-") { + v = attr.value; + vn = Number(v); + if (v.trim() !== "" && vn === v && !isNaN(vn)) { + v = vn; + } + data[attr.name.substr(5)] = v; + } + } + me.data = data; + if (__type(titles) === 'string') { + title = titles; + } else if (__type(titles) === 'function') { + title = titles(data); + } + if (title != null) { + me.svgPath.attr('title', title); + } + } + + MapLayerPath.prototype.setView = function(view) { + var me, path, path_str; + + me = this; + path = view.projectPath(me.path); + me.vpath = path; + if (me.path.type === "path") { + path_str = path.svgString(); + return me.svgPath.attr({ + path: path_str + }); + } else if (me.path.type === "circle") { + return me.svgPath.attr({ + cx: path.x, + cy: path.y, + r: path.r + }); + } + }; + + MapLayerPath.prototype.remove = function() { + var me; + + me = this; + return me.svgPath.remove(); + }; + + return MapLayerPath; + + })(); + + /* + kartograph - a svg mapping library + Copyright (C) 2011 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + /* + This is a reduced version of Danial Wachsstocks jQuery based CSS parser + Everything is removed but the core css-to-object parsing + + jQuery based CSS parser + documentation: http://youngisrael-stl.org/wordpress/2009/01/16/jquery-css-parser/ + Version: 1.3 + Copyright (c) 2011 Daniel Wachsstock + MIT license: + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ + + + kartograph.parsecss = function(str, callback) { + var css, k, props, ret, v, _i, _len, _ref4; + + ret = {}; + str = munge(str); + _ref4 = str.split('`b%'); + for (_i = 0, _len = _ref4.length; _i < _len; _i++) { + css = _ref4[_i]; + css = css.split('%b`'); + if (css.length < 2) { + continue; + } + css[0] = restore(css[0]); + props = parsedeclarations(css[1]); + if (ret[css[0]] != null) { + for (k in props) { + v = props[k]; + ret[css[0]][k] = v; + } + } else { + ret[css[0]] = props; + } + } + if (__type(callback) === 'function') { + callback(ret); + } else { + return ret; + } + }; + + munged = {}; + + parsedeclarations = function(index) { + var decl, parsed, str, _i, _len, _ref4; + + str = munged[index].replace(/^{|}$/g, ''); + str = munge(str); + parsed = {}; + _ref4 = str.split(';'); + for (_i = 0, _len = _ref4.length; _i < _len; _i++) { + decl = _ref4[_i]; + decl = decl.split(':'); + if (decl.length < 2) { + continue; + } + parsed[restore(decl[0])] = restore(decl.slice(1).join(':')); + } + return parsed; + }; + + REbraces = /{[^{}]*}/; + + REfull = /\[[^\[\]]*\]|{[^{}]*}|\([^()]*\)|function(\s+\w+)?(\s*%b`\d+`b%){2}/; + + REcomment_string = /(?:\/\*(?:[^\*]|\*[^\/])*\*\/)|(\\.|"(?:[^\\\"]|\\.|\\\n)*"|'(?:[^\\\']|\\.|\\\n)*')/g; + + REmunged = /%\w`(\d+)`\w%/; + + uid = 0; + + munge = function(str, full) { + var RE, match, replacement; + + str = str.replace(REcomment_string, function(s, string) { + var replacement; + + if (!string) { + return ''; + } + replacement = '%s`' + (++uid) + '`s%'; + munged[uid] = string.replace(/^\\/, ''); + return replacement; + }); + RE = full ? REfull : REbraces; + while (match = RE.exec(str)) { + replacement = '%b`' + (++uid) + '`b%'; + munged[uid] = match[0]; + str = str.replace(RE, replacement); + } + return str; + }; + + restore = function(str) { + var match; + + if (str == null) { + return str; + } + while (match = REmunged.exec(str)) { + str = str.replace(REmunged, munged[match[1]]); + } + return str.trim(); + }; + + /* + kartograph - a svg mapping library + Copyright (C) 2011 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + geom = (_ref4 = kartograph.geom) != null ? _ref4 : kartograph.geom = {}; + + Path = (function() { + /* + represents complex polygons (aka multi-polygons) + */ + function Path(type, contours, closed) { + var cnt, self, _i, _len; + + if (closed == null) { + closed = true; + } + self = this; + self.type = type; + self.contours = []; + for (_i = 0, _len = contours.length; _i < _len; _i++) { + cnt = contours[_i]; + if (!__is_clockwise(cnt)) { + cnt.reverse(); + } + self.contours.push(cnt); + } + self.closed = closed; + } + + Path.prototype.clipToBBox = function(bbox) { + throw "path clipping is not implemented yet"; + }; + + Path.prototype.toSVG = function(paper) { + /* translates this path to a SVG path string + */ + + var str; + + str = this.svgString(); + return paper.path(str); + }; + + Path.prototype.svgString = function() { + var contour, fst, glue, me, str, x, y, _i, _j, _len, _len1, _ref5, _ref6; + + me = this; + str = ""; + glue = me.closed ? "Z M" : "M"; + _ref5 = me.contours; + for (_i = 0, _len = _ref5.length; _i < _len; _i++) { + contour = _ref5[_i]; + fst = true; + str += str === "" ? "M" : glue; + for (_j = 0, _len1 = contour.length; _j < _len1; _j++) { + _ref6 = contour[_j], x = _ref6[0], y = _ref6[1]; + if (!fst) { + str += "L"; + } + str += x + ',' + y; + fst = false; + } + } + if (me.closed) { + str += "Z"; + } + return str; + }; + + Path.prototype.area = function() { + var area, cnt, me, _i, _len, _ref5; + + me = this; + if (me.areas != null) { + return me._area; + } + me.areas = []; + me._area = 0; + _ref5 = me.contours; + for (_i = 0, _len = _ref5.length; _i < _len; _i++) { + cnt = _ref5[_i]; + area = __area(cnt); + me.areas.push(area); + me._area += area; + } + return me._area; + }; + + Path.prototype.centroid = function() { + var S, a, area, cnt, cnt_orig, cx, cy, diff, dx, dy, i, j, k, l, len, me, p0, p1, s, sp, total_len, w, x, x_, y, y_, _i, _j, _k, _l, _lengths, _m, _ref5, _ref6, _ref7, _ref8, _ref9; + + me = this; + if (me._centroid != null) { + return me._centroid; + } + area = me.area(); + cx = cy = 0; + for (i = _i = 0, _ref5 = me.contours.length - 1; 0 <= _ref5 ? _i <= _ref5 : _i >= _ref5; i = 0 <= _ref5 ? ++_i : --_i) { + cnt_orig = me.contours[i]; + cnt = []; + l = cnt_orig.length; + a = me.areas[i]; + k = a / area; + if (k === 0) { + continue; + } + for (j = _j = 0, _ref6 = l - 1; 0 <= _ref6 ? _j <= _ref6 : _j >= _ref6; j = 0 <= _ref6 ? ++_j : --_j) { + p0 = cnt_orig[j]; + p1 = cnt_orig[(j + 1) % l]; + diff = 0; + cnt.push(p0); + if (p0[0] === p1[0]) { + diff = Math.abs(p0[1] - p1[1]); + } + if (p0[1] === p1[1]) { + diff = Math.abs(p0[0] - p1[0]); + } + if (diff > 10) { + S = Math.floor(diff * 2); + for (s = _k = 1, _ref7 = S - 1; 1 <= _ref7 ? _k <= _ref7 : _k >= _ref7; s = 1 <= _ref7 ? ++_k : --_k) { + sp = [p0[0] + s / S * (p1[0] - p0[0]), p0[1] + s / S * (p1[1] - p0[1])]; + cnt.push(sp); + } + } + } + x = y = x_ = y_ = 0; + l = cnt.length; + _lengths = []; + total_len = 0; + for (j = _l = 0, _ref8 = l - 1; 0 <= _ref8 ? _l <= _ref8 : _l >= _ref8; j = 0 <= _ref8 ? ++_l : --_l) { + p0 = cnt[j]; + p1 = cnt[(j + 1) % l]; + dx = p1[0] - p0[0]; + dy = p1[1] - p0[1]; + len = Math.sqrt(dx * dx + dy * dy); + _lengths.push(len); + total_len += len; + } + for (j = _m = 0, _ref9 = l - 1; 0 <= _ref9 ? _m <= _ref9 : _m >= _ref9; j = 0 <= _ref9 ? ++_m : --_m) { + p0 = cnt[j]; + w = _lengths[j] / total_len; + x += w * p0[0]; + y += w * p0[1]; + } + cx += x * k; + cy += y * k; + } + me._centroid = [cx, cy]; + return me._centroid; + }; + + Path.prototype.isInside = function(x, y) { + var bbox, cnt, i, me, _i, _ref5; + + me = this; + bbox = me._bbox; + if (x < bbox[0] || x > bbox[2] || y < bbox[1] || y > bbox[3]) { + return false; + } + for (i = _i = 0, _ref5 = me.contours.length - 1; 0 <= _ref5 ? _i <= _ref5 : _i >= _ref5; i = 0 <= _ref5 ? ++_i : --_i) { + cnt = me.contours[i]; + if (__point_in_polygon(cnt, [x, y])) { + return true; + } + } + return false; + }; + + return Path; + + })(); + + kartograph.geom.Path = Path; + + Circle = (function(_super) { + __extends(Circle, _super); + + function Circle(x, y, r) { + this.x = x; + this.y = y; + this.r = r; + Circle.__super__.constructor.call(this, 'circle', null, true); + } + + Circle.prototype.toSVG = function(paper) { + var me; + + me = this; + return paper.circle(me.x, me.y, me.r); + }; + + Circle.prototype.centroid = function() { + var me; + + me = this; + return [me.x, me.y]; + }; + + Circle.prototype.area = function() { + var me; + + me = this; + return Math.PI * me.r * m.r; + }; + + return Circle; + + })(Path); + + kartograph.geom.Circle = Circle; + + Path.fromSVG = function(path) { + /* + loads a path from a SVG path string + */ + + var closed, cmd, contour, contours, cx, cy, path_data, path_str, r, res, sep, type, _i, _len; + + contours = []; + type = path.nodeName; + res = null; + if (type === "path") { + path_str = path.getAttribute('d').trim(); + path_data = Raphael.parsePathString(path_str); + closed = path_data[path_data.length - 1] === "Z"; + sep = closed ? "Z M" : "M"; + contour = []; + for (_i = 0, _len = path_data.length; _i < _len; _i++) { + cmd = path_data[_i]; + if (cmd.length === 0) { + continue; + } + if (cmd[0] === "M") { + if (contour.length > 2) { + contours.push(contour); + contour = []; + } + contour.push([cmd[1], cmd[2]]); + } else if (cmd[0] === "L") { + contour.push([cmd[1], cmd[2]]); + } else if (cmd[0] === "Z") { + if (contour.length > 2) { + contours.push(contour); + contour = []; + } + } + } + if (contour.length >= 2) { + contours.push(contour); + contour = []; + } + res = new geom.Path(type, contours, closed); + } else if (type === "circle") { + cx = path.getAttribute("cx"); + cy = path.getAttribute("cy"); + r = path.getAttribute("r"); + res = new geom.Circle(cx, cy, r); + } + return res; + }; + + Line = (function() { + /* + represents simple lines + */ + function Line(points) { + this.points = points; + } + + Line.prototype.clipToBBox = function(bbox) { + var clip, err, i, last_in, lines, p0x, p0y, p1x, p1y, pts, self, x0, x1, y0, y1, _i, _ref5, _ref6, _ref7, _ref8; + + self = this; + clip = new geom.clipping.CohenSutherland().clip; + pts = []; + lines = []; + last_in = false; + for (i = _i = 0, _ref5 = self.points.length - 2; 0 <= _ref5 ? _i <= _ref5 : _i >= _ref5; i = 0 <= _ref5 ? ++_i : --_i) { + _ref6 = self.points[i], p0x = _ref6[0], p0y = _ref6[1]; + _ref7 = self.points[i + 1], p1x = _ref7[0], p1y = _ref7[1]; + try { + _ref8 = clip(bbox, p0x, p0y, p1x, p1y), x0 = _ref8[0], y0 = _ref8[1], x1 = _ref8[2], y1 = _ref8[3]; + last_in = true; + pts.push([x0, y0]); + if (p1x !== x1 || p1y !== y0 || i === len(self.points) - 2) { + pts.push([x1, y1]); + } + } catch (_error) { + err = _error; + if (last_in && pts.length > 1) { + lines.push(new Line(pts)); + pts = []; + } + last_in = false; + } + } + if (pts.length > 1) { + lines.push(new Line(pts)); + } + return lines; + }; + + Line.prototype.toSVG = function() { + var pts, self, x, y, _i, _len, _ref5, _ref6; + + self = this; + pts = []; + _ref5 = self.points; + for (_i = 0, _len = _ref5.length; _i < _len; _i++) { + _ref6 = _ref5[_i], x = _ref6[0], y = _ref6[1]; + pts.push(x + ',' + y); + } + return 'M' + pts.join('L'); + }; + + return Line; + + })(); + + kartograph.geom.Line = Line; + + __point_in_polygon = function(polygon, p) { + var angle, atan2, dtheta, i, n, pi, theta1, theta2, twopi, x1, x2, y1, y2, _i, _ref5; + + pi = Math.PI; + atan2 = Math.atan2; + twopi = pi * 2; + n = polygon.length; + angle = 0; + for (i = _i = 0, _ref5 = n - 1; 0 <= _ref5 ? _i <= _ref5 : _i >= _ref5; i = 0 <= _ref5 ? ++_i : --_i) { + x1 = polygon[i][0] - p[0]; + y1 = polygon[i][1] - p[1]; + x2 = polygon[(i + 1) % n][0] - p[0]; + y2 = polygon[(i + 1) % n][1] - p[1]; + theta1 = atan2(y1, x1); + theta2 = atan2(y2, x2); + dtheta = theta2 - theta1; + while (dtheta > pi) { + dtheta -= twopi; + } + while (dtheta < -pi) { + dtheta += twopi; + } + angle += dtheta; + } + return Math.abs(angle) >= pi; + }; + + __is_clockwise = function(contour) { + return __area(contour) > 0; + }; + + __area = function(contour) { + var i, n, s, x1, x2, y1, y2, _i; + + s = 0; + n = contour.length; + for (i = _i = 0; 0 <= n ? _i < n : _i > n; i = 0 <= n ? ++_i : --_i) { + x1 = contour[i][0]; + y1 = contour[i][1]; + x2 = contour[(i + 1) % n][0]; + y2 = contour[(i + 1) % n][1]; + s += x1 * y2 - x2 * y1; + } + return s *= 0.5; + }; + + /* + kartograph - a svg mapping library + Copyright (C) 2011 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + proj = kartograph.proj = root.kartograph.proj = {}; + + Function.prototype.bind = function(scope) { + var _function; + + _function = this; + return function() { + return _function.apply(scope, arguments); + }; + }; + + Proj = (function() { + Proj.parameters = []; + + Proj.title = "Projection"; + + function Proj(opts) { + var me, _ref5, _ref6; + + me = this; + me.lon0 = (_ref5 = opts.lon0) != null ? _ref5 : 0; + me.lat0 = (_ref6 = opts.lat0) != null ? _ref6 : 0; + me.PI = Math.PI; + me.HALFPI = me.PI * .5; + me.QUARTERPI = me.PI * .25; + me.RAD = me.PI / 180; + me.DEG = 180 / me.PI; + me.lam0 = me.rad(this.lon0); + me.phi0 = me.rad(this.lat0); + me.minLat = -90; + me.maxLat = 90; + } + + Proj.prototype.rad = function(a) { + return a * this.RAD; + }; + + Proj.prototype.deg = function(a) { + return a * this.DEG; + }; + + Proj.prototype.plot = function(polygon, truncate) { + var ignore, lat, lon, points, vis, x, y, _i, _len, _ref5, _ref6; + + if (truncate == null) { + truncate = true; + } + points = []; + ignore = true; + for (_i = 0, _len = polygon.length; _i < _len; _i++) { + _ref5 = polygon[_i], lon = _ref5[0], lat = _ref5[1]; + vis = this._visible(lon, lat); + if (vis) { + ignore = false; + } + _ref6 = this.project(lon, lat), x = _ref6[0], y = _ref6[1]; + if (!vis && truncate) { + points.push(this._truncate(x, y)); + } else { + points.push([x, y]); + } + } + if (ignore) { + return null; + } else { + return [points]; + } + }; + + Proj.prototype.sea = function() { + var l0, lat, lon, o, p, s, _i, _j, _k, _l, _ref5, _ref6, _ref7, _ref8; + + s = this; + p = s.project.bind(this); + o = []; + l0 = s.lon0; + s.lon0 = 0; + for (lon = _i = -180; _i <= 180; lon = ++_i) { + o.push(p(lon, s.maxLat)); + } + for (lat = _j = _ref5 = s.maxLat, _ref6 = s.minLat; _ref5 <= _ref6 ? _j <= _ref6 : _j >= _ref6; lat = _ref5 <= _ref6 ? ++_j : --_j) { + o.push(p(180, lat)); + } + for (lon = _k = 180; _k >= -180; lon = --_k) { + o.push(p(lon, s.minLat)); + } + for (lat = _l = _ref7 = s.minLat, _ref8 = s.maxLat; _ref7 <= _ref8 ? _l <= _ref8 : _l >= _ref8; lat = _ref7 <= _ref8 ? ++_l : --_l) { + o.push(p(-180, lat)); + } + s.lon0 = l0; + return o; + }; + + Proj.prototype.world_bbox = function() { + var bbox, p, s, sea, _i, _len; + + p = this.project.bind(this); + sea = this.sea(); + bbox = new BBox(); + for (_i = 0, _len = sea.length; _i < _len; _i++) { + s = sea[_i]; + bbox.update(s[0], s[1]); + } + return bbox; + }; + + Proj.prototype.toString = function() { + var me; + + me = this; + return '[Proj: ' + me.name + ']'; + }; + + return Proj; + + })(); + + Proj.fromXML = function(xml) { + /* + reconstructs a projection from xml description + */ + + var attr, i, id, opts, prj, _i, _ref5; + + id = xml.getAttribute('id'); + opts = {}; + for (i = _i = 0, _ref5 = xml.attributes.length - 1; 0 <= _ref5 ? _i <= _ref5 : _i >= _ref5; i = 0 <= _ref5 ? ++_i : --_i) { + attr = xml.attributes[i]; + if (attr.name !== "id") { + opts[attr.name] = attr.value; + } + } + if (proj[id] == null) { + throw 'unknown projection ' + id; + } + prj = new proj[id](opts); + prj.name = id; + return prj; + }; + + kartograph.Proj = Proj; + + Cylindrical = (function(_super) { + __extends(Cylindrical, _super); + + /* + Base class for cylindrical projections + */ + + + Cylindrical.parameters = ['lon0', 'flip']; + + Cylindrical.title = "Cylindrical Projection"; + + function Cylindrical(opts) { + var me, _ref5, _ref6; + + if (opts == null) { + opts = {}; + } + me = this; + me.flip = Number((_ref5 = opts.flip) != null ? _ref5 : 0); + if (me.flip === 1) { + opts.lon0 = (_ref6 = -opts.lon0) != null ? _ref6 : 0; + } + Cylindrical.__super__.constructor.call(this, opts); + } + + Cylindrical.prototype._visible = function(lon, lat) { + return true; + }; + + Cylindrical.prototype.clon = function(lon) { + lon -= this.lon0; + if (lon < -180) { + lon += 360; + } else if (lon > 180) { + lon -= 360; + } + return lon; + }; + + Cylindrical.prototype.ll = function(lon, lat) { + if (this.flip === 1) { + return [-lon, -lat]; + } else { + return [lon, lat]; + } + }; + + return Cylindrical; + + })(Proj); + + Equirectangular = (function(_super) { + __extends(Equirectangular, _super); + + /* + Equirectangular Projection aka Lonlat aka Plate Carree + */ + + + function Equirectangular() { + _ref5 = Equirectangular.__super__.constructor.apply(this, arguments); + return _ref5; + } + + Equirectangular.title = "Equirectangular Projection"; + + Equirectangular.prototype.project = function(lon, lat) { + var _ref6; + + _ref6 = this.ll(lon, lat), lon = _ref6[0], lat = _ref6[1]; + lon = this.clon(lon); + return [lon * Math.cos(this.phi0) * 1000, lat * -1 * 1000]; + }; + + return Equirectangular; + + })(Cylindrical); + + proj['lonlat'] = Equirectangular; + + CEA = (function(_super) { + __extends(CEA, _super); + + CEA.parameters = ['lon0', 'lat1', 'flip']; + + CEA.title = "Cylindrical Equal Area"; + + function CEA(opts) { + var _ref6; + + CEA.__super__.constructor.call(this, opts); + this.lat1 = (_ref6 = opts.lat1) != null ? _ref6 : 0; + this.phi1 = this.rad(this.lat1); + } + + /* + Cylindrical Equal Area Projection + */ + + + CEA.prototype.project = function(lon, lat) { + var lam, phi, x, y, _ref6; + + _ref6 = this.ll(lon, lat), lon = _ref6[0], lat = _ref6[1]; + lam = this.rad(this.clon(lon)); + phi = this.rad(lat * -1); + x = lam * Math.cos(this.phi1); + y = Math.sin(phi) / Math.cos(this.phi1); + return [x * 1000, y * 1000]; + }; + + return CEA; + + })(Cylindrical); + + proj['cea'] = CEA; + + GallPeters = (function(_super) { + __extends(GallPeters, _super); + + /* + Gall-Peters Projection + */ + + + GallPeters.title = "Gall-Peters Projection"; + + GallPeters.parameters = ['lon0', 'flip']; + + function GallPeters(opts) { + opts.lat1 = 45; + GallPeters.__super__.constructor.call(this, opts); + } + + return GallPeters; + + })(CEA); + + proj['gallpeters'] = GallPeters; + + HoboDyer = (function(_super) { + __extends(HoboDyer, _super); + + /* + Hobo-Dyer Projection + */ + + + HoboDyer.title = "Hobo-Dyer Projection"; + + HoboDyer.parameters = ['lon0', 'flip']; + + function HoboDyer(opts) { + opts.lat1 = 37.7; + HoboDyer.__super__.constructor.call(this, opts); + } + + return HoboDyer; + + })(CEA); + + proj['hobodyer'] = HoboDyer; + + Behrmann = (function(_super) { + __extends(Behrmann, _super); + + /* + Behrmann Projection + */ + + + Behrmann.title = "Behrmann Projection"; + + Behrmann.parameters = ['lon0', 'flip']; + + function Behrmann(opts) { + opts.lat1 = 30; + Behrmann.__super__.constructor.call(this, opts); + } + + return Behrmann; + + })(CEA); + + proj['behrmann'] = Behrmann; + + Balthasart = (function(_super) { + __extends(Balthasart, _super); + + /* + Balthasart Projection + */ + + + Balthasart.title = "Balthasart Projection"; + + Balthasart.parameters = ['lon0', 'flip']; + + function Balthasart(opts) { + opts.lat1 = 50; + Balthasart.__super__.constructor.call(this, opts); + } + + return Balthasart; + + })(CEA); + + proj['balthasart'] = Balthasart; + + Mercator = (function(_super) { + __extends(Mercator, _super); + + /* + # you're not really into maps.. + */ + + + Mercator.title = "Mercator Projection"; + + function Mercator(opts) { + Mercator.__super__.constructor.call(this, opts); + this.minLat = -85; + this.maxLat = 85; + } + + Mercator.prototype.project = function(lon, lat) { + var lam, math, phi, s, x, y, _ref6; + + s = this; + _ref6 = s.ll(lon, lat), lon = _ref6[0], lat = _ref6[1]; + math = Math; + lam = s.rad(s.clon(lon)); + phi = s.rad(lat * -1); + x = lam * 1000; + y = math.log((1 + math.sin(phi)) / math.cos(phi)) * 1000; + return [x, y]; + }; + + return Mercator; + + })(Cylindrical); + + proj['mercator'] = Mercator; + + PseudoCylindrical = (function(_super) { + __extends(PseudoCylindrical, _super); + + /* + Base class for pseudo cylindrical projections + */ + + + function PseudoCylindrical() { + _ref6 = PseudoCylindrical.__super__.constructor.apply(this, arguments); + return _ref6; + } + + PseudoCylindrical.title = "Pseudo-Cylindrical Projection"; + + return PseudoCylindrical; + + })(Cylindrical); + + NaturalEarth = (function(_super) { + __extends(NaturalEarth, _super); + + /* + Natural Earth Projection + see here http://www.shadedrelief.com/NE_proj/ + */ + + + NaturalEarth.title = "Natural Earth Projection"; + + function NaturalEarth(opts) { + var s; + + NaturalEarth.__super__.constructor.call(this, opts); + s = this; + s.A0 = 0.8707; + s.A1 = -0.131979; + s.A2 = -0.013791; + s.A3 = 0.003971; + s.A4 = -0.001529; + s.B0 = 1.007226; + s.B1 = 0.015085; + s.B2 = -0.044475; + s.B3 = 0.028874; + s.B4 = -0.005916; + s.C0 = s.B0; + s.C1 = 3 * s.B1; + s.C2 = 7 * s.B2; + s.C3 = 9 * s.B3; + s.C4 = 11 * s.B4; + s.EPS = 1e-11; + s.MAX_Y = 0.8707 * 0.52 * Math.PI; + return; + } + + NaturalEarth.prototype.project = function(lon, lat) { + var lplam, lpphi, phi2, phi4, s, x, y, _ref7; + + s = this; + _ref7 = s.ll(lon, lat), lon = _ref7[0], lat = _ref7[1]; + lplam = s.rad(s.clon(lon)); + lpphi = s.rad(lat * -1); + phi2 = lpphi * lpphi; + phi4 = phi2 * phi2; + x = lplam * (s.A0 + phi2 * (s.A1 + phi2 * (s.A2 + phi4 * phi2 * (s.A3 + phi2 * s.A4)))) * 180 + 500; + y = lpphi * (s.B0 + phi2 * (s.B1 + phi4 * (s.B2 + s.B3 * phi2 + s.B4 * phi4))) * 180 + 270; + return [x, y]; + }; + + return NaturalEarth; + + })(PseudoCylindrical); + + proj['naturalearth'] = NaturalEarth; + + Robinson = (function(_super) { + __extends(Robinson, _super); + + /* + Robinson Projection + */ + + + Robinson.title = "Robinson Projection"; + + function Robinson(opts) { + var s; + + Robinson.__super__.constructor.call(this, opts); + s = this; + s.X = [1, -5.67239e-12, -7.15511e-05, 3.11028e-06, 0.9986, -0.000482241, -2.4897e-05, -1.33094e-06, 0.9954, -0.000831031, -4.4861e-05, -9.86588e-07, 0.99, -0.00135363, -5.96598e-05, 3.67749e-06, 0.9822, -0.00167442, -4.4975e-06, -5.72394e-06, 0.973, -0.00214869, -9.03565e-05, 1.88767e-08, 0.96, -0.00305084, -9.00732e-05, 1.64869e-06, 0.9427, -0.00382792, -6.53428e-05, -2.61493e-06, 0.9216, -0.00467747, -0.000104566, 4.8122e-06, 0.8962, -0.00536222, -3.23834e-05, -5.43445e-06, 0.8679, -0.00609364, -0.0001139, 3.32521e-06, 0.835, -0.00698325, -6.40219e-05, 9.34582e-07, 0.7986, -0.00755337, -5.00038e-05, 9.35532e-07, 0.7597, -0.00798325, -3.59716e-05, -2.27604e-06, 0.7186, -0.00851366, -7.0112e-05, -8.63072e-06, 0.6732, -0.00986209, -0.000199572, 1.91978e-05, 0.6213, -0.010418, 8.83948e-05, 6.24031e-06, 0.5722, -0.00906601, 0.000181999, 6.24033e-06, 0.5322, 0, 0, 0]; + s.Y = [0, 0.0124, 3.72529e-10, 1.15484e-09, 0.062, 0.0124001, 1.76951e-08, -5.92321e-09, 0.124, 0.0123998, -7.09668e-08, 2.25753e-08, 0.186, 0.0124008, 2.66917e-07, -8.44523e-08, 0.248, 0.0123971, -9.99682e-07, 3.15569e-07, 0.31, 0.0124108, 3.73349e-06, -1.1779e-06, 0.372, 0.0123598, -1.3935e-05, 4.39588e-06, 0.434, 0.0125501, 5.20034e-05, -1.00051e-05, 0.4968, 0.0123198, -9.80735e-05, 9.22397e-06, 0.5571, 0.0120308, 4.02857e-05, -5.2901e-06, 0.6176, 0.0120369, -3.90662e-05, 7.36117e-07, 0.6769, 0.0117015, -2.80246e-05, -8.54283e-07, 0.7346, 0.0113572, -4.08389e-05, -5.18524e-07, 0.7903, 0.0109099, -4.86169e-05, -1.0718e-06, 0.8435, 0.0103433, -6.46934e-05, 5.36384e-09, 0.8936, 0.00969679, -6.46129e-05, -8.54894e-06, 0.9394, 0.00840949, -0.000192847, -4.21023e-06, 0.9761, 0.00616525, -0.000256001, -4.21021e-06, 1, 0, 0, 0]; + s.NODES = 18; + s.FXC = 0.8487; + s.FYC = 1.3523; + s.C1 = 11.45915590261646417544; + s.RC1 = 0.08726646259971647884; + s.ONEEPS = 1.000001; + s.EPS = 1e-8; + return; + } + + Robinson.prototype._poly = function(arr, offs, z) { + return arr[offs] + z * (arr[offs + 1] + z * (arr[offs + 2] + z * arr[offs + 3])); + }; + + Robinson.prototype.project = function(lon, lat) { + var i, lplam, lpphi, phi, s, x, y, _ref7; + + s = this; + _ref7 = s.ll(lon, lat), lon = _ref7[0], lat = _ref7[1]; + lon = s.clon(lon); + lplam = s.rad(lon); + lpphi = s.rad(lat * -1); + phi = Math.abs(lpphi); + i = Math.floor(phi * s.C1); + if (i >= s.NODES) { + i = s.NODES - 1; + } + phi = s.deg(phi - s.RC1 * i); + i *= 4; + x = 1000 * s._poly(s.X, i, phi) * s.FXC * lplam; + y = 1000 * s._poly(s.Y, i, phi) * s.FYC; + if (lpphi < 0.0) { + y = -y; + } + return [x, y]; + }; + + return Robinson; + + })(PseudoCylindrical); + + proj['robinson'] = Robinson; + + EckertIV = (function(_super) { + __extends(EckertIV, _super); + + /* + Eckert IV Projection + */ + + + EckertIV.title = "Eckert IV Projection"; + + function EckertIV(opts) { + var me; + + EckertIV.__super__.constructor.call(this, opts); + me = this; + me.C_x = .42223820031577120149; + me.C_y = 1.32650042817700232218; + me.RC_y = .75386330736002178205; + me.C_p = 3.57079632679489661922; + me.RC_p = .28004957675577868795; + me.EPS = 1e-7; + me.NITER = 6; + } + + EckertIV.prototype.project = function(lon, lat) { + var V, c, i, lplam, lpphi, me, p, s, x, y, _ref7; + + me = this; + _ref7 = me.ll(lon, lat), lon = _ref7[0], lat = _ref7[1]; + lplam = me.rad(me.clon(lon)); + lpphi = me.rad(lat * -1); + p = me.C_p * Math.sin(lpphi); + V = lpphi * lpphi; + lpphi *= 0.895168 + V * (0.0218849 + V * 0.00826809); + i = me.NITER; + while (i > 0) { + c = Math.cos(lpphi); + s = Math.sin(lpphi); + V = (lpphi + s * (c + 2) - p) / (1 + c * (c + 2) - s * s); + lpphi -= V; + if (Math.abs(V) < me.EPS) { + break; + } + i -= 1; + } + if (i === 0) { + x = me.C_x * lplam; + y = lpphi < 0 ? -me.C_y : me.C_y; + } else { + x = me.C_x * lplam * (1 + Math.cos(lpphi)); + y = me.C_y * Math.sin(lpphi); + } + return [x, y]; + }; + + return EckertIV; + + })(PseudoCylindrical); + + proj['eckert4'] = EckertIV; + + Sinusoidal = (function(_super) { + __extends(Sinusoidal, _super); + + /* + Sinusoidal Projection + */ + + + function Sinusoidal() { + _ref7 = Sinusoidal.__super__.constructor.apply(this, arguments); + return _ref7; + } + + Sinusoidal.title = "Sinusoidal Projection"; + + Sinusoidal.prototype.project = function(lon, lat) { + var lam, me, phi, x, y, _ref8; + + me = this; + _ref8 = me.ll(lon, lat), lon = _ref8[0], lat = _ref8[1]; + lam = me.rad(me.clon(lon)); + phi = me.rad(lat * -1); + x = 1032 * lam * Math.cos(phi); + y = 1032 * phi; + return [x, y]; + }; + + return Sinusoidal; + + })(PseudoCylindrical); + + proj['sinusoidal'] = Sinusoidal; + + Mollweide = (function(_super) { + __extends(Mollweide, _super); + + /* + Mollweide Projection + */ + + + Mollweide.title = "Mollweide Projection"; + + function Mollweide(opts, p, cx, cy, cp) { + var me, p2, r, sp; + + if (p == null) { + p = 1.5707963267948966; + } + if (cx == null) { + cx = null; + } + if (cy == null) { + cy = null; + } + if (cp == null) { + cp = null; + } + Mollweide.__super__.constructor.call(this, opts); + me = this; + me.MAX_ITER = 10; + me.TOLERANCE = 1e-7; + if (p != null) { + p2 = p + p; + sp = Math.sin(p); + r = Math.sqrt(Math.PI * 2.0 * sp / (p2 + Math.sin(p2))); + me.cx = 2 * r / Math.PI; + me.cy = r / sp; + me.cp = p2 + Math.sin(p2); + } else if ((cx != null) && (cy != null) && (typeof cz !== "undefined" && cz !== null)) { + me.cx = cx; + me.cy = cy; + me.cp = cp; + } else { + warn('kartograph.proj.Mollweide: either p or cx,cy,cp must be defined'); + } + } + + Mollweide.prototype.project = function(lon, lat) { + var abs, i, k, lam, math, me, phi, v, x, y, _ref8; + + me = this; + _ref8 = me.ll(lon, lat), lon = _ref8[0], lat = _ref8[1]; + math = Math; + abs = math.abs; + lam = me.rad(me.clon(lon)); + phi = me.rad(lat); + k = me.cp * math.sin(phi); + i = me.MAX_ITER; + while (i !== 0) { + v = (phi + math.sin(phi) - k) / (1 + math.cos(phi)); + phi -= v; + if (abs(v) < me.TOLERANCE) { + break; + } + i -= 1; + } + if (i === 0) { + phi = phi >= 0 ? me.HALFPI : -me.HALFPI; + } else { + phi *= 0.5; + } + x = 1000 * me.cx * lam * math.cos(phi); + y = 1000 * me.cy * math.sin(phi); + return [x, y * -1]; + }; + + return Mollweide; + + })(PseudoCylindrical); + + proj['mollweide'] = Mollweide; + + WagnerIV = (function(_super) { + __extends(WagnerIV, _super); + + /* + Wagner IV Projection + */ + + + WagnerIV.title = "Wagner IV Projection"; + + function WagnerIV(opts) { + WagnerIV.__super__.constructor.call(this, opts, 1.0471975511965976); + } + + return WagnerIV; + + })(Mollweide); + + proj['wagner4'] = WagnerIV; + + WagnerV = (function(_super) { + __extends(WagnerV, _super); + + /* + Wagner V Projection + */ + + + WagnerV.title = "Wagner V Projection"; + + function WagnerV(opts) { + WagnerV.__super__.constructor.call(this, opts, null, 0.90977, 1.65014, 3.00896); + } + + return WagnerV; + + })(Mollweide); + + proj['wagner5'] = WagnerV; + + Loximuthal = (function(_super) { + var maxLat, minLat; + + __extends(Loximuthal, _super); + + function Loximuthal() { + _ref8 = Loximuthal.__super__.constructor.apply(this, arguments); + return _ref8; + } + + minLat = -89; + + maxLat = 89; + + Loximuthal.parameters = ['lon0', 'lat0', 'flip']; + + Loximuthal.title = "Loximuthal Projection (equidistant)"; + + Loximuthal.prototype.project = function(lon, lat) { + var lam, math, me, phi, x, y, _ref9; + + me = this; + _ref9 = me.ll(lon, lat), lon = _ref9[0], lat = _ref9[1]; + math = Math; + lam = me.rad(me.clon(lon)); + phi = me.rad(lat); + if (phi === me.phi0) { + x = lam * math.cos(me.phi0); + } else { + x = lam * (phi - me.phi0) / (math.log(math.tan(me.QUARTERPI + phi * 0.5)) - math.log(math.tan(me.QUARTERPI + me.phi0 * 0.5))); + } + x *= 1000; + y = 1000 * (phi - me.phi0); + return [x, y * -1]; + }; + + return Loximuthal; + + })(PseudoCylindrical); + + proj['loximuthal'] = Loximuthal; + + CantersModifiedSinusoidalI = (function(_super) { + var C1, C3, C3x3, C5, C5x5; + + __extends(CantersModifiedSinusoidalI, _super); + + /* + Canters, F. (2002) Small-scale Map projection Design. p. 218-219. + Modified Sinusoidal, equal-area. + + implementation borrowed from + http://cartography.oregonstate.edu/temp/AdaptiveProjection/src/projections/Canters1.js + */ + + + function CantersModifiedSinusoidalI() { + _ref9 = CantersModifiedSinusoidalI.__super__.constructor.apply(this, arguments); + return _ref9; + } + + CantersModifiedSinusoidalI.title = "Canters Modified Sinusoidal I"; + + CantersModifiedSinusoidalI.parameters = ['lon0']; + + C1 = 1.1966; + + C3 = -0.1290; + + C3x3 = 3 * C3; + + C5 = -0.0076; + + C5x5 = 5 * C5; + + CantersModifiedSinusoidalI.prototype.project = function(lon, lat) { + var me, x, y, y2, y4, _ref10; + + me = this; + _ref10 = me.ll(lon, lat), lon = _ref10[0], lat = _ref10[1]; + lon = me.rad(me.clon(lon)); + lat = me.rad(lat); + y2 = lat * lat; + y4 = y2 * y2; + x = 1000 * lon * Math.cos(lat) / (C1 + C3x3 * y2 + C5x5 * y4); + y = 1000 * lat * (C1 + C3 * y2 + C5 * y4); + return [x, y * -1]; + }; + + return CantersModifiedSinusoidalI; + + })(PseudoCylindrical); + + proj['canters1'] = CantersModifiedSinusoidalI; + + Hatano = (function(_super) { + var CN, CS, EPS, FXC, FYCN, FYCS, NITER, ONETOL, RCN, RCS, RXC, RYCN, RYCS; + + __extends(Hatano, _super); + + Hatano.title = "Hatano Projection"; + + NITER = 20; + + EPS = 1e-7; + + ONETOL = 1.000001; + + CN = 2.67595; + + CS = 2.43763; + + RCN = 0.37369906014686373063; + + RCS = 0.41023453108141924738; + + FYCN = 1.75859; + + FYCS = 1.93052; + + RYCN = 0.56863737426006061674; + + RYCS = 0.51799515156538134803; + + FXC = 0.85; + + RXC = 1.17647058823529411764; + + function Hatano(opts) { + Hatano.__super__.constructor.call(this, opts); + } + + Hatano.prototype.project = function(lon, lat) { + var c, i, lam, me, phi, th1, x, y, _i, _ref10; + + me = this; + _ref10 = me.ll(lon, lat), lon = _ref10[0], lat = _ref10[1]; + lam = me.rad(me.clon(lon)); + phi = me.rad(lat); + c = Math.sin(phi) * (phi < 0.0 ? CS : CN); + for (i = _i = NITER; _i >= 1; i = _i += -1) { + th1 = (phi + Math.sin(phi) - c) / (1.0 + Math.cos(phi)); + phi -= th1; + if (Math.abs(th1) < EPS) { + break; + } + } + x = 1000 * FXC * lam * Math.cos(phi *= 0.5); + y = 1000 * Math.sin(phi) * (phi < 0.0 ? FYCS : FYCN); + return [x, y * -1]; + }; + + return Hatano; + + })(PseudoCylindrical); + + proj['hatano'] = Hatano; + + GoodeHomolosine = (function(_super) { + __extends(GoodeHomolosine, _super); + + GoodeHomolosine.title = "Goode Homolosine Projection"; + + GoodeHomolosine.parameters = ['lon0']; + + function GoodeHomolosine(opts) { + var me; + + GoodeHomolosine.__super__.constructor.call(this, opts); + me = this; + me.lat1 = 41.737; + me.p1 = new Mollweide(); + me.p0 = new Sinusoidal(); + } + + GoodeHomolosine.prototype.project = function(lon, lat) { + var me, _ref10; + + me = this; + _ref10 = me.ll(lon, lat), lon = _ref10[0], lat = _ref10[1]; + lon = me.clon(lon); + if (Math.abs(lat) > me.lat1) { + return me.p1.project(lon, lat); + } else { + return me.p0.project(lon, lat); + } + }; + + return GoodeHomolosine; + + })(PseudoCylindrical); + + proj['goodehomolosine'] = GoodeHomolosine; + + Nicolosi = (function(_super) { + var EPS; + + __extends(Nicolosi, _super); + + Nicolosi.title = "Nicolosi Globular Projection"; + + Nicolosi.parameters = ['lon0']; + + EPS = 1e-10; + + function Nicolosi(opts) { + Nicolosi.__super__.constructor.call(this, opts); + this.r = this.HALFPI * 100; + } + + Nicolosi.prototype._visible = function(lon, lat) { + var me; + + me = this; + lon = me.clon(lon); + return lon > -90 && lon < 90; + }; + + Nicolosi.prototype.project = function(lon, lat) { + var c, d, lam, m, me, n, phi, r2, sp, tb, x, y, _ref10; + + me = this; + _ref10 = me.ll(lon, lat), lon = _ref10[0], lat = _ref10[1]; + lam = me.rad(me.clon(lon)); + phi = me.rad(lat); + if (Math.abs(lam) < EPS) { + x = 0; + y = phi; + } else if (Math.abs(phi) < EPS) { + x = lam; + y = 0; + } else if (Math.abs(Math.abs(lam) - me.HALFPI) < EPS) { + x = lam * Math.cos(phi); + y = me.HALFPI * Math.sin(phi); + } else if (Math.abs(Math.abs(phi) - me.HALFPI) < EPS) { + x = 0; + y = phi; + } else { + tb = me.HALFPI / lam - lam / me.HALFPI; + c = phi / me.HALFPI; + sp = Math.sin(phi); + d = (1 - c * c) / (sp - c); + r2 = tb / d; + r2 *= r2; + m = (tb * sp / d - 0.5 * tb) / (1.0 + r2); + n = (sp / r2 + 0.5 * d) / (1.0 + 1.0 / r2); + x = Math.cos(phi); + x = Math.sqrt(m * m + x * x / (1.0 + r2)); + x = me.HALFPI * (m + (lam < 0 ? -x : x)); + y = Math.sqrt(n * n - (sp * sp / r2 + d * sp - 1.0) / (1.0 + 1.0 / r2)); + y = me.HALFPI * (n + (phi < 0 ? y : -y)); + } + return [x * 100, y * -100]; + }; + + Nicolosi.prototype.sea = function() { + var math, out, phi, r, _i; + + out = []; + r = this.r; + math = Math; + for (phi = _i = 0; _i <= 360; phi = ++_i) { + out.push([math.cos(this.rad(phi)) * r, math.sin(this.rad(phi)) * r]); + } + return out; + }; + + Nicolosi.prototype.world_bbox = function() { + var r; + + r = this.r; + return new BBox(-r, -r, r * 2, r * 2); + }; + + return Nicolosi; + + })(PseudoCylindrical); + + proj['nicolosi'] = Nicolosi; + + Azimuthal = (function(_super) { + __extends(Azimuthal, _super); + + /* + Base class for azimuthal projections + */ + + + Azimuthal.parameters = ['lon0', 'lat0']; + + Azimuthal.title = "Azimuthal Projection"; + + function Azimuthal(opts, rad) { + var me; + + if (rad == null) { + rad = 1000; + } + Azimuthal.__super__.constructor.call(this, opts); + me = this; + me.r = rad; + me.elevation0 = me.to_elevation(me.lat0); + me.azimuth0 = me.to_azimuth(me.lon0); + } + + Azimuthal.prototype.to_elevation = function(lat) { + var me; + + me = this; + return ((lat + 90) / 180) * me.PI - me.HALFPI; + }; + + Azimuthal.prototype.to_azimuth = function(lon) { + var me; + + me = this; + return ((lon + 180) / 360) * me.PI * 2 - me.PI; + }; + + Azimuthal.prototype._visible = function(lon, lat) { + var azimuth, cosc, elevation, math, me; + + me = this; + math = Math; + elevation = me.to_elevation(lat); + azimuth = me.to_azimuth(lon); + cosc = math.sin(elevation) * math.sin(me.elevation0) + math.cos(me.elevation0) * math.cos(elevation) * math.cos(azimuth - me.azimuth0); + return cosc >= 0.0; + }; + + Azimuthal.prototype._truncate = function(x, y) { + var math, r, theta, x1, y1; + + math = Math; + r = this.r; + theta = math.atan2(y - r, x - r); + x1 = r + r * math.cos(theta); + y1 = r + r * math.sin(theta); + return [x1, y1]; + }; + + Azimuthal.prototype.sea = function() { + var math, out, phi, r, _i; + + out = []; + r = this.r; + math = Math; + for (phi = _i = 0; _i <= 360; phi = ++_i) { + out.push([r + math.cos(this.rad(phi)) * r, r + math.sin(this.rad(phi)) * r]); + } + return out; + }; + + Azimuthal.prototype.world_bbox = function() { + var r; + + r = this.r; + return new BBox(0, 0, r * 2, r * 2); + }; + + return Azimuthal; + + })(Proj); + + Orthographic = (function(_super) { + __extends(Orthographic, _super); + + /* + Orthographic Azimuthal Projection + + implementation taken from http://www.mccarroll.net/snippets/svgworld/ + */ + + + function Orthographic() { + _ref10 = Orthographic.__super__.constructor.apply(this, arguments); + return _ref10; + } + + Orthographic.title = "Orthographic Projection"; + + Orthographic.prototype.project = function(lon, lat) { + var azimuth, elevation, math, me, x, xo, y, yo; + + me = this; + math = Math; + elevation = me.to_elevation(lat); + azimuth = me.to_azimuth(lon); + xo = me.r * math.cos(elevation) * math.sin(azimuth - me.azimuth0); + yo = -me.r * (math.cos(me.elevation0) * math.sin(elevation) - math.sin(me.elevation0) * math.cos(elevation) * math.cos(azimuth - me.azimuth0)); + x = me.r + xo; + y = me.r + yo; + return [x, y]; + }; + + return Orthographic; + + })(Azimuthal); + + proj['ortho'] = Orthographic; + + LAEA = (function(_super) { + __extends(LAEA, _super); + + /* + Lambert Azimuthal Equal-Area Projection + + implementation taken from + Snyder, Map projections - A working manual + */ + + + LAEA.title = "Lambert Azimuthal Equal-Area Projection"; + + function LAEA(opts) { + LAEA.__super__.constructor.call(this, opts); + this.scale = Math.sqrt(2) * 0.5; + } + + LAEA.prototype.project = function(lon, lat) { + var cos, k, lam, math, phi, sin, x, xo, y, yo; + + phi = this.rad(lat); + lam = this.rad(lon); + math = Math; + sin = math.sin; + cos = math.cos; + if (false && math.abs(lon - this.lon0) === 180) { + xo = this.r * 2; + yo = 0; + } else { + k = math.pow(2 / (1 + sin(this.phi0) * sin(phi) + cos(this.phi0) * cos(phi) * cos(lam - this.lam0)), .5); + k *= this.scale; + xo = this.r * k * cos(phi) * sin(lam - this.lam0); + yo = -this.r * k * (cos(this.phi0) * sin(phi) - sin(this.phi0) * cos(phi) * cos(lam - this.lam0)); + } + x = this.r + xo; + y = this.r + yo; + return [x, y]; + }; + + return LAEA; + + })(Azimuthal); + + proj['laea'] = LAEA; + + LAEA_Alaska = (function(_super) { + __extends(LAEA_Alaska, _super); + + function LAEA_Alaska() { + var opts; + + opts = { + lon0: -150, + lat0: 90 + }; + LAEA_Alaska.__super__.constructor.call(this, opts); + this.scale = Math.sqrt(2) * 0.5 * 0.33; + } + + return LAEA_Alaska; + + })(LAEA); + + LAEA_Hawaii = (function(_super) { + __extends(LAEA_Hawaii, _super); + + function LAEA_Hawaii(opts) { + opts = { + lon0: -157, + lat0: 20 + }; + LAEA_Hawaii.__super__.constructor.call(this, opts); + } + + return LAEA_Hawaii; + + })(LAEA); + + LAEA_USA = (function(_super) { + __extends(LAEA_USA, _super); + + function LAEA_USA(opts) { + opts.lon0 = -100; + opts.lat0 = 45; + LAEA_USA.__super__.constructor.call(this, opts); + this.laea_alaska = new LAEA_Alaska(); + this.laea_hawaii = new LAEA_Hawaii(); + } + + LAEA_USA.prototype.project = function(lon, lat) { + var alaska, hawaii, x, y, _ref11, _ref12, _ref13; + + alaska = lat > 44 && (lon < -127 || lon > 170); + hawaii = lon < -127 && lat < 44; + if (alaska) { + if (lon > 170) { + lon -= 380; + } + _ref11 = this.laea_alaska.project(lon, lat), x = _ref11[0], y = _ref11[1]; + } else if (hawaii) { + _ref12 = this.laea_hawaii.project(lon, lat), x = _ref12[0], y = _ref12[1]; + } else { + _ref13 = LAEA_USA.__super__.project.call(this, lon, lat), x = _ref13[0], y = _ref13[1]; + } + if (alaska) { + x += -180; + y += 100; + } + if (hawaii) { + y += 220; + x += -80; + } + return [x, y]; + }; + + return LAEA_USA; + + })(LAEA); + + proj['laea-usa'] = LAEA_USA; + + Stereographic = (function(_super) { + __extends(Stereographic, _super); + + /* + Stereographic projection + + implementation taken from + Snyder, Map projections - A working manual + */ + + + function Stereographic() { + _ref11 = Stereographic.__super__.constructor.apply(this, arguments); + return _ref11; + } + + Stereographic.title = "Stereographic Projection"; + + Stereographic.prototype.project = function(lon, lat) { + var cos, k, k0, lam, math, phi, sin, x, xo, y, yo; + + phi = this.rad(lat); + lam = this.rad(lon); + math = Math; + sin = math.sin; + cos = math.cos; + k0 = 0.5; + k = 2 * k0 / (1 + sin(this.phi0) * sin(phi) + cos(this.phi0) * cos(phi) * cos(lam - this.lam0)); + xo = this.r * k * cos(phi) * sin(lam - this.lam0); + yo = -this.r * k * (cos(this.phi0) * sin(phi) - sin(this.phi0) * cos(phi) * cos(lam - this.lam0)); + x = this.r + xo; + y = this.r + yo; + return [x, y]; + }; + + return Stereographic; + + })(Azimuthal); + + proj['stereo'] = Stereographic; + + Satellite = (function(_super) { + __extends(Satellite, _super); + + /* + General perspective projection, aka Satellite projection + + implementation taken from + Snyder, Map projections - A working manual + + up .. angle the camera is turned away from north (clockwise) + tilt .. angle the camera is tilted + */ + + + Satellite.parameters = ['lon0', 'lat0', 'tilt', 'dist', 'up']; + + Satellite.title = "Satellite Projection"; + + function Satellite(opts) { + var lat, lon, xmax, xmin, xy, _i, _j, _ref12, _ref13, _ref14; + + Satellite.__super__.constructor.call(this, { + lon0: 0, + lat0: 0 + }); + this.dist = (_ref12 = opts.dist) != null ? _ref12 : 3; + this.up = this.rad((_ref13 = opts.up) != null ? _ref13 : 0); + this.tilt = this.rad((_ref14 = opts.tilt) != null ? _ref14 : 0); + this.scale = 1; + xmin = Number.MAX_VALUE; + xmax = Number.MAX_VALUE * -1; + for (lat = _i = 0; _i <= 179; lat = ++_i) { + for (lon = _j = 0; _j <= 360; lon = ++_j) { + xy = this.project(lon - 180, lat - 90); + xmin = Math.min(xy[0], xmin); + xmax = Math.max(xy[0], xmax); + } + } + this.scale = (this.r * 2) / (xmax - xmin); + Satellite.__super__.constructor.call(this, opts); + return; + } + + Satellite.prototype.project = function(lon, lat, alt) { + var A, H, cos, cos_c, cos_tilt, cos_up, k, lam, math, phi, r, ra, sin, sin_tilt, sin_up, x, xo, xt, y, yo, yt; + + if (alt == null) { + alt = 0; + } + phi = this.rad(lat); + lam = this.rad(lon); + math = Math; + sin = math.sin; + cos = math.cos; + r = this.r; + ra = r * (alt + 6371) / 3671; + cos_c = sin(this.phi0) * sin(phi) + cos(this.phi0) * cos(phi) * cos(lam - this.lam0); + k = (this.dist - 1) / (this.dist - cos_c); + k = (this.dist - 1) / (this.dist - cos_c); + k *= this.scale; + xo = ra * k * cos(phi) * sin(lam - this.lam0); + yo = -ra * k * (cos(this.phi0) * sin(phi) - sin(this.phi0) * cos(phi) * cos(lam - this.lam0)); + cos_up = cos(this.up); + sin_up = sin(this.up); + cos_tilt = cos(this.tilt); + sin_tilt = sin(this.tilt); + H = ra * (this.dist - 1); + A = ((yo * cos_up + xo * sin_up) * sin(this.tilt) / H) + cos_tilt; + xt = (xo * cos_up - yo * sin_up) * cos(this.tilt) / A; + yt = (yo * cos_up + xo * sin_up) / A; + x = r + xt; + y = r + yt; + return [x, y]; + }; + + Satellite.prototype._visible = function(lon, lat) { + var azimuth, cosc, elevation, math; + + elevation = this.to_elevation(lat); + azimuth = this.to_azimuth(lon); + math = Math; + cosc = math.sin(elevation) * math.sin(this.elevation0) + math.cos(this.elevation0) * math.cos(elevation) * math.cos(azimuth - this.azimuth0); + return cosc >= (1.0 / this.dist); + }; + + Satellite.prototype.sea = function() { + var math, out, phi, r, _i; + + out = []; + r = this.r; + math = Math; + for (phi = _i = 0; _i <= 360; phi = ++_i) { + out.push([r + math.cos(this.rad(phi)) * r, r + math.sin(this.rad(phi)) * r]); + } + return out; + }; + + return Satellite; + + })(Azimuthal); + + proj['satellite'] = Satellite; + + EquidistantAzimuthal = (function(_super) { + __extends(EquidistantAzimuthal, _super); + + /* + Equidistant projection + + implementation taken from + Snyder, Map projections - A working manual + */ + + + function EquidistantAzimuthal() { + _ref12 = EquidistantAzimuthal.__super__.constructor.apply(this, arguments); + return _ref12; + } + + EquidistantAzimuthal.title = "Equidistant Azimuthal Projection"; + + EquidistantAzimuthal.prototype.project = function(lon, lat) { + var c, cos, cos_c, k, lam, math, me, phi, sin, x, xo, y, yo; + + me = this; + phi = me.rad(lat); + lam = me.rad(lon); + math = Math; + sin = math.sin; + cos = math.cos; + cos_c = sin(this.phi0) * sin(phi) + cos(this.phi0) * cos(phi) * cos(lam - this.lam0); + c = math.acos(cos_c); + k = 0.325 * c / sin(c); + xo = this.r * k * cos(phi) * sin(lam - this.lam0); + yo = -this.r * k * (cos(this.phi0) * sin(phi) - sin(this.phi0) * cos(phi) * cos(lam - this.lam0)); + x = this.r + xo; + y = this.r + yo; + return [x, y]; + }; + + EquidistantAzimuthal.prototype._visible = function(lon, lat) { + return true; + }; + + return EquidistantAzimuthal; + + })(Azimuthal); + + proj['equi'] = EquidistantAzimuthal; + + Aitoff = (function(_super) { + var COSPHI1; + + __extends(Aitoff, _super); + + /* + Aitoff projection + + implementation taken from + Snyder, Map projections - A working manual + */ + + + Aitoff.title = "Aitoff Projection"; + + Aitoff.parameters = ['lon0']; + + COSPHI1 = 0.636619772367581343; + + function Aitoff(opts) { + var me; + + me = this; + opts.lat0 = 0; + Aitoff.__super__.constructor.call(this, opts); + me.lam0 = 0; + } + + Aitoff.prototype.project = function(lon, lat) { + var c, d, lam, me, phi, x, y, _ref13; + + me = this; + _ref13 = me.ll(lon, lat), lon = _ref13[0], lat = _ref13[1]; + lon = me.clon(lon); + lam = me.rad(lon); + phi = me.rad(lat); + c = 0.5 * lam; + d = Math.acos(Math.cos(phi) * Math.cos(c)); + if (d !== 0) { + y = 1.0 / Math.sin(d); + x = 2.0 * d * Math.cos(phi) * Math.sin(c) * y; + y *= d * Math.sin(phi); + } else { + x = y = 0; + } + if (me.winkel) { + x = (x + lam * COSPHI1) * 0.5; + y = (y + phi) * 0.5; + } + return [x * 1000, y * -1000]; + }; + + Aitoff.prototype._visible = function(lon, lat) { + return true; + }; + + return Aitoff; + + })(PseudoCylindrical); + + proj['aitoff'] = Aitoff; + + Winkel3 = (function(_super) { + __extends(Winkel3, _super); + + Winkel3.title = "Winkel Tripel Projection"; + + function Winkel3(opts) { + Winkel3.__super__.constructor.call(this, opts); + this.winkel = true; + } + + return Winkel3; + + })(Aitoff); + + proj['winkel3'] = Winkel3; + + Conic = (function(_super) { + __extends(Conic, _super); + + Conic.title = "Conic Projection"; + + Conic.parameters = ['lon0', 'lat0', 'lat1', 'lat2']; + + function Conic(opts) { + var self, _ref13, _ref14; + + self = this; + Conic.__super__.constructor.call(this, opts); + self.lat1 = (_ref13 = opts.lat1) != null ? _ref13 : 30; + self.phi1 = self.rad(self.lat1); + self.lat2 = (_ref14 = opts.lat2) != null ? _ref14 : 50; + self.phi2 = self.rad(self.lat2); + } + + Conic.prototype._visible = function(lon, lat) { + var self; + + self = this; + return lat > self.minLat && lat < self.maxLat; + }; + + Conic.prototype._truncate = function(x, y) { + return [x, y]; + }; + + Conic.prototype.clon = function(lon) { + lon -= this.lon0; + if (lon < -180) { + lon += 360; + } else if (lon > 180) { + lon -= 360; + } + return lon; + }; + + return Conic; + + })(Proj); + + LCC = (function(_super) { + __extends(LCC, _super); + + /* + Lambert Conformal Conic Projection (spherical) + */ + + + LCC.title = "Lambert Conformal Conic Projection"; + + function LCC(opts) { + var abs, c, cos, cosphi, m, n, pow, secant, self, sin, sinphi, tan, _ref13; + + self = this; + LCC.__super__.constructor.call(this, opts); + m = Math; + _ref13 = [m.sin, m.cos, m.abs, m.log, m.tan, m.pow], sin = _ref13[0], cos = _ref13[1], abs = _ref13[2], log = _ref13[3], tan = _ref13[4], pow = _ref13[5]; + self.n = n = sinphi = sin(self.phi1); + cosphi = cos(self.phi1); + secant = abs(self.phi1 - self.phi2) >= 1e-10; + if (secant) { + n = log(cosphi / cos(self.phi2)) / log(tan(self.QUARTERPI + 0.5 * self.phi2) / tan(self.QUARTERPI + 0.5 * self.phi1)); + } + self.c = c = cosphi * pow(tan(self.QUARTERPI + .5 * self.phi1), n) / n; + if (abs(abs(self.phi0) - self.HALFPI) < 1e-10) { + self.rho0 = 0.0; + } else { + self.rho0 = c * pow(tan(self.QUARTERPI + .5 * self.phi0), -n); + } + self.minLat = -60; + self.maxLat = 85; + } + + LCC.prototype.project = function(lon, lat) { + var abs, cos, lam, lam_, m, n, phi, pow, rho, self, sin, tan, x, y, _ref13; + + self = this; + phi = self.rad(lat); + lam = self.rad(self.clon(lon)); + m = Math; + _ref13 = [m.sin, m.cos, m.abs, m.log, m.tan, m.pow], sin = _ref13[0], cos = _ref13[1], abs = _ref13[2], log = _ref13[3], tan = _ref13[4], pow = _ref13[5]; + n = self.n; + if (abs(abs(phi) - self.HALFPI) < 1e-10) { + rho = 0.0; + } else { + rho = self.c * pow(tan(self.QUARTERPI + 0.5 * phi), -n); + } + lam_ = lam * n; + x = 1000 * rho * sin(lam_); + y = 1000 * (self.rho0 - rho * cos(lam_)); + return [x, y * -1]; + }; + + return LCC; + + })(Conic); + + proj['lcc'] = LCC; + + PseudoConic = (function(_super) { + __extends(PseudoConic, _super); + + function PseudoConic() { + _ref13 = PseudoConic.__super__.constructor.apply(this, arguments); + return _ref13; + } + + return PseudoConic; + + })(Conic); + + /* + kartograph - a svg mapping library + Copyright (C) 2011 Gregor Aisch + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more detailme. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + + + View = (function() { + /* + 2D coordinate transfomation + */ + function View(bbox, width, height, padding, halign, valign) { + var me; + + me = this; + me.bbox = bbox; + me.width = width; + me.padding = padding != null ? padding : 0; + me.halign = halign != null ? halign : 'center'; + me.valign = valign != null ? valign : 'center'; + me.height = height; + me.scale = Math.min((width - padding * 2) / bbox.width, (height - padding * 2) / bbox.height); + } + + View.prototype.project = function(x, y) { + var bbox, h, me, s, w, xf, yf; + + if (y == null) { + y = x[1]; + x = x[0]; + } + me = this; + s = me.scale; + bbox = me.bbox; + h = me.height; + w = me.width; + xf = me.halign === "center" ? (w - bbox.width * s) * 0.5 : me.halign === "left" ? me.padding * s : w - (bbox.width - me.padding) * s; + yf = me.valign === "center" ? (h - bbox.height * s) * 0.5 : me.valign === "top" ? me.padding * s : 0; + x = (x - bbox.left) * s + xf; + y = (y - bbox.top) * s + yf; + return [x, y]; + }; + + View.prototype.projectPath = function(path) { + var bbox, cont, contours, me, new_path, pcont, r, x, y, _i, _j, _len, _len1, _ref14, _ref15, _ref16, _ref17; + + me = this; + if (path.type === "path") { + contours = []; + bbox = [99999, 99999, -99999, -99999]; + _ref14 = path.contours; + for (_i = 0, _len = _ref14.length; _i < _len; _i++) { + pcont = _ref14[_i]; + cont = []; + for (_j = 0, _len1 = pcont.length; _j < _len1; _j++) { + _ref15 = pcont[_j], x = _ref15[0], y = _ref15[1]; + _ref16 = me.project(x, y), x = _ref16[0], y = _ref16[1]; + cont.push([x, y]); + bbox[0] = Math.min(bbox[0], x); + bbox[1] = Math.min(bbox[1], y); + bbox[2] = Math.max(bbox[2], x); + bbox[3] = Math.max(bbox[3], y); + } + contours.push(cont); + } + new_path = new geom.Path(path.type, contours, path.closed); + new_path._bbox = bbox; + return new_path; + } else if (path.type === "circle") { + _ref17 = me.project(path.x, path.y), x = _ref17[0], y = _ref17[1]; + r = path.r * me.scale; + return new geom.Circle(x, y, r); + } + }; + + View.prototype.asBBox = function() { + var me; + + me = this; + return new BBox(0, 0, me.width, me.height); + }; + + return View; + + })(); + + View.fromXML = function(xml) { + /* + constructs a view from XML + */ + + var bbox, bbox_xml, h, pad, w; + + w = Number(xml.getAttribute('w')); + h = Number(xml.getAttribute('h')); + pad = Number(xml.getAttribute('padding')); + bbox_xml = xml.getElementsByTagName('bbox')[0]; + bbox = BBox.fromXML(bbox_xml); + return new View(bbox, w, h, pad); + }; + + root.kartograph.View = View; + + /* + kartograph - a svg mapping library + Copyright (C) 2011 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + Kartograph.prototype.dotgrid = function(opts) { + var anim, data, data_col, data_key, delay, dly, dotgrid, dotstyle, ds, dur, f, g, gridsize, id, layer, layer_id, me, path, pathData, paths, pd, row, size, sizes, x, y, _i, _j, _k, _l, _len, _len1, _len2, _len3, _m, _n, _ref14, _ref15, _ref16, _ref17, _ref18, _ref19, _ref20, _ref21, _ref22, _ref23, _ref24, _ref25, _ref26; + + me = this; + layer_id = (_ref14 = opts.layer) != null ? _ref14 : me.layerIds[me.layerIds.length - 1]; + if (!me.layers.hasOwnProperty(layer_id)) { + warn('dotgrid error: layer "' + layer_id + '" not found'); + return; + } + layer = me.layers[layer_id]; + data = opts.data; + data_col = opts.value; + data_key = opts.key; + pathData = {}; + if ((data_key != null) && __type(data) === "array") { + for (_i = 0, _len = data.length; _i < _len; _i++) { + row = data[_i]; + id = row[data_key]; + pathData[String(id)] = row; + } + } else { + for (id in data) { + row = data[id]; + pathData[String(id)] = row; + } + } + dotstyle = (_ref15 = opts.style) != null ? _ref15 : { + fill: 'black', + stroke: 'none' + }; + sizes = opts.size; + gridsize = (_ref16 = opts.gridsize) != null ? _ref16 : 15; + dotgrid = (_ref17 = layer.dotgrid) != null ? _ref17 : layer.dotgrid = { + gridsize: gridsize, + grid: [] + }; + if (dotgrid.gridsize !== gridsize) { + _ref18 = dotgrid.grid; + for (_j = 0, _len1 = _ref18.length; _j < _len1; _j++) { + g = _ref18[_j]; + if (g.shape != null) { + g.shape.remove(); + g.shape = null; + } + } + } + if (gridsize > 0) { + if (dotgrid.grid.length === 0) { + for (x = _k = 0, _ref19 = me.viewport.width; gridsize > 0 ? _k <= _ref19 : _k >= _ref19; x = _k += gridsize) { + for (y = _l = 0, _ref20 = me.viewport.height; gridsize > 0 ? _l <= _ref20 : _l >= _ref20; y = _l += gridsize) { + g = { + x: x + (Math.random() - 0.5) * gridsize * 0.2, + y: y + (Math.random() - 0.5) * gridsize * 0.2, + pathid: false + }; + f = false; + _ref21 = layer.pathsById; + for (id in _ref21) { + paths = _ref21[id]; + for (_m = 0, _len2 = paths.length; _m < _len2; _m++) { + path = paths[_m]; + if (path.vpath.isInside(g.x, g.y)) { + f = true; + pd = (_ref22 = pathData[id]) != null ? _ref22 : null; + size = sizes(pd); + g.pathid = id; + g.shape = layer.paper.circle(g.x, g.y, 1); + break; + } + } + if (f) { + break; + } + } + dotgrid.grid.push(g); + } + } + } + _ref23 = dotgrid.grid; + for (_n = 0, _len3 = _ref23.length; _n < _len3; _n++) { + g = _ref23[_n]; + if (g.pathid) { + pd = (_ref24 = pathData[g.pathid]) != null ? _ref24 : null; + size = sizes(pd); + dur = (_ref25 = opts.duration) != null ? _ref25 : 0; + delay = (_ref26 = opts.delay) != null ? _ref26 : 0; + if (__type(delay) === "function") { + dly = delay(pd); + } else { + dly = delay; + } + if (dur > 0 && Raphael.svg) { + anim = Raphael.animation({ + r: size * 0.5 + }, dur); + g.shape.animate(anim.delay(dly)); + } else { + g.shape.attr({ + r: size * 0.5 + }); + } + if (__type(dotstyle) === "function") { + ds = dotstyle(pd); + } else { + ds = dotstyle; + } + g.shape.attr(ds); + } + } + } + }; + + /* + kartograph - a svg mapping library + Copyright (C) 2011 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + filter = (_ref14 = kartograph.filter) != null ? _ref14 : kartograph.filter = {}; + + filter.__knownFilter = {}; + + filter.__patternFills = 0; + + MapLayer.prototype.SVG = function(el, attr) { + var key, val; + + if (typeof el === "string") { + el = window.document.createElementNS("http://www.w3.org/2000/svg", el); + } + if (attr) { + for (key in attr) { + val = attr[key]; + el.setAttribute(key, val); + } + } + return el; + }; + + Kartograph.prototype.addFilter = function(id, type, params) { + var doc, fltr, me; + + if (params == null) { + params = {}; + } + me = this; + doc = window.document; + if (kartograph.filter[type] != null) { + fltr = new filter[type](params).getFilter(id); + } else { + throw 'unknown filter type ' + type; + } + return me.paper.defs.appendChild(fltr); + }; + + MapLayer.prototype.applyFilter = function(filter_id) { + var me; + + me = this; + return $('.' + me.id, me.paper.canvas).attr({ + filter: 'url(#' + filter_id + ')' + }); + }; + + MapLayer.prototype.applyTexture = function(url, filt, defCol) { + var lp, me, _i, _len, _ref15, _results; + + if (filt == null) { + filt = false; + } + if (defCol == null) { + defCol = '#000'; + } + me = this; + filter.__patternFills += 1; + _ref15 = me.paths; + _results = []; + for (_i = 0, _len = _ref15.length; _i < _len; _i++) { + lp = _ref15[_i]; + if (!filt || filt(lp.data)) { + _results.push(lp.svgPath.attr({ + fill: 'url(' + url + ')' + })); + } else { + _results.push(lp.svgPath.attr('fill', defCol)); + } + } + return _results; + }; + + Filter = (function() { + /* base class for all svg filter + */ + function Filter(params) { + this.params = params != null ? params : {}; + } + + Filter.prototype.getFilter = function(id) { + var fltr, me; + + me = this; + fltr = me.SVG('filter', { + id: id + }); + me.buildFilter(fltr); + return fltr; + }; + + Filter.prototype._getFilter = function() { + throw "not implemented"; + }; + + Filter.prototype.SVG = function(el, attr) { + var key, val; + + if (typeof el === "string") { + el = window.document.createElementNS("http://www.w3.org/2000/svg", el); + } + if (attr) { + for (key in attr) { + val = attr[key]; + el.setAttribute(key, val); + } + } + return el; + }; + + return Filter; + + })(); + + BlurFilter = (function(_super) { + __extends(BlurFilter, _super); + + function BlurFilter() { + _ref15 = BlurFilter.__super__.constructor.apply(this, arguments); + return _ref15; + } + + /* simple gaussian blur filter + */ + + + BlurFilter.prototype.buildFilter = function(fltr) { + var SVG, blur, me; + + me = this; + SVG = me.SVG; + blur = SVG('feGaussianBlur', { + stdDeviation: me.params.size || 4, + result: 'blur' + }); + return fltr.appendChild(blur); + }; + + return BlurFilter; + + })(Filter); + + filter.blur = BlurFilter; + + hex2rgb = function(hex) { + var b, g, r, u; + + if (hex.trim().match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/)) { + if (hex.length === 4 || hex.length === 7) { + hex = hex.substr(1); + } + if (hex.length === 3) { + hex = hex.split(""); + hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; + } + u = parseInt(hex, 16); + r = u >> 16; + g = u >> 8 & 0xFF; + b = u & 0xFF; + return [r, g, b]; + } + throw 'unknown color format: "' + hex + '"'; + }; + + GlowFilter = (function(_super) { + __extends(GlowFilter, _super); + + function GlowFilter() { + _ref16 = GlowFilter.__super__.constructor.apply(this, arguments); + return _ref16; + } + + /* combined class for outer and inner glow filter + */ + + + GlowFilter.prototype.buildFilter = function(fltr) { + var alpha, blur, inner, knockout, me, rgb, strength, _ref17, _ref18, _ref19, _ref20, _ref21, _ref22; + + me = this; + blur = (_ref17 = me.params.blur) != null ? _ref17 : 4; + strength = (_ref18 = me.params.strength) != null ? _ref18 : 1; + rgb = (_ref19 = me.params.color) != null ? _ref19 : '#D1BEB0'; + if (__type(rgb) === 'string') { + rgb = hex2rgb(rgb); + } + inner = (_ref20 = me.params.inner) != null ? _ref20 : false; + knockout = (_ref21 = me.params.knockout) != null ? _ref21 : false; + alpha = (_ref22 = me.params.alpha) != null ? _ref22 : 1; + if (inner) { + me.innerGlow(fltr, blur, strength, rgb, alpha, knockout); + } else { + me.outerGlow(fltr, blur, strength, rgb, alpha, knockout); + } + }; + + GlowFilter.prototype.outerGlow = function(fltr, _blur, _strength, rgb, alpha, knockout) { + var SVG, blur, comp, mat, me, merge, morph; + + me = this; + SVG = me.SVG; + mat = SVG('feColorMatrix', { + "in": 'SourceGraphic', + type: 'matrix', + values: '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0', + result: 'mask' + }); + fltr.appendChild(mat); + if (_strength > 0) { + morph = SVG('feMorphology', { + "in": 'mask', + radius: _strength, + operator: 'dilate', + result: 'mask' + }); + fltr.appendChild(morph); + } + mat = SVG('feColorMatrix', { + "in": 'mask', + type: 'matrix', + values: '0 0 0 0 ' + (rgb[0] / 255) + ' 0 0 0 0 ' + (rgb[1] / 255) + ' 0 0 0 0 ' + (rgb[2] / 255) + ' 0 0 0 1 0', + result: 'r0' + }); + fltr.appendChild(mat); + blur = SVG('feGaussianBlur', { + "in": 'r0', + stdDeviation: _blur, + result: 'r1' + }); + fltr.appendChild(blur); + comp = SVG('feComposite', { + operator: 'out', + "in": 'r1', + in2: 'mask', + result: 'comp' + }); + fltr.appendChild(comp); + merge = SVG('feMerge'); + if (!knockout) { + merge.appendChild(SVG('feMergeNode', { + 'in': 'SourceGraphic' + })); + } + merge.appendChild(SVG('feMergeNode', { + 'in': 'r1' + })); + return fltr.appendChild(merge); + }; + + GlowFilter.prototype.innerGlow = function(fltr, _blur, _strength, rgb, alpha, knockout) { + var SVG, blur, comp, mat, me, merge, morph; + + me = this; + SVG = me.SVG; + log('innerglow'); + mat = SVG('feColorMatrix', { + "in": 'SourceGraphic', + type: 'matrix', + values: '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0', + result: 'mask' + }); + fltr.appendChild(mat); + morph = SVG('feMorphology', { + "in": 'mask', + radius: _strength, + operator: 'erode', + result: 'r1' + }); + fltr.appendChild(morph); + blur = SVG('feGaussianBlur', { + "in": 'r1', + stdDeviation: _blur, + result: 'r2' + }); + fltr.appendChild(blur); + mat = SVG('feColorMatrix', { + type: 'matrix', + "in": 'r2', + values: '1 0 0 0 ' + (rgb[0] / 255) + ' 0 1 0 0 ' + (rgb[1] / 255) + ' 0 0 1 0 ' + (rgb[2] / 255) + ' 0 0 0 -1 1', + result: 'r3' + }); + fltr.appendChild(mat); + comp = SVG('feComposite', { + operator: 'in', + "in": 'r3', + in2: 'mask', + result: 'comp' + }); + fltr.appendChild(comp); + merge = SVG('feMerge'); + if (!knockout) { + merge.appendChild(SVG('feMergeNode', { + 'in': 'SourceGraphic' + })); + } + merge.appendChild(SVG('feMergeNode', { + 'in': 'comp' + })); + return fltr.appendChild(merge); + }; + + return GlowFilter; + + })(Filter); + + filter.glow = GlowFilter; + + /* + kartograph - a svg mapping library + Copyright (C) 2011 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + Kartograph.prototype.addGeoPath = function(points, cmds, className) { + var me, path, path_str; + + if (cmds == null) { + cmds = []; + } + if (className == null) { + className = ''; + } + /* converts a set of + */ + + me = this; + path_str = me.getGeoPathStr(points, cmds); + path = me.paper.path(path_str); + if (className !== '') { + path.node.setAttribute('class', className); + } + return path; + }; + + Kartograph.prototype.getGeoPathStr = function(points, cmds) { + var cmd, i, me, path_str, pt, xy, _ref17; + + if (cmds == null) { + cmds = []; + } + /* converts a set of + */ + + me = this; + if (__type(cmds) === 'string') { + cmds = cmds.split(""); + } + if (cmds.length === 0) { + cmds.push('M'); + } + path_str = ''; + for (i in points) { + pt = points[i]; + cmd = (_ref17 = cmds[i]) != null ? _ref17 : 'L'; + xy = me.lonlat2xy(pt); + if (isNaN(xy[0]) || isNaN(xy[1])) { + continue; + } + path_str += cmd + xy[0] + ',' + xy[1]; + } + return path_str; + }; + + Kartograph.prototype.addGeoPolygon = function(points, className) { + /* converts a set of + */ + + var cmds, i, me; + + me = this; + cmds = ['M']; + for (i in points) { + cmds.push('L'); + } + cmds.push('Z'); + return me.addGeoPath(points, cmds, className); + }; + + /* + kartograph - a svg mapping library + Copyright (C) 2011 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + Scale = (function() { + /* scales map values to [0..1] + */ + function Scale(domain, prop, filter) { + var i, me, val, values, + _this = this; + + if (domain == null) { + domain = [0, 1]; + } + if (prop == null) { + prop = null; + } + if (filter == null) { + filter = null; + } + this.rangedScale = __bind(this.rangedScale, this); + this.scale = __bind(this.scale, this); + me = this; + values = []; + for (i in domain) { + if (__type(filter) === "function") { + if (filter(domain[i]) === false) { + continue; + } + } + if (prop != null) { + if (__type(prop) === "function") { + val = prop(domain[i]); + } else { + val = domain[i][prop]; + } + } else { + val = domain[i]; + } + if (!isNaN(val)) { + values.push(val); + } + } + values = values.sort(function(a, b) { + return a - b; + }); + me.values = values; + me._range = [0, 1]; + me.rangedScale.range = function(_r) { + me._range = _r; + return me.rangedScale; + }; + } + + Scale.prototype.scale = function(x) { + return x; + }; + + Scale.prototype.rangedScale = function(x) { + var me, r; + + me = this; + x = me.scale(x); + r = me._range; + return x * (r[1] - r[0]) + r[0]; + }; + + return Scale; + + })(); + + LinearScale = (function(_super) { + __extends(LinearScale, _super); + + function LinearScale() { + this.scale = __bind(this.scale, this); _ref17 = LinearScale.__super__.constructor.apply(this, arguments); + return _ref17; + } + + /* liniear scale + */ + + + LinearScale.prototype.scale = function(x) { + var me, vals; + + me = this; + vals = me.values; + return (x - vals[0]) / (vals[vals.length - 1] - vals[0]); + }; + + return LinearScale; + + })(Scale); + + LogScale = (function(_super) { + __extends(LogScale, _super); + + function LogScale() { + this.scale = __bind(this.scale, this); _ref18 = LogScale.__super__.constructor.apply(this, arguments); + return _ref18; + } + + /* logatithmic scale + */ + + + LogScale.prototype.scale = function(x) { + var me, vals; + + me = this; + vals = me.values; + log = Math.log; + return (log(x) - log(vals[0])) / (log(vals[vals.length - 1]) - log(vals[0])); + }; + + return LogScale; + + })(Scale); + + SqrtScale = (function(_super) { + __extends(SqrtScale, _super); + + function SqrtScale() { + this.scale = __bind(this.scale, this); _ref19 = SqrtScale.__super__.constructor.apply(this, arguments); + return _ref19; + } + + /* square root scale + */ + + + SqrtScale.prototype.scale = function(x) { + var me, vals; + + me = this; + vals = me.values; + return Math.sqrt((x - vals[0]) / (vals[vals.length - 1] - vals[0])); + }; + + return SqrtScale; + + })(Scale); + + QuantileScale = (function(_super) { + __extends(QuantileScale, _super); + + function QuantileScale() { + this.scale = __bind(this.scale, this); _ref20 = QuantileScale.__super__.constructor.apply(this, arguments); + return _ref20; + } + + /* quantiles scale + */ + + + QuantileScale.prototype.scale = function(x) { + var i, k, me, nv, v, vals; + + me = this; + vals = me.values; + k = vals.length - 1; + for (i in vals) { + v = vals[Number(i)]; + nv = vals[Number(i) + 1]; + if (x === v) { + return i / k; + } + if (i < k && x > v && x < nv) { + return i / k + (x - v) / (nv - v); + } + } + }; + + return QuantileScale; + + })(Scale); + + scale = root.kartograph.scale = {}; + + scale.identity = function(s) { + return new Scale(domain, prop, filter).rangedScale; + }; + + scale.linear = function(domain, prop, filter) { + return new LinearScale(domain, prop, filter).rangedScale; + }; + + scale.log = function(domain, prop, filter) { + return new LogScale(domain, prop, filter).rangedScale; + }; + + scale.sqrt = function(domain, prop, filter) { + return new SqrtScale(domain, prop, filter).rangedScale; + }; + + scale.quantile = function(domain, prop, filter) { + return new QuantileScale(domain, prop, filter).rangedScale; + }; + + /* + kartograph - a svg mapping library + Copyright (C) 2011,2012 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + Symbol = (function() { + /* base class for all symbols + */ + + var me; + + me = null; + + function Symbol(opts) { + me = this; + me.location = opts.location; + me.data = opts.data; + me.map = opts.map; + me.layers = opts.layers; + me.key = opts.key; + me.x = opts.x; + me.y = opts.y; + } + + Symbol.prototype.init = function() { + return me; + }; + + Symbol.prototype.overlaps = function(symbol) { + return false; + }; + + Symbol.prototype.update = function(opts) { + /* once the data has changed + */ + return me; + }; + + Symbol.prototype.nodes = function() { + return []; + }; + + Symbol.prototype.clear = function() { + return me; + }; + + return Symbol; + + })(); + + kartograph.Symbol = Symbol; + + /* + kartograph - a svg mapping library + Copyright (C) 2011,2012 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + SymbolGroup = (function() { + /* symbol groups + + Usage: + new $K.SymbolGroup(options); + map.addSymbols(options) + */ + + var me; + + me = null; + + function SymbolGroup(opts) { + this._initTooltips = __bind(this._initTooltips, this); + this._noverlap = __bind(this._noverlap, this); + this._kMeans = __bind(this._kMeans, this); + var SymbolType, d, i, id, l, layer, nid, optional, p, required, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref21, _ref22; + + me = this; + required = ['data', 'location', 'type', 'map']; + optional = ['filter', 'tooltip', 'click', 'delay', 'sortBy', 'clustering', 'aggregate', 'clusteringOpts', 'mouseenter', 'mouseleave']; + for (_i = 0, _len = required.length; _i < _len; _i++) { + p = required[_i]; + if (opts[p] != null) { + me[p] = opts[p]; + } else { + throw "SymbolGroup: missing argument '" + p + "'"; + } + } + for (_j = 0, _len1 = optional.length; _j < _len1; _j++) { + p = optional[_j]; + if (opts[p] != null) { + me[p] = opts[p]; + } + } + SymbolType = me.type; + if (SymbolType == null) { + warn('could not resolve symbol type', me.type); + return; + } + _ref21 = SymbolType.props; + for (_k = 0, _len2 = _ref21.length; _k < _len2; _k++) { + p = _ref21[_k]; + if (opts[p] != null) { + me[p] = opts[p]; + } + } + me.layers = { + mapcanvas: me.map.paper + }; + _ref22 = SymbolType.layers; + for (_l = 0, _len3 = _ref22.length; _l < _len3; _l++) { + l = _ref22[_l]; + nid = SymbolGroup._layerid++; + id = 'sl_' + nid; + if (l.type === 'svg') { + layer = me.map.createSVGLayer(id); + } else if (l.type === 'html') { + layer = me.map.createHTMLLayer(id); + } + me.layers[l.id] = layer; + } + me.symbols = []; + for (i in me.data) { + d = me.data[i]; + if (__type(me.filter) === "function") { + if (me.filter(d, i)) { + me.add(d, i); + } + } else { + me.add(d, i); + } + } + me.layout(); + me.render(); + me.map.addSymbolGroup(me); + } + + SymbolGroup.prototype.add = function(data, key) { + /* adds a new symbol to this group + */ + + var SymbolType, ll, p, sprops, symbol, _i, _len, _ref21; + + me = this; + SymbolType = me.type; + ll = me._evaluate(me.location, data, key); + if (__type(ll) === 'array') { + ll = new LonLat(ll[0], ll[1]); + } + sprops = { + layers: me.layers, + location: ll, + data: data, + key: key != null ? key : me.symbols.length, + map: me.map + }; + _ref21 = SymbolType.props; + for (_i = 0, _len = _ref21.length; _i < _len; _i++) { + p = _ref21[_i]; + if (me[p] != null) { + sprops[p] = me._evaluate(me[p], data, key); + } + } + symbol = new SymbolType(sprops); + me.symbols.push(symbol); + return symbol; + }; + + SymbolGroup.prototype.layout = function() { + var layer_id, ll, path, path_id, s, xy, _i, _len, _ref21, _ref22; + + _ref21 = me.symbols; + for (_i = 0, _len = _ref21.length; _i < _len; _i++) { + s = _ref21[_i]; + ll = s.location; + if (__type(ll) === 'string') { + _ref22 = ll.split('.'), layer_id = _ref22[0], path_id = _ref22[1]; + path = me.map.getLayerPath(layer_id, path_id); + if (path != null) { + xy = me.map.viewBC.project(path.path.centroid()); + } else { + warn('could not find layer path ' + layer_id + '.' + path_id); + continue; + } + } else { + xy = me.map.lonlat2xy(ll); + } + s.x = xy[0]; + s.y = xy[1]; + } + if (me.clustering === 'k-means') { + me._kMeans(); + } else if (me.clustering === 'noverlap') { + me._noverlap(); + } + return me; + }; + + SymbolGroup.prototype.render = function() { + var node, s, sortBy, sortDir, _i, _j, _len, _len1, _ref21, _ref22, _ref23; + + me = this; + if (me.sortBy) { + sortDir = 'asc'; + if (__type(me.sortBy) === "string") { + me.sortBy = me.sortBy.split(' ', 2); + sortBy = me.sortBy[0]; + sortDir = (_ref21 = me.sortBy[1]) != null ? _ref21 : 'asc'; + } + me.symbols = me.symbols.sort(function(a, b) { + var m, va, vb; + + if (__type(me.sortBy) === "function") { + va = me.sortBy(a.data, a); + vb = me.sortBy(b.data, b); + } else { + va = a[sortBy]; + vb = b[sortBy]; + } + if (va === vb) { + return 0; + } + m = sortDir === 'asc' ? 1 : -1; + if (va > vb) { + return 1 * m; + } else { + return -1 * m; + } + }); + } + _ref22 = me.symbols; + for (_i = 0, _len = _ref22.length; _i < _len; _i++) { + s = _ref22[_i]; + s.render(); + _ref23 = s.nodes(); + for (_j = 0, _len1 = _ref23.length; _j < _len1; _j++) { + node = _ref23[_j]; + node.symbol = s; + } + } + if (__type(me.tooltip) === "function") { + me._initTooltips(); + } + $.each(['click', 'mouseenter', 'mouseleave'], function(i, evt) { + var _k, _len2, _ref24, _results; + + if (__type(me[evt]) === "function") { + _ref24 = me.symbols; + _results = []; + for (_k = 0, _len2 = _ref24.length; _k < _len2; _k++) { + s = _ref24[_k]; + _results.push((function() { + var _l, _len3, _ref25, _results1, + _this = this; + + _ref25 = s.nodes(); + _results1 = []; + for (_l = 0, _len3 = _ref25.length; _l < _len3; _l++) { + node = _ref25[_l]; + _results1.push($(node)[evt](function(e) { + var tgt; + + tgt = e.target; + while (!tgt.symbol) { + tgt = $(tgt).parent().get(0); + } + e.stopPropagation(); + return me[evt](tgt.symbol.data, tgt.symbol, e); + })); + } + return _results1; + }).call(this)); + } + return _results; + } + }); + return me; + }; + + SymbolGroup.prototype.tooltips = function(cb) { + me = this; + me.tooltips = cb; + me._initTooltips(); + return me; + }; + + SymbolGroup.prototype.remove = function(filter) { + var error, id, kept, layer, s, _i, _len, _ref21, _ref22, _results; + + me = this; + kept = []; + _ref21 = me.symbols; + for (_i = 0, _len = _ref21.length; _i < _len; _i++) { + s = _ref21[_i]; + if ((filter != null) && !filter(s.data)) { + kept.push(s); + continue; + } + try { + s.clear(); + } catch (_error) { + error = _error; + warn('error: symbolgroup.remove'); + } + } + if (filter == null) { + _ref22 = me.layers; + _results = []; + for (id in _ref22) { + layer = _ref22[id]; + if (id !== "mapcanvas") { + _results.push(layer.remove()); + } else { + _results.push(void 0); + } + } + return _results; + } else { + return me.symbols = kept; + } + }; + + SymbolGroup.prototype._evaluate = function(prop, data, key) { + /* evaluates a property function or returns a static value + */ + + var val; + + if (__type(prop) === 'function') { + return val = prop(data, key); + } else { + return val = prop; + } + }; + + SymbolGroup.prototype._kMeans = function() { + /* + layouts symbols in this group, eventually adds new 'grouped' symbols + map.addSymbols({ + layout: "k-means", + aggregate: function(data) { + // compresses a list of data objects into a single one + // typically you want to calculate the mean position, sum value or something here + } + }) + */ + + var SymbolType, cluster, d, i, mean, means, out, p, s, size, sprops, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref21, _ref22, _ref23, _ref24; + + me = this; + if ((_ref21 = me.osymbols) == null) { + me.osymbols = me.symbols; + } + SymbolType = me.type; + if (me.clusteringOpts != null) { + size = me.clusteringOpts.size; + } + if (size == null) { + size = 64; + } + cluster = kmeans().iterations(16).size(size); + _ref22 = me.osymbols; + for (_i = 0, _len = _ref22.length; _i < _len; _i++) { + s = _ref22[_i]; + cluster.add({ + x: s.x, + y: s.y + }); + } + means = cluster.means(); + out = []; + for (_j = 0, _len1 = means.length; _j < _len1; _j++) { + mean = means[_j]; + if (mean.size === 0) { + continue; + } + d = []; + _ref23 = mean.indices; + for (_k = 0, _len2 = _ref23.length; _k < _len2; _k++) { + i = _ref23[_k]; + d.push(me.osymbols[i].data); + } + d = me.aggregate(d); + sprops = { + layers: me.layers, + location: false, + data: d, + map: me.map + }; + _ref24 = SymbolType.props; + for (_l = 0, _len3 = _ref24.length; _l < _len3; _l++) { + p = _ref24[_l]; + if (me[p] != null) { + sprops[p] = me._evaluate(me[p], d); + } + } + s = new SymbolType(sprops); + s.x = mean.x; + s.y = mean.y; + out.push(s); + } + return me.symbols = out; + }; + + SymbolGroup.prototype._noverlap = function() { + var SymbolType, b0, b1, d, dx, dy, i, intersects, iterations, l, l0, l1, maxRatio, out, p, q, r, r0, r1, rad0, rad1, s, s0, s1, sprops, symbols, t0, t1, tolerance, w, x, y, _i, _j, _k, _l, _len, _len1, _len2, _m, _n, _ref21, _ref22, _ref23, _ref24, _ref25, _ref26; + + me = this; + if ((_ref21 = me.osymbols) == null) { + me.osymbols = me.symbols; + } + iterations = 3; + SymbolType = me.type; + if (__indexOf.call(SymbolType.props, 'radius') < 0) { + warn('noverlap layout only available for symbols with property "radius"'); + return; + } + symbols = me.osymbols.slice(); + if (me.clusteringOpts != null) { + tolerance = me.clusteringOpts.tolerance; + maxRatio = me.clusteringOpts.maxRatio; + } + if (tolerance == null) { + tolerance = 0.05; + } + if (maxRatio == null) { + maxRatio = 0.8; + } + for (i = _i = 0, _ref22 = iterations - 1; 0 <= _ref22 ? _i <= _ref22 : _i >= _ref22; i = 0 <= _ref22 ? ++_i : --_i) { + symbols.sort(function(a, b) { + return b.radius - a.radius; + }); + l = symbols.length; + out = []; + for (p = _j = 0, _ref23 = l - 3; 0 <= _ref23 ? _j <= _ref23 : _j >= _ref23; p = 0 <= _ref23 ? ++_j : --_j) { + s0 = symbols[p]; + if (!s0) { + continue; + } + rad0 = s0.radius * (1 - tolerance); + l0 = s0.x - rad0; + r0 = s0.x + rad0; + t0 = s0.y - rad0; + b0 = s0.y + rad0; + intersects = []; + for (q = _k = _ref24 = p + 1, _ref25 = l - 2; _ref24 <= _ref25 ? _k <= _ref25 : _k >= _ref25; q = _ref24 <= _ref25 ? ++_k : --_k) { + s1 = symbols[q]; + if (!s1) { + continue; + } + rad1 = s1.radius; + l1 = s1.x - rad1; + r1 = s1.x + rad1; + t1 = s1.y - rad1; + b1 = s1.y + rad1; + if (rad1 / s0.radius < maxRatio) { + if (!(r0 < l1 || r1 < l0) && !(b0 < t1 || b1 < t0)) { + dx = s1.x - s0.x; + dy = s1.y - s0.y; + if (dx * dx + dy * dy < (rad0 + rad1) * (rad0 + rad1)) { + intersects.push(q); + } + } + } + } + if (intersects.length > 0) { + d = [s0.data]; + r = s0.radius * s0.radius; + for (_l = 0, _len = intersects.length; _l < _len; _l++) { + i = intersects[_l]; + d.push(symbols[i].data); + r += symbols[i].radius * symbols[i].radius; + } + d = me.aggregate(d); + sprops = { + layers: me.layers, + location: false, + data: d, + map: me.map + }; + _ref26 = SymbolType.props; + for (_m = 0, _len1 = _ref26.length; _m < _len1; _m++) { + p = _ref26[_m]; + if (me[p] != null) { + sprops[p] = me._evaluate(me[p], d); + } + } + s = new SymbolType(sprops); + w = s0.radius * s0.radius / r; + x = s0.x * w; + y = s0.y * w; + for (_n = 0, _len2 = intersects.length; _n < _len2; _n++) { + i = intersects[_n]; + s1 = symbols[i]; + w = s1.radius * s1.radius / r; + x += s1.x * w; + y += s1.y * w; + symbols[i] = void 0; + } + s.x = x; + s.y = y; + symbols[p] = void 0; + out.push(s); + } else { + out.push(s0); + } + } + symbols = out; + } + return me.symbols = symbols; + }; + + SymbolGroup.prototype._initTooltips = function() { + var cfg, node, s, tooltips, tt, _i, _j, _len, _len1, _ref21, _ref22; + + me = this; + tooltips = me.tooltip; + _ref21 = me.symbols; + for (_i = 0, _len = _ref21.length; _i < _len; _i++) { + s = _ref21[_i]; + cfg = { + position: { + target: 'mouse', + viewport: $(window), + adjust: { + x: 7, + y: 7 + } + }, + show: { + delay: 20 + }, + content: {}, + events: { + show: function(evt, api) { + return $('.qtip').filter(function() { + return this !== api.elements.tooltip.get(0); + }).hide(); + } + } + }; + tt = tooltips(s.data, s.key); + if (__type(tt) === "string") { + cfg.content.text = tt; + } else if (__type(tt) === "array") { + cfg.content.title = tt[0]; + cfg.content.text = tt[1]; + } + _ref22 = s.nodes(); + for (_j = 0, _len1 = _ref22.length; _j < _len1; _j++) { + node = _ref22[_j]; + $(node).qtip(cfg); + } + } + }; + + SymbolGroup.prototype.onResize = function() { + var s, _i, _len, _ref21; + + me = this; + me.layout(); + _ref21 = me.symbols; + for (_i = 0, _len = _ref21.length; _i < _len; _i++) { + s = _ref21[_i]; + s.update(); + } + }; + + SymbolGroup.prototype.update = function(opts, duration, easing) { + var p, s, _i, _j, _len, _len1, _ref21, _ref22; + + me = this; + if (opts == null) { + opts = {}; + } + _ref21 = me.symbols; + for (_i = 0, _len = _ref21.length; _i < _len; _i++) { + s = _ref21[_i]; + _ref22 = me.type.props; + for (_j = 0, _len1 = _ref22.length; _j < _len1; _j++) { + p = _ref22[_j]; + if (opts[p] != null) { + s[p] = me._evaluate(opts[p], s.data); + } else if (me[p] != null) { + s[p] = me._evaluate(me[p], s.data); + } + } + s.update(duration, easing); + } + return me; + }; + + return SymbolGroup; + + })(); + + SymbolGroup._layerid = 0; + + kartograph.SymbolGroup = SymbolGroup; + + Kartograph.prototype.addSymbols = function(opts) { + opts.map = this; + return new SymbolGroup(opts); + }; + + +/* + Copyright (c) 2010, SimpleGeo and Stamen Design + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of SimpleGeo nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL SIMPLEGEO BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +// k-means clustering +function kmeans() { + var kmeans = {}, + points = [], + iterations = 1, + size = 1; + + kmeans.size = function(x) { + if (!arguments.length) return size; + size = x; + return kmeans; + }; + + kmeans.iterations = function(x) { + if (!arguments.length) return iterations; + iterations = x; + return kmeans; + }; + + kmeans.add = function(x) { + points.push(x); + return kmeans; + }; + + kmeans.means = function() { + var means = [], + seen = {}, + n = Math.min(size, points.length); + + // Initialize k random (unique!) means. + for (var i = 0, m = 2 * n; i < m; i++) { + var p = points[~~(Math.random() * points.length)], id = p.x + "/" + p.y; + if (!(id in seen)) { + seen[id] = 1; + if (means.push({x: p.x, y: p.y}) >= n) break; + } + } + n = means.length; + + // For each iteration, create a kd-tree of the current means. + for (var j = 0; j < iterations; j++) { + var kd = kdtree().points(means); + + // Clear the state. + for (var i = 0; i < n; i++) { + var mean = means[i]; + mean.sumX = 0; + mean.sumY = 0; + mean.size = 0; + mean.points = []; + mean.indices = []; + } + + // Find the mean closest to each point. + for (var i = 0; i < points.length; i++) { + var point = points[i], mean = kd.find(point); + mean.sumX += point.x; + mean.sumY += point.y; + mean.size++; + mean.points.push(point); + mean.indices.push(i); + } + + // Compute the new means. + for (var i = 0; i < n; i++) { + var mean = means[i]; + if (!mean.size) continue; // overlapping mean + mean.x = mean.sumX / mean.size; + mean.y = mean.sumY / mean.size; + } + } + + return means; + }; + + return kmeans; +} + +// kd-tree +function kdtree() { + var kdtree = {}, + axes = ["x", "y"], + root, + points = []; + + kdtree.axes = function(x) { + if (!arguments.length) return axes; + axes = x; + return kdtree; + }; + + kdtree.points = function(x) { + if (!arguments.length) return points; + points = x; + root = null; + return kdtree; + }; + + kdtree.find = function(x) { + return find(kdtree.root(), x, root).point; + }; + + kdtree.root = function(x) { + return root || (root = node(points, 0)); + }; + + function node(points, depth) { + if (!points.length) return; + var axis = axes[depth % axes.length], median = points.length >> 1; + points.sort(order(axis)); // could use random sample to speed up here + return { + axis: axis, + point: points[median], + left: node(points.slice(0, median), depth + 1), + right: node(points.slice(median + 1), depth + 1) + }; + } + + function distance(a, b) { + var sum = 0; + for (var i = 0; i < axes.length; i++) { + var axis = axes[i], d = a[axis] - b[axis]; + sum += d * d; + } + return sum; + } + + function order(axis) { + return function(a, b) { + a = a[axis]; + b = b[axis]; + return a < b ? -1 : a > b ? 1 : 0; + }; + } + + function find(node, point, best) { + if (distance(node.point, point) < distance(best.point, point)) best = node; + if (node.left) best = find(node.left, point, best); + if (node.right) { + var d = node.point[node.axis] - point[node.axis]; + if (d * d < distance(best.point, point)) best = find(node.right, point, best); + } + return best; + } + + return kdtree; +} +; + + kartograph.dorlingLayout = function(symbolgroup, iterations) { + var A, B, apply, d, ds, dx, dy, f, i, j, nodes, r, rd, rs, _i; + + if (iterations == null) { + iterations = 40; + } + nodes = []; + $.each(symbolgroup.symbols, function(i, s) { + return nodes.push({ + i: i, + x: s.path.attrs.cx, + y: s.path.attrs.cy, + r: s.path.attrs.r + }); + }); + nodes.sort(function(a, b) { + return b.r - a.r; + }); + apply = function() { + var n, _i, _len; + + for (_i = 0, _len = nodes.length; _i < _len; _i++) { + n = nodes[_i]; + symbolgroup.symbols[n.i].path.attr({ + cx: n.x, + cy: n.y + }); + } + }; + for (r = _i = 1; 1 <= iterations ? _i <= iterations : _i >= iterations; r = 1 <= iterations ? ++_i : --_i) { + for (i in nodes) { + for (j in nodes) { + if (j > i) { + A = nodes[i]; + B = nodes[j]; + if (A.x + A.r < B.x - B.r || A.x - A.r > B.x + B.r) { + continue; + } + if (A.y + A.r < B.y - B.r || A.y - A.r > B.y + B.r) { + continue; + } + dx = A.x - B.x; + dy = A.y - B.y; + ds = dx * dx + dy * dy; + rd = A.r + B.r; + rs = rd * rd; + if (ds < rs) { + d = Math.sqrt(ds); + f = 10 / d; + A.x += dx * f * (1 - (A.r / rd)); + A.y += dy * f * (1 - (A.r / rd)); + B.x -= dx * f * (1 - (B.r / rd)); + B.y -= dy * f * (1 - (B.r / rd)); + } + } + } + } + } + return apply(); + }; + + /* + kartograph - a svg mapping library + Copyright (C) 2011,2012 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + Bubble = (function(_super) { + __extends(Bubble, _super); + + function Bubble(opts) { + this.nodes = __bind(this.nodes, this); + this.clear = __bind(this.clear, this); + this.update = __bind(this.update, this); + this.render = __bind(this.render, this); + this.overlaps = __bind(this.overlaps, this); + var me, _ref21, _ref22; + + me = this; + Bubble.__super__.constructor.call(this, opts); + me.radius = (_ref21 = opts.radius) != null ? _ref21 : 4; + me.style = opts.style; + me.attrs = opts.attrs; + me.title = opts.title; + me["class"] = (_ref22 = opts["class"]) != null ? _ref22 : 'bubble'; + } + + Bubble.prototype.overlaps = function(bubble) { + var dx, dy, me, r1, r2, x1, x2, y1, y2, _ref21, _ref22; + + me = this; + _ref21 = [me.x, me.y, me.radius], x1 = _ref21[0], y1 = _ref21[1], r1 = _ref21[2]; + _ref22 = [bubble.x, bubble.y, bubble.radius], x2 = _ref22[0], y2 = _ref22[1], r2 = _ref22[2]; + if (x1 - r1 > x2 + r2 || x1 + r1 < x2 - r2 || y1 - r1 > y2 + r2 || y1 + r1 < y2 - r2) { + return false; + } + dx = x1 - x2; + dy = y1 - y2; + if (dx * dx + dy * dy > (r1 + r2) * (r1 + r2)) { + return false; + } + return true; + }; + + Bubble.prototype.render = function(layers) { + var me; + + me = this; + if (me.path == null) { + me.path = me.layers.mapcanvas.circle(me.x, me.y, me.radius); + } + me.update(); + me.map.applyCSS(me.path); + return me; + }; + + Bubble.prototype.update = function(duration, easing) { + var attrs, me, path; + + if (duration == null) { + duration = false; + } + if (easing == null) { + easing = 'expo-out'; + } + me = this; + path = me.path; + attrs = { + cx: me.x, + cy: me.y, + r: me.radius + }; + if (me.attrs != null) { + attrs = $.extend(attrs, me.attrs); + } + if (!duration) { + path.attr(attrs); + } else { + path.animate(attrs, duration, easing); + } + if (path.node != null) { + if (me.style != null) { + path.node.setAttribute('style', me.style); + } + if (me["class"] != null) { + path.node.setAttribute('class', me["class"]); + } + } + if (me.title != null) { + path.attr('title', me.title); + } + return me; + }; + + Bubble.prototype.clear = function() { + var me; + + me = this; + me.path.remove(); + return me; + }; + + Bubble.prototype.nodes = function() { + var me; + + me = this; + return [me.path.node]; + }; + + return Bubble; + + })(Symbol); + + Bubble.props = ['radius', 'style', 'class', 'title', 'attrs']; + + Bubble.layers = []; + + root.kartograph.Bubble = Bubble; + + /* + kartograph - a svg mapping library + Copyright (C) 2011,2012 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + Icon = (function(_super) { + __extends(Icon, _super); + + function Icon(opts) { + var me, _ref21, _ref22, _ref23, _ref24, _ref25; + + me = this; + Icon.__super__.constructor.call(this, opts); + me.icon = (_ref21 = opts.icon) != null ? _ref21 : ''; + me.offset = (_ref22 = opts.offset) != null ? _ref22 : [0, 0]; + me.iconsize = (_ref23 = opts.iconsize) != null ? _ref23 : [10, 10]; + me["class"] = (_ref24 = opts["class"]) != null ? _ref24 : ''; + me.title = (_ref25 = opts.title) != null ? _ref25 : ''; + } + + Icon.prototype.render = function(layers) { + var cont, me; + + me = this; + cont = me.map.container; + me.img = $(''); + me.img.attr({ + src: me.icon, + title: me.title, + alt: me.title, + width: me.iconsize[0], + height: me.iconsize[1] + }); + me.img.addClass(me["class"]); + me.img.css({ + position: 'absolute', + 'z-index': 1000, + cursor: 'pointer' + }); + me.img[0].symbol = me; + cont.append(me.img); + return me.update(); + }; + + Icon.prototype.update = function() { + var me; + + me = this; + return me.img.css({ + left: (me.x + me.offset[0]) + 'px', + top: (me.y + me.offset[1]) + 'px' + }); + }; + + Icon.prototype.clear = function() { + var me; + + me = this; + me.img.remove(); + return me; + }; + + Icon.prototype.nodes = function() { + var me; + + me = this; + return [me.img]; + }; + + return Icon; + + })(kartograph.Symbol); + + Icon.props = ['icon', 'offset', 'class', 'title', 'iconsize']; + + Icon.layers = []; + + root.kartograph.Icon = Icon; + + /* + kartograph - a svg mapping library + Copyright (C) 2011,2012 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + SvgLabel = (function(_super) { + __extends(SvgLabel, _super); + + function SvgLabel(opts) { + var me, _ref21, _ref22, _ref23, _ref24; + + me = this; + SvgLabel.__super__.constructor.call(this, opts); + me.text = (_ref21 = opts.text) != null ? _ref21 : ''; + me.style = (_ref22 = opts.style) != null ? _ref22 : ''; + me["class"] = (_ref23 = opts["class"]) != null ? _ref23 : ''; + me.offset = (_ref24 = opts.offset) != null ? _ref24 : [0, 0]; + } + + SvgLabel.prototype.render = function(layers) { + var lbl, me; + + me = this; + me.lbl = lbl = me.layers.mapcanvas.text(me.x, me.y, me.text); + me.update(); + return me; + }; + + SvgLabel.prototype.update = function() { + var me; + + me = this; + me.lbl.attr({ + x: me.x + me.offset[0], + y: me.y + me.offset[1] + }); + me.lbl.node.setAttribute('style', me.style); + return me.lbl.node.setAttribute('class', me["class"]); + }; + + SvgLabel.prototype.clear = function() { + var me; + + me = this; + me.lbl.remove(); + return me; + }; + + SvgLabel.prototype.nodes = function() { + var me; + + me = this; + return [me.lbl.node]; + }; + + return SvgLabel; + + })(kartograph.Symbol); + + SvgLabel.props = ['text', 'style', 'class', 'offset']; + + SvgLabel.layers = []; + + root.kartograph.Label = SvgLabel; + + HtmlLabel = (function(_super) { + __extends(HtmlLabel, _super); + + function HtmlLabel(opts) { + var me, _ref21, _ref22, _ref23; + + me = this; + HtmlLabel.__super__.constructor.call(this, opts); + me.text = (_ref21 = opts.text) != null ? _ref21 : ''; + me.css = (_ref22 = opts.css) != null ? _ref22 : ''; + me["class"] = (_ref23 = opts["class"]) != null ? _ref23 : ''; + } + + HtmlLabel.prototype.render = function(layers) { + var l, lbl, me; + + me = this; + l = $('
' + me.text + '
'); + l.css({ + width: '80px', + position: 'absolute', + left: '-40px', + 'text-align': 'center' + }); + me.lbl = lbl = $('
'); + lbl.append(l); + me.layers.lbl.append(lbl); + l.css({ + height: l.height() + 'px', + top: (l.height() * -.4) + 'px' + }); + me.update(); + return me; + }; + + HtmlLabel.prototype.update = function() { + var me; + + me = this; + me.lbl.css({ + position: 'absolute', + left: me.x + 'px', + top: me.y + 'px' + }); + return me.lbl.css(me.css); + }; + + HtmlLabel.prototype.clear = function() { + var me; + + me = this; + me.lbl.remove(); + return me; + }; + + HtmlLabel.prototype.nodes = function() { + var me; + + me = this; + return [me.lbl[0]]; + }; + + return HtmlLabel; + + })(kartograph.Symbol); + + HtmlLabel.props = ['text', 'css', 'class']; + + HtmlLabel.layers = [ + { + id: 'lbl', + type: 'html' + } + ]; + + root.kartograph.HtmlLabel = HtmlLabel; + + /* + kartograph - a svg mapping library + Copyright (C) 2011,2012 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + LabeledBubble = (function(_super) { + __extends(LabeledBubble, _super); + + function LabeledBubble(opts) { + this.nodes = __bind(this.nodes, this); + this.clear = __bind(this.clear, this); + this.update = __bind(this.update, this); + this.render = __bind(this.render, this); + var me, _ref21, _ref22; + + me = this; + LabeledBubble.__super__.constructor.call(this, opts); + me.labelattrs = (_ref21 = opts.labelattrs) != null ? _ref21 : {}; + me.buffer = opts.buffer; + me.center = (_ref22 = opts.center) != null ? _ref22 : true; + } + + LabeledBubble.prototype.render = function(layers) { + var me; + + me = this; + if ((me.title != null) && String(me.title).trim() !== '') { + if (me.buffer) { + me.bufferlabel = me.layers.mapcanvas.text(me.x, me.y, me.title); + } + me.label = me.layers.mapcanvas.text(me.x, me.y, me.title); + } + LabeledBubble.__super__.render.call(this, layers); + return me; + }; + + LabeledBubble.prototype.update = function(duration, easing) { + var attrs, me, vp, x, y; + + if (duration == null) { + duration = false; + } + if (easing == null) { + easing = 'expo-out'; + } + me = this; + LabeledBubble.__super__.update.call(this, duration, easing); + if (me.label != null) { + vp = me.map.viewport; + attrs = $.extend({}, me.labelattrs); + x = me.x; + y = me.y; + if (me.center) { + y -= 0; + } else if (x > vp.width * 0.5) { + attrs['text-anchor'] = 'end'; + x -= me.radius + 5; + } else if (x < vp.width * 0.5) { + attrs['text-anchor'] = 'start'; + x += me.radius + 5; + } + attrs['x'] = x; + attrs['y'] = y; + if (me.buffer) { + me.bufferlabel.attr(attrs); + me.bufferlabel.attr({ + stroke: '#fff', + fill: '#fff', + 'stroke-linejoin': 'round', + 'stroke-linecap': 'round', + 'stroke-width': 6 + }); + } + me.label.attr(attrs); + me.label.toFront(); + } + return me; + }; + + LabeledBubble.prototype.clear = function() { + var me; + + me = this; + return LabeledBubble.__super__.clear.apply(this, arguments); + }; + + LabeledBubble.prototype.nodes = function() { + var me, nodes; + + me = this; + nodes = LabeledBubble.__super__.nodes.apply(this, arguments); + if (me.label) { + nodes.push(me.label.node); + } + if (me.bufferlabel) { + nodes.push(me.bufferlabel.node); + } + return nodes; + }; + + return LabeledBubble; + + })(Bubble); + + LabeledBubble.props = ['radius', 'style', 'class', 'title', 'labelattrs', 'buffer', 'center', 'attrs']; + + LabeledBubble.layers = []; + + root.kartograph.LabeledBubble = LabeledBubble; + + /* + kartograph - a svg mapping library + Copyright (C) 2011,2012 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + PieChart = (function(_super) { + var me; + + __extends(PieChart, _super); + + /* + usage: + new SymbolMap({ + map: map, + radius: 10 + data: [25,75], + colors: ['red', 'blue'], + titles: ['red pie', 'blue pie'] + }) + */ + + + me = null; + + function PieChart(opts) { + var _base2, _ref21, _ref22, _ref23, _ref24, _ref25, _ref26, _ref27, _ref28, _ref29; + + me = this; + PieChart.__super__.constructor.call(this, opts); + me.radius = (_ref21 = opts.radius) != null ? _ref21 : 4; + me.styles = (_ref22 = opts.styles) != null ? _ref22 : ''; + me.colors = (_ref23 = opts.colors) != null ? _ref23 : ['#3cc', '#c3c', '#33c', '#cc3']; + me.titles = (_ref24 = opts.titles) != null ? _ref24 : ['', '', '', '', '']; + me.values = (_ref25 = opts.values) != null ? _ref25 : []; + me.border = (_ref26 = opts.border) != null ? _ref26 : false; + me.borderWidth = (_ref27 = opts.borderWidth) != null ? _ref27 : 2; + me["class"] = (_ref28 = opts["class"]) != null ? _ref28 : 'piechart'; + if ((_ref29 = (_base2 = Raphael.fn).pieChart) == null) { + _base2.pieChart = drawPieChart; + } + } + + PieChart.prototype.overlaps = function(bubble) { + var dx, dy, r1, r2, x1, x2, y1, y2, _ref21, _ref22; + + _ref21 = [me.x, me.y, me.radius], x1 = _ref21[0], y1 = _ref21[1], r1 = _ref21[2]; + _ref22 = [bubble.x, bubble.y, bubble.radius], x2 = _ref22[0], y2 = _ref22[1], r2 = _ref22[2]; + if (x1 - r1 > x2 + r2 || x1 + r1 < x2 - r2 || y1 - r1 > y2 + r2 || y1 + r1 < y2 - r2) { + return false; + } + dx = x1 - x2; + dy = y1 - y2; + if (dx * dx + dy * dy > (r1 + r2) * (r1 + r2)) { + return false; + } + return true; + }; + + PieChart.prototype.render = function(layers) { + var bg; + + me = this; + if (me.border != null) { + bg = me.layers.mapcanvas.circle(me.x, me.y, me.radius + me.borderWidth).attr({ + stroke: 'none', + fill: me.border + }); + } + me.chart = me.layers.mapcanvas.pieChart(me.x, me.y, me.radius, me.values, me.titles, me.colors, "none"); + me.chart.push(bg); + return me; + }; + + PieChart.prototype.update = function(opts) { + var path; + + return; + me.path.attr({ + x: me.x, + y: me.y, + r: me.radius + }); + path = me.path; + path.node.setAttribute('style', me.styles[0]); + path.node.setAttribute('class', me["class"]); + if (me.title != null) { + path.attr('title', me.titles[0]); + } + return me; + }; + + PieChart.prototype.clear = function() { + var p, _i, _len, _ref21; + + me = this; + _ref21 = me.chart; + for (_i = 0, _len = _ref21.length; _i < _len; _i++) { + p = _ref21[_i]; + p.remove(); + } + return me; + }; + + PieChart.prototype.nodes = function() { + var el, _i, _len, _ref21, _results; + + _ref21 = me.chart; + _results = []; + for (_i = 0, _len = _ref21.length; _i < _len; _i++) { + el = _ref21[_i]; + _results.push(el.node); + } + return _results; + }; + + return PieChart; + + })(Symbol); + + PieChart.props = ['radius', 'values', 'styles', 'class', 'titles', 'colors', 'border', 'borderWidth']; + + PieChart.layers = []; + + root.kartograph.PieChart = PieChart; + + /* + pie chart extension for RaphaelJS + */ + + + drawPieChart = function(cx, cy, r, values, labels, colors, stroke) { + var angle, chart, i, paper, process, rad, sector, total, v, _i, _len; + + if (isNaN(cx) || isNaN(cy) || isNaN(r)) { + return []; + } + paper = this; + rad = Math.PI / 180; + chart = paper.set(); + sector = function(cx, cy, r, startAngle, endAngle, params) { + var x1, x2, y1, y2; + + x1 = cx + r * Math.cos(-startAngle * rad); + x2 = cx + r * Math.cos(-endAngle * rad); + y1 = cy + r * Math.sin(-startAngle * rad); + y2 = cy + r * Math.sin(-endAngle * rad); + return paper.path(["M", cx, cy, "L", x1, y1, "A", r, r, 0, +(endAngle - startAngle > 180), 0, x2, y2, "z"]).attr(params); + }; + angle = -270; + total = 0; + process = function(j) { + var angleplus, color, delta, ms, p, popangle, value; + + value = values[j]; + angleplus = 360 * value / total; + popangle = angle + (angleplus * 0.5); + color = colors[j]; + ms = 500; + delta = 30; + p = sector(cx, cy, r, angle, angle + angleplus, { + fill: color, + stroke: stroke, + 'stroke-width': 1 + }); + p.mouseover(function() { + p.stop().animate({ + transform: "s1.1 1.1 " + cx + " " + cy + }, ms, "elastic"); + }); + p.mouseout(function() { + p.stop().animate({ + transform: "" + }, ms, "elastic"); + }); + angle += angleplus; + chart.push(p); + }; + for (_i = 0, _len = values.length; _i < _len; _i++) { + v = values[_i]; + total += v; + } + for (i in values) { + process(i); + } + return chart; + }; + + /* + kartograph - a svg mapping library + Copyright (C) 2011,2012 Gregor Aisch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . + */ + + + + +drawStackedBars = function (cx, cy, w, h, values, labels, colors, stroke) { + var paper = this, + chart = this.set(); + function bar(x, y, w, h, params) { + return paper.rect(x,y,w,h).attr(params); + } + var yo = 0, + total = 0, + process = function (j) { + var value = values[j], + bh = h * value / total, + x = cx - w*0.5, + y = cy + h*0.5 - yo, + bw = w, + color = colors[j], + ms = 500, + delta = 30, + p = bar(x, y-bh, bw, bh, {fill: color, stroke: stroke, "stroke-width": 1}); + + yo += bh; + + p.mouseover(function () { + p.stop().animate({transform: "s1.1 1.1 " + cx + " " + cy}, ms, "elastic"); + }).mouseout(function () { + p.stop().animate({transform: ""}, ms, "elastic"); + + }); + chart.push(p); + }; + for (var i = 0, ii = values.length; i < ii; i++) { + total += values[i]; + } + for (i = 0; i < ii; i++) { + process(i); + } + return chart; +}; + +; + + StackedBarChart = (function(_super) { + __extends(StackedBarChart, _super); + + /* + usage: + new SymbolMap({ + map: map, + radius: 10 + data: [25,75], + colors: ['red', 'blue'], + titles: ['red pie', 'blue pie'] + }) + */ + + + function StackedBarChart(opts) { + var me, _base2, _ref21, _ref22, _ref23, _ref24, _ref25, _ref26, _ref27, _ref28; + + me = this; + StackedBarChart.__super__.constructor.call(this, opts); + me.styles = (_ref21 = opts.styles) != null ? _ref21 : ''; + me.colors = (_ref22 = opts.colors) != null ? _ref22 : []; + me.titles = (_ref23 = opts.titles) != null ? _ref23 : ['', '', '', '', '']; + me.values = (_ref24 = opts.values) != null ? _ref24 : []; + me.width = (_ref25 = opts.width) != null ? _ref25 : 17; + me.height = (_ref26 = opts.height) != null ? _ref26 : 30; + me["class"] = (_ref27 = opts["class"]) != null ? _ref27 : 'barchart'; + if ((_ref28 = (_base2 = Raphael.fn).drawStackedBarChart) == null) { + _base2.drawStackedBarChart = drawStackedBars; + } + } + + StackedBarChart.prototype.overlaps = function(bubble) { + var dx, dy, me, r1, r2, x1, x2, y1, y2, _ref21, _ref22; + + me = this; + _ref21 = [me.x, me.y, me.radius], x1 = _ref21[0], y1 = _ref21[1], r1 = _ref21[2]; + _ref22 = [bubble.x, bubble.y, bubble.radius], x2 = _ref22[0], y2 = _ref22[1], r2 = _ref22[2]; + if (x1 - r1 > x2 + r2 || x1 + r1 < x2 - r2 || y1 - r1 > y2 + r2 || y1 + r1 < y2 - r2) { + return false; + } + dx = x1 - x2; + dy = y1 - y2; + if (dx * dx + dy * dy > (r1 + r2) * (r1 + r2)) { + return false; + } + return true; + }; + + StackedBarChart.prototype.render = function(layers) { + var bg, h, me, w, x, y; + + me = this; + w = me.width; + h = me.height; + x = me.x; + y = me.y; + bg = me.layers.mapcanvas.rect(x - w * 0.5 - 2, y - h * 0.5 - 2, w + 4, h + 4).attr({ + stroke: 'none', + fill: '#fff' + }); + me.chart = me.layers.mapcanvas.drawStackedBarChart(me.x, me.y, me.width, me.height, me.values, me.titles, me.colors, "none"); + me.chart.push(bg); + return me; + }; + + StackedBarChart.prototype.update = function() { + var me, path; + + me = this; + return; + me.path.attr({ + x: me.x, + y: me.y, + r: me.radius + }); + path = me.path; + path.node.setAttribute('style', me.styles[0]); + path.node.setAttribute('class', me["class"]); + if (me.title != null) { + path.attr('title', me.titles[0]); + } + return me; + }; + + StackedBarChart.prototype.clear = function() { + var me, p, _i, _len, _ref21; + + me = this; + _ref21 = me.chart; + for (_i = 0, _len = _ref21.length; _i < _len; _i++) { + p = _ref21[_i]; + p.remove(); + } + me.chart = []; + return me; + }; + + StackedBarChart.prototype.nodes = function() { + var el, me, _i, _len, _ref21, _results; + + me = this; + _ref21 = me.chart; + _results = []; + for (_i = 0, _len = _ref21.length; _i < _len; _i++) { + el = _ref21[_i]; + _results.push(el.node); + } + return _results; + }; + + return StackedBarChart; + + })(kartograph.Symbol); + + StackedBarChart.props = ['values', 'styles', 'class', 'titles', 'colors', 'width', 'height']; + + StackedBarChart.layers = []; + + root.kartograph.StackedBarChart = StackedBarChart; + +}).call(this); diff --git a/js/kartograph.min.js b/js/kartograph.min.js new file mode 100644 index 0000000..c5703bb --- /dev/null +++ b/js/kartograph.min.js @@ -0,0 +1,3 @@ +!function(){function t(){var t={},e=[],n=1,o=1;return t.size=function(r){return arguments.length?(o=r,t):o},t.iterations=function(r){return arguments.length?(n=r,t):n},t.add=function(r){return e.push(r),t},t.means=function(){for(var t=[],a={},i=Math.min(o,e.length),s=0,l=2*i;l>s;s++){var u=e[~~(Math.random()*e.length)],p=u.x+"/"+u.y;if(!(p in a)&&(a[p]=1,t.push({x:u.x,y:u.y})>=i))break}i=t.length;for(var h=0;n>h;h++){for(var c=r().points(t),s=0;i>s;s++){var f=t[s];f.sumX=0,f.sumY=0,f.size=0,f.points=[],f.indices=[]}for(var s=0;ss;s++){var f=t[s];f.size&&(f.x=f.sumX/f.size,f.y=f.sumY/f.size)}}return t},t}function r(){function t(r,n){if(r.length){var o=i[n%i.length],a=r.length>>1;return r.sort(e(o)),{axis:o,point:r[a],left:t(r.slice(0,a),n+1),right:t(r.slice(a+1),n+1)}}}function r(t,r){for(var e=0,n=0;nr?-1:r>e?1:0}}function n(t,e,o){if(r(t.point,e)r;r++)if(r in this&&this[r]===t)return r;return-1};Nr="undefined"!=typeof exports&&null!==exports?exports:this,Pr=Nr.$K=null!=(qr=Nr.kartograph)?qr:Nr.kartograph={},Pr.version="0.8.7",e=Nr.jQuery,Pr.__verbose=!1,Er=function(){var t;try{return console.warn.apply(console,arguments)}catch(r){t=r;try{return opera.postError.apply(opera,arguments)}catch(r){return t=r,alert(Array.prototype.join.call(arguments," "))}}},jr=function(){var t;if(Pr.__verbose)try{return console.debug.apply(console,arguments)}catch(r){t=r;try{return opera.postError.apply(opera,arguments)}catch(r){return t=r,alert(Array.prototype.join.call(arguments," "))}}},null==(Xr=(Or=String.prototype).trim)&&(Or.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),Array.prototype.indexOf||(Array.prototype.indexOf=function(t){"use strict";if(null==this)throw new TypeError;var r=Object(this),e=r.length>>>0;if(0===e)return-1;var n=0;if(arguments.length>0&&(n=Number(arguments[1]),n!=n?n=0:0!=n&&1/0!=n&&n!=-1/0&&(n=(n>0||-1)*Math.floor(Math.abs(n)))),n>=e)return-1;for(var o=n>=0?n:Math.max(e-Math.abs(n),0);e>o;o++)if(o in r&&r[o]===t)return o;return-1}),Vr=function(){var t,r,e,n,o;for(t={},o="Boolean Number String Function Array Date RegExp Undefined Null".split(" "),e=0,n=o.length;n>e;e++)r=o[e],t["[object "+r+"]"]=r.toLowerCase();return function(r){var e;return e=Object.prototype.toString.call(r),t[e]||"object"}}(),a=function(){function t(t,r,e,n){var o;null==t&&(t=0),null==r&&(r=0),null==e&&(e=null),null==n&&(n=null),o=this,null===e?(o.xmin=Number.MAX_VALUE,o.xmax=-1*Number.MAX_VALUE):(o.xmin=o.left=t,o.xmax=o.right=t+e,o.width=e),null===n?(o.ymin=Number.MAX_VALUE,o.ymax=-1*Number.MAX_VALUE):(o.ymin=o.top=r,o.ymax=o.bottom=n+r,o.height=n)}return t.prototype.update=function(t,r){var e;return null==r&&(r=t[1],t=t[0]),e=this,e.xmin=Math.min(e.xmin,t),e.ymin=Math.min(e.ymin,r),e.xmax=Math.max(e.xmax,t),e.ymax=Math.max(e.ymax,r),e.left=e.xmin,e.top=e.ymin,e.right=e.xmax,e.bottom=e.ymax,e.width=e.xmax-e.xmin,e.height=e.ymax-e.ymin,this},t.prototype.intersects=function(t){return t.lefts.left&&t.tops.top},t.prototype.inside=function(t,r){var e;return e=this,t>=e.left&&t<=e.right&&r>=e.top&&r<=e.bottom},t.prototype.join=function(t){var r;return r=this,r.update(t.left,t.top),r.update(t.right,t.bottom),this},t}(),a.fromXML=function(t){var r,e,n,o;return n=Number(t.getAttribute("x")),o=Number(t.getAttribute("y")),e=Number(t.getAttribute("w")),r=Number(t.getAttribute("h")),new a(n,o,e,r)},Pr.BBox=a,null==(re=Pr.geom)&&(Pr.geom={}),null==(ne=(Hr=Pr.geom).clipping)&&(Hr.clipping={}),d=function(){function t(){}var r,e,n,o,a;return e=0,n=1,o=2,r=4,a=8,t.prototype.compute_out_code=function(t,r,e){var n,o;return o=this,n=o.INSIDE,rt.right&&(n|=o.RIGHT),et.bottom&&(n|=o.BOTTOM),n},t.prototype.clip=function(t,r,e,n,o){var a,i,s,l,u,p,h;for(u=this,i=u.compute_out_code(t,r,e),s=u.compute_out_code(t,n,o),a=False;True;){if(!(i|s)){a=True;break}if(i&s)break;l=0===code?s:i,l&u.TOP?(p=r+(n-r)*(t.top-e)/(o-e),h=t.top):l&u.BOTTOM?(p=r+(n-r)*(t.bottom-e)/(o-e),h=t.bottom):l&u.RIGHT?(h=e+(o-e)*(t.right-r)/(n-r),p=t.right):l&u.LEFT&&(h=e+(o-e)*(t.left-r)/(n-r),p=t.left),l===i?(r=p,e=h,i=u.compute_out_code(t,r,e)):(n=p,o=h,s=u.compute_out_code(t,n,o))}return a?[r,e,n,o]:null},t}(),Pr.geom.clipping.CohenSutherland=d,L=function(){function t(t,r,n){var o,a;a=this,a.container=o=e(t),null==r&&(r=o.width()),null==n&&(n=o.height()),0===n&&(n="auto"),a.size={h:n,w:r},a.markers=[],a.pathById={},a.container.addClass("kartograph")}return t.prototype.createSVGLayer=function(t){var r,n,o,a,i,s,l,u;return a=this,null==(u=a._layerCnt)&&(a._layerCnt=0),o=a._layerCnt++,l=a.viewport,n=a.container,i=Raphael(n[0],l.width,l.height),s=e(i.canvas),s.css({position:"absolute",top:"0px",left:"0px","z-index":o+5}),"static"===n.css("position")&&n.css({position:"relative",height:l.height+"px"}),s.addClass(t),r=e("desc",i.canvas).text(),e("desc",i.canvas).text(r.replace("with ","with kartograph "+Pr.version+" and ")),i},t.prototype.createHTMLLayer=function(t){var r,n,o,a,i,s;return a=this,i=a.viewport,r=a.container,null==(s=a._layerCnt)&&(a._layerCnt=0),o=a._layerCnt++,n=e('
'),n.css({position:"absolute",top:"0px",left:"0px",width:i.width+"px",height:i.height+"px","z-index":o+5}),r.append(n),n},t.prototype.load=function(t,r,n){var o,a,i,s;return a=this,o=e.Deferred(),a.clear(),a.opts=null!=n?n:{},null==(s=(i=a.opts).zoom)&&(i.zoom=1),a.mapLoadCallback=r,a._loadMapDeferred=o,a._lastMapUrl=t,a.cacheMaps&&null!=Pr.__mapCache[t]?a._mapLoaded(Pr.__mapCache[t]):e.ajax({url:t,dataType:"text",success:a._mapLoaded,context:a,error:function(t,r,e){return Er(t,r,e)}}),o.promise()},t.prototype.loadMap=function(){return this.load.apply(this,arguments)},t.prototype.setMap=function(t,r){var e,n,o;e=this,e.opts=null!=r?r:{},null==(o=(n=e.opts).zoom)&&(n.zoom=1),e._lastMapUrl="string",e._mapLoaded(t)},t.prototype._mapLoaded=function(t){var r,n,o,i,s,l,u,p,h,c,f,d,y,v,m,g,_;l=this,l.cacheMaps&&(null==(y=Pr.__mapCache)&&(Pr.__mapCache={}),Pr.__mapCache[l._lastMapUrl]=t);try{t=e(t)}catch(b){return o=b,Er("something went horribly wrong while parsing svg"),l._loadMapDeferred.reject("could not parse svg"),void 0}l.svgSrc=t,r=e("view",t),null==l.paper&&(f=l.size.w,i=l.size.h,"auto"===i&&(p=r.attr("w")/r.attr("h"),i=f/p),l.viewport=new a(0,0,f,i)),c=l.viewport,l.viewAB=n=vr.fromXML(r[0]),u=null!=(v=l.opts.padding)?v:0,s=null!=(m=l.opts.halign)?m:"center",h=null!=(g=l.opts.valign)?g:"center",d=null!=(_=l.opts.zoom)?_:1,l.viewBC=new vr(l.viewAB.asBBox(),c.width*d,c.height*d,u,s,h),l.proj=Pr.Proj.fromXML(e("proj",r)[0]),null!=l.mapLoadCallback&&l.mapLoadCallback(l),null!=l._loadMapDeferred&&l._loadMapDeferred.resolve(l)},t.prototype.addLayer=function(t,r){var n,o,a,i,s,l,u,p,h,c,f,d,y,v,m,g,_;return null==r&&(r={}),u=this,null==(m=u.layerIds)&&(u.layerIds=[]),null==(g=u.layers)&&(u.layers={}),null==u.paper&&(u.paper=u.createSVGLayer()),d=t,"object"===Vr(r)?(s=r.name,c=r.key,v=r.title):r={},l=u.paper,r.add_svg_layer&&(l=u.createSVGLayer()),null==s&&(s=d),y=e("#"+d,u.svgSrc),0!==y.length?(i=new q(s,c,u,r.filter,l),n=e("*",y[0]),f=n.length,o=null!=(_=r.chunks)?_:f,a=0,h=function(){var t,e,s,l,u,c;for(t=o*a,e=u=0;o>=0?o>u:u>o;e=o>=0?++u:--u)f>t+e&&i.addPath(n.get(t+e),v);if(null!=r.styles){c=r.styles;for(s in c)l=c[s],i.style(s,l)}return a++,f>a*o?setTimeout(h,0):p()},p=function(){var t,e,n,o;for(i.paths.length>0&&(u.layers[s]=i,u.layerIds.push(s)),t=["click","mouseenter","mouseleave","dblclick","mousedown","mouseup","mouseover","mouseout"],n=0,o=t.length;o>n;n++)e=t[n],"function"===Vr(r[e])&&i.on(e,r[e]);return null!=r.tooltips&&i.tooltips(r.tooltips),null!=r.done?r.done():void 0},null!=r.chunks?setTimeout(h,0):h(),u):void 0},t.prototype.getLayer=function(t){var r;return r=this,null==r.layers[t]?(Er("could not find layer "+t),null):r.layers[t]},t.prototype.getLayerPath=function(t,r){var e,n;return n=this,e=n.getLayer(t),null!=e?"object"===Vr(r)?e.getPaths(r)[0]:e.getPath(r):null},t.prototype.onLayerEvent=function(t,r,e){var n;return n=this,n.getLayer(e).on(t,r),n},t.prototype.addMarker=function(t){var r,e;return r=this,r.markers.push(t),e=r.viewBC.project(r.viewAB.project(r.proj.project(t.lonlat.lon,t.lonlat.lat))),t.render(e[0],e[1],r.container,r.paper)},t.prototype.clearMarkers=function(){var t,r,e,n,o;for(r=this,o=r.markers,e=0,n=o.length;n>e;e++)t=o[e],t.clear();return r.markers=[]},t.prototype.fadeIn=function(t){var r,e,n,o,a,i,s,l,u,p,h;null==t&&(t={}),a=this,o=null!=(l=t.layer)?l:a.layerIds[a.layerIds.length-1],e=null!=(u=t.duration)?u:500,p=a.layers[o].pathsById,h=[];for(n in p)s=p[n],h.push(function(){var t,n,o;for(o=[],t=0,n=s.length;n>t;t++)i=s[t],r="function"===Vr(e)?e(i.data):e,i.svgPath.attr("opacity",0),o.push(i.svgPath.animate({opacity:1},r));return o}());return h},t.prototype.loadCoastline=function(){var t;return t=this,e.ajax({url:"coastline.json",success:t.renderCoastline,context:t})},t.prototype.resize=function(t,r){var e,n,o,i,s,l,u,p,h,c,f,d,y,v,m,g,_,b;s=this,e=s.container,null==t&&(t=e.width()),null==r&&(r=e.height()),s.viewport=h=new a(0,0,t,r),null!=s.paper&&s.paper.setSize(h.width,h.height),y=s.layers;for(o in y)i=y[o],null!=i.paper&&i.paper!==s.paper&&i.paper.setSize(h.width,h.height);l=null!=(v=s.opts.padding)?v:0,n=null!=(m=s.opts.halign)?m:"center",p=null!=(g=s.opts.valign)?g:"center",c=s.opts.zoom,s.viewBC=new vr(s.viewAB.asBBox(),h.width*c,h.height*c,l,n,p),_=s.layers;for(o in _)i=_[o],i.setView(s.viewBC);if(null!=s.symbolGroups)for(b=s.symbolGroups,f=0,d=b.length;d>f;f++)u=b[f],u.onResize()},t.prototype.lonlat2xy=function(t){var r,e;return e=this,2===t.length&&(t=new O(t[0],t[1])),3===t.length&&(t=new O(t[0],t[1],t[2])),r=e.proj.project(t.lon,t.lat,t.alt),e.viewBC.project(e.viewAB.project(r))},t.prototype.addSymbolGroup=function(t){var r,e;return r=this,null==(e=r.symbolGroups)&&(r.symbolGroups=[]),r.symbolGroups.push(t)},t.prototype.removeSymbols=function(t){var r,e,n,o,a,i;if(r=this,null!=t)return r.symbolGroups[t].remove();for(a=r.symbolGroups,i=[],n=0,o=a.length;o>n;n++)e=a[n],i.push(e.remove());return i},t.prototype.clear=function(){var t,r,n,o,a,i;if(r=this,null!=r.layers){for(t in r.layers)r.layers[t].remove();r.layers={},r.layerIds=[]}if(null!=r.symbolGroups){for(i=r.symbolGroups,o=0,a=i.length;a>o;o++)n=i[o],n.remove();r.symbolGroups=[]}return null!=r.paper?(e(r.paper.canvas).remove(),r.paper=void 0):void 0},t.prototype.loadCSS=function(t,r){var n;return n=this,Raphael.svg?(e("body").append(''),r()):e.ajax({url:t,dataType:"text",success:function(t){return n.styles=Pr.parsecss(t),r()},error:function(r,e,n){return Er("error while loading "+t,r,e,n)}})},t.prototype.applyCSS=function(t,r){var e,n,o,a,i,s,l,u,p,h,c,f,d,y,v;if(o=this,null==o.styles)return t;null==(f=o._pathTypes)&&(o._pathTypes=["path","circle","rectangle","ellipse"]),null==(d=o._regardStyles)&&(o._regardStyles=["fill","stroke","fill-opacity","stroke-width","stroke-opacity"]);for(s in o.styles)for(a=s,y=a.split(","),u=0,h=y.length;h>u;u++)if(l=y[u],a=l.split(" "),a=a[a.length-1],a=a.split(":"),!(a.length>1||(a=a[0].split("."),e=a.slice(1),e.length>0&&e.indexOf(r)<0||(a=a[0],o._pathTypes.indexOf(a)>=0&&a!==t.type))))for(i=o.styles[s],v=o._regardStyles,p=0,c=v.length;c>p;p++)n=v[p],null!=i[n]&&t.attr(n,i[n]);return t},t.prototype.style=function(t,r,e,n,o){var a;return a=this,t=a.getLayer(t),null!=t?t.style(r,e,n,o):void 0},t}(),S=Pr,Nr.kartograph=function(t,r,e){return new L(t,r,e)},Pr.map=function(t,r,e){return new L(t,r,e)},Pr.__mapCache={},e.extend(Nr.kartograph,S),O=function(){function t(t,r,e){null==e&&(e=0),this.lon=Number(t),this.lat=Number(r),this.alt=Number(e)}return t.prototype.distance=function(t){var r,e,n,o,a,i,s,l,u;return u=this,r=6371,i=Math.PI/180,o=(t.lat-u.lat)*i,a=(t.lon-u.lon)*i,s=u.lat*i,l=t.lat*i,e=Math.sin(o/2)*Math.sin(o/2)+Math.sin(a/2)*Math.sin(a/2)*Math.cos(s)*Math.cos(l),n=2*Math.atan2(Math.sqrt(e),Math.sqrt(1-e)),r*n},t}(),T=function(t){function r(t,e,n){null==n&&(n=0),r.__super__.constructor.call(this,e,t,n)}return he(r,t),r}(O),Nr.kartograph.LonLat=O,Nr.kartograph.LatLon=T,q=function(){function t(t,r,e,n,o){var a;a=this,a.id=t,a.path_id=r,a.paper=null!=o?o:e.paper,a.view=e.viewBC,a.map=e,a.filter=n}return t.prototype.addPath=function(t,r){var e,n,o,a,i,s,l;return n=this,null==(i=n.paths)&&(n.paths=[]),e=new X(t,n.id,n,r),"function"===Vr(n.filter)&&n.filter(e.data)===!1?(e.remove(),void 0):(n.paths.push(e),null!=n.path_id?(null==(s=n.pathsById)&&(n.pathsById={}),null==(l=(o=n.pathsById)[a=e.data[n.path_id]])&&(o[a]=[]),n.pathsById[e.data[n.path_id]].push(e)):void 0)},t.prototype.hasPath=function(t){var r;return r=this,null!=r.pathsById&&null!=r.pathsById[t]},t.prototype.getPathsData=function(){var t,r,e,n,o,a;for(t=this,e=[],a=t.paths,n=0,o=a.length;o>n;n++)r=a[n],e.push(r.data);return e},t.prototype.getPath=function(t){var r;return r=this,r.hasPath(t)?r.pathsById[t][0]:null},t.prototype.getPaths=function(t){var r,e,n,o,a,i,s,l;if(o=this,n=[],"object"===Vr(t))for(l=o.paths,i=0,s=l.length;s>i;i++){a=l[i],e=!0;for(r in t)e=e&&a.data[r]===t[r];e&&n.push(a)}return n},t.prototype.setView=function(t){var r,e,n,o,a;for(r=this,a=r.paths,n=0,o=a.length;o>n;n++)e=a[n],e.setView(t);return r},t.prototype.remove=function(){var t,r,e,n,o,a;for(t=this,o=t.paths,a=[],e=0,n=o.length;n>e;e++)r=o[e],a.push(r.remove());return a},t.prototype.style=function(t,r,n,o){var a,i;return i=this,"string"===Vr(t)?(a=t,t={},t[a]=r):"object"===Vr(t)&&(o=n,n=r),null==n&&(n=0),e.each(i.paths,function(r,e){var a,i,s,l,u,p;i={};for(u in t)p=t[u],i[u]=Br(p,e.data);return l=Br(n,e.data),s=Br(o,e.data),null==s&&(s=0),l>0?(a=Raphael.animation(i,1e3*l),e.svgPath.animate(a.delay(1e3*s))):0===o?setTimeout(function(){return e.svgPath.attr(i)},0):e.svgPath.attr(i)}),i},t.prototype.on=function(t,r){var n,o,a,i,s,l,u;for(a=this,n=function(){function t(t,r,e){this.type=t,this.cb=r,this.layer=e,this.handle=ce(this.handle,this)}return t.prototype.handle=function(t){var r;return a=this,r=a.layer.map.pathById[t.target.getAttribute("id")],a.cb(r.data,r.svgPath,t)},t}(),o=new n(t,r,a),u=a.paths,s=0,l=u.length;l>s;s++)i=u[s],e(i.svgPath.node).bind(t,o.handle);return a},t.prototype.tooltips=function(t,r){var n,o,a,i,s,l,u;for(n=this,a=function(t,n){var o;return o={position:{target:"mouse",viewport:e(window),adjust:{x:7,y:7}},show:{delay:null!=r?r:20},events:{show:function(t,r){return e(".qtip").filter(function(){return this!==r.elements.tooltip.get(0)}).hide()}},content:{}},null!=n?"string"==typeof n?o.content.text=n:e.isArray(n)&&(o.content.title=n[0],o.content.text=n[1]):o.content.text="n/a",e(t.svgPath.node).qtip(o)},u=n.paths,s=0,l=u.length;l>s;s++)o=u[s],i=Br(t,o.data),a(o,i);return n},t.prototype.sort=function(t){var r,e,n,o,a,i;for(e=this,e.paths.sort(function(r,e){var n,o,a;return n=t(r.data),o=t(e.data),n===o?0:null!=(a=n>o)?a:{1:-1}}),r=!1,i=e.paths,o=0,a=i.length;a>o;o++)n=i[o],r&&n.svgPath.insertAfter(r.svgPath),r=n;return e},t}(),Br=function(t,r){return"function"===Vr(t)?t(r):t},Cr=0,X=function(){function t(t,r,e,n){var o,a,i,s,l,u,p,h,c,f,d,y,v,m;for(l=this,u=e.paper,s=e.map,d=s.viewBC,l.path=p=Pr.geom.Path.fromSVG(t),l.vpath=d.projectPath(p),l.svgPath=l.vpath.toSVG(u),l.svgPath.data("path",l),null==s.styles?Raphael.svg&&l.svgPath.node.setAttribute("class",r):s.applyCSS(l.svgPath,r),c="path_"+Cr++,l.svgPath.node.setAttribute("id",c),s.pathById[c]=l,a={},i=v=0,m=t.attributes.length-1;m>=0?m>=v:v>=m;i=m>=0?++v:--v)o=t.attributes[i],"data-"===o.name.substr(0,5)&&(f=o.value,y=Number(f),""===f.trim()||y!==f||isNaN(y)||(f=y),a[o.name.substr(5)]=f);l.data=a,"string"===Vr(n)?h=n:"function"===Vr(n)&&(h=n(a)),null!=h&&l.svgPath.attr("title",h)}return t.prototype.setView=function(t){var r,e,n;return r=this,e=t.projectPath(r.path),r.vpath=e,"path"===r.path.type?(n=e.svgString(),r.svgPath.attr({path:n})):"circle"===r.path.type?r.svgPath.attr({cx:e.x,cy:e.y,r:e.r}):void 0},t.prototype.remove=function(){var t;return t=this,t.svgPath.remove()},t}(),Pr.parsecss=function(t,r){var e,n,o,a,i,s,l,u;for(a={},t=Ar(t),u=t.split("`b%"),s=0,l=u.length;l>s;s++)if(e=u[s],e=e.split("%b`"),!(e.length<2))if(e[0]=Ir(e[0]),o=Sr(e[1]),null!=a[e[0]])for(n in o)i=o[n],a[e[0]][n]=i;else a[e[0]]=o;return"function"!==Vr(r)?a:(r(a),void 0)},kr={},Sr=function(t){var r,e,n,o,a,i;for(n=kr[t].replace(/^{|}$/g,""),n=Ar(n),e={},i=n.split(";"),o=0,a=i.length;a>o;o++)r=i[o],r=r.split(":"),r.length<2||(e[Ir(r[0])]=Ir(r.slice(1).join(":")));return e},er=/{[^{}]*}/,or=/\[[^\[\]]*\]|{[^{}]*}|\([^()]*\)|function(\s+\w+)?(\s*%b`\d+`b%){2}/,nr=/(?:\/\*(?:[^\*]|\*[^\/])*\*\/)|(\\.|"(?:[^\\\"]|\\.|\\\n)*"|'(?:[^\\\']|\\.|\\\n)*')/g,ar=/%\w`(\d+)`\w%/,zr=0,Ar=function(t,r){var e,n,o;for(t=t.replace(nr,function(t,r){var e;return r?(e="%s`"+ ++zr+"`s%",kr[zr]=r.replace(/^\\/,""),e):""}),e=r?or:er;n=e.exec(t);)o="%b`"+ ++zr+"`b%",kr[zr]=n[0],t=t.replace(e,o);return t},Ir=function(t){var r;if(null==t)return t;for(;r=ar.exec(t);)t=t.replace(ar,kr[r[1]]);return t.trim()},wr=null!=(oe=Pr.geom)?oe:Pr.geom={},Z=function(){function t(t,r,e){var n,o,a,i;for(null==e&&(e=!0),o=this,o.type=t,o.contours=[],a=0,i=r.length;i>a;a++)n=r[a],Rr(n)||n.reverse(),o.contours.push(n);o.closed=e}return t.prototype.clipToBBox=function(){throw"path clipping is not implemented yet"},t.prototype.toSVG=function(t){var r;return r=this.svgString(),t.path(r)},t.prototype.svgString=function(){var t,r,e,n,o,a,i,s,l,u,p,h,c;for(n=this,o="",e=n.closed?"Z M":"M",h=n.contours,s=0,u=h.length;u>s;s++)for(t=h[s],r=!0,o+=""===o?"M":e,l=0,p=t.length;p>l;l++)c=t[l],a=c[0],i=c[1],r||(o+="L"),o+=a+","+i,r=!1;return n.closed&&(o+="Z"),o},t.prototype.area=function(){var t,r,e,n,o,a;if(e=this,null!=e.areas)return e._area;for(e.areas=[],e._area=0,a=e.contours,n=0,o=a.length;o>n;n++)r=a[n],t=Tr(r),e.areas.push(t),e._area+=t;return e._area},t.prototype.centroid=function(){var t,r,e,n,o,a,i,s,l,u,p,h,c,f,d,y,v,m,g,_,b,x,w,M,P,j,C,A,k,S,L,B,I,N,G,z,E;if(y=this,null!=y._centroid)return y._centroid;for(e=y.area(),a=i=0,p=C=0,I=y.contours.length-1;I>=0?I>=C:C>=I;p=I>=0?++C:--C)if(o=y.contours[p],n=[],f=o.length,r=y.areas[p],c=r/e,0!==c){for(h=A=0,N=f-1;N>=0?N>=A:A>=N;h=N>=0?++A:--A)if(v=o[h],m=o[(h+1)%f],s=0,n.push(v),v[0]===m[0]&&(s=Math.abs(v[1]-m[1])),v[1]===m[1]&&(s=Math.abs(v[0]-m[0])),s>10)for(t=Math.floor(2*s),g=k=1,G=t-1;G>=1?G>=k:k>=G;g=G>=1?++k:--k)_=[v[0]+g/t*(m[0]-v[0]),v[1]+g/t*(m[1]-v[1])],n.push(_);for(w=P=M=j=0,f=n.length,L=[],b=0,h=S=0,z=f-1;z>=0?z>=S:S>=z;h=z>=0?++S:--S)v=n[h],m=n[(h+1)%f],l=m[0]-v[0],u=m[1]-v[1],d=Math.sqrt(l*l+u*u),L.push(d),b+=d;for(h=B=0,E=f-1;E>=0?E>=B:B>=E;h=E>=0?++B:--B)v=n[h],x=L[h]/b,w+=x*v[0],P+=x*v[1];a+=w*c,i+=P*c}return y._centroid=[a,i],y._centroid},t.prototype.isInside=function(t,r){var e,n,o,a,i,s;if(a=this,e=a._bbox,te[2]||re[3])return!1;for(o=i=0,s=a.contours.length-1;s>=0?s>=i:i>=s;o=s>=0?++i:--i)if(n=a.contours[o],Fr(n,[t,r]))return!0;return!1},t}(),Pr.geom.Path=Z,f=function(t){function r(t,e,n){this.x=t,this.y=e,this.r=n,r.__super__.constructor.call(this,"circle",null,!0)}return he(r,t),r.prototype.toSVG=function(t){var r;return r=this,t.circle(r.x,r.y,r.r)},r.prototype.centroid=function(){var t;return t=this,[t.x,t.y]},r.prototype.area=function(){var t;return t=this,Math.PI*t.r*m.r},r}(Z),Pr.geom.Circle=f,Z.fromSVG=function(t){var r,e,n,o,a,i,s,l,u,p,h,c,f,d;if(o=[],c=t.nodeName,p=null,"path"===c){for(l=t.getAttribute("d").trim(),s=Raphael.parsePathString(l),r="Z"===s[s.length-1],h=r?"Z M":"M",n=[],f=0,d=s.length;d>f;f++)e=s[f],0!==e.length&&("M"===e[0]?(n.length>2&&(o.push(n),n=[]),n.push([e[1],e[2]])):"L"===e[0]?n.push([e[1],e[2]]):"Z"===e[0]&&n.length>2&&(o.push(n),n=[]));n.length>=2&&(o.push(n),n=[]),p=new wr.Path(c,o,r)}else"circle"===c&&(a=t.getAttribute("cx"),i=t.getAttribute("cy"),u=t.getAttribute("r"),p=new wr.Circle(a,i,u));return p},R=function(){function t(t){this.points=t}return t.prototype.clipToBBox=function(r){var e,n,o,a,i,s,l,u,p,h,c,f,d,y,v,m,g,_,b,x;for(c=this,e=(new wr.clipping.CohenSutherland).clip,h=[],i=[],a=!1,o=m=0,g=c.points.length-2;g>=0?g>=m:m>=g;o=g>=0?++m:--m){_=c.points[o],s=_[0],l=_[1],b=c.points[o+1],u=b[0],p=b[1];try{x=e(r,s,l,u,p),f=x[0],y=x[1],d=x[2],v=x[3],a=!0,h.push([f,y]),(u!==d||p!==y||o===len(c.points)-2)&&h.push([d,v])}catch(w){n=w,a&&h.length>1&&(i.push(new t(h)),h=[]),a=!1}}return h.length>1&&i.push(new t(h)),i},t.prototype.toSVG=function(){var t,r,e,n,o,a,i,s;for(r=this,t=[],i=r.points,o=0,a=i.length;a>o;o++)s=i[o],e=s[0],n=s[1],t.push(e+","+n);return"M"+t.join("L")},t}(),Pr.geom.Line=R,Fr=function(t,r){var e,n,o,a,i,s,l,u,p,h,c,f,d,y,v;for(s=Math.PI,n=Math.atan2,p=2*s,i=t.length,e=0,a=y=0,v=i-1;v>=0?v>=y:y>=v;a=v>=0?++y:--y){for(h=t[a][0]-r[0],f=t[a][1]-r[1],c=t[(a+1)%i][0]-r[0],d=t[(a+1)%i][1]-r[1],l=n(f,h),u=n(d,c),o=u-l;o>s;)o-=p;for(;-s>o;)o+=p;e+=o}return Math.abs(e)>=s},Rr=function(t){return Tr(t)>0},Tr=function(t){var r,e,n,o,a,i,s,l;for(n=0,e=t.length,r=l=0;e>=0?e>l:l>e;r=e>=0?++l:--l)o=t[r][0],i=t[r][1],a=t[(r+1)%e][0],s=t[(r+1)%e][1],n+=o*s-a*i;return n*=.5},Lr=Pr.proj=Nr.kartograph.proj={},Function.prototype.bind=function(t){var r;return r=this,function(){return r.apply(t,arguments)}},K=function(){function t(t){var r,e,n;r=this,r.lon0=null!=(e=t.lon0)?e:0,r.lat0=null!=(n=t.lat0)?n:0,r.PI=Math.PI,r.HALFPI=.5*r.PI,r.QUARTERPI=.25*r.PI,r.RAD=r.PI/180,r.DEG=180/r.PI,r.lam0=r.rad(this.lon0),r.phi0=r.rad(this.lat0),r.minLat=-90,r.maxLat=90}return t.parameters=[],t.title="Projection",t.prototype.rad=function(t){return t*this.RAD},t.prototype.deg=function(t){return t*this.DEG},t.prototype.plot=function(t,r){var e,n,o,a,i,s,l,u,p,h,c;for(null==r&&(r=!0),a=[],e=!0,u=0,p=t.length;p>u;u++)h=t[u],o=h[0],n=h[1],i=this._visible(o,n),i&&(e=!1),c=this.project(o,n),s=c[0],l=c[1],!i&&r?a.push(this._truncate(s,l)):a.push([s,l]);return e?null:[a]},t.prototype.sea=function(){var t,r,e,n,o,a,i,s,l,u,p,h,c,f;for(a=this,o=a.project.bind(this),n=[],t=a.lon0,a.lon0=0,e=i=-180;180>=i;e=++i)n.push(o(e,a.maxLat));for(r=s=p=a.maxLat,h=a.minLat;h>=p?h>=s:s>=h;r=h>=p?++s:--s)n.push(o(180,r));for(e=l=180;l>=-180;e=--l)n.push(o(e,a.minLat));for(r=u=c=a.minLat,f=a.maxLat;f>=c?f>=u:u>=f;r=f>=c?++u:--u)n.push(o(-180,r));return a.lon0=t,n},t.prototype.world_bbox=function(){var t,r,e,n,o,i;for(r=this.project.bind(this),n=this.sea(),t=new a,o=0,i=n.length;i>o;o++)e=n[o],t.update(e[0],e[1]);return t},t.prototype.toString=function(){var t;return t=this,"[Proj: "+t.name+"]"},t}(),K.fromXML=function(t){var r,e,n,o,a,i,s;for(n=t.getAttribute("id"),o={},e=i=0,s=t.attributes.length-1;s>=0?s>=i:i>=s;e=s>=0?++i:--i)r=t.attributes[e],"id"!==r.name&&(o[r.name]=r.value);if(null==Lr[n])throw"unknown projection "+n;return a=new Lr[n](o),a.name=n,a},Pr.Proj=K,v=function(t){function r(t){var e,n,o;null==t&&(t={}),e=this,e.flip=Number(null!=(n=t.flip)?n:0),1===e.flip&&(t.lon0=null!=(o=-t.lon0)?o:0),r.__super__.constructor.call(this,t)}return he(r,t),r.parameters=["lon0","flip"],r.title="Cylindrical Projection",r.prototype._visible=function(){return!0},r.prototype.clon=function(t){return t-=this.lon0,-180>t?t+=360:t>180&&(t-=360),t},r.prototype.ll=function(t,r){return 1===this.flip?[-t,-r]:[t,r]},r}(K),b=function(t){function r(){return ae=r.__super__.constructor.apply(this,arguments)}return he(r,t),r.title="Equirectangular Projection",r.prototype.project=function(t,r){var e;return e=this.ll(t,r),t=e[0],r=e[1],t=this.clon(t),[1e3*t*Math.cos(this.phi0),1e3*-1*r]},r}(v),Lr.lonlat=b,h=function(t){function r(t){var e;r.__super__.constructor.call(this,t),this.lat1=null!=(e=t.lat1)?e:0,this.phi1=this.rad(this.lat1)}return he(r,t),r.parameters=["lon0","lat1","flip"],r.title="Cylindrical Equal Area",r.prototype.project=function(t,r){var e,n,o,a,i;return i=this.ll(t,r),t=i[0],r=i[1],e=this.rad(this.clon(t)),n=this.rad(-1*r),o=e*Math.cos(this.phi1),a=Math.sin(n)/Math.cos(this.phi1),[1e3*o,1e3*a]},r}(v),Lr.cea=h,w=function(t){function r(t){t.lat1=45,r.__super__.constructor.call(this,t)}return he(r,t),r.title="Gall-Peters Projection",r.parameters=["lon0","flip"],r}(h),Lr.gallpeters=w,C=function(t){function r(t){t.lat1=37.7,r.__super__.constructor.call(this,t)}return he(r,t),r.title="Hobo-Dyer Projection",r.parameters=["lon0","flip"],r}(h),Lr.hobodyer=C,l=function(t){function r(t){t.lat1=30,r.__super__.constructor.call(this,t)}return he(r,t),r.title="Behrmann Projection",r.parameters=["lon0","flip"],r}(h),Lr.behrmann=l,i=function(t){function r(t){t.lat1=50,r.__super__.constructor.call(this,t)}return he(r,t),r.title="Balthasart Projection",r.parameters=["lon0","flip"],r}(h),Lr.balthasart=i,D=function(t){function r(t){r.__super__.constructor.call(this,t),this.minLat=-85,this.maxLat=85}return he(r,t),r.title="Mercator Projection",r.prototype.project=function(t,r){var e,n,o,a,i,s,l;return a=this,l=a.ll(t,r),t=l[0],r=l[1],n=Math,e=a.rad(a.clon(t)),o=a.rad(-1*r),i=1e3*e,s=1e3*n.log((1+n.sin(o))/n.cos(o)),[i,s]},r}(v),Lr.mercator=D,tr=function(t){function r(){return ie=r.__super__.constructor.apply(this,arguments)}return he(r,t),r.title="Pseudo-Cylindrical Projection",r}(v),Q=function(t){function r(t){var e;r.__super__.constructor.call(this,t),e=this,e.A0=.8707,e.A1=-.131979,e.A2=-.013791,e.A3=.003971,e.A4=-.001529,e.B0=1.007226,e.B1=.015085,e.B2=-.044475,e.B3=.028874,e.B4=-.005916,e.C0=e.B0,e.C1=3*e.B1,e.C2=7*e.B2,e.C3=9*e.B3,e.C4=11*e.B4,e.EPS=1e-11,e.MAX_Y=.8707*.52*Math.PI}return he(r,t),r.title="Natural Earth Projection",r.prototype.project=function(t,r){var e,n,o,a,i,s,l,u;return i=this,u=i.ll(t,r),t=u[0],r=u[1],e=i.rad(i.clon(t)),n=i.rad(-1*r),o=n*n,a=o*o,s=180*e*(i.A0+o*(i.A1+o*(i.A2+a*o*(i.A3+o*i.A4))))+500,l=180*n*(i.B0+o*(i.B1+a*(i.B2+i.B3*o+i.B4*a)))+270,[s,l]},r}(tr),Lr.naturalearth=Q,ir=function(t){function r(t){var e;r.__super__.constructor.call(this,t),e=this,e.X=[1,-5.67239e-12,-715511e-10,311028e-11,.9986,-482241e-9,-24897e-9,-133094e-11,.9954,-831031e-9,-44861e-9,-9.86588e-7,.99,-.00135363,-596598e-10,367749e-11,.9822,-.00167442,-44975e-10,-572394e-11,.973,-.00214869,-903565e-10,1.88767e-8,.96,-.00305084,-900732e-10,164869e-11,.9427,-.00382792,-653428e-10,-261493e-11,.9216,-.00467747,-104566e-9,48122e-10,.8962,-.00536222,-323834e-10,-543445e-11,.8679,-.00609364,-1139e-7,332521e-11,.835,-.00698325,-640219e-10,9.34582e-7,.7986,-.00755337,-500038e-10,9.35532e-7,.7597,-.00798325,-359716e-10,-227604e-11,.7186,-.00851366,-70112e-9,-863072e-11,.6732,-.00986209,-199572e-9,191978e-10,.6213,-.010418,883948e-10,624031e-11,.5722,-.00906601,181999e-9,624033e-11,.5322,0,0,0],e.Y=[0,.0124,3.72529e-10,1.15484e-9,.062,.0124001,1.76951e-8,-5.92321e-9,.124,.0123998,-7.09668e-8,2.25753e-8,.186,.0124008,2.66917e-7,-8.44523e-8,.248,.0123971,-9.99682e-7,3.15569e-7,.31,.0124108,373349e-11,-11779e-10,.372,.0123598,-13935e-9,439588e-11,.434,.0125501,520034e-10,-100051e-10,.4968,.0123198,-980735e-10,922397e-11,.5571,.0120308,402857e-10,-52901e-10,.6176,.0120369,-390662e-10,7.36117e-7,.6769,.0117015,-280246e-10,-8.54283e-7,.7346,.0113572,-408389e-10,-5.18524e-7,.7903,.0109099,-486169e-10,-10718e-10,.8435,.0103433,-646934e-10,5.36384e-9,.8936,.00969679,-646129e-10,-854894e-11,.9394,.00840949,-192847e-9,-421023e-11,.9761,.00616525,-256001e-9,-421021e-11,1,0,0,0],e.NODES=18,e.FXC=.8487,e.FYC=1.3523,e.C1=11.459155902616464,e.RC1=.08726646259971647,e.ONEEPS=1.000001,e.EPS=1e-8}return he(r,t),r.title="Robinson Projection",r.prototype._poly=function(t,r,e){return t[r]+e*(t[r+1]+e*(t[r+2]+e*t[r+3]))},r.prototype.project=function(t,r){var e,n,o,a,i,s,l,u;return i=this,u=i.ll(t,r),t=u[0],r=u[1],t=i.clon(t),n=i.rad(t),o=i.rad(-1*r),a=Math.abs(o),e=Math.floor(a*i.C1),e>=i.NODES&&(e=i.NODES-1),a=i.deg(a-i.RC1*e),e*=4,s=1e3*i._poly(i.X,e,a)*i.FXC*n,l=1e3*i._poly(i.Y,e,a)*i.FYC,0>o&&(l=-l),[s,l]},r}(tr),Lr.robinson=ir,g=function(t){function r(t){var e;r.__super__.constructor.call(this,t),e=this,e.C_x=.4222382003157712,e.C_y=1.3265004281770023,e.RC_y=.7538633073600218,e.C_p=3.5707963267948966,e.RC_p=.2800495767557787,e.EPS=1e-7,e.NITER=6}return he(r,t),r.title="Eckert IV Projection",r.prototype.project=function(t,r){var e,n,o,a,i,s,l,u,p,h,c;for(s=this,c=s.ll(t,r),t=c[0],r=c[1],a=s.rad(s.clon(t)),i=s.rad(-1*r),l=s.C_p*Math.sin(i),e=i*i,i*=.895168+e*(.0218849+.00826809*e),o=s.NITER;o>0&&(n=Math.cos(i),u=Math.sin(i),e=(i+u*(n+2)-l)/(1+n*(n+2)-u*u),i-=e,!(Math.abs(e)i?-s.C_y:s.C_y):(p=s.C_x*a*(1+Math.cos(i)),h=s.C_y*Math.sin(i)),[p,h]},r}(tr),Lr.eckert4=g,ur=function(t){function r(){return se=r.__super__.constructor.apply(this,arguments)}return he(r,t),r.title="Sinusoidal Projection",r.prototype.project=function(t,r){var e,n,o,a,i,s;return n=this,s=n.ll(t,r),t=s[0],r=s[1],e=n.rad(n.clon(t)),o=n.rad(-1*r),a=1032*e*Math.cos(o),i=1032*o,[a,i]},r}(tr),Lr.sinusoidal=ur,U=function(t){function r(t,e,n,o,a){var i,s,l,u;null==e&&(e=1.5707963267948966),null==n&&(n=null),null==o&&(o=null),null==a&&(a=null),r.__super__.constructor.call(this,t),i=this,i.MAX_ITER=10,i.TOLERANCE=1e-7,null!=e?(s=e+e,u=Math.sin(e),l=Math.sqrt(2*Math.PI*u/(s+Math.sin(s))),i.cx=2*l/Math.PI,i.cy=l/u,i.cp=s+Math.sin(s)):null!=n&&null!=o&&"undefined"!=typeof cz&&null!==cz?(i.cx=n,i.cy=o,i.cp=a):Er("kartograph.proj.Mollweide: either p or cx,cy,cp must be defined")}return he(r,t),r.title="Mollweide Projection",r.prototype.project=function(t,r){var e,n,o,a,i,s,l,u,p,h,c;for(s=this,c=s.ll(t,r),t=c[0],r=c[1],i=Math,e=i.abs,a=s.rad(s.clon(t)),l=s.rad(r),o=s.cp*i.sin(l),n=s.MAX_ITER;0!==n&&(u=(l+i.sin(l)-o)/(1+i.cos(l)),l-=u,!(e(u)=0?s.HALFPI:-s.HALFPI:l*=.5,p=1e3*s.cx*a*i.cos(l),h=1e3*s.cy*i.sin(l),[p,-1*h]},r}(tr),Lr.mollweide=U,mr=function(t){function r(t){r.__super__.constructor.call(this,t,1.0471975511965976)}return he(r,t),r.title="Wagner IV Projection",r}(U),Lr.wagner4=mr,gr=function(t){function r(t){r.__super__.constructor.call(this,t,null,.90977,1.65014,3.00896)}return he(r,t),r.title="Wagner V Projection",r}(U),Lr.wagner5=gr,H=function(t){function r(){return le=r.__super__.constructor.apply(this,arguments)}var e,n;return he(r,t),n=-89,e=89,r.parameters=["lon0","lat0","flip"],r.title="Loximuthal Projection (equidistant)",r.prototype.project=function(t,r){var e,n,o,a,i,s,l;return o=this,l=o.ll(t,r),t=l[0],r=l[1],n=Math,e=o.rad(o.clon(t)),a=o.rad(r),i=a===o.phi0?e*n.cos(o.phi0):e*(a-o.phi0)/(n.log(n.tan(o.QUARTERPI+.5*a))-n.log(n.tan(o.QUARTERPI+.5*o.phi0))),i*=1e3,s=1e3*(a-o.phi0),[i,-1*s]},r}(tr),Lr.loximuthal=H,c=function(t){function r(){return ue=r.__super__.constructor.apply(this,arguments)}var e,n,o,a,i;return he(r,t),r.title="Canters Modified Sinusoidal I",r.parameters=["lon0"],e=1.1966,n=-.129,o=3*n,a=-.0076,i=5*a,r.prototype.project=function(t,r){var s,l,u,p,h,c;return s=this,c=s.ll(t,r),t=c[0],r=c[1],t=s.rad(s.clon(t)),r=s.rad(r),p=r*r,h=p*p,l=1e3*t*Math.cos(r)/(e+o*p+i*h),u=1e3*r*(e+n*p+a*h),[l,-1*u] +},r}(tr),Lr.canters1=c,j=function(t){function r(t){r.__super__.constructor.call(this,t)}var e,n,o,a,i,s,l,u,p,h,c,f,d;return he(r,t),r.title="Hatano Projection",l=20,o=1e-7,u=1.000001,e=2.67595,n=2.43763,p=.3736990601468637,h=.4102345310814193,i=1.75859,s=1.93052,f=.5686373742600607,d=.5179951515653813,a=.85,c=1.1764705882352942,r.prototype.project=function(t,r){var u,p,h,c,f,d,y,v,m,g;for(c=this,g=c.ll(t,r),t=g[0],r=g[1],h=c.rad(c.clon(t)),f=c.rad(r),u=Math.sin(f)*(0>f?n:e),p=m=l;m>=1&&(d=(f+Math.sin(f)-u)/(1+Math.cos(f)),f-=d,!(Math.abs(d)f?s:i),[y,-1*v]},r}(tr),Lr.hatano=j,P=function(t){function r(t){var e;r.__super__.constructor.call(this,t),e=this,e.lat1=41.737,e.p1=new U,e.p0=new ur}return he(r,t),r.title="Goode Homolosine Projection",r.parameters=["lon0"],r.prototype.project=function(t,r){var e,n;return e=this,n=e.ll(t,r),t=n[0],r=n[1],t=e.clon(t),Math.abs(r)>e.lat1?e.p1.project(t,r):e.p0.project(t,r)},r}(tr),Lr.goodehomolosine=P,Y=function(t){function r(t){r.__super__.constructor.call(this,t),this.r=100*this.HALFPI}var e;return he(r,t),r.title="Nicolosi Globular Projection",r.parameters=["lon0"],e=1e-10,r.prototype._visible=function(t){var r;return r=this,t=r.clon(t),t>-90&&90>t},r.prototype.project=function(t,r){var n,o,a,i,s,l,u,p,h,c,f,d,y;return s=this,y=s.ll(t,r),t=y[0],r=y[1],a=s.rad(s.clon(t)),u=s.rad(r),Math.abs(a)a?-f:f)),d=Math.sqrt(l*l-(h*h/p+o*h-1)/(1+1/p)),d=s.HALFPI*(l+(0>u?d:-d))),[100*f,-100*d]},r.prototype.sea=function(){var t,r,e,n,o;for(r=[],n=this.r,t=Math,e=o=0;360>=o;e=++o)r.push([t.cos(this.rad(e))*n,t.sin(this.rad(e))*n]);return r},r.prototype.world_bbox=function(){var t;return t=this.r,new a(-t,-t,2*t,2*t)},r}(tr),Lr.nicolosi=Y,o=function(t){function r(t,e){var n;null==e&&(e=1e3),r.__super__.constructor.call(this,t),n=this,n.r=e,n.elevation0=n.to_elevation(n.lat0),n.azimuth0=n.to_azimuth(n.lon0)}return he(r,t),r.parameters=["lon0","lat0"],r.title="Azimuthal Projection",r.prototype.to_elevation=function(t){var r;return r=this,(t+90)/180*r.PI-r.HALFPI},r.prototype.to_azimuth=function(t){var r;return r=this,2*(t+180)/360*r.PI-r.PI},r.prototype._visible=function(t,r){var e,n,o,a,i;return i=this,a=Math,o=i.to_elevation(r),e=i.to_azimuth(t),n=a.sin(o)*a.sin(i.elevation0)+a.cos(i.elevation0)*a.cos(o)*a.cos(e-i.azimuth0),n>=0},r.prototype._truncate=function(t,r){var e,n,o,a,i;return e=Math,n=this.r,o=e.atan2(r-n,t-n),a=n+n*e.cos(o),i=n+n*e.sin(o),[a,i]},r.prototype.sea=function(){var t,r,e,n,o;for(r=[],n=this.r,t=Math,e=o=0;360>=o;e=++o)r.push([n+t.cos(this.rad(e))*n,n+t.sin(this.rad(e))*n]);return r},r.prototype.world_bbox=function(){var t;return t=this.r,new a(0,0,2*t,2*t)},r}(K),W=function(t){function r(){return Dr=r.__super__.constructor.apply(this,arguments)}return he(r,t),r.title="Orthographic Projection",r.prototype.project=function(t,r){var e,n,o,a,i,s,l,u;return a=this,o=Math,n=a.to_elevation(r),e=a.to_azimuth(t),s=a.r*o.cos(n)*o.sin(e-a.azimuth0),u=-a.r*(o.cos(a.elevation0)*o.sin(n)-o.sin(a.elevation0)*o.cos(n)*o.cos(e-a.azimuth0)),i=a.r+s,l=a.r+u,[i,l]},r}(o),Lr.ortho=W,B=function(t){function r(t){r.__super__.constructor.call(this,t),this.scale=.5*Math.sqrt(2)}return he(r,t),r.title="Lambert Azimuthal Equal-Area Projection",r.prototype.project=function(t,r){var e,n,o,a,i,s,l,u,p,h;return i=this.rad(r),o=this.rad(t),a=Math,s=a.sin,e=a.cos,n=a.pow(2/(1+s(this.phi0)*s(i)+e(this.phi0)*e(i)*e(o-this.lam0)),.5),n*=this.scale,u=this.r*n*e(i)*s(o-this.lam0),h=-this.r*n*(e(this.phi0)*s(i)-s(this.phi0)*e(i)*e(o-this.lam0)),l=this.r+u,p=this.r+h,[l,p]},r}(o),Lr.laea=B,I=function(t){function r(){var t;t={lon0:-150,lat0:90},r.__super__.constructor.call(this,t),this.scale=.33*.5*Math.sqrt(2)}return he(r,t),r}(B),N=function(t){function r(t){t={lon0:-157,lat0:20},r.__super__.constructor.call(this,t)}return he(r,t),r}(B),G=function(t){function r(t){t.lon0=-100,t.lat0=45,r.__super__.constructor.call(this,t),this.laea_alaska=new I,this.laea_hawaii=new N}return he(r,t),r.prototype.project=function(t,e){var n,o,a,i,s,l,u;return n=e>44&&(-127>t||t>170),o=-127>t&&44>e,n?(t>170&&(t-=380),s=this.laea_alaska.project(t,e),a=s[0],i=s[1]):o?(l=this.laea_hawaii.project(t,e),a=l[0],i=l[1]):(u=r.__super__.project.call(this,t,e),a=u[0],i=u[1]),n&&(a+=-180,i+=100),o&&(i+=220,a+=-80),[a,i]},r}(B),Lr["laea-usa"]=G,cr=function(t){function r(){return Ur=r.__super__.constructor.apply(this,arguments)}return he(r,t),r.title="Stereographic Projection",r.prototype.project=function(t,r){var e,n,o,a,i,s,l,u,p,h,c;return s=this.rad(r),a=this.rad(t),i=Math,l=i.sin,e=i.cos,o=.5,n=2*o/(1+l(this.phi0)*l(s)+e(this.phi0)*e(s)*e(a-this.lam0)),p=this.r*n*e(s)*l(a-this.lam0),c=-this.r*n*(e(this.phi0)*l(s)-l(this.phi0)*e(s)*e(a-this.lam0)),u=this.r+p,h=this.r+c,[u,h]},r}(o),Lr.stereo=cr,sr=function(t){function r(t){var e,n,o,a,i,s,l,u,p,h;for(r.__super__.constructor.call(this,{lon0:0,lat0:0}),this.dist=null!=(u=t.dist)?u:3,this.up=this.rad(null!=(p=t.up)?p:0),this.tilt=this.rad(null!=(h=t.tilt)?h:0),this.scale=1,a=Number.MAX_VALUE,o=-1*Number.MAX_VALUE,e=s=0;179>=s;e=++s)for(n=l=0;360>=l;n=++l)i=this.project(n-180,e-90),a=Math.min(i[0],a),o=Math.max(i[0],o);this.scale=2*this.r/(o-a),r.__super__.constructor.call(this,t)}return he(r,t),r.parameters=["lon0","lat0","tilt","dist","up"],r.title="Satellite Projection",r.prototype.project=function(t,r,e){var n,o,a,i,s,l,u,p,h,c,f,d,y,v,m,g,_,b,x,w,M;return null==e&&(e=0),c=this.rad(r),p=this.rad(t),h=Math,y=h.sin,a=h.cos,f=this.r,d=f*(e+6371)/3671,i=y(this.phi0)*y(c)+a(this.phi0)*a(c)*a(p-this.lam0),u=(this.dist-1)/(this.dist-i),u=(this.dist-1)/(this.dist-i),u*=this.scale,_=d*u*a(c)*y(p-this.lam0),w=-d*u*(a(this.phi0)*y(c)-y(this.phi0)*a(c)*a(p-this.lam0)),l=a(this.up),m=y(this.up),s=a(this.tilt),v=y(this.tilt),o=d*(this.dist-1),n=(w*l+_*m)*y(this.tilt)/o+s,b=(_*l-w*m)*a(this.tilt)/n,M=(w*l+_*m)/n,g=f+b,x=f+M,[g,x]},r.prototype._visible=function(t,r){var e,n,o,a;return o=this.to_elevation(r),e=this.to_azimuth(t),a=Math,n=a.sin(o)*a.sin(this.elevation0)+a.cos(this.elevation0)*a.cos(o)*a.cos(e-this.azimuth0),n>=1/this.dist},r.prototype.sea=function(){var t,r,e,n,o;for(r=[],n=this.r,t=Math,e=o=0;360>=o;e=++o)r.push([n+t.cos(this.rad(e))*n,n+t.sin(this.rad(e))*n]);return r},r}(o),Lr.satellite=sr,_=function(t){function r(){return Qr=r.__super__.constructor.apply(this,arguments)}return he(r,t),r.title="Equidistant Azimuthal Projection",r.prototype.project=function(t,r){var e,n,o,a,i,s,l,u,p,h,c,f,d;return l=this,u=l.rad(r),i=l.rad(t),s=Math,p=s.sin,n=s.cos,o=p(this.phi0)*p(u)+n(this.phi0)*n(u)*n(i-this.lam0),e=s.acos(o),a=.325*e/p(e),c=this.r*a*n(u)*p(i-this.lam0),d=-this.r*a*(n(this.phi0)*p(u)-p(this.phi0)*n(u)*n(i-this.lam0)),h=this.r+c,f=this.r+d,[h,f]},r.prototype._visible=function(){return!0},r}(o),Lr.equi=_,n=function(t){function r(t){var e;e=this,t.lat0=0,r.__super__.constructor.call(this,t),e.lam0=0}var e;return he(r,t),r.title="Aitoff Projection",r.parameters=["lon0"],e=.6366197723675814,r.prototype.project=function(t,r){var n,o,a,i,s,l,u,p;return i=this,p=i.ll(t,r),t=p[0],r=p[1],t=i.clon(t),a=i.rad(t),s=i.rad(r),n=.5*a,o=Math.acos(Math.cos(s)*Math.cos(n)),0!==o?(u=1/Math.sin(o),l=2*o*Math.cos(s)*Math.sin(n)*u,u*=o*Math.sin(s)):l=u=0,i.winkel&&(l=.5*(l+a*e),u=.5*(u+s)),[1e3*l,-1e3*u]},r.prototype._visible=function(){return!0},r}(tr),Lr.aitoff=n,_r=function(t){function r(t){r.__super__.constructor.call(this,t),this.winkel=!0}return he(r,t),r.title="Winkel Tripel Projection",r}(n),Lr.winkel3=_r,y=function(t){function r(t){var e,n,o;e=this,r.__super__.constructor.call(this,t),e.lat1=null!=(n=t.lat1)?n:30,e.phi1=e.rad(e.lat1),e.lat2=null!=(o=t.lat2)?o:50,e.phi2=e.rad(e.lat2)}return he(r,t),r.title="Conic Projection",r.parameters=["lon0","lat0","lat1","lat2"],r.prototype._visible=function(t,r){var e;return e=this,r>e.minLat&&rt?t+=360:t>180&&(t-=360),t},r}(K),z=function(t){function r(t){var e,n,o,a,i,s,l,u,p,h,c,f,d;p=this,r.__super__.constructor.call(this,t),i=Math,d=[i.sin,i.cos,i.abs,i.log,i.tan,i.pow],h=d[0],o=d[1],e=d[2],jr=d[3],f=d[4],l=d[5],p.n=s=c=h(p.phi1),a=o(p.phi1),u=e(p.phi1-p.phi2)>=1e-10,u&&(s=jr(a/o(p.phi2))/jr(f(p.QUARTERPI+.5*p.phi2)/f(p.QUARTERPI+.5*p.phi1))),p.c=n=a*l(f(p.QUARTERPI+.5*p.phi1),s)/s,p.rho0=e(e(p.phi0)-p.HALFPI)<1e-10?0:n*l(f(p.QUARTERPI+.5*p.phi0),-s),p.minLat=-60,p.maxLat=85}return he(r,t),r.title="Lambert Conformal Conic Projection",r.prototype.project=function(t,r){var e,n,o,a,i,s,l,u,p,h,c,f,d,y,v;return h=this,l=h.rad(r),o=h.rad(h.clon(t)),i=Math,v=[i.sin,i.cos,i.abs,i.log,i.tan,i.pow],c=v[0],n=v[1],e=v[2],jr=v[3],f=v[4],u=v[5],s=h.n,p=e(e(l)-h.HALFPI)<1e-10?0:h.c*u(f(h.QUARTERPI+.5*l),-s),a=o*s,d=1e3*p*c(a),y=1e3*(h.rho0-p*n(a)),[d,-1*y]},r}(y),Lr.lcc=z,J=function(t){function r(){return Yr=r.__super__.constructor.apply(this,arguments)}return he(r,t),r}(y),vr=function(){function t(t,r,e,n,o,a){var i;i=this,i.bbox=t,i.width=r,i.padding=null!=n?n:0,i.halign=null!=o?o:"center",i.valign=null!=a?a:"center",i.height=e,i.scale=Math.min((r-2*n)/t.width,(e-2*n)/t.height)}return t.prototype.project=function(t,r){var e,n,o,a,i,s,l;return null==r&&(r=t[1],t=t[0]),o=this,a=o.scale,e=o.bbox,n=o.height,i=o.width,s="center"===o.halign?.5*(i-e.width*a):"left"===o.halign?o.padding*a:i-(e.width-o.padding)*a,l="center"===o.valign?.5*(n-e.height*a):"top"===o.valign?o.padding*a:0,t=(t-e.left)*a+s,r=(r-e.top)*a+l,[t,r]},t.prototype.projectPath=function(t){var r,e,n,o,a,i,s,l,u,p,h,c,f,d,y,v,m;if(o=this,"path"===t.type){for(n=[],r=[99999,99999,-99999,-99999],d=t.contours,p=0,c=d.length;c>p;p++){for(i=d[p],e=[],h=0,f=i.length;f>h;h++)y=i[h],l=y[0],u=y[1],v=o.project(l,u),l=v[0],u=v[1],e.push([l,u]),r[0]=Math.min(r[0],l),r[1]=Math.min(r[1],u),r[2]=Math.max(r[2],l),r[3]=Math.max(r[3],u);n.push(e)}return a=new wr.Path(t.type,n,t.closed),a._bbox=r,a}return"circle"===t.type?(m=o.project(t.x,t.y),l=m[0],u=m[1],s=t.r*o.scale,new wr.Circle(l,u,s)):void 0},t.prototype.asBBox=function(){var t;return t=this,new a(0,0,t.width,t.height)},t}(),vr.fromXML=function(t){var r,e,n,o,i;return i=Number(t.getAttribute("w")),n=Number(t.getAttribute("h")),o=Number(t.getAttribute("padding")),e=t.getElementsByTagName("bbox")[0],r=a.fromXML(e),new vr(r,i,n,o)},Nr.kartograph.View=vr,L.prototype.dotgrid=function(t){var r,e,n,o,a,i,s,l,u,p,h,c,f,d,y,v,m,g,_,b,x,w,M,P,j,C,A,k,S,L,B,I,N,G,z,E,T,R,F,V,O,H,q,X,D,U,Q,Y,W;if(m=this,v=null!=(T=t.layer)?T:m.layerIds[m.layerIds.length-1],!m.layers.hasOwnProperty(v))return Er('dotgrid error: layer "'+v+'" not found'),void 0;if(y=m.layers[v],e=t.data,n=t.value,o=t.key,_={},null!=o&&"array"===Vr(e))for(A=0,B=e.length;B>A;A++)w=e[A],d=w[o],_[String(d)]=w;else for(d in e)w=e[d],_[String(d)]=w;if(l=null!=(R=t.style)?R:{fill:"black",stroke:"none"},P=t.size,f=null!=(F=t.gridsize)?F:15,s=null!=(V=y.dotgrid)?V:y.dotgrid={gridsize:f,grid:[]},s.gridsize!==f)for(O=s.grid,k=0,I=O.length;I>k;k++)c=O[k],null!=c.shape&&(c.shape.remove(),c.shape=null);if(f>0){if(0===s.grid.length)for(j=S=0,H=m.viewport.width;f>0?H>=S:S>=H;j=S+=f)for(C=L=0,q=m.viewport.height;f>0?q>=L:L>=q;C=L+=f){c={x:j+.2*(Math.random()-.5)*f,y:C+.2*(Math.random()-.5)*f,pathid:!1},h=!1,X=y.pathsById;for(d in X){for(b=X[d],z=0,N=b.length;N>z;z++)if(g=b[z],g.vpath.isInside(c.x,c.y)){h=!0,x=null!=(D=_[d])?D:null,M=P(x),c.pathid=d,c.shape=y.paper.circle(c.x,c.y,1);break}if(h)break}s.grid.push(c)}for(U=s.grid,E=0,G=U.length;G>E;E++)c=U[E],c.pathid&&(x=null!=(Q=_[c.pathid])?Q:null,M=P(x),p=null!=(Y=t.duration)?Y:0,a=null!=(W=t.delay)?W:0,i="function"===Vr(a)?a(x):a,p>0&&Raphael.svg?(r=Raphael.animation({r:.5*M},p),c.shape.animate(r.delay(i))):c.shape.attr({r:.5*M}),u="function"===Vr(l)?l(x):l,c.shape.attr(u))}},xr=null!=(Wr=Pr.filter)?Wr:Pr.filter={},xr.__knownFilter={},xr.__patternFills=0,q.prototype.SVG=function(t,r){var e,n;if("string"==typeof t&&(t=window.document.createElementNS("http://www.w3.org/2000/svg",t)),r)for(e in r)n=r[e],t.setAttribute(e,n);return t},L.prototype.addFilter=function(t,r,e){var n,o,a;if(null==e&&(e={}),a=this,n=window.document,null==Pr.filter[r])throw"unknown filter type "+r;return o=new xr[r](e).getFilter(t),a.paper.defs.appendChild(o)},q.prototype.applyFilter=function(t){var r;return r=this,e("."+r.id,r.paper.canvas).attr({filter:"url(#"+t+")"})},q.prototype.applyTexture=function(t,r,e){var n,o,a,i,s,l;for(null==r&&(r=!1),null==e&&(e="#000"),o=this,xr.__patternFills+=1,s=o.paths,l=[],a=0,i=s.length;i>a;a++)n=s[a],!r||r(n.data)?l.push(n.svgPath.attr({fill:"url("+t+")"})):l.push(n.svgPath.attr("fill",e));return l},x=function(){function t(t){this.params=null!=t?t:{}}return t.prototype.getFilter=function(t){var r,e;return e=this,r=e.SVG("filter",{id:t}),e.buildFilter(r),r},t.prototype._getFilter=function(){throw"not implemented"},t.prototype.SVG=function(t,r){var e,n;if("string"==typeof t&&(t=window.document.createElementNS("http://www.w3.org/2000/svg",t)),r)for(e in r)n=r[e],t.setAttribute(e,n);return t},t}(),u=function(t){function r(){return Zr=r.__super__.constructor.apply(this,arguments)}return he(r,t),r.prototype.buildFilter=function(t){var r,e,n;return n=this,r=n.SVG,e=r("feGaussianBlur",{stdDeviation:n.params.size||4,result:"blur"}),t.appendChild(e)},r}(x),xr.blur=u,Mr=function(t){var r,e,n,o;if(t.trim().match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/))return(4===t.length||7===t.length)&&(t=t.substr(1)),3===t.length&&(t=t.split(""),t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),o=parseInt(t,16),n=o>>16,e=255&o>>8,r=255&o,[n,e,r];throw'unknown color format: "'+t+'"'},M=function(t){function r(){return $r=r.__super__.constructor.apply(this,arguments)}return he(r,t),r.prototype.buildFilter=function(t){var r,e,n,o,a,i,s,l,u,p,h,c,f;a=this,e=null!=(l=a.params.blur)?l:4,s=null!=(u=a.params.strength)?u:1,i=null!=(p=a.params.color)?p:"#D1BEB0","string"===Vr(i)&&(i=Mr(i)),n=null!=(h=a.params.inner)?h:!1,o=null!=(c=a.params.knockout)?c:!1,r=null!=(f=a.params.alpha)?f:1,n?a.innerGlow(t,e,s,i,r,o):a.outerGlow(t,e,s,i,r,o)},r.prototype.outerGlow=function(t,r,e,n,o,a){var i,s,l,u,p,h,c;return p=this,i=p.SVG,u=i("feColorMatrix",{"in":"SourceGraphic",type:"matrix",values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0",result:"mask"}),t.appendChild(u),e>0&&(c=i("feMorphology",{"in":"mask",radius:e,operator:"dilate",result:"mask"}),t.appendChild(c)),u=i("feColorMatrix",{"in":"mask",type:"matrix",values:"0 0 0 0 "+n[0]/255+" 0 0 0 0 "+n[1]/255+" 0 0 0 0 "+n[2]/255+" 0 0 0 1 0",result:"r0"}),t.appendChild(u),s=i("feGaussianBlur",{"in":"r0",stdDeviation:r,result:"r1"}),t.appendChild(s),l=i("feComposite",{operator:"out","in":"r1",in2:"mask",result:"comp"}),t.appendChild(l),h=i("feMerge"),a||h.appendChild(i("feMergeNode",{"in":"SourceGraphic"})),h.appendChild(i("feMergeNode",{"in":"r1"})),t.appendChild(h)},r.prototype.innerGlow=function(t,r,e,n,o,a){var i,s,l,u,p,h,c;return p=this,i=p.SVG,jr("innerglow"),u=i("feColorMatrix",{"in":"SourceGraphic",type:"matrix",values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0",result:"mask"}),t.appendChild(u),c=i("feMorphology",{"in":"mask",radius:e,operator:"erode",result:"r1"}),t.appendChild(c),s=i("feGaussianBlur",{"in":"r1",stdDeviation:r,result:"r2"}),t.appendChild(s),u=i("feColorMatrix",{type:"matrix","in":"r2",values:"1 0 0 0 "+n[0]/255+" 0 1 0 0 "+n[1]/255+" 0 0 1 0 "+n[2]/255+" 0 0 0 -1 1",result:"r3"}),t.appendChild(u),l=i("feComposite",{operator:"in","in":"r3",in2:"mask",result:"comp"}),t.appendChild(l),h=i("feMerge"),a||h.appendChild(i("feMergeNode",{"in":"SourceGraphic"})),h.appendChild(i("feMergeNode",{"in":"comp"})),t.appendChild(h)},r}(x),xr.glow=M,L.prototype.addGeoPath=function(t,r,e){var n,o,a;return null==r&&(r=[]),null==e&&(e=""),n=this,a=n.getGeoPathStr(t,r),o=n.paper.path(a),""!==e&&o.node.setAttribute("class",e),o},L.prototype.getGeoPathStr=function(t,r){var e,n,o,a,i,s,l;null==r&&(r=[]),o=this,"string"===Vr(r)&&(r=r.split("")),0===r.length&&r.push("M"),a="";for(n in t)i=t[n],e=null!=(l=r[n])?l:"L",s=o.lonlat2xy(i),isNaN(s[0])||isNaN(s[1])||(a+=e+s[0]+","+s[1]);return a},L.prototype.addGeoPolygon=function(t,r){var e,n,o;o=this,e=["M"];for(n in t)e.push("L");return e.push("Z"),o.addGeoPath(t,e,r)},lr=function(){function t(t,r,e){var n,o,a,i;null==t&&(t=[0,1]),null==r&&(r=null),null==e&&(e=null),this.rangedScale=ce(this.rangedScale,this),this.scale=ce(this.scale,this),o=this,i=[];for(n in t)("function"!==Vr(e)||e(t[n])!==!1)&&(a=null!=r?"function"===Vr(r)?r(t[n]):t[n][r]:t[n],isNaN(a)||i.push(a));i=i.sort(function(t,r){return t-r}),o.values=i,o._range=[0,1],o.rangedScale.range=function(t){return o._range=t,o.rangedScale}}return t.prototype.scale=function(t){return t},t.prototype.rangedScale=function(t){var r,e;return r=this,t=r.scale(t),e=r._range,t*(e[1]-e[0])+e[0]},t}(),F=function(t){function r(){return this.scale=ce(this.scale,this),Kr=r.__super__.constructor.apply(this,arguments)}return he(r,t),r.prototype.scale=function(t){var r,e;return r=this,e=r.values,(t-e[0])/(e[e.length-1]-e[0])},r}(lr),V=function(t){function r(){return this.scale=ce(this.scale,this),Jr=r.__super__.constructor.apply(this,arguments)}return he(r,t),r.prototype.scale=function(t){var r,e;return r=this,e=r.values,jr=Math.log,(jr(t)-jr(e[0]))/(jr(e[e.length-1])-jr(e[0]))},r}(lr),pr=function(t){function r(){return this.scale=ce(this.scale,this),te=r.__super__.constructor.apply(this,arguments)}return he(r,t),r.prototype.scale=function(t){var r,e;return r=this,e=r.values,Math.sqrt((t-e[0])/(e[e.length-1]-e[0]))},r}(lr),rr=function(t){function r(){return this.scale=ce(this.scale,this),ee=r.__super__.constructor.apply(this,arguments)}return he(r,t),r.prototype.scale=function(t){var r,e,n,o,a,i;n=this,i=n.values,e=i.length-1;for(r in i){if(a=i[Number(r)],o=i[Number(r)+1],t===a)return r/e;if(e>r&&t>a&&o>t)return r/e+(t-a)/(o-a)}},r}(lr),Gr=Nr.kartograph.scale={},Gr.identity=function(){return new lr(domain,prop,xr).rangedScale},Gr.linear=function(t,r,e){return new F(t,r,e).rangedScale},Gr.log=function(t,r,e){return new V(t,r,e).rangedScale},Gr.sqrt=function(t,r,e){return new pr(t,r,e).rangedScale},Gr.quantile=function(t,r,e){return new rr(t,r,e).rangedScale},dr=function(){function t(t){r=this,r.location=t.location,r.data=t.data,r.map=t.map,r.layers=t.layers,r.key=t.key,r.x=t.x,r.y=t.y}var r;return r=null,t.prototype.init=function(){return r},t.prototype.overlaps=function(){return!1},t.prototype.update=function(){return r},t.prototype.nodes=function(){return[]},t.prototype.clear=function(){return r},t}(),Pr.Symbol=dr,yr=function(){function r(t){this._initTooltips=ce(this._initTooltips,this),this._noverlap=ce(this._noverlap,this),this._kMeans=ce(this._kMeans,this);var e,o,a,i,s,l,u,p,h,c,f,d,y,v,m,g,_,b,x,w;for(n=this,c=["data","location","type","map"],p=["filter","tooltip","click","delay","sortBy","clustering","aggregate","clusteringOpts","mouseenter","mouseleave"],f=0,m=c.length;m>f;f++){if(h=c[f],null==t[h])throw"SymbolGroup: missing argument '"+h+"'";n[h]=t[h]}for(d=0,g=p.length;g>d;d++)h=p[d],null!=t[h]&&(n[h]=t[h]);if(e=n.type,null==e)return Er("could not resolve symbol type",n.type),void 0;for(x=e.props,y=0,_=x.length;_>y;y++)h=x[y],null!=t[h]&&(n[h]=t[h]);for(n.layers={mapcanvas:n.map.paper},w=e.layers,v=0,b=w.length;b>v;v++)s=w[v],u=r._layerid++,i="sl_"+u,"svg"===s.type?l=n.map.createSVGLayer(i):"html"===s.type&&(l=n.map.createHTMLLayer(i)),n.layers[s.id]=l;n.symbols=[];for(a in n.data)o=n.data[a],"function"===Vr(n.filter)?n.filter(o,a)&&n.add(o,a):n.add(o,a);n.layout(),n.render(),n.map.addSymbolGroup(n)}var n;return n=null,r.prototype.add=function(t,r){var e,o,a,i,s,l,u,p;for(n=this,e=n.type,o=n._evaluate(n.location,t,r),"array"===Vr(o)&&(o=new O(o[0],o[1])),i={layers:n.layers,location:o,data:t,key:null!=r?r:n.symbols.length,map:n.map},p=e.props,l=0,u=p.length;u>l;l++)a=p[l],null!=n[a]&&(i[a]=n._evaluate(n[a],t,r));return s=new e(i),n.symbols.push(s),s},r.prototype.layout=function(){var t,r,e,o,a,i,s,l,u,p;for(u=n.symbols,s=0,l=u.length;l>s;s++){if(a=u[s],r=a.location,"string"===Vr(r)){if(p=r.split("."),t=p[0],o=p[1],e=n.map.getLayerPath(t,o),null==e){Er("could not find layer path "+t+"."+o);continue}i=n.map.viewBC.project(e.path.centroid())}else i=n.map.lonlat2xy(r);a.x=i[0],a.y=i[1]}return"k-means"===n.clustering?n._kMeans():"noverlap"===n.clustering&&n._noverlap(),n},r.prototype.render=function(){var t,r,o,a,i,s,l,u,p,h,c;for(n=this,n.sortBy&&(a="asc","string"===Vr(n.sortBy)&&(n.sortBy=n.sortBy.split(" ",2),o=n.sortBy[0],a=null!=(p=n.sortBy[1])?p:"asc"),n.symbols=n.symbols.sort(function(t,r){var e,i,s;return"function"===Vr(n.sortBy)?(i=n.sortBy(t.data,t),s=n.sortBy(r.data,r)):(i=t[o],s=r[o]),i===s?0:(e="asc"===a?1:-1,i>s?1*e:-1*e)})),h=n.symbols,i=0,l=h.length;l>i;i++)for(r=h[i],r.render(),c=r.nodes(),s=0,u=c.length;u>s;s++)t=c[s],t.symbol=r;return"function"===Vr(n.tooltip)&&n._initTooltips(),e.each(["click","mouseenter","mouseleave"],function(o,a){var i,s,l,u;if("function"===Vr(n[a])){for(l=n.symbols,u=[],i=0,s=l.length;s>i;i++)r=l[i],u.push(function(){var o,i,s,l;for(s=r.nodes(),l=[],o=0,i=s.length;i>o;o++)t=s[o],l.push(e(t)[a](function(t){var r;for(r=t.target;!r.symbol;)r=e(r).parent().get(0);return t.stopPropagation(),n[a](r.symbol.data,r.symbol,t)}));return l}.call(this));return u}}),n},r.prototype.tooltips=function(t){return n=this,n.tooltips=t,n._initTooltips(),n},r.prototype.remove=function(t){var r,e,o,a,i,s,l,u,p,h;for(n=this,o=[],u=n.symbols,s=0,l=u.length;l>s;s++)if(i=u[s],null==t||t(i.data))try{i.clear()}catch(c){r=c,Er("error: symbolgroup.remove")}else o.push(i);if(null==t){p=n.layers,h=[];for(e in p)a=p[e],"mapcanvas"!==e?h.push(a.remove()):h.push(void 0);return h}return n.symbols=o},r.prototype._evaluate=function(t,r,e){var n;return n="function"===Vr(t)?t(r,e):t},r.prototype._kMeans=function(){var r,e,o,a,i,s,l,u,p,h,c,f,d,y,v,m,g,_,b,x,w,M,P;for(n=this,null==(x=n.osymbols)&&(n.osymbols=n.symbols),r=n.type,null!=n.clusteringOpts&&(h=n.clusteringOpts.size),null==h&&(h=64),e=t().iterations(16).size(h),w=n.osymbols,f=0,m=w.length;m>f;f++)p=w[f],e.add({x:p.x,y:p.y});for(s=e.means(),l=[],d=0,g=s.length;g>d;d++)if(i=s[d],0!==i.size){for(o=[],M=i.indices,y=0,_=M.length;_>y;y++)a=M[y],o.push(n.osymbols[a].data);for(o=n.aggregate(o),c={layers:n.layers,location:!1,data:o,map:n.map},P=r.props,v=0,b=P.length;b>v;v++)u=P[v],null!=n[u]&&(c[u]=n._evaluate(n[u],o));p=new r(c),p.x=i.x,p.y=i.y,l.push(p)}return n.symbols=l},r.prototype._noverlap=function(){var t,r,e,o,a,i,s,l,u,p,h,c,f,d,y,v,m,g,_,b,x,w,M,P,j,C,A,k,S,L,B,I,N,G,z,E,T,R,F,V,O,H,q,X,D,U,Q;if(n=this,null==(H=n.osymbols)&&(n.osymbols=n.symbols),u=3,t=n.type,fe.call(t.props,"radius")<0)return Er('noverlap layout only available for symbols with property "radius"'),void 0;for(C=n.osymbols.slice(),null!=n.clusteringOpts&&(S=n.clusteringOpts.tolerance,f=n.clusteringOpts.maxRatio),null==S&&(S=.05),null==f&&(f=.8),s=N=0,q=u-1;q>=0?q>=N:N>=q;s=q>=0?++N:--N){for(C.sort(function(t,r){return r.radius-t.radius}),p=C.length,d=[],y=G=0,X=p-3;X>=0?X>=G:G>=X;y=X>=0?++G:--G)if(M=C[y]){for(b=M.radius*(1-S),h=M.x-b,g=M.x+b,A=M.y-b,r=M.y+b,l=[],v=z=D=y+1,U=p-2;U>=D?U>=z:z>=U;v=U>=D?++z:--z)P=C[v],P&&(x=P.radius,c=P.x-x,_=P.x+x,k=P.y-x,e=P.y+x,x/M.radiusg||h>_||k>r||A>e||(a=P.x-M.x,i=P.y-M.y,(b+x)*(b+x)>a*a+i*i&&l.push(v))));if(l.length>0){for(o=[M.data],m=M.radius*M.radius,E=0,T=l.length;T>E;E++)s=l[E],o.push(C[s].data),m+=C[s].radius*C[s].radius;for(o=n.aggregate(o),j={layers:n.layers,location:!1,data:o,map:n.map},Q=t.props,V=0,R=Q.length;R>V;V++)y=Q[V],null!=n[y]&&(j[y]=n._evaluate(n[y],o));for(w=new t(j),L=M.radius*M.radius/m,B=M.x*L,I=M.y*L,O=0,F=l.length;F>O;O++)s=l[O],P=C[s],L=P.radius*P.radius/m,B+=P.x*L,I+=P.y*L,C[s]=void 0;w.x=B,w.y=I,C[y]=void 0,d.push(w)}else d.push(M)}C=d}return n.symbols=C},r.prototype._initTooltips=function(){var t,r,o,a,i,s,l,u,p,h,c;for(n=this,a=n.tooltip,h=n.symbols,s=0,u=h.length;u>s;s++)for(o=h[s],t={position:{target:"mouse",viewport:e(window),adjust:{x:7,y:7}},show:{delay:20},content:{},events:{show:function(t,r){return e(".qtip").filter(function(){return this!==r.elements.tooltip.get(0)}).hide()}}},i=a(o.data,o.key),"string"===Vr(i)?t.content.text=i:"array"===Vr(i)&&(t.content.title=i[0],t.content.text=i[1]),c=o.nodes(),l=0,p=c.length;p>l;l++)r=c[l],e(r).qtip(t)},r.prototype.onResize=function(){var t,r,e,o;for(n=this,n.layout(),o=n.symbols,r=0,e=o.length;e>r;r++)t=o[r],t.update()},r.prototype.update=function(t,r,e){var o,a,i,s,l,u,p,h;for(n=this,null==t&&(t={}),p=n.symbols,i=0,l=p.length;l>i;i++){for(a=p[i],h=n.type.props,s=0,u=h.length;u>s;s++)o=h[s],null!=t[o]?a[o]=n._evaluate(t[o],a.data):null!=n[o]&&(a[o]=n._evaluate(n[o],a.data));a.update(r,e)}return n},r}(),yr._layerid=0,Pr.SymbolGroup=yr,L.prototype.addSymbols=function(t){return t.map=this,new yr(t)},Pr.dorlingLayout=function(t,r){var n,o,a,i,s,l,u,p,h,c,f,d,y,v,m;for(null==r&&(r=40),f=[],e.each(t.symbols,function(t,r){return f.push({i:t,x:r.path.attrs.cx,y:r.path.attrs.cy,r:r.path.attrs.r})}),f.sort(function(t,r){return r.r-t.r}),a=function(){var r,e,n;for(e=0,n=f.length;n>e;e++)r=f[e],t.symbols[r.i].path.attr({cx:r.x,cy:r.y})},d=m=1;r>=1?r>=m:m>=r;d=r>=1?++m:--m)for(h in f)for(c in f)if(c>h){if(n=f[h],o=f[c],n.x+n.ro.x+o.r)continue;if(n.y+n.ro.y+o.r)continue;l=n.x-o.x,u=n.y-o.y,s=l*l+u*u,y=n.r+o.r,v=y*y,v>s&&(i=Math.sqrt(s),p=10/i,n.x+=l*p*(1-n.r/y),n.y+=u*p*(1-n.r/y),o.x-=l*p*(1-o.r/y),o.y-=u*p*(1-o.r/y))}return a()},p=function(t){function r(t){this.nodes=ce(this.nodes,this),this.clear=ce(this.clear,this),this.update=ce(this.update,this),this.render=ce(this.render,this),this.overlaps=ce(this.overlaps,this);var e,n,o;e=this,r.__super__.constructor.call(this,t),e.radius=null!=(n=t.radius)?n:4,e.style=t.style,e.attrs=t.attrs,e.title=t.title,e["class"]=null!=(o=t["class"])?o:"bubble"}return he(r,t),r.prototype.overlaps=function(t){var r,e,n,o,a,i,s,l,u,p,h;return n=this,p=[n.x,n.y,n.radius],i=p[0],l=p[1],o=p[2],h=[t.x,t.y,t.radius],s=h[0],u=h[1],a=h[2],i-o>s+a||s-a>i+o||l-o>u+a||u-a>l+o?!1:(r=i-s,e=l-u,r*r+e*e>(o+a)*(o+a)?!1:!0)},r.prototype.render=function(){var t;return t=this,null==t.path&&(t.path=t.layers.mapcanvas.circle(t.x,t.y,t.radius)),t.update(),t.map.applyCSS(t.path),t},r.prototype.update=function(t,r){var n,o,a;return null==t&&(t=!1),null==r&&(r="expo-out"),o=this,a=o.path,n={cx:o.x,cy:o.y,r:o.radius},null!=o.attrs&&(n=e.extend(n,o.attrs)),t?a.animate(n,t,r):a.attr(n),null!=a.node&&(null!=o.style&&a.node.setAttribute("style",o.style),null!=o["class"]&&a.node.setAttribute("class",o["class"])),null!=o.title&&a.attr("title",o.title),o},r.prototype.clear=function(){var t;return t=this,t.path.remove(),t},r.prototype.nodes=function(){var t;return t=this,[t.path.node]},r}(dr),p.props=["radius","style","class","title","attrs"],p.layers=[],Nr.kartograph.Bubble=p,k=function(t){function r(t){var e,n,o,a,i,s;e=this,r.__super__.constructor.call(this,t),e.icon=null!=(n=t.icon)?n:"",e.offset=null!=(o=t.offset)?o:[0,0],e.iconsize=null!=(a=t.iconsize)?a:[10,10],e["class"]=null!=(i=t["class"])?i:"",e.title=null!=(s=t.title)?s:""}return he(r,t),r.prototype.render=function(){var t,r;return r=this,t=r.map.container,r.img=e(""),r.img.attr({src:r.icon,title:r.title,alt:r.title,width:r.iconsize[0],height:r.iconsize[1]}),r.img.addClass(r["class"]),r.img.css({position:"absolute","z-index":1e3,cursor:"pointer"}),r.img[0].symbol=r,t.append(r.img),r.update()},r.prototype.update=function(){var t;return t=this,t.img.css({left:t.x+t.offset[0]+"px",top:t.y+t.offset[1]+"px"})},r.prototype.clear=function(){var t;return t=this,t.img.remove(),t},r.prototype.nodes=function(){var t;return t=this,[t.img]},r}(Pr.Symbol),k.props=["icon","offset","class","title","iconsize"],k.layers=[],Nr.kartograph.Icon=k,fr=function(t){function r(t){var e,n,o,a,i;e=this,r.__super__.constructor.call(this,t),e.text=null!=(n=t.text)?n:"",e.style=null!=(o=t.style)?o:"",e["class"]=null!=(a=t["class"])?a:"",e.offset=null!=(i=t.offset)?i:[0,0]}return he(r,t),r.prototype.render=function(){var t,r;return r=this,r.lbl=t=r.layers.mapcanvas.text(r.x,r.y,r.text),r.update(),r},r.prototype.update=function(){var t;return t=this,t.lbl.attr({x:t.x+t.offset[0],y:t.y+t.offset[1]}),t.lbl.node.setAttribute("style",t.style),t.lbl.node.setAttribute("class",t["class"])},r.prototype.clear=function(){var t;return t=this,t.lbl.remove(),t},r.prototype.nodes=function(){var t;return t=this,[t.lbl.node]},r}(Pr.Symbol),fr.props=["text","style","class","offset"],fr.layers=[],Nr.kartograph.Label=fr,A=function(t){function r(t){var e,n,o,a;e=this,r.__super__.constructor.call(this,t),e.text=null!=(n=t.text)?n:"",e.css=null!=(o=t.css)?o:"",e["class"]=null!=(a=t["class"])?a:""}return he(r,t),r.prototype.render=function(){var t,r,n;return n=this,t=e("
"+n.text+"
"),t.css({width:"80px",position:"absolute",left:"-40px","text-align":"center"}),n.lbl=r=e('
'),r.append(t),n.layers.lbl.append(r),t.css({height:t.height()+"px",top:t.height()*-.4+"px"}),n.update(),n},r.prototype.update=function(){var t;return t=this,t.lbl.css({position:"absolute",left:t.x+"px",top:t.y+"px"}),t.lbl.css(t.css)},r.prototype.clear=function(){var t;return t=this,t.lbl.remove(),t},r.prototype.nodes=function(){var t;return t=this,[t.lbl[0]]},r}(Pr.Symbol),A.props=["text","css","class"],A.layers=[{id:"lbl",type:"html"}],Nr.kartograph.HtmlLabel=A,E=function(t){function r(t){this.nodes=ce(this.nodes,this),this.clear=ce(this.clear,this),this.update=ce(this.update,this),this.render=ce(this.render,this);var e,n,o;e=this,r.__super__.constructor.call(this,t),e.labelattrs=null!=(n=t.labelattrs)?n:{},e.buffer=t.buffer,e.center=null!=(o=t.center)?o:!0}return he(r,t),r.prototype.render=function(t){var e;return e=this,null!=e.title&&""!==String(e.title).trim()&&(e.buffer&&(e.bufferlabel=e.layers.mapcanvas.text(e.x,e.y,e.title)),e.label=e.layers.mapcanvas.text(e.x,e.y,e.title)),r.__super__.render.call(this,t),e},r.prototype.update=function(t,n){var o,a,i,s,l;return null==t&&(t=!1),null==n&&(n="expo-out"),a=this,r.__super__.update.call(this,t,n),null!=a.label&&(i=a.map.viewport,o=e.extend({},a.labelattrs),s=a.x,l=a.y,a.center?l-=0:s>.5*i.width?(o["text-anchor"]="end",s-=a.radius+5):s<.5*i.width&&(o["text-anchor"]="start",s+=a.radius+5),o.x=s,o.y=l,a.buffer&&(a.bufferlabel.attr(o),a.bufferlabel.attr({stroke:"#fff",fill:"#fff","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":6})),a.label.attr(o),a.label.toFront()),a},r.prototype.clear=function(){var t;return t=this,r.__super__.clear.apply(this,arguments)},r.prototype.nodes=function(){var t,e;return t=this,e=r.__super__.nodes.apply(this,arguments),t.label&&e.push(t.label.node),t.bufferlabel&&e.push(t.bufferlabel.node),e},r}(p),E.props=["radius","style","class","title","labelattrs","buffer","center","attrs"],E.layers=[],Nr.kartograph.LabeledBubble=E,$=function(t){function r(t){var n,o,a,i,s,l,u,p,h,c;e=this,r.__super__.constructor.call(this,t),e.radius=null!=(o=t.radius)?o:4,e.styles=null!=(a=t.styles)?a:"",e.colors=null!=(i=t.colors)?i:["#3cc","#c3c","#33c","#cc3"],e.titles=null!=(s=t.titles)?s:["","","","",""],e.values=null!=(l=t.values)?l:[],e.border=null!=(u=t.border)?u:!1,e.borderWidth=null!=(p=t.borderWidth)?p:2,e["class"]=null!=(h=t["class"])?h:"piechart",null==(c=(n=Raphael.fn).pieChart)&&(n.pieChart=br)}var e;return he(r,t),e=null,r.prototype.overlaps=function(t){var r,n,o,a,i,s,l,u,p,h;return p=[e.x,e.y,e.radius],i=p[0],l=p[1],o=p[2],h=[t.x,t.y,t.radius],s=h[0],u=h[1],a=h[2],i-o>s+a||s-a>i+o||l-o>u+a||u-a>l+o?!1:(r=i-s,n=l-u,r*r+n*n>(o+a)*(o+a)?!1:!0)},r.prototype.render=function(){var t;return e=this,null!=e.border&&(t=e.layers.mapcanvas.circle(e.x,e.y,e.radius+e.borderWidth).attr({stroke:"none",fill:e.border})),e.chart=e.layers.mapcanvas.pieChart(e.x,e.y,e.radius,e.values,e.titles,e.colors,"none"),e.chart.push(t),e +},r.prototype.update=function(){},r.prototype.clear=function(){var t,r,n,o;for(e=this,o=e.chart,r=0,n=o.length;n>r;r++)t=o[r],t.remove();return e},r.prototype.nodes=function(){var t,r,n,o,a;for(o=e.chart,a=[],r=0,n=o.length;n>r;r++)t=o[r],a.push(t.node);return a},r}(dr),$.props=["radius","values","styles","class","titles","colors","border","borderWidth"],$.layers=[],Nr.kartograph.PieChart=$,br=function(t,r,e,n,o,a,i){var s,l,u,p,h,c,f,d,y,v,m;if(isNaN(t)||isNaN(r)||isNaN(e))return[];for(p=this,c=Math.PI/180,l=p.set(),f=function(t,r,e,n,o,a){var i,s,l,u;return i=t+e*Math.cos(-n*c),s=t+e*Math.cos(-o*c),l=r+e*Math.sin(-n*c),u=r+e*Math.sin(-o*c),p.path(["M",t,r,"L",i,l,"A",e,e,0,+(o-n>180),0,s,u,"z"]).attr(a)},s=-270,d=0,h=function(o){var u,p,h,c,y,v,m;m=n[o],u=360*m/d,v=s+.5*u,p=a[o],c=500,h=30,y=f(t,r,e,s,s+u,{fill:p,stroke:i,"stroke-width":1}),y.mouseover(function(){y.stop().animate({transform:"s1.1 1.1 "+t+" "+r},c,"elastic")}),y.mouseout(function(){y.stop().animate({transform:""},c,"elastic")}),s+=u,l.push(y)},v=0,m=n.length;m>v;v++)y=n[v],d+=y;for(u in n)h(u);return l},drawStackedBars=function(t,r,e,n,o,a,i,s){function l(t,r,e,n,o){return u.rect(t,r,e,n).attr(o)}for(var u=this,p=this.set(),h=0,c=0,f=function(a){var u=o[a],f=n*u/c,d=t-.5*e,y=r+.5*n-h,v=e,m=i[a],g=500,_=l(d,y-f,v,f,{fill:m,stroke:s,"stroke-width":1});h+=f,_.mouseover(function(){_.stop().animate({transform:"s1.1 1.1 "+t+" "+r},g,"elastic")}).mouseout(function(){_.stop().animate({transform:""},g,"elastic")}),p.push(_)},d=0,y=o.length;y>d;d++)c+=o[d];for(d=0;y>d;d++)f(d);return p},hr=function(t){function r(t){var e,n,o,a,i,s,l,u,p,h;e=this,r.__super__.constructor.call(this,t),e.styles=null!=(o=t.styles)?o:"",e.colors=null!=(a=t.colors)?a:[],e.titles=null!=(i=t.titles)?i:["","","","",""],e.values=null!=(s=t.values)?s:[],e.width=null!=(l=t.width)?l:17,e.height=null!=(u=t.height)?u:30,e["class"]=null!=(p=t["class"])?p:"barchart",null==(h=(n=Raphael.fn).drawStackedBarChart)&&(n.drawStackedBarChart=drawStackedBars)}return he(r,t),r.prototype.overlaps=function(t){var r,e,n,o,a,i,s,l,u,p,h;return n=this,p=[n.x,n.y,n.radius],i=p[0],l=p[1],o=p[2],h=[t.x,t.y,t.radius],s=h[0],u=h[1],a=h[2],i-o>s+a||s-a>i+o||l-o>u+a||u-a>l+o?!1:(r=i-s,e=l-u,r*r+e*e>(o+a)*(o+a)?!1:!0)},r.prototype.render=function(){var t,r,e,n,o,a;return e=this,n=e.width,r=e.height,o=e.x,a=e.y,t=e.layers.mapcanvas.rect(o-.5*n-2,a-.5*r-2,n+4,r+4).attr({stroke:"none",fill:"#fff"}),e.chart=e.layers.mapcanvas.drawStackedBarChart(e.x,e.y,e.width,e.height,e.values,e.titles,e.colors,"none"),e.chart.push(t),e},r.prototype.update=function(){var t;t=this},r.prototype.clear=function(){var t,r,e,n,o;for(t=this,o=t.chart,e=0,n=o.length;n>e;e++)r=o[e],r.remove();return t.chart=[],t},r.prototype.nodes=function(){var t,r,e,n,o,a;for(r=this,o=r.chart,a=[],e=0,n=o.length;n>e;e++)t=o[e],a.push(t.node);return a},r}(Pr.Symbol),hr.props=["values","styles","class","titles","colors","width","height"],hr.layers=[],Nr.kartograph.StackedBarChart=hr}.call(this); \ No newline at end of file diff --git a/js/prettify.js b/js/prettify.js new file mode 100644 index 0000000..eef5ad7 --- /dev/null +++ b/js/prettify.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}pg;g++)"zIndex"in o[g]&&(c.push(o[g].zIndex),0>o[g].zIndex&&(f[o[g].zIndex]=o[g]));for(c.sort(l);0>c[h];)if(n=f[c[h++]],p.push(n.apply(i,s)),r)return r=a,p;for(g=0;v>g;g++)if(n=o[g],"zIndex"in n)if(n.zIndex==c[h]){if(p.push(n.apply(i,s)),r)break;do if(h++,n=f[c[h]],n&&p.push(n.apply(i,s)),r)break;while(n)}else f[n.zIndex]=n;else if(p.push(n.apply(i,s)),r)break;return r=a,e=d,p.length?p:null};u._events=h,u.listeners=function(t){var e,r,i,n,o,l,u,c,f=t.split(a),p=h,d=[p],g=[];for(n=0,o=f.length;o>n;n++){for(c=[],l=0,u=d.length;u>l;l++)for(p=d[l].n,r=[p[f[n]],p[s]],i=2;i--;)e=r[i],e&&(c.push(e),g=g.concat(e.f||[]));d=c}return g},u.on=function(t,e){if(t+="","function"!=typeof e)return function(){};for(var r=t.split(a),i=h,n=0,s=r.length;s>n;n++)i=i.n,i=i.hasOwnProperty(r[n])&&i[r[n]]||(i[r[n]]={n:{}});for(i.f=i.f||[],n=0,s=i.f.length;s>n;n++)if(i.f[n]==e)return o;return i.f.push(e),function(t){+t==+t&&(e.zIndex=+t)}},u.f=function(t){var e=[].slice.call(arguments,1);return function(){u.apply(null,[t,null].concat(e).concat([].slice.call(arguments,0)))}},u.stop=function(){r=1},u.nt=function(t){return t?RegExp("(?:\\.|\\/|^)"+t+"(?:\\.|\\/|$)").test(e):e},u.nts=function(){return e.split(a)},u.off=u.unbind=function(t,e){if(!t)return u._events=h={n:{}},void 0;var r,i,o,l,c,f,p,d=t.split(a),g=[h];for(l=0,c=d.length;c>l;l++)for(f=0;g.length>f;f+=o.length-2){if(o=[f,1],r=g[f].n,d[l]!=s)r[d[l]]&&o.push(r[d[l]]);else for(i in r)r[n](i)&&o.push(r[i]);g.splice.apply(g,o)}for(l=0,c=g.length;c>l;l++)for(r=g[l];r.n;){if(e){if(r.f){for(f=0,p=r.f.length;p>f;f++)if(r.f[f]==e){r.f.splice(f,1);break}!r.f.length&&delete r.f}for(i in r.n)if(r.n[n](i)&&r.n[i].f){var v=r.n[i].f;for(f=0,p=v.length;p>f;f++)if(v[f]==e){v.splice(f,1);break}!v.length&&delete r.n[i].f}}else{delete r.f;for(i in r.n)r.n[n](i)&&r.n[i].f&&delete r.n[i].f}r=r.n}},u.once=function(t,e){var r=function(){return u.unbind(t,r),e.apply(this,arguments)};return u.on(t,r)},u.version=i,u.toString=function(){return"You are running Eve "+i},"undefined"!=typeof module&&module.exports?module.exports=u:"undefined"!=typeof define?define("eve",[],function(){return u}):t.eve=u})(this),function(t,e){"function"==typeof define&&define.amd?define(["eve"],function(r){return e(t,r)}):e(t,t.eve)}(this,function(t,e){function r(t){if(r.is(t,"function"))return b?t():e.on("raphael.DOMload",t);if(r.is(t,H))return r._engine.create[N](r,t.splice(0,3+r.is(t[0],W))).add(t);var i=Array.prototype.slice.call(arguments,0);if(r.is(i[i.length-1],"function")){var n=i.pop();return b?n.call(r._engine.create[N](r,i)):e.on("raphael.DOMload",function(){n.call(r._engine.create[N](r,i))})}return r._engine.create[N](r,arguments)}function i(t){if(Object(t)!==t)return t;var e=new t.constructor;for(var r in t)t[B](r)&&(e[r]=i(t[r]));return e}function n(t,e){for(var r=0,i=t.length;i>r;r++)if(t[r]===e)return t.push(t.splice(r,1)[0])}function a(t,e,r){function i(){var a=Array.prototype.slice.call(arguments,0),s=a.join("␀"),o=i.cache=i.cache||{},l=i.count=i.count||[];return o[B](s)?(n(l,s),r?r(o[s]):o[s]):(l.length>=1e3&&delete o[l.shift()],l.push(s),o[s]=t[N](e,a),r?r(o[s]):o[s])}return i}function s(){return this.hex}function o(t,e){for(var r=[],i=0,n=t.length;n-2*!e>i;i+=2){var a=[{x:+t[i-2],y:+t[i-1]},{x:+t[i],y:+t[i+1]},{x:+t[i+2],y:+t[i+3]},{x:+t[i+4],y:+t[i+5]}];e?i?n-4==i?a[3]={x:+t[0],y:+t[1]}:n-2==i&&(a[2]={x:+t[0],y:+t[1]},a[3]={x:+t[2],y:+t[3]}):a[0]={x:+t[n-2],y:+t[n-1]}:n-4==i?a[3]=a[2]:i||(a[0]={x:+t[i],y:+t[i+1]}),r.push(["C",(-a[0].x+6*a[1].x+a[2].x)/6,(-a[0].y+6*a[1].y+a[2].y)/6,(a[1].x+6*a[2].x-a[3].x)/6,(a[1].y+6*a[2].y-a[3].y)/6,a[2].x,a[2].y])}return r}function l(t,e,r,i,n){var a=-3*e+9*r-9*i+3*n,s=t*a+6*e-12*r+6*i;return t*s-3*e+3*r}function h(t,e,r,i,n,a,s,o,h){null==h&&(h=1),h=h>1?1:0>h?0:h;for(var u=h/2,c=12,f=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],p=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],d=0,g=0;c>g;g++){var v=u*f[g]+u,x=l(v,t,r,n,s),y=l(v,e,i,a,o),m=x*x+y*y;d+=p[g]*q.sqrt(m)}return u*d}function u(t,e,r,i,n,a,s,o,l){if(!(0>l||l>h(t,e,r,i,n,a,s,o))){var u,c=1,f=c/2,p=c-f,d=.01;for(u=h(t,e,r,i,n,a,s,o,p);V(u-l)>d;)f/=2,p+=(l>u?1:-1)*f,u=h(t,e,r,i,n,a,s,o,p);return p}}function c(t,e,r,i,n,a,s,o){if(!(D(t,r)D(n,s)||D(e,i)D(a,o))){var l=(t*i-e*r)*(n-s)-(t-r)*(n*o-a*s),h=(t*i-e*r)*(a-o)-(e-i)*(n*o-a*s),u=(t-r)*(a-o)-(e-i)*(n-s);if(u){var c=l/u,f=h/u,p=+c.toFixed(2),d=+f.toFixed(2);if(!(+O(t,r).toFixed(2)>p||p>+D(t,r).toFixed(2)||+O(n,s).toFixed(2)>p||p>+D(n,s).toFixed(2)||+O(e,i).toFixed(2)>d||d>+D(e,i).toFixed(2)||+O(a,o).toFixed(2)>d||d>+D(a,o).toFixed(2)))return{x:c,y:f}}}}function f(t,e,i){var n=r.bezierBBox(t),a=r.bezierBBox(e);if(!r.isBBoxIntersect(n,a))return i?0:[];for(var s=h.apply(0,t),o=h.apply(0,e),l=~~(s/5),u=~~(o/5),f=[],p=[],d={},g=i?0:[],v=0;l+1>v;v++){var x=r.findDotsAtSegment.apply(r,t.concat(v/l));f.push({x:x.x,y:x.y,t:v/l})}for(v=0;u+1>v;v++)x=r.findDotsAtSegment.apply(r,e.concat(v/u)),p.push({x:x.x,y:x.y,t:v/u});for(v=0;l>v;v++)for(var y=0;u>y;y++){var m=f[v],b=f[v+1],_=p[y],w=p[y+1],k=.001>V(b.x-m.x)?"y":"x",C=.001>V(w.x-_.x)?"y":"x",B=c(m.x,m.y,b.x,b.y,_.x,_.y,w.x,w.y);if(B){if(d[B.x.toFixed(4)]==B.y.toFixed(4))continue;d[B.x.toFixed(4)]=B.y.toFixed(4);var S=m.t+V((B[k]-m[k])/(b[k]-m[k]))*(b.t-m.t),T=_.t+V((B[C]-_[C])/(w[C]-_[C]))*(w.t-_.t);S>=0&&1>=S&&T>=0&&1>=T&&(i?g++:g.push({x:B.x,y:B.y,t1:S,t2:T}))}}return g}function p(t,e,i){t=r._path2curve(t),e=r._path2curve(e);for(var n,a,s,o,l,h,u,c,p,d,g=i?0:[],v=0,x=t.length;x>v;v++){var y=t[v];if("M"==y[0])n=l=y[1],a=h=y[2];else{"C"==y[0]?(p=[n,a].concat(y.slice(1)),n=p[6],a=p[7]):(p=[n,a,n,a,l,h,l,h],n=l,a=h);for(var m=0,b=e.length;b>m;m++){var _=e[m];if("M"==_[0])s=u=_[1],o=c=_[2];else{"C"==_[0]?(d=[s,o].concat(_.slice(1)),s=d[6],o=d[7]):(d=[s,o,s,o,u,c,u,c],s=u,o=c);var w=f(p,d,i);if(i)g+=w;else{for(var k=0,C=w.length;C>k;k++)w[k].segment1=v,w[k].segment2=m,w[k].bez1=p,w[k].bez2=d;g=g.concat(w)}}}}}return g}function d(t,e,r,i,n,a){null!=t?(this.a=+t,this.b=+e,this.c=+r,this.d=+i,this.e=+n,this.f=+a):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function g(){return this.x+P+this.y+P+this.width+" × "+this.height}function v(t,e,r,i,n,a){function s(t){return((c*t+u)*t+h)*t}function o(t,e){var r=l(t,e);return((d*r+p)*r+f)*r}function l(t,e){var r,i,n,a,o,l;for(n=t,l=0;8>l;l++){if(a=s(n)-t,e>V(a))return n;if(o=(3*c*n+2*u)*n+h,1e-6>V(o))break;n-=a/o}if(r=0,i=1,n=t,r>n)return r;if(n>i)return i;for(;i>r;){if(a=s(n),e>V(a-t))return n;t>a?r=n:i=n,n=(i-r)/2+r}return n}var h=3*e,u=3*(i-e)-h,c=1-h-u,f=3*r,p=3*(n-r)-f,d=1-f-p;return o(t,1/(200*a))}function x(t,e){var r=[],i={};if(this.ms=e,this.times=1,t){for(var n in t)t[B](n)&&(i[K(n)]=t[n],r.push(K(n)));r.sort(ce)}this.anim=i,this.top=r[r.length-1],this.percents=r}function y(t,i,n,a,s,o){n=K(n);var l,h,u,c,f,p,g=t.ms,x={},y={},m={};if(a)for(_=0,k=lr.length;k>_;_++){var b=lr[_];if(b.el.id==i.id&&b.anim==t){b.percent!=n?(lr.splice(_,1),u=1):h=b,i.attr(b.totalOrigin);break}}else a=+y;for(var _=0,k=t.percents.length;k>_;_++){if(t.percents[_]==n||t.percents[_]>a*t.top){n=t.percents[_],f=t.percents[_-1]||0,g=g/t.top*(n-f),c=t.percents[_+1],l=t.anim[n];break}a&&i.attr(t.anim[t.percents[_]])}if(l){if(h)h.initstatus=a,h.start=new Date-h.ms*a;else{for(var C in l)if(l[B](C)&&(ie[B](C)||i.paper.customAttributes[B](C)))switch(x[C]=i.attr(C),null==x[C]&&(x[C]=re[C]),y[C]=l[C],ie[C]){case W:m[C]=(y[C]-x[C])/g;break;case"colour":x[C]=r.getRGB(x[C]);var S=r.getRGB(y[C]);m[C]={r:(S.r-x[C].r)/g,g:(S.g-x[C].g)/g,b:(S.b-x[C].b)/g};break;case"path":var T=Re(x[C],y[C]),A=T[1];for(x[C]=T[0],m[C]=[],_=0,k=x[C].length;k>_;_++){m[C][_]=[0];for(var N=1,L=x[C][_].length;L>N;N++)m[C][_][N]=(A[_][N]-x[C][_][N])/g}break;case"transform":var M=i._,P=Oe(M[C],y[C]);if(P)for(x[C]=P.from,y[C]=P.to,m[C]=[],m[C].real=!0,_=0,k=x[C].length;k>_;_++)for(m[C][_]=[x[C][_][0]],N=1,L=x[C][_].length;L>N;N++)m[C][_][N]=(y[C][_][N]-x[C][_][N])/g;else{var R=i.matrix||new d,I={_:{transform:M.transform},getBBox:function(){return i.getBBox(1)}};x[C]=[R.a,R.b,R.c,R.d,R.e,R.f],qe(I,y[C]),y[C]=I._.transform,m[C]=[(I.matrix.a-R.a)/g,(I.matrix.b-R.b)/g,(I.matrix.c-R.c)/g,(I.matrix.d-R.d)/g,(I.matrix.e-R.e)/g,(I.matrix.f-R.f)/g]}break;case"csv":var j=z(l[C])[F](w),q=z(x[C])[F](w);if("clip-rect"==C)for(x[C]=q,m[C]=[],_=q.length;_--;)m[C][_]=(j[_]-x[C][_])/g;y[C]=j;break;default:for(j=[][E](l[C]),q=[][E](x[C]),m[C]=[],_=i.paper.customAttributes[C].length;_--;)m[C][_]=((j[_]||0)-(q[_]||0))/g}var D=l.easing,O=r.easing_formulas[D];if(!O)if(O=z(D).match(Q),O&&5==O.length){var V=O;O=function(t){return v(t,+V[1],+V[2],+V[3],+V[4],g)}}else O=pe;if(p=l.start||t.start||+new Date,b={anim:t,percent:n,timestamp:p,start:p+(t.del||0),status:0,initstatus:a||0,stop:!1,ms:g,easing:O,from:x,diff:m,to:y,el:i,callback:l.callback,prev:f,next:c,repeat:o||t.times,origin:i.attr(),totalOrigin:s},lr.push(b),a&&!h&&!u&&(b.stop=!0,b.start=new Date-g*a,1==lr.length))return ur();u&&(b.start=new Date-b.ms*a),1==lr.length&&hr(ur)}e("raphael.anim.start."+i.id,i,t)}}function m(t){for(var e=0;lr.length>e;e++)lr[e].el.paper==t&&lr.splice(e--,1)}r.version="2.1.0",r.eve=e;var b,_,w=/[, ]+/,k={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},C=/\{(\d+)\}/g,B="hasOwnProperty",S={doc:document,win:t},T={was:Object.prototype[B].call(S.win,"Raphael"),is:S.win.Raphael},A=function(){this.ca=this.customAttributes={}},N="apply",E="concat",L="ontouchstart"in S.win||S.win.DocumentTouch&&S.doc instanceof DocumentTouch,M="",P=" ",z=String,F="split",R="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[F](P),I={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},j=z.prototype.toLowerCase,q=Math,D=q.max,O=q.min,V=q.abs,Y=q.pow,G=q.PI,W="number",X="string",H="array",U=Object.prototype.toString,$=(r._ISURL=/^url\(['"]?([^\)]+?)['"]?\)$/i,/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i),Z={NaN:1,Infinity:1,"-Infinity":1},Q=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,J=q.round,K=parseFloat,te=parseInt,ee=z.prototype.toUpperCase,re=r._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},ie=r._availableAnimAttrs={blur:W,"clip-rect":"csv",cx:W,cy:W,fill:"colour","fill-opacity":W,"font-size":W,height:W,opacity:W,path:"path",r:W,rx:W,ry:W,stroke:"colour","stroke-opacity":W,"stroke-width":W,transform:"transform",width:W,x:W,y:W},ne=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,ae={hs:1,rg:1},se=/,?([achlmqrstvxz]),?/gi,oe=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,le=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,he=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/gi,ue=(r._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,{}),ce=function(t,e){return K(t)-K(e)},fe=function(){},pe=function(t){return t},de=r._rectPath=function(t,e,r,i,n){return n?[["M",t+n,e],["l",r-2*n,0],["a",n,n,0,0,1,n,n],["l",0,i-2*n],["a",n,n,0,0,1,-n,n],["l",2*n-r,0],["a",n,n,0,0,1,-n,-n],["l",0,2*n-i],["a",n,n,0,0,1,n,-n],["z"]]:[["M",t,e],["l",r,0],["l",0,i],["l",-r,0],["z"]]},ge=function(t,e,r,i){return null==i&&(i=r),[["M",t,e],["m",0,-i],["a",r,i,0,1,1,0,2*i],["a",r,i,0,1,1,0,-2*i],["z"]]},ve=r._getPath={path:function(t){return t.attr("path")},circle:function(t){var e=t.attrs;return ge(e.cx,e.cy,e.r)},ellipse:function(t){var e=t.attrs;return ge(e.cx,e.cy,e.rx,e.ry)},rect:function(t){var e=t.attrs;return de(e.x,e.y,e.width,e.height,e.r)},image:function(t){var e=t.attrs;return de(e.x,e.y,e.width,e.height)},text:function(t){var e=t._getBBox();return de(e.x,e.y,e.width,e.height)},set:function(t){var e=t._getBBox();return de(e.x,e.y,e.width,e.height)}},xe=r.mapPath=function(t,e){if(!e)return t;var r,i,n,a,s,o,l;for(t=Re(t),n=0,s=t.length;s>n;n++)for(l=t[n],a=1,o=l.length;o>a;a+=2)r=e.x(l[a],l[a+1]),i=e.y(l[a],l[a+1]),l[a]=r,l[a+1]=i;return t};if(r._g=S,r.type=S.win.SVGAngle||S.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==r.type){var ye,me=S.doc.createElement("div");if(me.innerHTML='',ye=me.firstChild,ye.style.behavior="url(#default#VML)",!ye||"object"!=typeof ye.adj)return r.type=M;me=null}r.svg=!(r.vml="VML"==r.type),r._Paper=A,r.fn=_=A.prototype=r.prototype,r._id=0,r._oid=0,r.is=function(t,e){return e=j.call(e),"finite"==e?!Z[B](+t):"array"==e?t instanceof Array:"null"==e&&null===t||e==typeof t&&null!==t||"object"==e&&t===Object(t)||"array"==e&&Array.isArray&&Array.isArray(t)||U.call(t).slice(8,-1).toLowerCase()==e},r.angle=function(t,e,i,n,a,s){if(null==a){var o=t-i,l=e-n;return o||l?(180+180*q.atan2(-l,-o)/G+360)%360:0}return r.angle(t,e,a,s)-r.angle(i,n,a,s)},r.rad=function(t){return t%360*G/180},r.deg=function(t){return 180*t/G%360},r.snapTo=function(t,e,i){if(i=r.is(i,"finite")?i:10,r.is(t,H)){for(var n=t.length;n--;)if(i>=V(t[n]-e))return t[n]}else{t=+t;var a=e%t;if(i>a)return e-a;if(a>t-i)return e-a+t}return e},r.createUUID=function(t,e){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(t,e).toUpperCase()}}(/[xy]/g,function(t){var e=0|16*q.random(),r="x"==t?e:8|3&e;return r.toString(16)}),r.setWindow=function(t){e("raphael.setWindow",r,S.win,t),S.win=t,S.doc=S.win.document,r._engine.initWin&&r._engine.initWin(S.win)};var be=function(t){if(r.vml){var e,i=/^\s+|\s+$/g;try{var n=new ActiveXObject("htmlfile");n.write(""),n.close(),e=n.body}catch(s){e=createPopup().document.body}var o=e.createTextRange();be=a(function(t){try{e.style.color=z(t).replace(i,M);var r=o.queryCommandValue("ForeColor");return r=(255&r)<<16|65280&r|(16711680&r)>>>16,"#"+("000000"+r.toString(16)).slice(-6)}catch(n){return"none"}})}else{var l=S.doc.createElement("i");l.title="Raphaël Colour Picker",l.style.display="none",S.doc.body.appendChild(l),be=a(function(t){return l.style.color=t,S.doc.defaultView.getComputedStyle(l,M).getPropertyValue("color")})}return be(t)},_e=function(){return"hsb("+[this.h,this.s,this.b]+")"},we=function(){return"hsl("+[this.h,this.s,this.l]+")"},ke=function(){return this.hex},Ce=function(t,e,i){if(null==e&&r.is(t,"object")&&"r"in t&&"g"in t&&"b"in t&&(i=t.b,e=t.g,t=t.r),null==e&&r.is(t,X)){var n=r.getRGB(t);t=n.r,e=n.g,i=n.b}return(t>1||e>1||i>1)&&(t/=255,e/=255,i/=255),[t,e,i]},Be=function(t,e,i,n){t*=255,e*=255,i*=255;var a={r:t,g:e,b:i,hex:r.rgb(t,e,i),toString:ke};return r.is(n,"finite")&&(a.opacity=n),a};r.color=function(t){var e;return r.is(t,"object")&&"h"in t&&"s"in t&&"b"in t?(e=r.hsb2rgb(t),t.r=e.r,t.g=e.g,t.b=e.b,t.hex=e.hex):r.is(t,"object")&&"h"in t&&"s"in t&&"l"in t?(e=r.hsl2rgb(t),t.r=e.r,t.g=e.g,t.b=e.b,t.hex=e.hex):(r.is(t,"string")&&(t=r.getRGB(t)),r.is(t,"object")&&"r"in t&&"g"in t&&"b"in t?(e=r.rgb2hsl(t),t.h=e.h,t.s=e.s,t.l=e.l,e=r.rgb2hsb(t),t.v=e.b):(t={hex:"none"},t.r=t.g=t.b=t.h=t.s=t.v=t.l=-1)),t.toString=ke,t},r.hsb2rgb=function(t,e,r,i){this.is(t,"object")&&"h"in t&&"s"in t&&"b"in t&&(r=t.b,e=t.s,t=t.h,i=t.o),t*=360;var n,a,s,o,l;return t=t%360/60,l=r*e,o=l*(1-V(t%2-1)),n=a=s=r-l,t=~~t,n+=[l,o,0,0,o,l][t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],Be(n,a,s,i)},r.hsl2rgb=function(t,e,r,i){this.is(t,"object")&&"h"in t&&"s"in t&&"l"in t&&(r=t.l,e=t.s,t=t.h),(t>1||e>1||r>1)&&(t/=360,e/=100,r/=100),t*=360;var n,a,s,o,l;return t=t%360/60,l=2*e*(.5>r?r:1-r),o=l*(1-V(t%2-1)),n=a=s=r-l/2,t=~~t,n+=[l,o,0,0,o,l][t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],Be(n,a,s,i)},r.rgb2hsb=function(t,e,r){r=Ce(t,e,r),t=r[0],e=r[1],r=r[2];var i,n,a,s;return a=D(t,e,r),s=a-O(t,e,r),i=0==s?null:a==t?(e-r)/s:a==e?(r-t)/s+2:(t-e)/s+4,i=60*((i+360)%6)/360,n=0==s?0:s/a,{h:i,s:n,b:a,toString:_e}},r.rgb2hsl=function(t,e,r){r=Ce(t,e,r),t=r[0],e=r[1],r=r[2];var i,n,a,s,o,l;return s=D(t,e,r),o=O(t,e,r),l=s-o,i=0==l?null:s==t?(e-r)/l:s==e?(r-t)/l+2:(t-e)/l+4,i=60*((i+360)%6)/360,a=(s+o)/2,n=0==l?0:.5>a?l/(2*a):l/(2-2*a),{h:i,s:n,l:a,toString:we}},r._path2string=function(){return this.join(",").replace(se,"$1")},r._preload=function(t,e){var r=S.doc.createElement("img");r.style.cssText="position:absolute;left:-9999em;top:-9999em",r.onload=function(){e.call(this),this.onload=null,S.doc.body.removeChild(this)},r.onerror=function(){S.doc.body.removeChild(this)},S.doc.body.appendChild(r),r.src=t},r.getRGB=a(function(t){if(!t||(t=z(t)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:s};if("none"==t)return{r:-1,g:-1,b:-1,hex:"none",toString:s};!(ae[B](t.toLowerCase().substring(0,2))||"#"==t.charAt())&&(t=be(t));var e,i,n,a,o,l,h=t.match($);return h?(h[2]&&(n=te(h[2].substring(5),16),i=te(h[2].substring(3,5),16),e=te(h[2].substring(1,3),16)),h[3]&&(n=te((o=h[3].charAt(3))+o,16),i=te((o=h[3].charAt(2))+o,16),e=te((o=h[3].charAt(1))+o,16)),h[4]&&(l=h[4][F](ne),e=K(l[0]),"%"==l[0].slice(-1)&&(e*=2.55),i=K(l[1]),"%"==l[1].slice(-1)&&(i*=2.55),n=K(l[2]),"%"==l[2].slice(-1)&&(n*=2.55),"rgba"==h[1].toLowerCase().slice(0,4)&&(a=K(l[3])),l[3]&&"%"==l[3].slice(-1)&&(a/=100)),h[5]?(l=h[5][F](ne),e=K(l[0]),"%"==l[0].slice(-1)&&(e*=2.55),i=K(l[1]),"%"==l[1].slice(-1)&&(i*=2.55),n=K(l[2]),"%"==l[2].slice(-1)&&(n*=2.55),("deg"==l[0].slice(-3)||"°"==l[0].slice(-1))&&(e/=360),"hsba"==h[1].toLowerCase().slice(0,4)&&(a=K(l[3])),l[3]&&"%"==l[3].slice(-1)&&(a/=100),r.hsb2rgb(e,i,n,a)):h[6]?(l=h[6][F](ne),e=K(l[0]),"%"==l[0].slice(-1)&&(e*=2.55),i=K(l[1]),"%"==l[1].slice(-1)&&(i*=2.55),n=K(l[2]),"%"==l[2].slice(-1)&&(n*=2.55),("deg"==l[0].slice(-3)||"°"==l[0].slice(-1))&&(e/=360),"hsla"==h[1].toLowerCase().slice(0,4)&&(a=K(l[3])),l[3]&&"%"==l[3].slice(-1)&&(a/=100),r.hsl2rgb(e,i,n,a)):(h={r:e,g:i,b:n,toString:s},h.hex="#"+(16777216|n|i<<8|e<<16).toString(16).slice(1),r.is(a,"finite")&&(h.opacity=a),h)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:s}},r),r.hsb=a(function(t,e,i){return r.hsb2rgb(t,e,i).hex}),r.hsl=a(function(t,e,i){return r.hsl2rgb(t,e,i).hex}),r.rgb=a(function(t,e,r){return"#"+(16777216|r|e<<8|t<<16).toString(16).slice(1)}),r.getColor=function(t){var e=this.getColor.start=this.getColor.start||{h:0,s:1,b:t||.75},r=this.hsb2rgb(e.h,e.s,e.b);return e.h+=.075,e.h>1&&(e.h=0,e.s-=.2,0>=e.s&&(this.getColor.start={h:0,s:1,b:e.b})),r.hex},r.getColor.reset=function(){delete this.start},r.parsePathString=function(t){if(!t)return null;var e=Se(t);if(e.arr)return Ae(e.arr);var i={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},n=[];return r.is(t,H)&&r.is(t[0],H)&&(n=Ae(t)),n.length||z(t).replace(oe,function(t,e,r){var a=[],s=e.toLowerCase();if(r.replace(he,function(t,e){e&&a.push(+e)}),"m"==s&&a.length>2&&(n.push([e][E](a.splice(0,2))),s="l",e="m"==e?"l":"L"),"r"==s)n.push([e][E](a));else for(;a.length>=i[s]&&(n.push([e][E](a.splice(0,i[s]))),i[s]););}),n.toString=r._path2string,e.arr=Ae(n),n},r.parseTransformString=a(function(t){if(!t)return null;var e=[];return r.is(t,H)&&r.is(t[0],H)&&(e=Ae(t)),e.length||z(t).replace(le,function(t,r,i){var n=[];j.call(r),i.replace(he,function(t,e){e&&n.push(+e)}),e.push([r][E](n))}),e.toString=r._path2string,e});var Se=function(t){var e=Se.ps=Se.ps||{};return e[t]?e[t].sleep=100:e[t]={sleep:100},setTimeout(function(){for(var r in e)e[B](r)&&r!=t&&(e[r].sleep--,!e[r].sleep&&delete e[r])}),e[t]};r.findDotsAtSegment=function(t,e,r,i,n,a,s,o,l){var h=1-l,u=Y(h,3),c=Y(h,2),f=l*l,p=f*l,d=u*t+3*c*l*r+3*h*l*l*n+p*s,g=u*e+3*c*l*i+3*h*l*l*a+p*o,v=t+2*l*(r-t)+f*(n-2*r+t),x=e+2*l*(i-e)+f*(a-2*i+e),y=r+2*l*(n-r)+f*(s-2*n+r),m=i+2*l*(a-i)+f*(o-2*a+i),b=h*t+l*r,_=h*e+l*i,w=h*n+l*s,k=h*a+l*o,C=90-180*q.atan2(v-y,x-m)/G;return(v>y||m>x)&&(C+=180),{x:d,y:g,m:{x:v,y:x},n:{x:y,y:m},start:{x:b,y:_},end:{x:w,y:k},alpha:C}},r.bezierBBox=function(t,e,i,n,a,s,o,l){r.is(t,"array")||(t=[t,e,i,n,a,s,o,l]);var h=Fe.apply(null,t);return{x:h.min.x,y:h.min.y,x2:h.max.x,y2:h.max.y,width:h.max.x-h.min.x,height:h.max.y-h.min.y}},r.isPointInsideBBox=function(t,e,r){return e>=t.x&&t.x2>=e&&r>=t.y&&t.y2>=r},r.isBBoxIntersect=function(t,e){var i=r.isPointInsideBBox;return i(e,t.x,t.y)||i(e,t.x2,t.y)||i(e,t.x,t.y2)||i(e,t.x2,t.y2)||i(t,e.x,e.y)||i(t,e.x2,e.y)||i(t,e.x,e.y2)||i(t,e.x2,e.y2)||(t.xe.x||e.xt.x)&&(t.ye.y||e.yt.y)},r.pathIntersection=function(t,e){return p(t,e)},r.pathIntersectionNumber=function(t,e){return p(t,e,1)},r.isPointInsidePath=function(t,e,i){var n=r.pathBBox(t);return r.isPointInsideBBox(n,e,i)&&1==p(t,[["M",e,i],["H",n.x2+10]],1)%2},r._removedFactory=function(t){return function(){e("raphael.log",null,"Raphaël: you are calling to method “"+t+"” of removed object",t)}};var Te=r.pathBBox=function(t){var e=Se(t);if(e.bbox)return i(e.bbox);if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0};t=Re(t);for(var r,n=0,a=0,s=[],o=[],l=0,h=t.length;h>l;l++)if(r=t[l],"M"==r[0])n=r[1],a=r[2],s.push(n),o.push(a);else{var u=Fe(n,a,r[1],r[2],r[3],r[4],r[5],r[6]);s=s[E](u.min.x,u.max.x),o=o[E](u.min.y,u.max.y),n=r[5],a=r[6]}var c=O[N](0,s),f=O[N](0,o),p=D[N](0,s),d=D[N](0,o),g=p-c,v=d-f,x={x:c,y:f,x2:p,y2:d,width:g,height:v,cx:c+g/2,cy:f+v/2};return e.bbox=i(x),x},Ae=function(t){var e=i(t);return e.toString=r._path2string,e},Ne=r._pathToRelative=function(t){var e=Se(t);if(e.rel)return Ae(e.rel);r.is(t,H)&&r.is(t&&t[0],H)||(t=r.parsePathString(t));var i=[],n=0,a=0,s=0,o=0,l=0;"M"==t[0][0]&&(n=t[0][1],a=t[0][2],s=n,o=a,l++,i.push(["M",n,a]));for(var h=l,u=t.length;u>h;h++){var c=i[h]=[],f=t[h];if(f[0]!=j.call(f[0]))switch(c[0]=j.call(f[0]),c[0]){case"a":c[1]=f[1],c[2]=f[2],c[3]=f[3],c[4]=f[4],c[5]=f[5],c[6]=+(f[6]-n).toFixed(3),c[7]=+(f[7]-a).toFixed(3);break;case"v":c[1]=+(f[1]-a).toFixed(3);break;case"m":s=f[1],o=f[2];default:for(var p=1,d=f.length;d>p;p++)c[p]=+(f[p]-(p%2?n:a)).toFixed(3)}else{c=i[h]=[],"m"==f[0]&&(s=f[1]+n,o=f[2]+a);for(var g=0,v=f.length;v>g;g++)i[h][g]=f[g]}var x=i[h].length;switch(i[h][0]){case"z":n=s,a=o;break;case"h":n+=+i[h][x-1];break;case"v":a+=+i[h][x-1];break;default:n+=+i[h][x-2],a+=+i[h][x-1]}}return i.toString=r._path2string,e.rel=Ae(i),i},Ee=r._pathToAbsolute=function(t){var e=Se(t);if(e.abs)return Ae(e.abs);if(r.is(t,H)&&r.is(t&&t[0],H)||(t=r.parsePathString(t)),!t||!t.length)return[["M",0,0]];var i=[],n=0,a=0,s=0,l=0,h=0;"M"==t[0][0]&&(n=+t[0][1],a=+t[0][2],s=n,l=a,h++,i[0]=["M",n,a]);for(var u,c,f=3==t.length&&"M"==t[0][0]&&"R"==t[1][0].toUpperCase()&&"Z"==t[2][0].toUpperCase(),p=h,d=t.length;d>p;p++){if(i.push(u=[]),c=t[p],c[0]!=ee.call(c[0]))switch(u[0]=ee.call(c[0]),u[0]){case"A":u[1]=c[1],u[2]=c[2],u[3]=c[3],u[4]=c[4],u[5]=c[5],u[6]=+(c[6]+n),u[7]=+(c[7]+a);break;case"V":u[1]=+c[1]+a;break;case"H":u[1]=+c[1]+n;break;case"R":for(var g=[n,a][E](c.slice(1)),v=2,x=g.length;x>v;v++)g[v]=+g[v]+n,g[++v]=+g[v]+a;i.pop(),i=i[E](o(g,f));break;case"M":s=+c[1]+n,l=+c[2]+a;default:for(v=1,x=c.length;x>v;v++)u[v]=+c[v]+(v%2?n:a)}else if("R"==c[0])g=[n,a][E](c.slice(1)),i.pop(),i=i[E](o(g,f)),u=["R"][E](c.slice(-2));else for(var y=0,m=c.length;m>y;y++)u[y]=c[y];switch(u[0]){case"Z":n=s,a=l;break;case"H":n=u[1];break;case"V":a=u[1];break;case"M":s=u[u.length-2],l=u[u.length-1];default:n=u[u.length-2],a=u[u.length-1]}}return i.toString=r._path2string,e.abs=Ae(i),i},Le=function(t,e,r,i){return[t,e,r,i,r,i]},Me=function(t,e,r,i,n,a){var s=1/3,o=2/3;return[s*t+o*r,s*e+o*i,s*n+o*r,s*a+o*i,n,a]},Pe=function(t,e,r,i,n,s,o,l,h,u){var c,f=120*G/180,p=G/180*(+n||0),d=[],g=a(function(t,e,r){var i=t*q.cos(r)-e*q.sin(r),n=t*q.sin(r)+e*q.cos(r);return{x:i,y:n}});if(u)C=u[0],B=u[1],w=u[2],k=u[3];else{c=g(t,e,-p),t=c.x,e=c.y,c=g(l,h,-p),l=c.x,h=c.y;var v=(q.cos(G/180*n),q.sin(G/180*n),(t-l)/2),x=(e-h)/2,y=v*v/(r*r)+x*x/(i*i);y>1&&(y=q.sqrt(y),r=y*r,i=y*i);var m=r*r,b=i*i,_=(s==o?-1:1)*q.sqrt(V((m*b-m*x*x-b*v*v)/(m*x*x+b*v*v))),w=_*r*x/i+(t+l)/2,k=_*-i*v/r+(e+h)/2,C=q.asin(((e-k)/i).toFixed(9)),B=q.asin(((h-k)/i).toFixed(9));C=w>t?G-C:C,B=w>l?G-B:B,0>C&&(C=2*G+C),0>B&&(B=2*G+B),o&&C>B&&(C-=2*G),!o&&B>C&&(B-=2*G)}var S=B-C;if(V(S)>f){var T=B,A=l,N=h;B=C+f*(o&&B>C?1:-1),l=w+r*q.cos(B),h=k+i*q.sin(B),d=Pe(l,h,r,i,n,0,o,A,N,[B,T,w,k])}S=B-C;var L=q.cos(C),M=q.sin(C),P=q.cos(B),z=q.sin(B),R=q.tan(S/4),I=4/3*r*R,j=4/3*i*R,D=[t,e],O=[t+I*M,e-j*L],Y=[l+I*z,h-j*P],W=[l,h];if(O[0]=2*D[0]-O[0],O[1]=2*D[1]-O[1],u)return[O,Y,W][E](d);d=[O,Y,W][E](d).join()[F](",");for(var X=[],H=0,U=d.length;U>H;H++)X[H]=H%2?g(d[H-1],d[H],p).y:g(d[H],d[H+1],p).x;return X},ze=function(t,e,r,i,n,a,s,o,l){var h=1-l;return{x:Y(h,3)*t+3*Y(h,2)*l*r+3*h*l*l*n+Y(l,3)*s,y:Y(h,3)*e+3*Y(h,2)*l*i+3*h*l*l*a+Y(l,3)*o}},Fe=a(function(t,e,r,i,n,a,s,o){var l,h=n-2*r+t-(s-2*n+r),u=2*(r-t)-2*(n-r),c=t-r,f=(-u+q.sqrt(u*u-4*h*c))/2/h,p=(-u-q.sqrt(u*u-4*h*c))/2/h,d=[e,o],g=[t,s];return V(f)>"1e12"&&(f=.5),V(p)>"1e12"&&(p=.5),f>0&&1>f&&(l=ze(t,e,r,i,n,a,s,o,f),g.push(l.x),d.push(l.y)),p>0&&1>p&&(l=ze(t,e,r,i,n,a,s,o,p),g.push(l.x),d.push(l.y)),h=a-2*i+e-(o-2*a+i),u=2*(i-e)-2*(a-i),c=e-i,f=(-u+q.sqrt(u*u-4*h*c))/2/h,p=(-u-q.sqrt(u*u-4*h*c))/2/h,V(f)>"1e12"&&(f=.5),V(p)>"1e12"&&(p=.5),f>0&&1>f&&(l=ze(t,e,r,i,n,a,s,o,f),g.push(l.x),d.push(l.y)),p>0&&1>p&&(l=ze(t,e,r,i,n,a,s,o,p),g.push(l.x),d.push(l.y)),{min:{x:O[N](0,g),y:O[N](0,d)},max:{x:D[N](0,g),y:D[N](0,d)}}}),Re=r._path2curve=a(function(t,e){var r=!e&&Se(t);if(!e&&r.curve)return Ae(r.curve);for(var i=Ee(t),n=e&&Ee(e),a={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},s={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},o=(function(t,e){var r,i;if(!t)return["C",e.x,e.y,e.x,e.y,e.x,e.y];switch(!(t[0]in{T:1,Q:1})&&(e.qx=e.qy=null),t[0]){case"M":e.X=t[1],e.Y=t[2];break;case"A":t=["C"][E](Pe[N](0,[e.x,e.y][E](t.slice(1))));break;case"S":r=e.x+(e.x-(e.bx||e.x)),i=e.y+(e.y-(e.by||e.y)),t=["C",r,i][E](t.slice(1));break;case"T":e.qx=e.x+(e.x-(e.qx||e.x)),e.qy=e.y+(e.y-(e.qy||e.y)),t=["C"][E](Me(e.x,e.y,e.qx,e.qy,t[1],t[2]));break;case"Q":e.qx=t[1],e.qy=t[2],t=["C"][E](Me(e.x,e.y,t[1],t[2],t[3],t[4]));break;case"L":t=["C"][E](Le(e.x,e.y,t[1],t[2]));break;case"H":t=["C"][E](Le(e.x,e.y,t[1],e.y));break;case"V":t=["C"][E](Le(e.x,e.y,e.x,t[1]));break;case"Z":t=["C"][E](Le(e.x,e.y,e.X,e.Y))}return t}),l=function(t,e){if(t[e].length>7){t[e].shift();for(var r=t[e];r.length;)t.splice(e++,0,["C"][E](r.splice(0,6)));t.splice(e,1),c=D(i.length,n&&n.length||0)}},h=function(t,e,r,a,s){t&&e&&"M"==t[s][0]&&"M"!=e[s][0]&&(e.splice(s,0,["M",a.x,a.y]),r.bx=0,r.by=0,r.x=t[s][1],r.y=t[s][2],c=D(i.length,n&&n.length||0))},u=0,c=D(i.length,n&&n.length||0);c>u;u++){i[u]=o(i[u],a),l(i,u),n&&(n[u]=o(n[u],s)),n&&l(n,u),h(i,n,a,s,u),h(n,i,s,a,u);var f=i[u],p=n&&n[u],d=f.length,g=n&&p.length;a.x=f[d-2],a.y=f[d-1],a.bx=K(f[d-4])||a.x,a.by=K(f[d-3])||a.y,s.bx=n&&(K(p[g-4])||s.x),s.by=n&&(K(p[g-3])||s.y),s.x=n&&p[g-2],s.y=n&&p[g-1]}return n||(r.curve=Ae(i)),n?[i,n]:i},null,Ae),Ie=(r._parseDots=a(function(t){for(var e=[],i=0,n=t.length;n>i;i++){var a={},s=t[i].match(/^([^:]*):?([\d\.]*)/);if(a.color=r.getRGB(s[1]),a.color.error)return null;a.color=a.color.hex,s[2]&&(a.offset=s[2]+"%"),e.push(a)}for(i=1,n=e.length-1;n>i;i++)if(!e[i].offset){for(var o=K(e[i-1].offset||0),l=0,h=i+1;n>h;h++)if(e[h].offset){l=e[h].offset;break}l||(l=100,h=n),l=K(l);for(var u=(l-o)/(h-i+1);h>i;i++)o+=u,e[i].offset=o+"%"}return e}),r._tear=function(t,e){t==e.top&&(e.top=t.prev),t==e.bottom&&(e.bottom=t.next),t.next&&(t.next.prev=t.prev),t.prev&&(t.prev.next=t.next)}),je=(r._tofront=function(t,e){e.top!==t&&(Ie(t,e),t.next=null,t.prev=e.top,e.top.next=t,e.top=t)},r._toback=function(t,e){e.bottom!==t&&(Ie(t,e),t.next=e.bottom,t.prev=null,e.bottom.prev=t,e.bottom=t)},r._insertafter=function(t,e,r){Ie(t,r),e==r.top&&(r.top=t),e.next&&(e.next.prev=t),t.next=e.next,t.prev=e,e.next=t},r._insertbefore=function(t,e,r){Ie(t,r),e==r.bottom&&(r.bottom=t),e.prev&&(e.prev.next=t),t.prev=e.prev,e.prev=t,t.next=e},r.toMatrix=function(t,e){var r=Te(t),i={_:{transform:M},getBBox:function(){return r}};return qe(i,e),i.matrix}),qe=(r.transformPath=function(t,e){return xe(t,je(t,e))},r._extractTransform=function(t,e){if(null==e)return t._.transform;e=z(e).replace(/\.{3}|\u2026/g,t._.transform||M);var i=r.parseTransformString(e),n=0,a=0,s=0,o=1,l=1,h=t._,u=new d;if(h.transform=i||[],i)for(var c=0,f=i.length;f>c;c++){var p,g,v,x,y,m=i[c],b=m.length,_=z(m[0]).toLowerCase(),w=m[0]!=_,k=w?u.invert():0;"t"==_&&3==b?w?(p=k.x(0,0),g=k.y(0,0),v=k.x(m[1],m[2]),x=k.y(m[1],m[2]),u.translate(v-p,x-g)):u.translate(m[1],m[2]):"r"==_?2==b?(y=y||t.getBBox(1),u.rotate(m[1],y.x+y.width/2,y.y+y.height/2),n+=m[1]):4==b&&(w?(v=k.x(m[2],m[3]),x=k.y(m[2],m[3]),u.rotate(m[1],v,x)):u.rotate(m[1],m[2],m[3]),n+=m[1]):"s"==_?2==b||3==b?(y=y||t.getBBox(1),u.scale(m[1],m[b-1],y.x+y.width/2,y.y+y.height/2),o*=m[1],l*=m[b-1]):5==b&&(w?(v=k.x(m[3],m[4]),x=k.y(m[3],m[4]),u.scale(m[1],m[2],v,x)):u.scale(m[1],m[2],m[3],m[4]),o*=m[1],l*=m[2]):"m"==_&&7==b&&u.add(m[1],m[2],m[3],m[4],m[5],m[6]),h.dirtyT=1,t.matrix=u}t.matrix=u,h.sx=o,h.sy=l,h.deg=n,h.dx=a=u.e,h.dy=s=u.f,1==o&&1==l&&!n&&h.bbox?(h.bbox.x+=+a,h.bbox.y+=+s):h.dirtyT=1}),De=function(t){var e=t[0];switch(e.toLowerCase()){case"t":return[e,0,0];case"m":return[e,1,0,0,1,0,0];case"r":return 4==t.length?[e,0,t[2],t[3]]:[e,0];case"s":return 5==t.length?[e,1,1,t[3],t[4]]:3==t.length?[e,1,1]:[e,1]}},Oe=r._equaliseTransform=function(t,e){e=z(e).replace(/\.{3}|\u2026/g,t),t=r.parseTransformString(t)||[],e=r.parseTransformString(e)||[];for(var i,n,a,s,o=D(t.length,e.length),l=[],h=[],u=0;o>u;u++){if(a=t[u]||De(e[u]),s=e[u]||De(a),a[0]!=s[0]||"r"==a[0].toLowerCase()&&(a[2]!=s[2]||a[3]!=s[3])||"s"==a[0].toLowerCase()&&(a[3]!=s[3]||a[4]!=s[4]))return;for(l[u]=[],h[u]=[],i=0,n=D(a.length,s.length);n>i;i++)i in a&&(l[u][i]=a[i]),i in s&&(h[u][i]=s[i])}return{from:l,to:h} +};r._getContainer=function(t,e,i,n){var a;return a=null!=n||r.is(t,"object")?t:S.doc.getElementById(t),null!=a?a.tagName?null==e?{container:a,width:a.style.pixelWidth||a.offsetWidth,height:a.style.pixelHeight||a.offsetHeight}:{container:a,width:e,height:i}:{container:1,x:t,y:e,width:i,height:n}:void 0},r.pathToRelative=Ne,r._engine={},r.path2curve=Re,r.matrix=function(t,e,r,i,n,a){return new d(t,e,r,i,n,a)},function(t){function e(t){return t[0]*t[0]+t[1]*t[1]}function i(t){var r=q.sqrt(e(t));t[0]&&(t[0]/=r),t[1]&&(t[1]/=r)}t.add=function(t,e,r,i,n,a){var s,o,l,h,u=[[],[],[]],c=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],f=[[t,r,n],[e,i,a],[0,0,1]];for(t&&t instanceof d&&(f=[[t.a,t.c,t.e],[t.b,t.d,t.f],[0,0,1]]),s=0;3>s;s++)for(o=0;3>o;o++){for(h=0,l=0;3>l;l++)h+=c[s][l]*f[l][o];u[s][o]=h}this.a=u[0][0],this.b=u[1][0],this.c=u[0][1],this.d=u[1][1],this.e=u[0][2],this.f=u[1][2]},t.invert=function(){var t=this,e=t.a*t.d-t.b*t.c;return new d(t.d/e,-t.b/e,-t.c/e,t.a/e,(t.c*t.f-t.d*t.e)/e,(t.b*t.e-t.a*t.f)/e)},t.clone=function(){return new d(this.a,this.b,this.c,this.d,this.e,this.f)},t.translate=function(t,e){this.add(1,0,0,1,t,e)},t.scale=function(t,e,r,i){null==e&&(e=t),(r||i)&&this.add(1,0,0,1,r,i),this.add(t,0,0,e,0,0),(r||i)&&this.add(1,0,0,1,-r,-i)},t.rotate=function(t,e,i){t=r.rad(t),e=e||0,i=i||0;var n=+q.cos(t).toFixed(9),a=+q.sin(t).toFixed(9);this.add(n,a,-a,n,e,i),this.add(1,0,0,1,-e,-i)},t.x=function(t,e){return t*this.a+e*this.c+this.e},t.y=function(t,e){return t*this.b+e*this.d+this.f},t.get=function(t){return+this[z.fromCharCode(97+t)].toFixed(4)},t.toString=function(){return r.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},t.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},t.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},t.split=function(){var t={};t.dx=this.e,t.dy=this.f;var n=[[this.a,this.c],[this.b,this.d]];t.scalex=q.sqrt(e(n[0])),i(n[0]),t.shear=n[0][0]*n[1][0]+n[0][1]*n[1][1],n[1]=[n[1][0]-n[0][0]*t.shear,n[1][1]-n[0][1]*t.shear],t.scaley=q.sqrt(e(n[1])),i(n[1]),t.shear/=t.scaley;var a=-n[0][1],s=n[1][1];return 0>s?(t.rotate=r.deg(q.acos(s)),0>a&&(t.rotate=360-t.rotate)):t.rotate=r.deg(q.asin(a)),t.isSimple=!(+t.shear.toFixed(9)||t.scalex.toFixed(9)!=t.scaley.toFixed(9)&&t.rotate),t.isSuperSimple=!+t.shear.toFixed(9)&&t.scalex.toFixed(9)==t.scaley.toFixed(9)&&!t.rotate,t.noRotation=!+t.shear.toFixed(9)&&!t.rotate,t},t.toTransformString=function(t){var e=t||this[F]();return e.isSimple?(e.scalex=+e.scalex.toFixed(4),e.scaley=+e.scaley.toFixed(4),e.rotate=+e.rotate.toFixed(4),(e.dx||e.dy?"t"+[e.dx,e.dy]:M)+(1!=e.scalex||1!=e.scaley?"s"+[e.scalex,e.scaley,0,0]:M)+(e.rotate?"r"+[e.rotate,0,0]:M)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(d.prototype);var Ve=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);_.safari="Apple Computer, Inc."==navigator.vendor&&(Ve&&4>Ve[1]||"iP"==navigator.platform.slice(0,2))||"Google Inc."==navigator.vendor&&Ve&&8>Ve[1]?function(){var t=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){t.remove()})}:fe;for(var Ye=function(){this.returnValue=!1},Ge=function(){return this.originalEvent.preventDefault()},We=function(){this.cancelBubble=!0},Xe=function(){return this.originalEvent.stopPropagation()},He=function(t){var e=S.doc.documentElement.scrollTop||S.doc.body.scrollTop,r=S.doc.documentElement.scrollLeft||S.doc.body.scrollLeft;return{x:t.clientX+r,y:t.clientY+e}},Ue=function(){return S.doc.addEventListener?function(t,e,r,i){var n=function(t){var e=He(t);return r.call(i,t,e.x,e.y)};if(t.addEventListener(e,n,!1),L&&I[e]){var a=function(e){for(var n=He(e),a=e,s=0,o=e.targetTouches&&e.targetTouches.length;o>s;s++)if(e.targetTouches[s].target==t){e=e.targetTouches[s],e.originalEvent=a,e.preventDefault=Ge,e.stopPropagation=Xe;break}return r.call(i,e,n.x,n.y)};t.addEventListener(I[e],a,!1)}return function(){return t.removeEventListener(e,n,!1),L&&I[e]&&t.removeEventListener(I[e],n,!1),!0}}:S.doc.attachEvent?function(t,e,r,i){var n=function(t){t=t||S.win.event;var e=S.doc.documentElement.scrollTop||S.doc.body.scrollTop,n=S.doc.documentElement.scrollLeft||S.doc.body.scrollLeft,a=t.clientX+n,s=t.clientY+e;return t.preventDefault=t.preventDefault||Ye,t.stopPropagation=t.stopPropagation||We,r.call(i,t,a,s)};t.attachEvent("on"+e,n);var a=function(){return t.detachEvent("on"+e,n),!0};return a}:void 0}(),$e=[],Ze=function(t){for(var r,i=t.clientX,n=t.clientY,a=S.doc.documentElement.scrollTop||S.doc.body.scrollTop,s=S.doc.documentElement.scrollLeft||S.doc.body.scrollLeft,o=$e.length;o--;){if(r=$e[o],L&&t.touches){for(var l,h=t.touches.length;h--;)if(l=t.touches[h],l.identifier==r.el._drag.id){i=l.clientX,n=l.clientY,(t.originalEvent?t.originalEvent:t).preventDefault();break}}else t.preventDefault();var u,c=r.el.node,f=c.nextSibling,p=c.parentNode,d=c.style.display;S.win.opera&&p.removeChild(c),c.style.display="none",u=r.el.paper.getElementByPoint(i,n),c.style.display=d,S.win.opera&&(f?p.insertBefore(c,f):p.appendChild(c)),u&&e("raphael.drag.over."+r.el.id,r.el,u),i+=s,n+=a,e("raphael.drag.move."+r.el.id,r.move_scope||r.el,i-r.el._drag.x,n-r.el._drag.y,i,n,t)}},Qe=function(t){r.unmousemove(Ze).unmouseup(Qe);for(var i,n=$e.length;n--;)i=$e[n],i.el._drag={},e("raphael.drag.end."+i.el.id,i.end_scope||i.start_scope||i.move_scope||i.el,t);$e=[]},Je=r.el={},Ke=R.length;Ke--;)(function(t){r[t]=Je[t]=function(e,i){return r.is(e,"function")&&(this.events=this.events||[],this.events.push({name:t,f:e,unbind:Ue(this.shape||this.node||S.doc,t,e,i||this)})),this},r["un"+t]=Je["un"+t]=function(e){for(var i=this.events||[],n=i.length;n--;)i[n].name!=t||!r.is(e,"undefined")&&i[n].f!=e||(i[n].unbind(),i.splice(n,1),!i.length&&delete this.events);return this}})(R[Ke]);Je.data=function(t,i){var n=ue[this.id]=ue[this.id]||{};if(0==arguments.length)return n;if(1==arguments.length){if(r.is(t,"object")){for(var a in t)t[B](a)&&this.data(a,t[a]);return this}return e("raphael.data.get."+this.id,this,n[t],t),n[t]}return n[t]=i,e("raphael.data.set."+this.id,this,i,t),this},Je.removeData=function(t){return null==t?ue[this.id]={}:ue[this.id]&&delete ue[this.id][t],this},Je.getData=function(){return i(ue[this.id]||{})},Je.hover=function(t,e,r,i){return this.mouseover(t,r).mouseout(e,i||r)},Je.unhover=function(t,e){return this.unmouseover(t).unmouseout(e)};var tr=[];Je.drag=function(t,i,n,a,s,o){function l(l){(l.originalEvent||l).preventDefault();var h=S.doc.documentElement.scrollTop||S.doc.body.scrollTop,u=S.doc.documentElement.scrollLeft||S.doc.body.scrollLeft;this._drag.x=l.clientX+u,this._drag.y=l.clientY+h,this._drag.id=l.identifier,!$e.length&&r.mousemove(Ze).mouseup(Qe),$e.push({el:this,move_scope:a,start_scope:s,end_scope:o}),i&&e.on("raphael.drag.start."+this.id,i),t&&e.on("raphael.drag.move."+this.id,t),n&&e.on("raphael.drag.end."+this.id,n),e("raphael.drag.start."+this.id,s||a||this,l.clientX+u,l.clientY+h,l)}return this._drag={},tr.push({el:this,start:l}),this.mousedown(l),this},Je.onDragOver=function(t){t?e.on("raphael.drag.over."+this.id,t):e.unbind("raphael.drag.over."+this.id)},Je.undrag=function(){for(var t=tr.length;t--;)tr[t].el==this&&(this.unmousedown(tr[t].start),tr.splice(t,1),e.unbind("raphael.drag.*."+this.id));!tr.length&&r.unmousemove(Ze).unmouseup(Qe),$e=[]},_.circle=function(t,e,i){var n=r._engine.circle(this,t||0,e||0,i||0);return this.__set__&&this.__set__.push(n),n},_.rect=function(t,e,i,n,a){var s=r._engine.rect(this,t||0,e||0,i||0,n||0,a||0);return this.__set__&&this.__set__.push(s),s},_.ellipse=function(t,e,i,n){var a=r._engine.ellipse(this,t||0,e||0,i||0,n||0);return this.__set__&&this.__set__.push(a),a},_.path=function(t){t&&!r.is(t,X)&&!r.is(t[0],H)&&(t+=M);var e=r._engine.path(r.format[N](r,arguments),this);return this.__set__&&this.__set__.push(e),e},_.image=function(t,e,i,n,a){var s=r._engine.image(this,t||"about:blank",e||0,i||0,n||0,a||0);return this.__set__&&this.__set__.push(s),s},_.text=function(t,e,i){var n=r._engine.text(this,t||0,e||0,z(i));return this.__set__&&this.__set__.push(n),n},_.set=function(t){!r.is(t,"array")&&(t=Array.prototype.splice.call(arguments,0,arguments.length));var e=new fr(t);return this.__set__&&this.__set__.push(e),e.paper=this,e.type="set",e},_.setStart=function(t){this.__set__=t||this.set()},_.setFinish=function(){var t=this.__set__;return delete this.__set__,t},_.setSize=function(t,e){return r._engine.setSize.call(this,t,e)},_.setViewBox=function(t,e,i,n,a){return r._engine.setViewBox.call(this,t,e,i,n,a)},_.top=_.bottom=null,_.raphael=r;var er=function(t){var e=t.getBoundingClientRect(),r=t.ownerDocument,i=r.body,n=r.documentElement,a=n.clientTop||i.clientTop||0,s=n.clientLeft||i.clientLeft||0,o=e.top+(S.win.pageYOffset||n.scrollTop||i.scrollTop)-a,l=e.left+(S.win.pageXOffset||n.scrollLeft||i.scrollLeft)-s;return{y:o,x:l}};_.getElementByPoint=function(t,e){var r=this,i=r.canvas,n=S.doc.elementFromPoint(t,e);if(S.win.opera&&"svg"==n.tagName){var a=er(i),s=i.createSVGRect();s.x=t-a.x,s.y=e-a.y,s.width=s.height=1;var o=i.getIntersectionList(s,null);o.length&&(n=o[o.length-1])}if(!n)return null;for(;n.parentNode&&n!=i.parentNode&&!n.raphael;)n=n.parentNode;return n==r.canvas.parentNode&&(n=i),n=n&&n.raphael?r.getById(n.raphaelid):null},_.getElementsByBBox=function(t){var e=this.set();return this.forEach(function(i){r.isBBoxIntersect(i.getBBox(),t)&&e.push(i)}),e},_.getById=function(t){for(var e=this.bottom;e;){if(e.id==t)return e;e=e.next}return null},_.forEach=function(t,e){for(var r=this.bottom;r;){if(t.call(e,r)===!1)return this;r=r.next}return this},_.getElementsByPoint=function(t,e){var r=this.set();return this.forEach(function(i){i.isPointInside(t,e)&&r.push(i)}),r},Je.isPointInside=function(t,e){var i=this.realPath=this.realPath||ve[this.type](this);return r.isPointInsidePath(i,t,e)},Je.getBBox=function(t){if(this.removed)return{};var e=this._;return t?((e.dirty||!e.bboxwt)&&(this.realPath=ve[this.type](this),e.bboxwt=Te(this.realPath),e.bboxwt.toString=g,e.dirty=0),e.bboxwt):((e.dirty||e.dirtyT||!e.bbox)&&((e.dirty||!this.realPath)&&(e.bboxwt=0,this.realPath=ve[this.type](this)),e.bbox=Te(xe(this.realPath,this.matrix)),e.bbox.toString=g,e.dirty=e.dirtyT=0),e.bbox)},Je.clone=function(){if(this.removed)return null;var t=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(t),t},Je.glow=function(t){if("text"==this.type)return null;t=t||{};var e={width:(t.width||10)+(+this.attr("stroke-width")||1),fill:t.fill||!1,opacity:t.opacity||.5,offsetx:t.offsetx||0,offsety:t.offsety||0,color:t.color||"#000"},r=e.width/2,i=this.paper,n=i.set(),a=this.realPath||ve[this.type](this);a=this.matrix?xe(a,this.matrix):a;for(var s=1;r+1>s;s++)n.push(i.path(a).attr({stroke:e.color,fill:e.fill?e.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(e.width/r*s).toFixed(3),opacity:+(e.opacity/r).toFixed(3)}));return n.insertBefore(this).translate(e.offsetx,e.offsety)};var rr=function(t,e,i,n,a,s,o,l,c){return null==c?h(t,e,i,n,a,s,o,l):r.findDotsAtSegment(t,e,i,n,a,s,o,l,u(t,e,i,n,a,s,o,l,c))},ir=function(t,e){return function(i,n,a){i=Re(i);for(var s,o,l,h,u,c="",f={},p=0,d=0,g=i.length;g>d;d++){if(l=i[d],"M"==l[0])s=+l[1],o=+l[2];else{if(h=rr(s,o,l[1],l[2],l[3],l[4],l[5],l[6]),p+h>n){if(e&&!f.start){if(u=rr(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p),c+=["C"+u.start.x,u.start.y,u.m.x,u.m.y,u.x,u.y],a)return c;f.start=c,c=["M"+u.x,u.y+"C"+u.n.x,u.n.y,u.end.x,u.end.y,l[5],l[6]].join(),p+=h,s=+l[5],o=+l[6];continue}if(!t&&!e)return u=rr(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p),{x:u.x,y:u.y,alpha:u.alpha}}p+=h,s=+l[5],o=+l[6]}c+=l.shift()+l}return f.end=c,u=t?p:e?f:r.findDotsAtSegment(s,o,l[0],l[1],l[2],l[3],l[4],l[5],1),u.alpha&&(u={x:u.x,y:u.y,alpha:u.alpha}),u}},nr=ir(1),ar=ir(),sr=ir(0,1);r.getTotalLength=nr,r.getPointAtLength=ar,r.getSubpath=function(t,e,r){if(1e-6>this.getTotalLength(t)-r)return sr(t,e).end;var i=sr(t,r,1);return e?sr(i,e).end:i},Je.getTotalLength=function(){var t=this.getPath();if(t)return this.node.getTotalLength?this.node.getTotalLength():nr(t)},Je.getPointAtLength=function(t){var e=this.getPath();if(e)return ar(e,t)},Je.getPath=function(){var t,e=r._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return e&&(t=e(this)),t},Je.getSubpath=function(t,e){var i=this.getPath();if(i)return r.getSubpath(i,t,e)};var or=r.easing_formulas={linear:function(t){return t},"<":function(t){return Y(t,1.7)},">":function(t){return Y(t,.48)},"<>":function(t){var e=.48-t/1.04,r=q.sqrt(.1734+e*e),i=r-e,n=Y(V(i),1/3)*(0>i?-1:1),a=-r-e,s=Y(V(a),1/3)*(0>a?-1:1),o=n+s+.5;return 3*(1-o)*o*o+o*o*o},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){t-=1;var e=1.70158;return t*t*((e+1)*t+e)+1},elastic:function(t){return t==!!t?t:Y(2,-10*t)*q.sin((t-.075)*2*G/.3)+1},bounce:function(t){var e,r=7.5625,i=2.75;return 1/i>t?e=r*t*t:2/i>t?(t-=1.5/i,e=r*t*t+.75):2.5/i>t?(t-=2.25/i,e=r*t*t+.9375):(t-=2.625/i,e=r*t*t+.984375),e}};or.easeIn=or["ease-in"]=or["<"],or.easeOut=or["ease-out"]=or[">"],or.easeInOut=or["ease-in-out"]=or["<>"],or["back-in"]=or.backIn,or["back-out"]=or.backOut;var lr=[],hr=t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||t.msRequestAnimationFrame||function(t){setTimeout(t,16)},ur=function(){for(var t=+new Date,i=0;lr.length>i;i++){var n=lr[i];if(!n.el.removed&&!n.paused){var a,s,o=t-n.start,l=n.ms,h=n.easing,u=n.from,c=n.diff,f=n.to,p=(n.t,n.el),d={},g={};if(n.initstatus?(o=(n.initstatus*n.anim.top-n.prev)/(n.percent-n.prev)*l,n.status=n.initstatus,delete n.initstatus,n.stop&&lr.splice(i--,1)):n.status=(n.prev+(n.percent-n.prev)*(o/l))/n.anim.top,!(0>o))if(l>o){var v=h(o/l);for(var x in u)if(u[B](x)){switch(ie[x]){case W:a=+u[x]+v*l*c[x];break;case"colour":a="rgb("+[cr(J(u[x].r+v*l*c[x].r)),cr(J(u[x].g+v*l*c[x].g)),cr(J(u[x].b+v*l*c[x].b))].join(",")+")";break;case"path":a=[];for(var m=0,b=u[x].length;b>m;m++){a[m]=[u[x][m][0]];for(var _=1,w=u[x][m].length;w>_;_++)a[m][_]=+u[x][m][_]+v*l*c[x][m][_];a[m]=a[m].join(P)}a=a.join(P);break;case"transform":if(c[x].real)for(a=[],m=0,b=u[x].length;b>m;m++)for(a[m]=[u[x][m][0]],_=1,w=u[x][m].length;w>_;_++)a[m][_]=u[x][m][_]+v*l*c[x][m][_];else{var k=function(t){return+u[x][t]+v*l*c[x][t]};a=[["m",k(0),k(1),k(2),k(3),k(4),k(5)]]}break;case"csv":if("clip-rect"==x)for(a=[],m=4;m--;)a[m]=+u[x][m]+v*l*c[x][m];break;default:var C=[][E](u[x]);for(a=[],m=p.paper.customAttributes[x].length;m--;)a[m]=+C[m]+v*l*c[x][m]}d[x]=a}p.attr(d),function(t,r,i){setTimeout(function(){e("raphael.anim.frame."+t,r,i)})}(p.id,p,n.anim)}else{if(function(t,i,n){setTimeout(function(){e("raphael.anim.frame."+i.id,i,n),e("raphael.anim.finish."+i.id,i,n),r.is(t,"function")&&t.call(i)})}(n.callback,p,n.anim),p.attr(f),lr.splice(i--,1),n.repeat>1&&!n.next){for(s in f)f[B](s)&&(g[s]=n.totalOrigin[s]);n.el.attr(g),y(n.anim,n.el,n.anim.percents[0],null,n.totalOrigin,n.repeat-1)}n.next&&!n.stop&&y(n.anim,n.el,n.next,null,n.totalOrigin,n.repeat)}}}r.svg&&p&&p.paper&&p.paper.safari(),lr.length&&hr(ur)},cr=function(t){return t>255?255:0>t?0:t};Je.animateWith=function(t,e,i,n,a,s){var o=this;if(o.removed)return s&&s.call(o),o;var l=i instanceof x?i:r.animation(i,n,a,s);y(l,o,l.percents[0],null,o.attr());for(var h=0,u=lr.length;u>h;h++)if(lr[h].anim==e&&lr[h].el==t){lr[u-1].start=lr[h].start;break}return o},Je.onAnimation=function(t){return t?e.on("raphael.anim.frame."+this.id,t):e.unbind("raphael.anim.frame."+this.id),this},x.prototype.delay=function(t){var e=new x(this.anim,this.ms);return e.times=this.times,e.del=+t||0,e},x.prototype.repeat=function(t){var e=new x(this.anim,this.ms);return e.del=this.del,e.times=q.floor(D(t,0))||1,e},r.animation=function(t,e,i,n){if(t instanceof x)return t;(r.is(i,"function")||!i)&&(n=n||i||null,i=null),t=Object(t),e=+e||0;var a,s,o={};for(s in t)t[B](s)&&K(s)!=s&&K(s)+"%"!=s&&(a=!0,o[s]=t[s]);return a?(i&&(o.easing=i),n&&(o.callback=n),new x({100:o},e)):new x(t,e)},Je.animate=function(t,e,i,n){var a=this;if(a.removed)return n&&n.call(a),a;var s=t instanceof x?t:r.animation(t,e,i,n);return y(s,a,s.percents[0],null,a.attr()),a},Je.setTime=function(t,e){return t&&null!=e&&this.status(t,O(e,t.ms)/t.ms),this},Je.status=function(t,e){var r,i,n=[],a=0;if(null!=e)return y(t,this,-1,O(e,1)),this;for(r=lr.length;r>a;a++)if(i=lr[a],i.el.id==this.id&&(!t||i.anim==t)){if(t)return i.status;n.push({anim:i.anim,status:i.status})}return t?0:n},Je.pause=function(t){for(var r=0;lr.length>r;r++)lr[r].el.id!=this.id||t&&lr[r].anim!=t||e("raphael.anim.pause."+this.id,this,lr[r].anim)!==!1&&(lr[r].paused=!0);return this},Je.resume=function(t){for(var r=0;lr.length>r;r++)if(lr[r].el.id==this.id&&(!t||lr[r].anim==t)){var i=lr[r];e("raphael.anim.resume."+this.id,this,i.anim)!==!1&&(delete i.paused,this.status(i.anim,i.status))}return this},Je.stop=function(t){for(var r=0;lr.length>r;r++)lr[r].el.id!=this.id||t&&lr[r].anim!=t||e("raphael.anim.stop."+this.id,this,lr[r].anim)!==!1&&lr.splice(r--,1);return this},e.on("raphael.remove",m),e.on("raphael.clear",m),Je.toString=function(){return"Raphaël’s object"};var fr=function(t){if(this.items=[],this.length=0,this.type="set",t)for(var e=0,r=t.length;r>e;e++)!t[e]||t[e].constructor!=Je.constructor&&t[e].constructor!=fr||(this[this.items.length]=this.items[this.items.length]=t[e],this.length++)},pr=fr.prototype;pr.push=function(){for(var t,e,r=0,i=arguments.length;i>r;r++)t=arguments[r],!t||t.constructor!=Je.constructor&&t.constructor!=fr||(e=this.items.length,this[e]=this.items[e]=t,this.length++);return this},pr.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},pr.forEach=function(t,e){for(var r=0,i=this.items.length;i>r;r++)if(t.call(e,this.items[r],r)===!1)return this;return this};for(var dr in Je)Je[B](dr)&&(pr[dr]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t][N](r,e)})}}(dr));return pr.attr=function(t,e){if(t&&r.is(t,H)&&r.is(t[0],"object"))for(var i=0,n=t.length;n>i;i++)this.items[i].attr(t[i]);else for(var a=0,s=this.items.length;s>a;a++)this.items[a].attr(t,e);return this},pr.clear=function(){for(;this.length;)this.pop()},pr.splice=function(t,e){t=0>t?D(this.length+t,0):t,e=D(0,O(this.length-t,e));var r,i=[],n=[],a=[];for(r=2;arguments.length>r;r++)a.push(arguments[r]);for(r=0;e>r;r++)n.push(this[t+r]);for(;this.length-t>r;r++)i.push(this[t+r]);var s=a.length;for(r=0;s+i.length>r;r++)this.items[t+r]=this[t+r]=s>r?a[r]:i[r-s];for(r=this.items.length=this.length-=e-s;this[r];)delete this[r++];return new fr(n)},pr.exclude=function(t){for(var e=0,r=this.length;r>e;e++)if(this[e]==t)return this.splice(e,1),!0},pr.animate=function(t,e,i,n){(r.is(i,"function")||!i)&&(n=i||null);var a,s,o=this.items.length,l=o,h=this;if(!o)return this;n&&(s=function(){!--o&&n.call(h)}),i=r.is(i,X)?i:s;var u=r.animation(t,e,i,s);for(a=this.items[--l].animate(u);l--;)this.items[l]&&!this.items[l].removed&&this.items[l].animateWith(a,u,u),this.items[l]&&!this.items[l].removed||o--;return this},pr.insertAfter=function(t){for(var e=this.items.length;e--;)this.items[e].insertAfter(t);return this},pr.getBBox=function(){for(var t=[],e=[],r=[],i=[],n=this.items.length;n--;)if(!this.items[n].removed){var a=this.items[n].getBBox();t.push(a.x),e.push(a.y),r.push(a.x+a.width),i.push(a.y+a.height)}return t=O[N](0,t),e=O[N](0,e),r=D[N](0,r),i=D[N](0,i),{x:t,y:e,x2:r,y2:i,width:r-t,height:i-e}},pr.clone=function(t){t=this.paper.set();for(var e=0,r=this.items.length;r>e;e++)t.push(this.items[e].clone());return t},pr.toString=function(){return"Raphaël‘s set"},pr.glow=function(t){var e=this.paper.set();return this.forEach(function(r){var i=r.glow(t);null!=i&&i.forEach(function(t){e.push(t)})}),e},pr.isPointInside=function(t,e){var r=!1;return this.forEach(function(i){return i.isPointInside(t,e)?(console.log("runned"),r=!0,!1):void 0}),r},r.registerFont=function(t){if(!t.face)return t;this.fonts=this.fonts||{};var e={w:t.w,face:{},glyphs:{}},r=t.face["font-family"];for(var i in t.face)t.face[B](i)&&(e.face[i]=t.face[i]);if(this.fonts[r]?this.fonts[r].push(e):this.fonts[r]=[e],!t.svg){e.face["units-per-em"]=te(t.face["units-per-em"],10);for(var n in t.glyphs)if(t.glyphs[B](n)){var a=t.glyphs[n];if(e.glyphs[n]={w:a.w,k:{},d:a.d&&"M"+a.d.replace(/[mlcxtrv]/g,function(t){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[t]||"M"})+"z"},a.k)for(var s in a.k)a[B](s)&&(e.glyphs[n].k[s]=a.k[s])}}return t},_.getFont=function(t,e,i,n){if(n=n||"normal",i=i||"normal",e=+e||{normal:400,bold:700,lighter:300,bolder:800}[e]||400,r.fonts){var a=r.fonts[t];if(!a){var s=RegExp("(^|\\s)"+t.replace(/[^\w\d\s+!~.:_-]/g,M)+"(\\s|$)","i");for(var o in r.fonts)if(r.fonts[B](o)&&s.test(o)){a=r.fonts[o];break}}var l;if(a)for(var h=0,u=a.length;u>h&&(l=a[h],l.face["font-weight"]!=e||l.face["font-style"]!=i&&l.face["font-style"]||l.face["font-stretch"]!=n);h++);return l}},_.print=function(t,e,i,n,a,s,o,l){s=s||"middle",o=D(O(o||0,1),-1),l=D(O(l||1,3),1);var h,u=z(i)[F](M),c=0,f=0,p=M;if(r.is(n,"string")&&(n=this.getFont(n)),n){h=(a||16)/n.face["units-per-em"];for(var d=n.face.bbox[F](w),g=+d[0],v=d[3]-d[1],x=0,y=+d[1]+("baseline"==s?v+ +n.face.descent:v/2),m=0,b=u.length;b>m;m++){if("\n"==u[m])c=0,k=0,f=0,x+=v*l;else{var _=f&&n.glyphs[u[m-1]]||{},k=n.glyphs[u[m]];c+=f?(_.w||n.w)+(_.k&&_.k[u[m]]||0)+n.w*o:0,f=1}k&&k.d&&(p+=r.transformPath(k.d,["t",c*h,x*h,"s",h,h,g,y,"t",(t-g)/h,(e-y)/h]))}}return this.path(p).attr({fill:"#000",stroke:"none"})},_.add=function(t){if(r.is(t,"array"))for(var e,i=this.set(),n=0,a=t.length;a>n;n++)e=t[n]||{},k[B](e.type)&&i.push(this[e.type]().attr(e));return i},r.format=function(t,e){var i=r.is(e,H)?[0][E](e):arguments;return t&&r.is(t,X)&&i.length-1&&(t=t.replace(C,function(t,e){return null==i[++e]?M:i[e]})),t||M},r.fullfill=function(){var t=/\{([^\}]+)\}/g,e=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,r=function(t,r,i){var n=i;return r.replace(e,function(t,e,r,i,a){e=e||i,n&&(e in n&&(n=n[e]),"function"==typeof n&&a&&(n=n()))}),n=(null==n||n==i?t:n)+""};return function(e,i){return(e+"").replace(t,function(t,e){return r(t,e,i)})}}(),r.ninja=function(){return T.was?S.win.Raphael=T.is:delete Raphael,r},r.st=pr,function(t,e,i){function n(){/in/.test(t.readyState)?setTimeout(n,9):r.eve("raphael.DOMload")}null==t.readyState&&t.addEventListener&&(t.addEventListener(e,i=function(){t.removeEventListener(e,i,!1),t.readyState="complete"},!1),t.readyState="loading"),n()}(document,"DOMContentLoaded"),e.on("raphael.DOMload",function(){b=!0}),function(){if(r.svg){var t="hasOwnProperty",e=String,i=parseFloat,n=parseInt,a=Math,s=a.max,o=a.abs,l=a.pow,h=/[, ]+/,u=r.eve,c="",f=" ",p="http://www.w3.org/1999/xlink",d={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},g={};r.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var v=function(i,n){if(n){"string"==typeof i&&(i=v(i));for(var a in n)n[t](a)&&("xlink:"==a.substring(0,6)?i.setAttributeNS(p,a.substring(6),e(n[a])):i.setAttribute(a,e(n[a])))}else i=r._g.doc.createElementNS("http://www.w3.org/2000/svg",i),i.style&&(i.style.webkitTapHighlightColor="rgba(0,0,0,0)");return i},x=function(t,n){var h="linear",u=t.id+n,f=.5,p=.5,d=t.node,g=t.paper,x=d.style,y=r._g.doc.getElementById(u);if(!y){if(n=e(n).replace(r._radial_gradient,function(t,e,r){if(h="radial",e&&r){f=i(e),p=i(r);var n=2*(p>.5)-1;l(f-.5,2)+l(p-.5,2)>.25&&(p=a.sqrt(.25-l(f-.5,2))*n+.5)&&.5!=p&&(p=p.toFixed(5)-1e-5*n)}return c}),n=n.split(/\s*\-\s*/),"linear"==h){var m=n.shift();if(m=-i(m),isNaN(m))return null;var b=[0,0,a.cos(r.rad(m)),a.sin(r.rad(m))],_=1/(s(o(b[2]),o(b[3]))||1);b[2]*=_,b[3]*=_,0>b[2]&&(b[0]=-b[2],b[2]=0),0>b[3]&&(b[1]=-b[3],b[3]=0)}var w=r._parseDots(n);if(!w)return null;if(u=u.replace(/[\(\)\s,\xb0#]/g,"_"),t.gradient&&u!=t.gradient.id&&(g.defs.removeChild(t.gradient),delete t.gradient),!t.gradient){y=v(h+"Gradient",{id:u}),t.gradient=y,v(y,"radial"==h?{fx:f,fy:p}:{x1:b[0],y1:b[1],x2:b[2],y2:b[3],gradientTransform:t.matrix.invert()}),g.defs.appendChild(y);for(var k=0,C=w.length;C>k;k++)y.appendChild(v("stop",{offset:w[k].offset?w[k].offset:k?"100%":"0%","stop-color":w[k].color||"#fff"}))}}return v(d,{fill:"url(#"+u+")",opacity:1,"fill-opacity":1}),x.fill=c,x.opacity=1,x.fillOpacity=1,1},y=function(t){var e=t.getBBox(1);v(t.pattern,{patternTransform:t.matrix.invert()+" translate("+e.x+","+e.y+")"})},m=function(i,n,a){if("path"==i.type){for(var s,o,l,h,u,f=e(n).toLowerCase().split("-"),p=i.paper,x=a?"end":"start",y=i.node,m=i.attrs,b=m["stroke-width"],_=f.length,w="classic",k=3,C=3,B=5;_--;)switch(f[_]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":w=f[_];break;case"wide":C=5;break;case"narrow":C=2;break;case"long":k=5;break;case"short":k=2}if("open"==w?(k+=2,C+=2,B+=2,l=1,h=a?4:1,u={fill:"none",stroke:m.stroke}):(h=l=k/2,u={fill:m.stroke,stroke:"none"}),i._.arrows?a?(i._.arrows.endPath&&g[i._.arrows.endPath]--,i._.arrows.endMarker&&g[i._.arrows.endMarker]--):(i._.arrows.startPath&&g[i._.arrows.startPath]--,i._.arrows.startMarker&&g[i._.arrows.startMarker]--):i._.arrows={},"none"!=w){var S="raphael-marker-"+w,T="raphael-marker-"+x+w+k+C;r._g.doc.getElementById(S)?g[S]++:(p.defs.appendChild(v(v("path"),{"stroke-linecap":"round",d:d[w],id:S})),g[S]=1);var A,N=r._g.doc.getElementById(T);N?(g[T]++,A=N.getElementsByTagName("use")[0]):(N=v(v("marker"),{id:T,markerHeight:C,markerWidth:k,orient:"auto",refX:h,refY:C/2}),A=v(v("use"),{"xlink:href":"#"+S,transform:(a?"rotate(180 "+k/2+" "+C/2+") ":c)+"scale("+k/B+","+C/B+")","stroke-width":(1/((k/B+C/B)/2)).toFixed(4)}),N.appendChild(A),p.defs.appendChild(N),g[T]=1),v(A,u);var E=l*("diamond"!=w&&"oval"!=w);a?(s=i._.arrows.startdx*b||0,o=r.getTotalLength(m.path)-E*b):(s=E*b,o=r.getTotalLength(m.path)-(i._.arrows.enddx*b||0)),u={},u["marker-"+x]="url(#"+T+")",(o||s)&&(u.d=r.getSubpath(m.path,s,o)),v(y,u),i._.arrows[x+"Path"]=S,i._.arrows[x+"Marker"]=T,i._.arrows[x+"dx"]=E,i._.arrows[x+"Type"]=w,i._.arrows[x+"String"]=n}else a?(s=i._.arrows.startdx*b||0,o=r.getTotalLength(m.path)-s):(s=0,o=r.getTotalLength(m.path)-(i._.arrows.enddx*b||0)),i._.arrows[x+"Path"]&&v(y,{d:r.getSubpath(m.path,s,o)}),delete i._.arrows[x+"Path"],delete i._.arrows[x+"Marker"],delete i._.arrows[x+"dx"],delete i._.arrows[x+"Type"],delete i._.arrows[x+"String"];for(u in g)if(g[t](u)&&!g[u]){var L=r._g.doc.getElementById(u);L&&L.parentNode.removeChild(L)}}},b={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},_=function(t,r,i){if(r=b[e(r).toLowerCase()]){for(var n=t.attrs["stroke-width"]||"1",a={round:n,square:n,butt:0}[t.attrs["stroke-linecap"]||i["stroke-linecap"]]||0,s=[],o=r.length;o--;)s[o]=r[o]*n+(o%2?1:-1)*a;v(t.node,{"stroke-dasharray":s.join(",")})}},w=function(i,a){var l=i.node,u=i.attrs,f=l.style.visibility;l.style.visibility="hidden";for(var d in a)if(a[t](d)){if(!r._availableAttrs[t](d))continue;var g=a[d];switch(u[d]=g,d){case"blur":i.blur(g);break;case"href":case"title":case"target":var b=l.parentNode;if("a"!=b.tagName.toLowerCase()){var w=v("a");b.insertBefore(w,l),w.appendChild(l),b=w}"target"==d?b.setAttributeNS(p,"show","blank"==g?"new":g):b.setAttributeNS(p,d,g);break;case"cursor":l.style.cursor=g;break;case"transform":i.transform(g);break;case"arrow-start":m(i,g);break;case"arrow-end":m(i,g,1);break;case"clip-rect":var k=e(g).split(h);if(4==k.length){i.clip&&i.clip.parentNode.parentNode.removeChild(i.clip.parentNode);var B=v("clipPath"),S=v("rect");B.id=r.createUUID(),v(S,{x:k[0],y:k[1],width:k[2],height:k[3]}),B.appendChild(S),i.paper.defs.appendChild(B),v(l,{"clip-path":"url(#"+B.id+")"}),i.clip=S}if(!g){var T=l.getAttribute("clip-path");if(T){var A=r._g.doc.getElementById(T.replace(/(^url\(#|\)$)/g,c));A&&A.parentNode.removeChild(A),v(l,{"clip-path":c}),delete i.clip}}break;case"path":"path"==i.type&&(v(l,{d:g?u.path=r._pathToAbsolute(g):"M0,0"}),i._.dirty=1,i._.arrows&&("startString"in i._.arrows&&m(i,i._.arrows.startString),"endString"in i._.arrows&&m(i,i._.arrows.endString,1)));break;case"width":if(l.setAttribute(d,g),i._.dirty=1,!u.fx)break;d="x",g=u.x;case"x":u.fx&&(g=-u.x-(u.width||0));case"rx":if("rx"==d&&"rect"==i.type)break;case"cx":l.setAttribute(d,g),i.pattern&&y(i),i._.dirty=1;break;case"height":if(l.setAttribute(d,g),i._.dirty=1,!u.fy)break;d="y",g=u.y;case"y":u.fy&&(g=-u.y-(u.height||0));case"ry":if("ry"==d&&"rect"==i.type)break;case"cy":l.setAttribute(d,g),i.pattern&&y(i),i._.dirty=1;break;case"r":"rect"==i.type?v(l,{rx:g,ry:g}):l.setAttribute(d,g),i._.dirty=1;break;case"src":"image"==i.type&&l.setAttributeNS(p,"href",g);break;case"stroke-width":(1!=i._.sx||1!=i._.sy)&&(g/=s(o(i._.sx),o(i._.sy))||1),i.paper._vbSize&&(g*=i.paper._vbSize),l.setAttribute(d,g),u["stroke-dasharray"]&&_(i,u["stroke-dasharray"],a),i._.arrows&&("startString"in i._.arrows&&m(i,i._.arrows.startString),"endString"in i._.arrows&&m(i,i._.arrows.endString,1));break;case"stroke-dasharray":_(i,g,a);break;case"fill":var N=e(g).match(r._ISURL);if(N){B=v("pattern");var E=v("image");B.id=r.createUUID(),v(B,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),v(E,{x:0,y:0,"xlink:href":N[1]}),B.appendChild(E),function(t){r._preload(N[1],function(){var e=this.offsetWidth,r=this.offsetHeight;v(t,{width:e,height:r}),v(E,{width:e,height:r}),i.paper.safari()})}(B),i.paper.defs.appendChild(B),v(l,{fill:"url(#"+B.id+")"}),i.pattern=B,i.pattern&&y(i);break}var L=r.getRGB(g);if(L.error){if(("circle"==i.type||"ellipse"==i.type||"r"!=e(g).charAt())&&x(i,g)){if("opacity"in u||"fill-opacity"in u){var M=r._g.doc.getElementById(l.getAttribute("fill").replace(/^url\(#|\)$/g,c));if(M){var P=M.getElementsByTagName("stop");v(P[P.length-1],{"stop-opacity":("opacity"in u?u.opacity:1)*("fill-opacity"in u?u["fill-opacity"]:1)})}}u.gradient=g,u.fill="none";break}}else delete a.gradient,delete u.gradient,!r.is(u.opacity,"undefined")&&r.is(a.opacity,"undefined")&&v(l,{opacity:u.opacity}),!r.is(u["fill-opacity"],"undefined")&&r.is(a["fill-opacity"],"undefined")&&v(l,{"fill-opacity":u["fill-opacity"]});L[t]("opacity")&&v(l,{"fill-opacity":L.opacity>1?L.opacity/100:L.opacity});case"stroke":L=r.getRGB(g),l.setAttribute(d,L.hex),"stroke"==d&&L[t]("opacity")&&v(l,{"stroke-opacity":L.opacity>1?L.opacity/100:L.opacity}),"stroke"==d&&i._.arrows&&("startString"in i._.arrows&&m(i,i._.arrows.startString),"endString"in i._.arrows&&m(i,i._.arrows.endString,1));break;case"gradient":("circle"==i.type||"ellipse"==i.type||"r"!=e(g).charAt())&&x(i,g);break;case"opacity":u.gradient&&!u[t]("stroke-opacity")&&v(l,{"stroke-opacity":g>1?g/100:g});case"fill-opacity":if(u.gradient){M=r._g.doc.getElementById(l.getAttribute("fill").replace(/^url\(#|\)$/g,c)),M&&(P=M.getElementsByTagName("stop"),v(P[P.length-1],{"stop-opacity":g}));break}default:"font-size"==d&&(g=n(g,10)+"px");var z=d.replace(/(\-.)/g,function(t){return t.substring(1).toUpperCase()});l.style[z]=g,i._.dirty=1,l.setAttribute(d,g)}}C(i,a),l.style.visibility=f},k=1.2,C=function(i,a){if("text"==i.type&&(a[t]("text")||a[t]("font")||a[t]("font-size")||a[t]("x")||a[t]("y"))){var s=i.attrs,o=i.node,l=o.firstChild?n(r._g.doc.defaultView.getComputedStyle(o.firstChild,c).getPropertyValue("font-size"),10):10;if(a[t]("text")){for(s.text=a.text;o.firstChild;)o.removeChild(o.firstChild);for(var h,u=e(a.text).split("\n"),f=[],p=0,d=u.length;d>p;p++)h=v("tspan"),p&&v(h,{dy:l*k,x:s.x}),h.appendChild(r._g.doc.createTextNode(u[p])),o.appendChild(h),f[p]=h +}else for(f=o.getElementsByTagName("tspan"),p=0,d=f.length;d>p;p++)p?v(f[p],{dy:l*k,x:s.x}):v(f[0],{dy:0});v(o,{x:s.x,y:s.y}),i._.dirty=1;var g=i._getBBox(),x=s.y-(g.y+g.height/2);x&&r.is(x,"finite")&&v(f[0],{dy:x})}},B=function(t,e){this[0]=this.node=t,t.raphael=!0,this.id=r._oid++,t.raphaelid=this.id,this.matrix=r.matrix(),this.realPath=null,this.paper=e,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!e.bottom&&(e.bottom=this),this.prev=e.top,e.top&&(e.top.next=this),e.top=this,this.next=null},S=r.el;B.prototype=S,S.constructor=B,r._engine.path=function(t,e){var r=v("path");e.canvas&&e.canvas.appendChild(r);var i=new B(r,e);return i.type="path",w(i,{fill:"none",stroke:"#000",path:t}),i},S.rotate=function(t,r,n){if(this.removed)return this;if(t=e(t).split(h),t.length-1&&(r=i(t[1]),n=i(t[2])),t=i(t[0]),null==n&&(r=n),null==r||null==n){var a=this.getBBox(1);r=a.x+a.width/2,n=a.y+a.height/2}return this.transform(this._.transform.concat([["r",t,r,n]])),this},S.scale=function(t,r,n,a){if(this.removed)return this;if(t=e(t).split(h),t.length-1&&(r=i(t[1]),n=i(t[2]),a=i(t[3])),t=i(t[0]),null==r&&(r=t),null==a&&(n=a),null==n||null==a)var s=this.getBBox(1);return n=null==n?s.x+s.width/2:n,a=null==a?s.y+s.height/2:a,this.transform(this._.transform.concat([["s",t,r,n,a]])),this},S.translate=function(t,r){return this.removed?this:(t=e(t).split(h),t.length-1&&(r=i(t[1])),t=i(t[0])||0,r=+r||0,this.transform(this._.transform.concat([["t",t,r]])),this)},S.transform=function(e){var i=this._;if(null==e)return i.transform;if(r._extractTransform(this,e),this.clip&&v(this.clip,{transform:this.matrix.invert()}),this.pattern&&y(this),this.node&&v(this.node,{transform:this.matrix}),1!=i.sx||1!=i.sy){var n=this.attrs[t]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":n})}return this},S.hide=function(){return!this.removed&&this.paper.safari(this.node.style.display="none"),this},S.show=function(){return!this.removed&&this.paper.safari(this.node.style.display=""),this},S.remove=function(){if(!this.removed&&this.node.parentNode){var t=this.paper;t.__set__&&t.__set__.exclude(this),u.unbind("raphael.*.*."+this.id),this.gradient&&t.defs.removeChild(this.gradient),r._tear(this,t),"a"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.removeChild(this.node.parentNode):this.node.parentNode.removeChild(this.node);for(var e in this)this[e]="function"==typeof this[e]?r._removedFactory(e):null;this.removed=!0}},S._getBBox=function(){if("none"==this.node.style.display){this.show();var t=!0}var e={};try{e=this.node.getBBox()}catch(r){}finally{e=e||{}}return t&&this.hide(),e},S.attr=function(e,i){if(this.removed)return this;if(null==e){var n={};for(var a in this.attrs)this.attrs[t](a)&&(n[a]=this.attrs[a]);return n.gradient&&"none"==n.fill&&(n.fill=n.gradient)&&delete n.gradient,n.transform=this._.transform,n}if(null==i&&r.is(e,"string")){if("fill"==e&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==e)return this._.transform;for(var s=e.split(h),o={},l=0,c=s.length;c>l;l++)e=s[l],o[e]=e in this.attrs?this.attrs[e]:r.is(this.paper.customAttributes[e],"function")?this.paper.customAttributes[e].def:r._availableAttrs[e];return c-1?o:o[s[0]]}if(null==i&&r.is(e,"array")){for(o={},l=0,c=e.length;c>l;l++)o[e[l]]=this.attr(e[l]);return o}if(null!=i){var f={};f[e]=i}else null!=e&&r.is(e,"object")&&(f=e);for(var p in f)u("raphael.attr."+p+"."+this.id,this,f[p]);for(p in this.paper.customAttributes)if(this.paper.customAttributes[t](p)&&f[t](p)&&r.is(this.paper.customAttributes[p],"function")){var d=this.paper.customAttributes[p].apply(this,[].concat(f[p]));this.attrs[p]=f[p];for(var g in d)d[t](g)&&(f[g]=d[g])}return w(this,f),this},S.toFront=function(){if(this.removed)return this;"a"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var t=this.paper;return t.top!=this&&r._tofront(this,t),this},S.toBack=function(){if(this.removed)return this;var t=this.node.parentNode;return"a"==t.tagName.toLowerCase()?t.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):t.firstChild!=this.node&&t.insertBefore(this.node,this.node.parentNode.firstChild),r._toback(this,this.paper),this.paper,this},S.insertAfter=function(t){if(this.removed)return this;var e=t.node||t[t.length-1].node;return e.nextSibling?e.parentNode.insertBefore(this.node,e.nextSibling):e.parentNode.appendChild(this.node),r._insertafter(this,t,this.paper),this},S.insertBefore=function(t){if(this.removed)return this;var e=t.node||t[0].node;return e.parentNode.insertBefore(this.node,e),r._insertbefore(this,t,this.paper),this},S.blur=function(t){var e=this;if(0!==+t){var i=v("filter"),n=v("feGaussianBlur");e.attrs.blur=t,i.id=r.createUUID(),v(n,{stdDeviation:+t||1.5}),i.appendChild(n),e.paper.defs.appendChild(i),e._blur=i,v(e.node,{filter:"url(#"+i.id+")"})}else e._blur&&(e._blur.parentNode.removeChild(e._blur),delete e._blur,delete e.attrs.blur),e.node.removeAttribute("filter");return e},r._engine.circle=function(t,e,r,i){var n=v("circle");t.canvas&&t.canvas.appendChild(n);var a=new B(n,t);return a.attrs={cx:e,cy:r,r:i,fill:"none",stroke:"#000"},a.type="circle",v(n,a.attrs),a},r._engine.rect=function(t,e,r,i,n,a){var s=v("rect");t.canvas&&t.canvas.appendChild(s);var o=new B(s,t);return o.attrs={x:e,y:r,width:i,height:n,r:a||0,rx:a||0,ry:a||0,fill:"none",stroke:"#000"},o.type="rect",v(s,o.attrs),o},r._engine.ellipse=function(t,e,r,i,n){var a=v("ellipse");t.canvas&&t.canvas.appendChild(a);var s=new B(a,t);return s.attrs={cx:e,cy:r,rx:i,ry:n,fill:"none",stroke:"#000"},s.type="ellipse",v(a,s.attrs),s},r._engine.image=function(t,e,r,i,n,a){var s=v("image");v(s,{x:r,y:i,width:n,height:a,preserveAspectRatio:"none"}),s.setAttributeNS(p,"href",e),t.canvas&&t.canvas.appendChild(s);var o=new B(s,t);return o.attrs={x:r,y:i,width:n,height:a,src:e},o.type="image",o},r._engine.text=function(t,e,i,n){var a=v("text");t.canvas&&t.canvas.appendChild(a);var s=new B(a,t);return s.attrs={x:e,y:i,"text-anchor":"middle",text:n,font:r._availableAttrs.font,stroke:"none",fill:"#000"},s.type="text",w(s,s.attrs),s},r._engine.setSize=function(t,e){return this.width=t||this.width,this.height=e||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},r._engine.create=function(){var t=r._getContainer.apply(0,arguments),e=t&&t.container,i=t.x,n=t.y,a=t.width,s=t.height;if(!e)throw Error("SVG container not found.");var o,l=v("svg"),h="overflow:hidden;";return i=i||0,n=n||0,a=a||512,s=s||342,v(l,{height:s,version:1.1,width:a,xmlns:"http://www.w3.org/2000/svg"}),1==e?(l.style.cssText=h+"position:absolute;left:"+i+"px;top:"+n+"px",r._g.doc.body.appendChild(l),o=1):(l.style.cssText=h+"position:relative",e.firstChild?e.insertBefore(l,e.firstChild):e.appendChild(l)),e=new r._Paper,e.width=a,e.height=s,e.canvas=l,e.clear(),e._left=e._top=0,o&&(e.renderfix=function(){}),e.renderfix(),e},r._engine.setViewBox=function(t,e,r,i,n){u("raphael.setViewBox",this,this._viewBox,[t,e,r,i,n]);var a,o,l=s(r/this.width,i/this.height),h=this.top,c=n?"meet":"xMinYMin";for(null==t?(this._vbSize&&(l=1),delete this._vbSize,a="0 0 "+this.width+f+this.height):(this._vbSize=l,a=t+f+e+f+r+f+i),v(this.canvas,{viewBox:a,preserveAspectRatio:c});l&&h;)o="stroke-width"in h.attrs?h.attrs["stroke-width"]:1,h.attr({"stroke-width":o}),h._.dirty=1,h._.dirtyT=1,h=h.prev;return this._viewBox=[t,e,r,i,!!n],this},r.prototype.renderfix=function(){var t,e=this.canvas,r=e.style;try{t=e.getScreenCTM()||e.createSVGMatrix()}catch(i){t=e.createSVGMatrix()}var n=-t.e%1,a=-t.f%1;(n||a)&&(n&&(this._left=(this._left+n)%1,r.left=this._left+"px"),a&&(this._top=(this._top+a)%1,r.top=this._top+"px"))},r.prototype.clear=function(){r.eve("raphael.clear",this);for(var t=this.canvas;t.firstChild;)t.removeChild(t.firstChild);this.bottom=this.top=null,(this.desc=v("desc")).appendChild(r._g.doc.createTextNode("Created with Raphaël "+r.version)),t.appendChild(this.desc),t.appendChild(this.defs=v("defs"))},r.prototype.remove=function(){u("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var t in this)this[t]="function"==typeof this[t]?r._removedFactory(t):null};var T=r.st;for(var A in S)S[t](A)&&!T[t](A)&&(T[A]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(A))}}(),function(){if(r.vml){var t="hasOwnProperty",e=String,i=parseFloat,n=Math,a=n.round,s=n.max,o=n.min,l=n.abs,h="fill",u=/[, ]+/,c=r.eve,f=" progid:DXImageTransform.Microsoft",p=" ",d="",g={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},v=/([clmz]),?([^clmz]*)/gi,x=/ progid:\S+Blur\([^\)]+\)/g,y=/-?[^,\s-]+/g,m="position:absolute;left:0;top:0;width:1px;height:1px",b=21600,_={path:1,rect:1,image:1},w={circle:1,ellipse:1},k=function(t){var i=/[ahqstv]/gi,n=r._pathToAbsolute;if(e(t).match(i)&&(n=r._path2curve),i=/[clmz]/g,n==r._pathToAbsolute&&!e(t).match(i)){var s=e(t).replace(v,function(t,e,r){var i=[],n="m"==e.toLowerCase(),s=g[e];return r.replace(y,function(t){n&&2==i.length&&(s+=i+g["m"==e?"l":"L"],i=[]),i.push(a(t*b))}),s+i});return s}var o,l,h=n(t);s=[];for(var u=0,c=h.length;c>u;u++){o=h[u],l=h[u][0].toLowerCase(),"z"==l&&(l="x");for(var f=1,x=o.length;x>f;f++)l+=a(o[f]*b)+(f!=x-1?",":d);s.push(l)}return s.join(p)},C=function(t,e,i){var n=r.matrix();return n.rotate(-t,.5,.5),{dx:n.x(e,i),dy:n.y(e,i)}},B=function(t,e,r,i,n,a){var s=t._,o=t.matrix,u=s.fillpos,c=t.node,f=c.style,d=1,g="",v=b/e,x=b/r;if(f.visibility="hidden",e&&r){if(c.coordsize=l(v)+p+l(x),f.rotation=a*(0>e*r?-1:1),a){var y=C(a,i,n);i=y.dx,n=y.dy}if(0>e&&(g+="x"),0>r&&(g+=" y")&&(d=-1),f.flip=g,c.coordorigin=i*-v+p+n*-x,u||s.fillsize){var m=c.getElementsByTagName(h);m=m&&m[0],c.removeChild(m),u&&(y=C(a,o.x(u[0],u[1]),o.y(u[0],u[1])),m.position=y.dx*d+p+y.dy*d),s.fillsize&&(m.size=s.fillsize[0]*l(e)+p+s.fillsize[1]*l(r)),c.appendChild(m)}f.visibility="visible"}};r.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var S=function(t,r,i){for(var n=e(r).toLowerCase().split("-"),a=i?"end":"start",s=n.length,o="classic",l="medium",h="medium";s--;)switch(n[s]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":o=n[s];break;case"wide":case"narrow":h=n[s];break;case"long":case"short":l=n[s]}var u=t.node.getElementsByTagName("stroke")[0];u[a+"arrow"]=o,u[a+"arrowlength"]=l,u[a+"arrowwidth"]=h},T=function(n,l){n.attrs=n.attrs||{};var c=n.node,f=n.attrs,g=c.style,v=_[n.type]&&(l.x!=f.x||l.y!=f.y||l.width!=f.width||l.height!=f.height||l.cx!=f.cx||l.cy!=f.cy||l.rx!=f.rx||l.ry!=f.ry||l.r!=f.r),x=w[n.type]&&(f.cx!=l.cx||f.cy!=l.cy||f.r!=l.r||f.rx!=l.rx||f.ry!=l.ry),y=n;for(var m in l)l[t](m)&&(f[m]=l[m]);if(v&&(f.path=r._getPath[n.type](n),n._.dirty=1),l.href&&(c.href=l.href),l.title&&(c.title=l.title),l.target&&(c.target=l.target),l.cursor&&(g.cursor=l.cursor),"blur"in l&&n.blur(l.blur),(l.path&&"path"==n.type||v)&&(c.path=k(~e(f.path).toLowerCase().indexOf("r")?r._pathToAbsolute(f.path):f.path),"image"==n.type&&(n._.fillpos=[f.x,f.y],n._.fillsize=[f.width,f.height],B(n,1,1,0,0,0))),"transform"in l&&n.transform(l.transform),x){var C=+f.cx,T=+f.cy,N=+f.rx||+f.r||0,E=+f.ry||+f.r||0;c.path=r.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",a((C-N)*b),a((T-E)*b),a((C+N)*b),a((T+E)*b),a(C*b)),n._.dirty=1}if("clip-rect"in l){var M=e(l["clip-rect"]).split(u);if(4==M.length){M[2]=+M[2]+ +M[0],M[3]=+M[3]+ +M[1];var P=c.clipRect||r._g.doc.createElement("div"),z=P.style;z.clip=r.format("rect({1}px {2}px {3}px {0}px)",M),c.clipRect||(z.position="absolute",z.top=0,z.left=0,z.width=n.paper.width+"px",z.height=n.paper.height+"px",c.parentNode.insertBefore(P,c),P.appendChild(c),c.clipRect=P)}l["clip-rect"]||c.clipRect&&(c.clipRect.style.clip="auto")}if(n.textpath){var F=n.textpath.style;l.font&&(F.font=l.font),l["font-family"]&&(F.fontFamily='"'+l["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,d)+'"'),l["font-size"]&&(F.fontSize=l["font-size"]),l["font-weight"]&&(F.fontWeight=l["font-weight"]),l["font-style"]&&(F.fontStyle=l["font-style"])}if("arrow-start"in l&&S(y,l["arrow-start"]),"arrow-end"in l&&S(y,l["arrow-end"],1),null!=l.opacity||null!=l["stroke-width"]||null!=l.fill||null!=l.src||null!=l.stroke||null!=l["stroke-width"]||null!=l["stroke-opacity"]||null!=l["fill-opacity"]||null!=l["stroke-dasharray"]||null!=l["stroke-miterlimit"]||null!=l["stroke-linejoin"]||null!=l["stroke-linecap"]){var R=c.getElementsByTagName(h),I=!1;if(R=R&&R[0],!R&&(I=R=L(h)),"image"==n.type&&l.src&&(R.src=l.src),l.fill&&(R.on=!0),(null==R.on||"none"==l.fill||null===l.fill)&&(R.on=!1),R.on&&l.fill){var j=e(l.fill).match(r._ISURL);if(j){R.parentNode==c&&c.removeChild(R),R.rotate=!0,R.src=j[1],R.type="tile";var q=n.getBBox(1);R.position=q.x+p+q.y,n._.fillpos=[q.x,q.y],r._preload(j[1],function(){n._.fillsize=[this.offsetWidth,this.offsetHeight]})}else R.color=r.getRGB(l.fill).hex,R.src=d,R.type="solid",r.getRGB(l.fill).error&&(y.type in{circle:1,ellipse:1}||"r"!=e(l.fill).charAt())&&A(y,l.fill,R)&&(f.fill="none",f.gradient=l.fill,R.rotate=!1)}if("fill-opacity"in l||"opacity"in l){var D=((+f["fill-opacity"]+1||2)-1)*((+f.opacity+1||2)-1)*((+r.getRGB(l.fill).o+1||2)-1);D=o(s(D,0),1),R.opacity=D,R.src&&(R.color="none")}c.appendChild(R);var O=c.getElementsByTagName("stroke")&&c.getElementsByTagName("stroke")[0],V=!1;!O&&(V=O=L("stroke")),(l.stroke&&"none"!=l.stroke||l["stroke-width"]||null!=l["stroke-opacity"]||l["stroke-dasharray"]||l["stroke-miterlimit"]||l["stroke-linejoin"]||l["stroke-linecap"])&&(O.on=!0),("none"==l.stroke||null===l.stroke||null==O.on||0==l.stroke||0==l["stroke-width"])&&(O.on=!1);var Y=r.getRGB(l.stroke);O.on&&l.stroke&&(O.color=Y.hex),D=((+f["stroke-opacity"]+1||2)-1)*((+f.opacity+1||2)-1)*((+Y.o+1||2)-1);var G=.75*(i(l["stroke-width"])||1);if(D=o(s(D,0),1),null==l["stroke-width"]&&(G=f["stroke-width"]),l["stroke-width"]&&(O.weight=G),G&&1>G&&(D*=G)&&(O.weight=1),O.opacity=D,l["stroke-linejoin"]&&(O.joinstyle=l["stroke-linejoin"]||"miter"),O.miterlimit=l["stroke-miterlimit"]||8,l["stroke-linecap"]&&(O.endcap="butt"==l["stroke-linecap"]?"flat":"square"==l["stroke-linecap"]?"square":"round"),l["stroke-dasharray"]){var W={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};O.dashstyle=W[t](l["stroke-dasharray"])?W[l["stroke-dasharray"]]:d}V&&c.appendChild(O)}if("text"==y.type){y.paper.canvas.style.display=d;var X=y.paper.span,H=100,U=f.font&&f.font.match(/\d+(?:\.\d*)?(?=px)/);g=X.style,f.font&&(g.font=f.font),f["font-family"]&&(g.fontFamily=f["font-family"]),f["font-weight"]&&(g.fontWeight=f["font-weight"]),f["font-style"]&&(g.fontStyle=f["font-style"]),U=i(f["font-size"]||U&&U[0])||10,g.fontSize=U*H+"px",y.textpath.string&&(X.innerHTML=e(y.textpath.string).replace(/"));var $=X.getBoundingClientRect();y.W=f.w=($.right-$.left)/H,y.H=f.h=($.bottom-$.top)/H,y.X=f.x,y.Y=f.y+y.H/2,("x"in l||"y"in l)&&(y.path.v=r.format("m{0},{1}l{2},{1}",a(f.x*b),a(f.y*b),a(f.x*b)+1));for(var Z=["x","y","text","font","font-family","font-weight","font-style","font-size"],Q=0,J=Z.length;J>Q;Q++)if(Z[Q]in l){y._.dirty=1;break}switch(f["text-anchor"]){case"start":y.textpath.style["v-text-align"]="left",y.bbx=y.W/2;break;case"end":y.textpath.style["v-text-align"]="right",y.bbx=-y.W/2;break;default:y.textpath.style["v-text-align"]="center",y.bbx=0}y.textpath.style["v-text-kern"]=!0}},A=function(t,a,s){t.attrs=t.attrs||{};var o=(t.attrs,Math.pow),l="linear",h=".5 .5";if(t.attrs.gradient=a,a=e(a).replace(r._radial_gradient,function(t,e,r){return l="radial",e&&r&&(e=i(e),r=i(r),o(e-.5,2)+o(r-.5,2)>.25&&(r=n.sqrt(.25-o(e-.5,2))*(2*(r>.5)-1)+.5),h=e+p+r),d}),a=a.split(/\s*\-\s*/),"linear"==l){var u=a.shift();if(u=-i(u),isNaN(u))return null}var c=r._parseDots(a);if(!c)return null;if(t=t.shape||t.node,c.length){t.removeChild(s),s.on=!0,s.method="none",s.color=c[0].color,s.color2=c[c.length-1].color;for(var f=[],g=0,v=c.length;v>g;g++)c[g].offset&&f.push(c[g].offset+p+c[g].color);s.colors=f.length?f.join():"0% "+s.color,"radial"==l?(s.type="gradientTitle",s.focus="100%",s.focussize="0 0",s.focusposition=h,s.angle=0):(s.type="gradient",s.angle=(270-u)%360),t.appendChild(s)}return 1},N=function(t,e){this[0]=this.node=t,t.raphael=!0,this.id=r._oid++,t.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=e,this.matrix=r.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!e.bottom&&(e.bottom=this),this.prev=e.top,e.top&&(e.top.next=this),e.top=this,this.next=null},E=r.el;N.prototype=E,E.constructor=N,E.transform=function(t){if(null==t)return this._.transform;var i,n=this.paper._viewBoxShift,a=n?"s"+[n.scale,n.scale]+"-1-1t"+[n.dx,n.dy]:d;n&&(i=t=e(t).replace(/\.{3}|\u2026/g,this._.transform||d)),r._extractTransform(this,a+t);var s,o=this.matrix.clone(),l=this.skew,h=this.node,u=~e(this.attrs.fill).indexOf("-"),c=!e(this.attrs.fill).indexOf("url(");if(o.translate(-.5,-.5),c||u||"image"==this.type)if(l.matrix="1 0 0 1",l.offset="0 0",s=o.split(),u&&s.noRotation||!s.isSimple){h.style.filter=o.toFilter();var f=this.getBBox(),g=this.getBBox(1),v=f.x-g.x,x=f.y-g.y;h.coordorigin=v*-b+p+x*-b,B(this,1,1,v,x,0)}else h.style.filter=d,B(this,s.scalex,s.scaley,s.dx,s.dy,s.rotate);else h.style.filter=d,l.matrix=e(o),l.offset=o.offset();return i&&(this._.transform=i),this},E.rotate=function(t,r,n){if(this.removed)return this;if(null!=t){if(t=e(t).split(u),t.length-1&&(r=i(t[1]),n=i(t[2])),t=i(t[0]),null==n&&(r=n),null==r||null==n){var a=this.getBBox(1);r=a.x+a.width/2,n=a.y+a.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",t,r,n]])),this}},E.translate=function(t,r){return this.removed?this:(t=e(t).split(u),t.length-1&&(r=i(t[1])),t=i(t[0])||0,r=+r||0,this._.bbox&&(this._.bbox.x+=t,this._.bbox.y+=r),this.transform(this._.transform.concat([["t",t,r]])),this)},E.scale=function(t,r,n,a){if(this.removed)return this;if(t=e(t).split(u),t.length-1&&(r=i(t[1]),n=i(t[2]),a=i(t[3]),isNaN(n)&&(n=null),isNaN(a)&&(a=null)),t=i(t[0]),null==r&&(r=t),null==a&&(n=a),null==n||null==a)var s=this.getBBox(1);return n=null==n?s.x+s.width/2:n,a=null==a?s.y+s.height/2:a,this.transform(this._.transform.concat([["s",t,r,n,a]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=d),this},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),r.eve.unbind("raphael.*.*."+this.id),r._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var t in this)this[t]="function"==typeof this[t]?r._removedFactory(t):null;this.removed=!0}},E.attr=function(e,i){if(this.removed)return this;if(null==e){var n={};for(var a in this.attrs)this.attrs[t](a)&&(n[a]=this.attrs[a]);return n.gradient&&"none"==n.fill&&(n.fill=n.gradient)&&delete n.gradient,n.transform=this._.transform,n}if(null==i&&r.is(e,"string")){if(e==h&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var s=e.split(u),o={},l=0,f=s.length;f>l;l++)e=s[l],o[e]=e in this.attrs?this.attrs[e]:r.is(this.paper.customAttributes[e],"function")?this.paper.customAttributes[e].def:r._availableAttrs[e];return f-1?o:o[s[0]]}if(this.attrs&&null==i&&r.is(e,"array")){for(o={},l=0,f=e.length;f>l;l++)o[e[l]]=this.attr(e[l]);return o}var p;null!=i&&(p={},p[e]=i),null==i&&r.is(e,"object")&&(p=e);for(var d in p)c("raphael.attr."+d+"."+this.id,this,p[d]);if(p){for(d in this.paper.customAttributes)if(this.paper.customAttributes[t](d)&&p[t](d)&&r.is(this.paper.customAttributes[d],"function")){var g=this.paper.customAttributes[d].apply(this,[].concat(p[d]));this.attrs[d]=p[d];for(var v in g)g[t](v)&&(p[v]=g[v])}p.text&&"text"==this.type&&(this.textpath.string=p.text),T(this,p)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&r._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),r._toback(this,this.paper)),this)},E.insertAfter=function(t){return this.removed?this:(t.constructor==r.st.constructor&&(t=t[t.length-1]),t.node.nextSibling?t.node.parentNode.insertBefore(this.node,t.node.nextSibling):t.node.parentNode.appendChild(this.node),r._insertafter(this,t,this.paper),this)},E.insertBefore=function(t){return this.removed?this:(t.constructor==r.st.constructor&&(t=t[0]),t.node.parentNode.insertBefore(this.node,t.node),r._insertbefore(this,t,this.paper),this)},E.blur=function(t){var e=this.node.runtimeStyle,i=e.filter;return i=i.replace(x,d),0!==+t?(this.attrs.blur=t,e.filter=i+p+f+".Blur(pixelradius="+(+t||1.5)+")",e.margin=r.format("-{0}px 0 0 -{0}px",a(+t||1.5))):(e.filter=i,e.margin=0,delete this.attrs.blur),this},r._engine.path=function(t,e){var r=L("shape");r.style.cssText=m,r.coordsize=b+p+b,r.coordorigin=e.coordorigin;var i=new N(r,e),n={fill:"none",stroke:"#000"};t&&(n.path=t),i.type="path",i.path=[],i.Path=d,T(i,n),e.canvas.appendChild(r);var a=L("skew");return a.on=!0,r.appendChild(a),i.skew=a,i.transform(d),i},r._engine.rect=function(t,e,i,n,a,s){var o=r._rectPath(e,i,n,a,s),l=t.path(o),h=l.attrs;return l.X=h.x=e,l.Y=h.y=i,l.W=h.width=n,l.H=h.height=a,h.r=s,h.path=o,l.type="rect",l},r._engine.ellipse=function(t,e,r,i,n){var a=t.path();return a.attrs,a.X=e-i,a.Y=r-n,a.W=2*i,a.H=2*n,a.type="ellipse",T(a,{cx:e,cy:r,rx:i,ry:n}),a},r._engine.circle=function(t,e,r,i){var n=t.path();return n.attrs,n.X=e-i,n.Y=r-i,n.W=n.H=2*i,n.type="circle",T(n,{cx:e,cy:r,r:i}),n},r._engine.image=function(t,e,i,n,a,s){var o=r._rectPath(i,n,a,s),l=t.path(o).attr({stroke:"none"}),u=l.attrs,c=l.node,f=c.getElementsByTagName(h)[0];return u.src=e,l.X=u.x=i,l.Y=u.y=n,l.W=u.width=a,l.H=u.height=s,u.path=o,l.type="image",f.parentNode==c&&c.removeChild(f),f.rotate=!0,f.src=e,f.type="tile",l._.fillpos=[i,n],l._.fillsize=[a,s],c.appendChild(f),B(l,1,1,0,0,0),l},r._engine.text=function(t,i,n,s){var o=L("shape"),l=L("path"),h=L("textpath");i=i||0,n=n||0,s=s||"",l.v=r.format("m{0},{1}l{2},{1}",a(i*b),a(n*b),a(i*b)+1),l.textpathok=!0,h.string=e(s),h.on=!0,o.style.cssText=m,o.coordsize=b+p+b,o.coordorigin="0 0";var u=new N(o,t),c={fill:"#000",stroke:"none",font:r._availableAttrs.font,text:s};u.shape=o,u.path=l,u.textpath=h,u.type="text",u.attrs.text=e(s),u.attrs.x=i,u.attrs.y=n,u.attrs.w=1,u.attrs.h=1,T(u,c),o.appendChild(h),o.appendChild(l),t.canvas.appendChild(o);var f=L("skew");return f.on=!0,o.appendChild(f),u.skew=f,u.transform(d),u},r._engine.setSize=function(t,e){var i=this.canvas.style;return this.width=t,this.height=e,t==+t&&(t+="px"),e==+e&&(e+="px"),i.width=t,i.height=e,i.clip="rect(0 "+t+" "+e+" 0)",this._viewBox&&r._engine.setViewBox.apply(this,this._viewBox),this},r._engine.setViewBox=function(t,e,i,n,a){r.eve("raphael.setViewBox",this,this._viewBox,[t,e,i,n,a]);var o,l,h=this.width,u=this.height,c=1/s(i/h,n/u);return a&&(o=u/n,l=h/i,h>i*o&&(t-=(h-i*o)/2/o),u>n*l&&(e-=(u-n*l)/2/l)),this._viewBox=[t,e,i,n,!!a],this._viewBoxShift={dx:-t,dy:-e,scale:c},this.forEach(function(t){t.transform("...")}),this};var L;r._engine.initWin=function(t){var e=t.document;e.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!e.namespaces.rvml&&e.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),L=function(t){return e.createElement("')}}catch(r){L=function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},r._engine.initWin(r._g.win),r._engine.create=function(){var t=r._getContainer.apply(0,arguments),e=t.container,i=t.height,n=t.width,a=t.x,s=t.y;if(!e)throw Error("VML container not found.");var o=new r._Paper,l=o.canvas=r._g.doc.createElement("div"),h=l.style;return a=a||0,s=s||0,n=n||512,i=i||342,o.width=n,o.height=i,n==+n&&(n+="px"),i==+i&&(i+="px"),o.coordsize=1e3*b+p+1e3*b,o.coordorigin="0 0",o.span=r._g.doc.createElement("span"),o.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",l.appendChild(o.span),h.cssText=r.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",n,i),1==e?(r._g.doc.body.appendChild(l),h.left=a+"px",h.top=s+"px",h.position="absolute"):e.firstChild?e.insertBefore(l,e.firstChild):e.appendChild(l),o.renderfix=function(){},o},r.prototype.clear=function(){r.eve("raphael.clear",this),this.canvas.innerHTML=d,this.span=r._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},r.prototype.remove=function(){r.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var t in this)this[t]="function"==typeof this[t]?r._removedFactory(t):null;return!0};var M=r.st;for(var P in E)E[t](P)&&!M[t](P)&&(M[P]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(P))}}(),T.was?S.win.Raphael=r:Raphael=r,r}); \ No newline at end of file diff --git a/js/raphael.min.js b/js/raphael.min.js new file mode 100644 index 0000000..791d790 --- /dev/null +++ b/js/raphael.min.js @@ -0,0 +1,8 @@ +// ┌─────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.0.1 - JavaScript Vector Library │ \\ +// ├─────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) │ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\ +// └─────────────────────────────────────────────────────────────────────┘ \\ +(function(a){var b="0.4.0",c="hasOwnProperty",d=/[\.\/]/,e="*",f=function(){},g=function(a,b){return a-b},h,i,j={n:{}},k=function(a,b){var c=j,d=i,e=Array.prototype.slice.call(arguments,2),f=k.listeners(a),l=0,m=!1,n,o=[],p={},q=[],r=[];h=a,i=0;for(var s=0,t=f.length;sf*b.top){e=b.percents[y],p=b.percents[y-1]||0,t=t/b.top*(e-p),o=b.percents[y+1],j=b.anim[e];break}f&&d.attr(b.anim[b.percents[y]])}if(!!j){if(!k){for(var A in j)if(j[g](A))if(U[g](A)||d.paper.customAttributes[g](A)){u[A]=d.attr(A),u[A]==null&&(u[A]=T[A]),v[A]=j[A];switch(U[A]){case C:w[A]=(v[A]-u[A])/t;break;case"colour":u[A]=a.getRGB(u[A]);var B=a.getRGB(v[A]);w[A]={r:(B.r-u[A].r)/t,g:(B.g-u[A].g)/t,b:(B.b-u[A].b)/t};break;case"path":var D=bG(u[A],v[A]),E=D[1];u[A]=D[0],w[A]=[];for(y=0,z=u[A].length;yd)return d;while(cf?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cd(){return this.x+q+this.y+q+this.width+" × "+this.height}function cc(){return this.x+q+this.y}function bQ(a,b,c,d,e,f){a!=null?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function bw(a){var b=[];for(var c=0,d=a.length;d-2>c;c+=2){var e=[{x:+a[c],y:+a[c+1]},{x:+a[c],y:+a[c+1]},{x:+a[c+2],y:+a[c+3]},{x:+a[c+4],y:+a[c+5]}];d-4==c?(e[0]={x:+a[c-2],y:+a[c-1]},e[3]=e[2]):c&&(e[0]={x:+a[c-2],y:+a[c-1]}),b.push(["C",(-e[0].x+6*e[1].x+e[2].x)/6,(-e[0].y+6*e[1].y+e[2].y)/6,(e[1].x+6*e[2].x-e[3].x)/6,(e[1].y+6*e[2].y-e[3].y)/6,e[2].x,e[2].y])}return b}function bv(){return this.hex}function bt(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[g](f)){bs(i,f);return c?c(h[f]):h[f]}i.length>=1e3&&delete h[i.shift()],i.push(f),h[f]=a[m](b,e);return c?c(h[f]):h[f]}return d}function bs(a,b){for(var c=0,d=a.length;c',bk=bj.firstChild,bk.style.behavior="url(#default#VML)";if(!bk||typeof bk.adj!="object")return a.type=p;bj=null}a.svg=!(a.vml=a.type=="VML"),a._Paper=j,a.fn=k=j.prototype=a.prototype,a._id=0,a._oid=0,a.is=function(a,b){b=v.call(b);if(b=="finite")return!M[g](+a);if(b=="array")return a instanceof Array;return b=="null"&&a===null||b==typeof a&&a!==null||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||H.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+w.atan2(-i,-h)*180/B+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*B/180},a.deg=function(a){return a*180/B%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,E)){var e=b.length;while(e--)if(z(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(fb-d)return c-f+b}return c};var bl=a.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=w.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){eve("setWindow",a,h.win,b),h.win=b,h.doc=h.win.document,a._engine.initWin&&a._engine.initWin(h.win)};var bm=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write(""),e.close(),d=e.body}catch(f){d=createPopup().document.body}var g=d.createTextRange();bm=bt(function(a){try{d.style.color=r(a).replace(c,p);var b=g.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=h.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",h.doc.body.appendChild(i),bm=bt(function(a){i.style.color=a;return h.doc.defaultView.getComputedStyle(i,p).getPropertyValue("color")})}return bm(b)},bn=function(){return"hsb("+[this.h,this.s,this.b]+")"},bo=function(){return"hsl("+[this.h,this.s,this.l]+")"},bp=function(){return this.hex},bq=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,D)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},br=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:bp};a.is(e,"finite")&&(f.opacity=e);return f};a.color=function(b){var c;a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b?(c=a.hsb2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b?(c=a.hsl2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):(a.is(b,"string")&&(b=a.getRGB(b)),a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b?(c=a.rgb2hsl(b),b.h=c.h,b.s=c.s,b.l=c.l,c=a.rgb2hsb(b),b.v=c.b):(b={hex:"none"},b.r=b.g=b.b=b.h=b.s=b.v=b.l=-1)),b.toString=bp;return b},a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-z(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return br(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-z(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return br(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bq(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=x(a,b,c),g=f-y(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bn}},a.rgb2hsl=function(a,b,c){c=bq(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=x(a,b,c),h=y(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bo}},a._path2string=function(){return this.join(",").replace(X,"$1")};var bu=a._preload=function(a,b){var c=h.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,h.doc.body.removeChild(this)},c.onerror=function(){h.doc.body.removeChild(this)},h.doc.body.appendChild(c),c.src=a};a.getRGB=bt(function(b){if(!b||!!((b=r(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bv};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none",toString:bv};!W[g](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bm(b));var c,d,e,f,h,i,j,k=b.match(L);if(k){k[2]&&(f=R(k[2].substring(5),16),e=R(k[2].substring(3,5),16),d=R(k[2].substring(1,3),16)),k[3]&&(f=R((i=k[3].charAt(3))+i,16),e=R((i=k[3].charAt(2))+i,16),d=R((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4][s](V),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5][s](V),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,f,h)}if(k[6]){j=k[6][s](V),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,f,h)}k={r:d,g:e,b:f,toString:bv},k.hex="#"+(16777216|f|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bv}},a),a.hsb=bt(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=bt(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=bt(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=bt(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=by(b)),d.length||r(b).replace(Y,function(a,b,e){var f=[],g=b.toLowerCase();e.replace($,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(d.push([b][n](f.splice(0,2))),g="l",b=b=="m"?"l":"L");if(g=="r")d.push([b][n](f));else while(f.length>=c[g]){d.push([b][n](f.splice(0,c[g])));if(!c[g])break}}),d.toString=a._path2string;return d}),a.parseTransformString=bt(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=by(b)),d.length||r(b).replace(Z,function(a,b,c){var e=[],f=v.call(b);c.replace($,function(a,b){b&&e.push(+b)}),d.push([b][n](e))}),d.toString=a._path2string;return d}),a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=A(j,3),l=A(j,2),m=i*i,n=m*i,o=k*a+l*3*i*c+j*3*i*i*e+n*g,p=k*b+l*3*i*d+j*3*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,x=j*e+i*g,y=j*f+i*h,z=90-w.atan2(q-s,r-t)*180/B;(q>s||r1&&(v=w.sqrt(v),c=v*c,d=v*d);var x=c*c,y=d*d,A=(f==g?-1:1)*w.sqrt(z((x*y-x*u*u-y*t*t)/(x*u*u+y*t*t))),C=A*c*u/d+(a+h)/2,D=A*-d*t/c+(b+i)/2,E=w.asin(((b-D)/d).toFixed(9)),F=w.asin(((i-D)/d).toFixed(9));E=aF&&(E=E-B*2),!g&&F>E&&(F=F-B*2)}else E=j[0],F=j[1],C=j[2],D=j[3];var G=F-E;if(z(G)>k){var H=F,I=h,J=i;F=E+k*(g&&F>E?1:-1),h=C+c*w.cos(F),i=D+d*w.sin(F),m=bD(h,i,c,d,e,0,g,I,J,[F,H,C,D])}G=F-E;var K=w.cos(E),L=w.sin(E),M=w.cos(F),N=w.sin(F),O=w.tan(G/4),P=4/3*c*O,Q=4/3*d*O,R=[a,b],S=[a+P*L,b-Q*K],T=[h+P*N,i-Q*M],U=[h,i];S[0]=2*R[0]-S[0],S[1]=2*R[1]-S[1];if(j)return[S,T,U][n](m);m=[S,T,U][n](m).join()[s](",");var V=[];for(var W=0,X=m.length;W"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bE(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bE(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bE(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bE(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:y[m](0,p),y:y[m](0,o)},max:{x:x[m](0,p),y:x[m](0,o)}}}),bG=a._path2curve=bt(function(a,b){var c=bA(a),d=b&&bA(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][n](bD[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][n](bC(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][n](bC(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](bB(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](bB(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](bB(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](bB(b.x,b.y,b.X,b.Y))}return a},h=function(a,b){if(a[b].length>7){a[b].shift();var e=a[b];while(e.length)a.splice(b++,0,["C"][n](e.splice(0,6)));a.splice(b,1),k=x(c.length,d&&d.length||0)}},i=function(a,b,e,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),e.bx=0,e.by=0,e.x=a[g][1],e.y=a[g][2],k=x(c.length,d&&d.length||0))};for(var j=0,k=x(c.length,d&&d.length||0);j=j)return p;o=p}if(j==null)return k},cg=function(b,c){return function(d,e,f){d=bG(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;oe){if(c&&!l.start){m=cf(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cf(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},ch=cg(1),ci=cg(),cj=cg(0,1);a.getTotalLength=ch,a.getPointAtLength=ci,a.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return cj(a,b).end;var d=cj(a,c,1);return b?cj(d,b).end:d},b$.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return ch(this.attrs.path)}},b$.getPointAtLength=function(a){if(this.type=="path")return ci(this.attrs.path,a)},b$.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var ck=a.easing_formulas={linear:function(a){return a},"<":function(a){return A(a,1.7)},">":function(a){return A(a,.48)},"<>":function(a){var b=.48-a/1.04,c=w.sqrt(.1734+b*b),d=c-b,e=A(z(d),1/3)*(d<0?-1:1),f=-c-b,g=A(z(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return A(2,-10*a)*w.sin((a-.075)*2*B/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};ck.easeIn=ck["ease-in"]=ck["<"],ck.easeOut=ck["ease-out"]=ck[">"],ck.easeInOut=ck["ease-in-out"]=ck["<>"],ck["back-in"]=ck.backIn,ck["back-out"]=ck.backOut;var cl=[],cm=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cn=function(){var b=+(new Date),c=0;for(;c1&&!d.next){for(s in k)k[g](s)&&(r[s]=d.totalOrigin[s]);d.el.attr(r),cr(d.anim,d.el,d.anim.percents[0],null,d.totalOrigin,d.repeat-1)}d.next&&!d.stop&&cr(d.anim,d.el,d.next,null,d.totalOrigin,d.repeat)}}a.svg&&m&&m.paper&&m.paper.safari(),cl.length&&cm(cn)},co=function(a){return a>255?255:a<0?0:a};b$.animateWith=function(b,c,d,e,f,g){var h=d?a.animation(d,e,f,g):c,i=b.status(c);return this.animate(h).status(h,i*c.ms/h.ms)},b$.onAnimation=function(a){a?eve.on("anim.frame."+this.id,a):eve.unbind("anim.frame."+this.id);return this},cq.prototype.delay=function(a){var b=new cq(this.anim,this.ms);b.times=this.times,b.del=+a||0;return b},cq.prototype.repeat=function(a){var b=new cq(this.anim,this.ms);b.del=this.del,b.times=w.floor(x(a,0))||1;return b},a.animation=function(b,c,d,e){if(b instanceof cq)return b;if(a.is(d,"function")||!d)e=e||d||null,d=null;b=Object(b),c=+c||0;var f={},h,i;for(i in b)b[g](i)&&Q(i)!=i&&Q(i)+"%"!=i&&(h=!0,f[i]=b[i]);if(!h)return new cq(b,c);d&&(f.easing=d),e&&(f.callback=e);return new cq({100:f},c)},b$.animate=function(b,c,d,e){var f=this;if(f.removed){e&&e.call(f);return f}var g=b instanceof cq?b:a.animation(b,c,d,e);cr(g,f,g.percents[0],null,f.attr());return f},b$.setTime=function(a,b){a&&b!=null&&this.status(a,y(b,a.ms)/a.ms);return this},b$.status=function(a,b){var c=[],d=0,e,f;if(b!=null){cr(a,this,-1,y(b,1));return this}e=cl.length;for(;d.5)*2-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&n!=.5&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/);if(j=="linear"){var t=e.shift();t=-d(t);if(isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient);if(!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,j=="radial"?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;x1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(p),i.setAttribute(o,G.hex),o=="stroke"&&G[b]("opacity")&&q(i,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity}),o=="stroke"&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":(d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p);break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),H&&(I=H.getElementsByTagName("stop"),q(I[I.length-1],{"stop-opacity":p}));break};default:o=="font-size"&&(p=e(p,10)+"px");var J=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[J]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if(d.type=="text"&&!!(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){g.text=f.text;while(h.firstChild)h.removeChild(h.firstChild);var j=c(f.text).split("\n"),k=[],m;for(var n=0,o=j.length;n"));var $=X.getBoundingClientRect();t.W=m.w=($.right-$.left)/Y,t.H=m.h=($.bottom-$.top)/Y,t.X=m.x,t.Y=m.y+t.H/2,("x"in i||"y"in i)&&(t.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));var _=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var ba=0,bb=_.length;ba.25&&(c=e.sqrt(.25-i(b-.5,2))*((c>.5)*2-1)+.5),m=b+n+c);return o}),f=f.split(/\s*\-\s*/);if(l=="linear"){var p=f.shift();p=-d(p);if(isNaN(p))return null}var q=a._parseDots(f);if(!q)return null;b=b.shape||b.node;if(q.length){b.removeChild(g),g.on=!0,g.method="none",g.color=q[0].color,g.color2=q[q.length-1].color;var r=[];for(var s=0,t=q.length;s')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e,f=b.width,g=b.x,h=b.y;if(!c)throw new Error("VML container not found.");var i=new a._Paper,j=i.canvas=a._g.doc.createElement("div"),k=j.style;g=g||0,h=h||0,f=f||512,d=d||342,i.width=f,i.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),i.coordsize=u*1e3+n+u*1e3,i.coordorigin="0 0",i.span=a._g.doc.createElement("span"),i.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",j.appendChild(i.span),k.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(a._g.doc.body.appendChild(j),k.left=g+"px",k.top=h+"px",k.position="absolute"):c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j),i.renderfix=function(){};return i},a.prototype.clear=function(){a.eve("clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E)E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}(window.Raphael) \ No newline at end of file diff --git a/map/world.svg b/map/world.svg new file mode 100644 index 0000000..e146812 --- /dev/null +++ b/map/world.svg @@ -0,0 +1,636 @@ + + + + + + + + + + + + + diff --git a/source/.html b/source/.html new file mode 100644 index 0000000..e69de29 diff --git a/source/__init__.html b/source/__init__.html new file mode 100644 index 0000000..d83f3b5 --- /dev/null +++ b/source/__init__.html @@ -0,0 +1,34 @@ + + + + + __init__.py + + + +
+
+
+

__init__.py

+
+
+
+
+
+ # +
+ +
+
+
from kartograph import Kartograph
+from kartograph import verbose
+from map import projections
+
+__all__ = ['Kartograph', 'projections', 'verbose']
+
+
+
+
+
+
+ diff --git a/source/cartogram.html b/source/cartogram.html new file mode 100644 index 0000000..2b936e5 --- /dev/null +++ b/source/cartogram.html @@ -0,0 +1,858 @@ + + + + + cartogram.py + + + +
+
+
+

cartogram.py

+
+
+
+
+
+ # +
+

computes a circle cartogram for a given svg map + data file

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
class Cartogram:
+
+
+
+
+
+
+ # +
+ +
+
+
    def generate(self, svg_src, attr, csv_src, key, value):
+        regions = self.load_regions_from_svg(svg_src, attr)
+        data = self.load_csv(csv_src, key, value)
+        circles = []
+        for id in regions:
+            cx, cy = regions[id]
+            val = data[id]
+            circles.append(Circle(cx, cy, id, val))
+
+        self.attr = attr
+        self.key = value
+        self.circles = circles
+        self.compute_radii()
+        self.layout(700)
+        self.rescale()
+        self.correct()
+        self.layout(200, True)
+        self.rescale()
+        self.correct()
+        self.layout(100, False)
+        self.rescale()
+        self.correct()
+        self.to_svg()
+
+
+
+
+
+
+ # +
+ +
+
+
    def load_regions_from_svg(self, url, attr):
+        import svg as svgdoc
+        svg = svgdoc.Document.load(url)
+        self.svg = svg
+        g = svg.doc.getElementsByTagName('g')[0]
+        coords = {}
+        for path in g.getElementsByTagName('path'):
+            path_str = path.getAttribte('d')
+            id = path.getAttribte('data-' + attr)
+            poly = restore_poly_from_path_str(path_str)
+            coords[id] = poly.center()
+        return coords
+
+
+
+
+
+
+ # +
+ +
+
+
    def load_csv(self, url, key='id', value='val'):
+        import csv
+        doc = csv.reader(open(url), dialect='excel-tab')
+        head = None
+        data = {}
+        for row in doc:
+            if not head:
+                head = row
+                print head
+            else:
+                id = row[head.index(key)].strip()
+                val = float(row[head.index(value)])
+                data[id] = val
+        return data
+
+
+
+
+
+
+ # +
+ +
+
+
    def compute_radii(self):
+        import sys, math
+        minv = 0
+        maxv = sys.maxint * -1
+        for c in self.circles:
+            minv = min(minv, c.value)
+            maxv = max(maxv, c.value)
+
+        for c in self.circles:
+            c.r = math.pow((c.value - minv) / (maxv - minv), 0.50) * 60
+            c.weight = c.value / maxv
+
+
+
+
+
+
+ # +
+ +
+
+
    def layout(self, steps=100, correct=False):
+        for i in range(steps):
+
+
+
+
+
+
+ # +
+

if i % 100 == 0: + self.toSVG()

+
+
+
            self.layout_step(correct)
+
+
+
+
+
+
+ # +
+ +
+
+
    def layout_step(self, correct=False):
+        import math
+        pad = 0
+
+        if correct:
+            for C in self.circles:
+                v = Vector(C.ox - C.x, C.oy - C.y)
+                v.normalize()
+                v.resize(0.5)
+                C._move(v.x, v.y)
+
+        for A in self.circles:
+            for B in self.circles:
+                if A != B:
+                    radsq = (A.r + B.r) * (A.r + B.r)
+                    d = A.sqdist(B)
+                    if radsq + pad > d:
+
+
+
+
+
+
+ # +
+

move circles away from each other

+
+
+
                        v = Vector(B.x - A.x, B.y - A.y)
+                        v.normalize()
+                        m = (math.sqrt(radsq) - math.sqrt(d)) * 0.25
+                        v.resize(m)
+                        A._move(v.x * -1 * B.weight, v.y * -1 * B.weight)
+                        B._move(v.x * A.weight, v.y * A.weight)
+
+        for C in self.circles:
+            C.move()
+
+
+
+
+
+
+ # +
+ +
+
+
    def rescale(self):
+        from geometry import BBox, View
+        svg = self.svg
+        svg_view = svg[1][0][0]
+        vh = float(svg_view['h'])
+        vw = float(svg_view['w'])
+
+        bbox = BBox()
+        for c in self.circles:
+            r = c.r
+            bbox.update((c.x + r, c.y + r))
+            bbox.update((c.x + r, c.y - r))
+            bbox.update((c.x - r, c.y + r))
+            bbox.update((c.x - r, c.y - r))
+
+        view = View(bbox, vw, vh)
+        for c in self.circles:
+            c.r *= view.scale
+            x, y = view.project((c.x, c.y))
+            c.x = x
+            c.y = y
+
+
+
+
+
+
+ # +
+ +
+
+
    def correct(self):
+        for A in self.circles:
+            intersects = False
+            for B in self.circles:
+                if A != B:
+                    radsq = (A.r + B.r) * (A.r + B.r)
+                    d = A.sqdist_o(B)
+                    if radsq > d:
+                        intersects = True
+                        break
+            if not intersects:
+                A.x = A.ox
+                A.y = A.oy
+
+
+
+
+
+
+ # +
+ +
+
+
    def to_svg(self):
+        svg = self.svg
+
+        g = svg.node('g', svg.root, id="cartogram", fill="red", fill_opacity="0.5")
+
+        for circle in self.circles:
+            c = svg.node('circle', g, cx=circle.x, cy=circle.y, r=circle.r)
+            c.setAttribute('data-' + self.attr, circle.id)
+            c.setAttribute('data-' + self.key.lower(), circle.value)
+            g.append(c)
+
+        svg.preview()
+
+
+
+
+
+
+ # +
+

svg.save('cartogram.svg')

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
class Circle:
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, x, y, id, value):
+        self.x = self.ox = float(x)
+        self.y = self.oy = float(y)
+        self.id = id
+        self.value = float(value)
+        self.dx = 0
+        self.dy = 0
+
+
+
+
+
+
+ # +
+ +
+
+
    def _move(self, x, y):
+        self.dx += x
+        self.dy += y
+
+
+
+
+
+
+ # +
+ +
+
+
    def move(self):
+        self.x += self.dx
+        self.y += self.dy
+        self.dx = 0
+        self.dy = 0
+
+
+
+
+
+
+ # +
+ +
+
+
    def __repr__(self):
+        return '<Circle x=%.1f, y=%.1f, id=%s, val=%f >' % (self.x, self.y, self.id, self.value)
+
+
+
+
+
+
+ # +
+ +
+
+
    def sqdist(self, circ):
+        dx = self.x - circ.x
+        dy = self.y - circ.y
+        return dx * dx + dy * dy
+
+
+
+
+
+
+ # +
+

been too lazy to code this myself, instead I took code from here +http://www.kokkugia.com/wiki/index.php5?title=Python_vector_class

+
+
+
    def sqdist_o(self, circ):
+        dx = self.ox - circ.x
+        dy = self.oy - circ.y
+        return dx * dx + dy * dy
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
class Vector:
+
+
+
+
+
+
+ # +
+

Class properties

+
+
+
    def __init__(self, x, y):
+        self.x = float(x)
+        self.y = float(y)
+
+
+
+
+
+
+ # +
+

represent as a string

+
+
+
    def __repr__(self):
+        return 'Vector(%s, %s)' % (self.x, self.y)
+
+    '''
+       Class Methods / Behaviours
+    '''
+
+
+
+
+
+
+ # +
+ +
+
+
    def zero(self):
+        self.x = 0.0
+        self.y = 0.0
+        return self
+
+
+
+
+
+
+ # +
+ +
+
+
    def clone(self):
+        return Vector(self.x, self.y)
+
+
+
+
+
+
+ # +
+ +
+
+
    def normalize(self):
+        from math import sqrt
+        if self.x == 0 and self.y == 0:
+            return self
+        norm = float(1.0 / sqrt(self.x * self.x + self.y * self.y))
+        self.x *= norm
+        self.y *= norm
+
+
+
+
+
+
+ # +
+

self.z *= norm

+
+
+
        return self
+
+
+
+
+
+
+ # +
+ +
+
+
    def invert(self):
+        self.x = -(self.x)
+        self.y = -(self.y)
+        return self
+
+
+
+
+
+
+ # +
+ +
+
+
    def resize(self, sizeFactor):
+        self.normalize
+        self.scale(sizeFactor)
+        return self
+
+
+
+
+
+
+ # +
+ +
+
+
    def minus(self, t):
+        self.x -= t.x
+        self.y -= t.y
+
+
+
+
+
+
+ # +
+

self.z -= t.z

+
+
+
        return self
+
+
+
+
+
+
+ # +
+ +
+
+
    def plus(self, t):
+        self.x += t.x
+        self.y += t.y
+
+
+
+
+
+
+ # +
+

self.z += t.z

+
+
+
        return self
+
+
+
+
+
+
+ # +
+ +
+
+
    def roundToInt(self):
+        self.x = int(self.x)
+        self.y = int(self.y)
+        return self
+
+
+
+
+
+
+ # +
+

Returns the squared length of this vector.

+
+
+
    def lengthSquared(self):
+        return float((self.x * self.x) + (self.y * self.y))
+
+
+
+
+
+
+ # +
+

Returns the length of this vector.

+
+
+
    def length(self):
+        from math import sqrt
+        return float(sqrt(self.x * self.x + self.y * self.y))
+
+
+
+
+
+
+ # +
+

Computes the dot product of this vector and vector v2

+
+
+
    def dot(self, v2):
+        return (self.x * v2.x + self.y * v2.y)
+
+
+
+
+
+
+ # +
+

Linearly interpolates between vectors v1 and v2 and returns the result point = (1-alpha)v1 + alphav2.

+
+
+
    def interpolate(self, v2, alpha):
+        self.x = float((1 - alpha) * self.x + alpha * v2.x)
+        self.y = float((1 - alpha) * self.y + alpha * v2.y)
+        return Vector(self.x, self.y)
+
+
+
+
+
+
+ # +
+

Returns the angle in radians between this vector and the vector parameter; +the return value is constrained to the range [0,PI].

+
+
+
    def angle(self, v2):
+        from math import acos
+        vDot = self.dot(v2) / (self.length() * v2.length())
+        if vDot < -1.0:
+            vDot = -1.0
+        if vDot > 1.0:
+            vDot = 1.0
+        return float(acos(vDot))
+
+
+
+
+
+
+ # +
+

Limits this vector to a given size. +NODEBOX USERS: name should change as 'size' and 'scale' are reserved words in Nodebox!

+
+
+
    def limit(self, size):
+        if (self.length() > size):
+            self.normalize()
+            self.scale(size)
+
+
+
+
+
+
+ # +
+

Point Methods +Returns the square of the distance between this tuple and tuple t1.

+
+
+
    def distanceSquared(self, t1):
+        dx = self.x - t1.x
+        dy = self.y - t1.y
+        return (dx * dx + dy * dy)
+
+
+
+
+
+
+ # +
+

NODEBOX USERS: name should change as 'scale' is reserved word in Nodebox!

+
+
+
    def scale(self, s):
+        self.x *= s
+        self.y *= s
+        return self
+
+
+
+
+
+
+ # +
+

NODEBOX USERS: name should change as 'translate' is reserved word in Nodebox!

+
+
+
    def translate(self, vec):
+        self.plus(vec)
+
+
+
+
+
+
+ # +
+ +
+
+
    def distance(self, pt):
+        from math import sqrt
+        dx = self.x - pt.x
+        dy = self.y - pt.y
+        return float(sqrt(dx * dx + dy * dy))
+
+
+
+
+
+
+ # +
+

restores a list of polygons from a SVG path string

+
+
+
def restore_poly_from_path_str(path_str):
+
+
+
+
+
+
+ # +
+ +
+
+
    contours = path_str.split('Z')  # last contour may be empty
+    from Polygon import Polygon as Poly
+    poly = Poly()
+    for c_str in contours:
+        if c_str.strip() != "":
+            pts_str = c_str.strip()[1:].split("L")
+            pts = []
+            for pt_str in pts_str:
+                x, y = map(float, pt_str.split(','))
+                pts.append((x, y))
+            poly.addContour(pts, is_clockwise(pts))
+    return poly
+
+
+
+
+
+
+ # +
+

returns true if a given polygon is in clockwise order

+
+
+
def is_clockwise(pts):
+
+
+
+
+
+
+ # +
+ +
+
+
    s = 0
+    for i in range(len(pts) - 1):
+        if 'x' in pts[i]:
+            x1 = pts[i].x
+            y1 = pts[i].y
+            x2 = pts[i + 1].x
+            y2 = pts[i + 1].y
+        else:
+            x1, y1 = pts[i]
+            x2, y2 = pts[i + 1]
+        s += (x2 - x1) * (y2 + y1)
+    return s >= 0
+
+
+
+
+
+
+ diff --git a/source/cli.html b/source/cli.html new file mode 100644 index 0000000..19ce355 --- /dev/null +++ b/source/cli.html @@ -0,0 +1,214 @@ + + + + + cli.py + + + +
+
+
+

cli.py

+
+
+
+
+
+ # +
+

command line interface for kartograph

+
+
+
import argparse
+import os.path
+import json
+from errors import KartographError
+
+
+
+
+
+
+ # +
+ +
+
+
class bcolors:
+    HEADER = '\033[95m'
+    OKBLUE = '\033[94m'
+    OKGREEN = '\033[92m'
+    WARNING = '\033[93m'
+    FAIL = '\033[91m'
+    ENDC = '\033[0m'
+
+
+
+
+
+
+ # +
+ +
+
+
    def disable(self):
+        self.HEADER = ''
+        self.OKBLUE = ''
+        self.OKGREEN = ''
+        self.WARNING = ''
+        self.FAIL = ''
+        self.ENDC = ''
+
+parser = argparse.ArgumentParser(prog='kartograph', description='generating svg maps from shapefiles')
+
+
+
+
+
+
+ # +
+

subparsers = parser.add_subparsers(help='sub-command help')

+
+
+
+
+
+
+
+
+
+ # +
+

parser_svg = subparsers.add_parser('svg', help='generates svg map')

+
+
+
parser.add_argument('config', type=argparse.FileType('r'), help='the configuration for the map. accepts json and yaml.')
+parser.add_argument('--output', '-o', metavar='FILE', type=argparse.FileType('w'), help='the file in which the map will be stored')
+parser.add_argument('--verbose', '-v', nargs='?', metavar='', const=True, help='verbose mode')
+parser.add_argument('--format', '-f', metavar='svg|kml', help='output format, if not specified it will be guessed from output filename or default to svg')
+parser.add_argument('--preview', '-p', nargs='?', metavar='', const=True, help='opens the generated svg for preview')
+
+from kartograph import Kartograph
+import time
+import sys
+import os
+
+
+
+
+
+
+ # +
+ +
+
+
def parse_config(f):
+    content = f.read()
+    if f.name[-5:].lower() == '.json':
+        try:
+            cfg = json.loads(content)
+        except Exception, e:
+            raise KartographError('parsing of json map configuration failed.\n' + e)
+        else:
+            return cfg
+    elif f.name[-5:].lower() == '.yaml':
+        import yaml
+        try:
+            cfg = yaml.load(content)
+        except Exception, e:
+            raise KartographError('parsing of yaml map configuration failed.\n' + e)
+        else:
+            return cfg
+    else:
+        raise KartographError('supported config formats are .json and .yaml')
+
+
+
+
+
+
+ # +
+ +
+
+
def render_map(args):
+    cfg = parse_config(args.config)
+    K = Kartograph()
+    if args.format:
+        format = args.format
+    elif args.output:
+        format = os.path.splitext(args.output.name)[1][1:]
+    else:
+        format = 'svg'
+    try:
+
+
+
+
+
+
+ # +
+

generate the map

+
+
+
        K.generate(cfg, args.output, verbose=args.verbose, preview=args.preview, format=format)
+
+    except Exception, e:
+        import traceback
+        ignore_path_len = len(__file__) - 7
+        exc = sys.exc_info()
+        for (filename, line, func, code) in traceback.extract_tb(exc[2]):
+            if filename[:len(__file__) - 7] == __file__[:-7]:
+                print '  \033[1;33;40m%s\033[0m, \033[0;37;40min\033[0m %s()\n  \033[1;31;40m%d:\033[0m \033[0;37;40m%s\033[0m' % (filename[ignore_path_len:], func, line, code)
+            else:
+                print '  %s, in %s()\n  %d: %s' % (filename, func, line, code)
+        print
+        print e
+        exit(-1)
+
+parser.set_defaults(func=render_map)
+
+
+
+
+
+
+ # +
+ +
+
+
def main():
+    start = time.time()
+
+    try:
+        args = parser.parse_args()
+    except IOError, e:
+        parser.print_help()
+        print '\nIOError:', e
+    except Exception, e:
+        parser.print_help()
+        print '\nError:', e
+    else:
+        args.func(args)
+
+    elapsed = (time.time() - start)
+    print 'execution time: %.3f secs' % elapsed
+    sys.exit(0)
+
+
+if __name__ == "__main__":
+    main()
+
+
+
+
+
+
+ diff --git a/source/errors.html b/source/errors.html new file mode 100644 index 0000000..7e9f2fd --- /dev/null +++ b/source/errors.html @@ -0,0 +1,94 @@ + + + + + errors.py + + + +
+
+
+

errors.py

+
+
+
+
+
+ # +
+

error classes for kartograph

+
+
+
+
+
+
+
+
+
+ # +
+

Base class for exceptions in this module.

+
+
+
class KartographError(Exception):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __str__(self):
+        return '\033[0;31;40mKartograph-Error:\033[0m ' + super(KartographError, self).__str__()
+
+
+
+
+
+
+ # +
+ +
+
+
class KartographOptionParseError(KartographError):
+    pass
+
+
+
+
+
+
+ # +
+ +
+
+
class KartographShapefileAttributesError(KartographError):
+    pass
+
+
+
+
+
+
+ # +
+ +
+
+
class KartographLayerSourceError(KartographError):
+    pass
+
+
+
+
+
+
+ diff --git a/source/filter.html b/source/filter.html new file mode 100644 index 0000000..7cc2a7e --- /dev/null +++ b/source/filter.html @@ -0,0 +1,114 @@ + + + + + filter.py + + + +
+
+
+

filter.py

+
+
+
+
+
+ # +
+

layer filter

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
import re
+
+
+
+
+
+
+ # +
+ +
+
+
def filter_record(filt, record):
+    if isinstance(filt, dict):
+        if 'and' in filt:
+            res = True
+            for sfilt in filt['and']:
+                res = res and filter_record(sfilt, record)
+        elif 'or' in filt:
+            res = False
+            for sfilt in filt['or']:
+                res = res or filter_record(sfilt, record)
+    elif isinstance(filt, list):
+        res = filter_single(filt, record)
+    return res
+
+
+
+
+
+
+ # +
+ +
+
+
def filter_single(filt, record):
+    key, comp, val = filt
+    prop = record[key]
+    comp = comp.lower().split(' ')
+
+    if 'in' in comp:
+        res = prop in val
+    elif 'like' in comp:
+        res = re.search('^' + _escape_regex(val).replace('%', '.*') + '$', prop) is not None
+    elif 'matches' in comp:
+        res = re.search(val, prop) is not None
+    elif 'is' in comp or '=' in comp:
+        res = prop == val
+    elif 'greater' in comp or ('>' in comp):
+        res = prop > val
+    elif 'less' in comp or '<' in comp:
+        res = prop < val
+    if 'not' in comp:
+        return not res
+    else:
+        return res
+
+
+
+
+
+
+ # +
+ +
+
+
def _escape_regex(s):
+    chars = ('.', '*', '?', '+', '(', ')', '[', ']', '-')
+    for c in chars:
+        s = s.replace(c, '\\' + c)
+    return s
+
+
+
+
+
+
+ diff --git a/source/geometry/__init__.html b/source/geometry/__init__.html new file mode 100644 index 0000000..4ec2d26 --- /dev/null +++ b/source/geometry/__init__.html @@ -0,0 +1,50 @@ + + + + + __init__.py + + + +
+
+
+

__init__.py

+
+
+
+
+
+ # +
+

geometry package

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
__all__ = ['Feature', 'Geometry', 'SolidGeometry', 'MultiPolygon', 'BBox', 'Point', 'View', 'Line', 'PolyLine', 'create_feature']
+
+from feature import *
+from geometry import Geometry, SolidGeometry
+from polygon import MultiPolygon
+from point import Point
+from bbox import BBox
+from view import View
+from line import Line, PolyLine
+
+
+
+
+
+
+ diff --git a/source/geometry/bbox.html b/source/geometry/bbox.html new file mode 100644 index 0000000..ead41c7 --- /dev/null +++ b/source/geometry/bbox.html @@ -0,0 +1,195 @@ + + + + + bbox.py + + + +
+
+
+

bbox.py

+
+
+
+
+
+ # +
+ +
+
+
from point import Point
+
+
+
+
+
+
+ # +
+

2D bounding box

+
+
+
class BBox(object):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, width=None, height=None, left=0, top=0):
+        import sys
+        if width == None:
+            self.xmin = sys.maxint
+            self.xmax = sys.maxint * -1
+        else:
+            self.xmin = self.left = left
+            self.xmax = self.right = left + width
+            self.width = width
+        if height == None:
+            self.ymin = sys.maxint
+            self.ymax = sys.maxint * -1
+        else:
+            self.ymin = self.top = top
+            self.ymax = self.bottom = height + top
+            self.height = height
+
+
+
+
+
+
+ # +
+ +
+
+
    def update(self, pt):
+        if not isinstance(pt, Point):
+            pt = Point(pt[0], pt[1])
+        self.xmin = min(self.xmin, pt.x)
+        self.ymin = min(self.ymin, pt.y)
+        self.xmax = max(self.xmax, pt.x)
+        self.ymax = max(self.ymax, pt.y)
+
+        self.left = self.xmin
+        self.top = self.ymin
+        self.right = self.xmax
+        self.bottom = self.ymax
+        self.width = self.xmax - self.xmin
+        self.height = self.ymax - self.ymin
+
+
+
+
+
+
+ # +
+

returns true if two bounding boxes overlap

+
+
+
    def intersects(self, bbox):
+
+
+
+
+
+
+ # +
+ +
+
+
        return bbox.left < self.right and bbox.right > self.left and bbox.top < self.bottom and bbox.bottom > self.top
+
+
+
+
+
+
+ # +
+

check if a point is inside the bbox

+
+
+
    def check_point(self, pt):
+
+
+
+
+
+
+ # +
+ +
+
+
        return pt[0] > self.xmin and pt[0] < self.xmax and pt[1] > self.ymin and pt[1] < self.ymax
+
+
+
+
+
+
+ # +
+ +
+
+
    def __str__(self):
+        return 'BBox(x=%.2f, y=%.2f, w=%.2f, h=%.2f)' % (self.left, self.top, self.width, self.height)
+
+
+
+
+
+
+ # +
+ +
+
+
    def join(self, bbox):
+        self.update(Point(bbox.left, bbox.top))
+        self.update(Point(bbox.right, bbox.bottom))
+
+
+
+
+
+
+ # +
+ +
+
+
    def inflate(self, amount=0, inflate=False):
+        if inflate:
+            d = min(self.width, self.height)
+            amount += d * inflate
+        self.xmin -= amount
+        self.ymin -= amount
+        self.xmax += amount
+        self.ymax += amount
+
+        self.left = self.xmin
+        self.top = self.ymin
+        self.right = self.xmax
+        self.bottom = self.ymax
+        self.width = self.xmax - self.xmin
+        self.height = self.ymax - self.ymin
+
+
+
+
+
+
+ diff --git a/source/geometry/geometry.html b/source/geometry/geometry.html new file mode 100644 index 0000000..d54ab56 --- /dev/null +++ b/source/geometry/geometry.html @@ -0,0 +1,279 @@ + + + + + geometry.py + + + +
+
+
+

geometry.py

+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

DEPRECATED

+
+
+
+
+
+
+
+
+
+ # +
+

base class for all geometry

+
+
+
class Geometry:
+
+
+
+
+
+
+ # +
+

project geometry

+
+
+
    def project(self, proj):
+
+
+
+
+
+
+ # +
+ +
+
+
        raise NotImplementedError('project() is not implemented')
+
+
+
+
+
+
+ # +
+ +
+
+
    def bbox(self):
+        raise NotImplementedError('bbox() is not implemented')
+
+
+
+
+
+
+ # +
+ +
+
+
    def project_view(self, view):
+        raise NotImplementedError('project_view() is not implemented')
+
+
+
+
+
+
+ # +
+ +
+
+
    def to_svg(self, round=0):
+        raise NotImplementedError('to_svg() is not implemented')
+
+
+
+
+
+
+ # +
+ +
+
+
    def crop_to(self, view_bounds):
+        raise NotImplementedError('crop_to() is not implemented')
+
+
+
+
+
+
+ # +
+ +
+
+
    def substract_geom(self, geom):
+        raise NotImplementedError('substract_geom() is not implemented yet')
+
+
+
+
+
+
+ # +
+ +
+
+
    def is_emtpy(self):
+        return False
+
+
+
+
+
+
+ # +
+ +
+
+
    def unify(self, point_store, precision=None):
+        raise NotImplementedError('unify() is not implemented yet')
+
+
+
+
+
+
+ # +
+

returns a list of point lists

+
+
+
    def points(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        raise NotImplementedError('points() is not implemented yet')
+
+
+
+
+
+
+ # +
+ +
+
+
    def join(self, geom):
+        raise NotImplementedError('join() is not implemented yet')
+
+
+
+
+
+
+ # +
+

base class for all solid geometry, e.g. polygons

+
+
+
class SolidGeometry(Geometry):
+
+
+
+
+
+
+ # +
+

calculates area for this geometry

+
+
+
    def area():
+
+
+
+
+
+
+ # +
+ +
+
+
        raise NotImplementedError('area() is not implemented')
+
+
+
+
+
+
+ # +
+

calculates centroid for this geometry

+
+
+
    def centroid():
+
+
+
+
+
+
+ # +
+ +
+
+
        raise NotImplementedError('centroid() is not implemented')
+
+
+
+
+
+
+ # +
+ +
+
+
    def invalidate(self):
+        self.__area = None
+
+
+
+
+
+
+ diff --git a/source/geometry/line.html b/source/geometry/line.html new file mode 100644 index 0000000..b5c0982 --- /dev/null +++ b/source/geometry/line.html @@ -0,0 +1,519 @@ + + + + + line.py + + + +
+
+
+

line.py

+
+
+
+
+
+ # +
+ +
+
+
from bbox import BBox
+from geometry import Geometry
+
+
+
+
+
+
+ # +
+

polyline

+
+
+
class PolyLine(Geometry):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, contours):
+        self.contours = contours
+
+
+
+
+
+
+ # +
+

returns the bounding box of the line

+
+
+
    def bbox(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        bbox = BBox()
+        for pts in self.contours:
+            for pt in pts:
+                bbox.update(pt)
+        return bbox
+
+
+
+
+
+
+ # +
+

projects the line to a map projection

+
+
+
    def project(self, proj):
+
+
+
+
+
+
+ # +
+ +
+
+
        contours = []
+        for points in self.contours:
+            pts = []
+            for pt in points:
+                if proj._visible(pt[0], pt[1]):
+                    p = proj.project(pt[0], pt[1])
+                    if p is not None:
+                        pts.append(p)
+                else:
+                    if len(pts) > 0:
+                        contours.append(pts)
+                        pts = []
+            if len(pts) > 0:
+                contours.append(pts)
+        return PolyLine(contours)
+
+
+
+
+
+
+ # +
+

transforms the line to a new view

+
+
+
    def project_view(self, view):
+
+
+
+
+
+
+ # +
+ +
+
+
        contours = []
+        for points in self.contours:
+            pts = []
+            for pt in points:
+                p = view.project(pt)
+                pts.append(p)
+            contours.append(pts)
+        return PolyLine(contours)
+
+
+
+
+
+
+ # +
+

constructs a svg representation of this line

+
+
+
    def to_svg(self, svg, round):
+
+
+
+
+
+
+ # +
+ +
+
+
        path_str = ""
+        if round is False:
+            fmt = '%f,%f'
+        else:
+            fmt = '%.' + str(round) + 'f'
+            fmt = fmt + ',' + fmt
+
+        for points in self.contours:
+            path_str += "M "
+            pts = []
+            for pt in points:
+                pts.append(fmt % (pt[0], pt[1]))
+            path_str += 'L '.join(pts)
+
+        path = svg.node('path', d=path_str)
+        return path
+
+
+
+
+
+
+ # +
+ +
+
+
    def crop_to(self, geom):
+
+
+
+
+
+
+ # +
+

skip

+
+
+
        return self
+
+
+
+
+
+
+ # +
+ +
+
+
    def is_empty(self):
+        return len(self.contours) == 0
+
+
+
+
+
+
+ # +
+ +
+
+
    def unify(self, point_store, precision):
+        from kartograph.simplify import unify_polygon
+        for i in range(len(self.contours)):
+            self.contours[i] = unify_polygon(self.contours[i], point_store, precision)
+
+
+
+
+
+
+ # +
+ +
+
+
    def points(self):
+        return self.contours
+
+
+
+
+
+
+ # +
+

is called after the points of this geometry have been +changed from outside this class

+
+
+
    def update(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        pass
+
+
+
+
+
+
+ # +
+

simple line (= list of points)

+
+
+
class Line(Geometry):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, points):
+        self.pts = points
+
+
+
+
+
+
+ # +
+

returns the bounding box of the line

+
+
+
    def bbox(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        bbox = BBox()
+        for pt in self.pts:
+            bbox.update(pt)
+        return bbox
+
+
+
+
+
+
+ # +
+

projects the line to a map projection

+
+
+
    def project(self, proj):
+
+
+
+
+
+
+ # +
+ +
+
+
        pts = []
+        for pt in self.pts:
+            p = proj.project(pt[0], pt[1])
+            if p is not None:
+                pts.append(p)
+        return Line(pts)
+
+
+
+
+
+
+ # +
+

transforms the line to a new view

+
+
+
    def project_view(self, view):
+
+
+
+
+
+
+ # +
+ +
+
+
        pts = []
+        for pt in self.pts:
+            p = view.project(pt)
+            pts.append(p)
+        return Line(pts)
+
+
+
+
+
+
+ # +
+

constructs a svg representation of this line

+
+
+
    def to_svg(self, svg, round):
+
+
+
+
+
+
+ # +
+ +
+
+
        path_str = ""
+        if round is False:
+            fmt = '%f,%f'
+        else:
+            fmt = '%.' + str(round) + 'f'
+            fmt = fmt + ',' + fmt
+
+        for pt in self.pts:
+            if path_str == "":
+                path_str = "M"
+            else:
+                path_str += "L"
+            path_str += fmt % (pt[0], pt[1])
+
+        path = svg.node('path', d=path_str)
+        return path
+
+
+
+
+
+
+ # +
+ +
+
+
    def crop_to(self, geom):
+
+
+
+
+
+
+ # +
+

skip

+
+
+
        return self
+
+
+
+
+
+
+ # +
+ +
+
+
    def is_empty(self):
+        return len(self.pts) == 0
+
+
+
+
+
+
+ # +
+ +
+
+
    def unify(self, point_store, precision):
+        from kartograph.simplify import unify_polygon
+        self.pts = unify_polygon(self.pts, point_store, precision)
+
+
+
+
+
+
+ # +
+ +
+
+
    def points(self):
+        return [self.pts]
+
+
+
+
+
+
+ # +
+

is called after the points of this geometry have been +changed from outside this class

+
+
+
    def update(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        pass
+
+
+
+
+
+
+ diff --git a/source/geometry/point.html b/source/geometry/point.html new file mode 100644 index 0000000..c10c17d --- /dev/null +++ b/source/geometry/point.html @@ -0,0 +1,141 @@ + + + + + point.py + + + +
+
+
+

point.py

+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

base class for points, used by line and bbox

+
+
+
class Point():
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, x, y):
+        self.x = x
+        self.y = y
+
+
+
+
+
+
+ # +
+

emulate python's container types

+
+
+
    def project(self, proj):
+        (x, y) = proj.project(self.x, self.y)
+        self.x = x
+        self.y = y
+
+
+
+
+
+
+ # +
+ +
+
+
    def __len__(self):
+        return 2
+
+
+
+
+
+
+ # +
+ +
+
+
    def __getitem__(self, k):
+        pt = (self.x, self.y)
+        return pt[k]
+
+
+
+
+
+
+ # +
+ +
+
+
    def __setitem__(self, k, value):
+        if k == 0:
+            self.x = value
+        elif k == 1:
+            self.y = value
+        else:
+            raise IndexError
+
+
+
+
+
+
+ # +
+ +
+
+
    def __delitem__(self, key):
+        raise TypeError('deletion not supported')
+
+
+
+
+
+
+ diff --git a/source/geometry/polygon.html b/source/geometry/polygon.html new file mode 100644 index 0000000..cf5a761 --- /dev/null +++ b/source/geometry/polygon.html @@ -0,0 +1,625 @@ + + + + + polygon.py + + + +
+
+
+

polygon.py

+
+
+
+
+
+ # +
+ +
+
+
from geometry import *
+from bbox import BBox
+import utils
+
+
+
+
+
+
+ # +
+

DEPRECATED! we use shapely.geometry.MultiPolygon instead

+
+
+
+
+
+
+
+
+
+ # +
+

Complex polygons

+
+
+
class MultiPolygon(SolidGeometry):
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, contours):
+        self.__area = None
+        self.__areas = None
+        self.__centroid = None
+        self.apply_contours(contours)
+
+
+
+
+
+
+ # +
+

constructs a Polygon from contours

+
+
+
    @staticmethod
+    def fromPoly(poly):
+        contours = []
+        for i in range(len(poly)):
+            pts = poly.contour(i)
+            contours.append(pts)
+        return MultiPolygon(contours)
+
+    def apply_contours(self, contours):
+
+
+
+
+
+
+ # +
+ +
+
+
        self.contours = contours
+        from Polygon import Polygon as GPCPoly
+        poly = GPCPoly()
+        skip = 0
+        for pts_ in contours:
+            pts = []
+            for pt in pts_:
+                if 'deleted' in pt and pt.deleted is True:
+                    skip += 1
+                    continue
+                pts.append((pt[0], pt[1]))
+            ishole = utils.is_clockwise(pts)
+
+            if len(pts) > 2:
+                poly.addContour(pts, ishole)
+        self.poly = poly
+
+
+
+
+
+
+ # +
+ +
+
+
    def area(self):
+        if self.__area is not None:
+            return self.__area
+        self.__area = self.poly.area()
+        return self.__area
+
+
+
+
+
+
+ # +
+

returns array of areas of all sub-polygons areas of holes are < 0

+
+
+
    def areas(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        if self.__areas is not None:
+            return self.__areas
+        a = []
+        for i in range(len(self.poly)):
+            t = self.poly.area(i)
+            if self.poly.isHole(i):
+                t *= -1
+            a.append(t)
+        self.__areas = a
+        return a
+
+
+
+
+
+
+ # +
+

returns the center of gravity for this polygon

+
+
+
    def centroid(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        if self.__centroid is not None:
+            return self.__centroid
+        self.__centroid = self.poly.center()
+        return self.__centroid
+
+
+
+
+
+
+ # +
+

smart bounding box

+
+
+
    def bbox(self, min_area=0):
+
+
+
+
+
+
+ # +
+ +
+
+
        bb = []
+        bbox = BBox()
+        if min_area == 0:
+            bb.append(self.poly.boundingBox())
+        else:
+            areas = self.areas()
+            max_a = max(areas)
+            for i in range(len(self.poly)):
+                if self.poly.isHole(i):
+                    continue
+                a = areas[i]
+                if a < max_a * min_area:
+                    continue
+                bb.append(self.poly.boundingBox(i))
+        for b in bb:
+            bbox.update((b[0], b[2]))
+            bbox.update((b[1], b[2]))
+            bbox.update((b[0], b[3]))
+            bbox.update((b[1], b[3]))
+        return bbox
+
+
+
+
+
+
+ # +
+

returns a new multi-polygon whose contours are +projected to a map projection

+
+
+
    def project(self, proj):
+
+
+
+
+
+
+ # +
+ +
+
+
        in_contours = self.contours
+        out_contours = []
+        for pts in in_contours:
+            pcont = proj.plot(pts)
+            if pcont != None:
+                out_contours += pcont
+        return MultiPolygon(out_contours)
+
+
+
+
+
+
+ # +
+

returns a new multi-polygon whose contours are +projected to a new view

+
+
+
    def project_view(self, view):
+
+
+
+
+
+
+ # +
+ +
+
+
        contours = self.contours
+        out = []
+        for contour in contours:
+            out_c = []
+            for pt in contour:
+                pt = view.project(pt)
+                out_c.append(pt)
+            out.append(out_c)
+        self.contours = out
+        out_poly = MultiPolygon(out)
+        return out_poly
+
+
+
+
+
+
+ # +
+ +
+
+
    def crop_to(self, view_bounds):
+        poly = self.poly & view_bounds.poly
+        return MultiPolygon.fromPoly(poly)
+
+
+
+
+
+
+ # +
+ +
+
+
    def substract_geom(self, geom):
+        if not isinstance(geom, MultiPolygon):
+            raise NotImplementedError('substraction is allowed for polygons only, yet')
+        poly = self.poly - geom.poly
+        return MultiPolygon.fromPoly(poly)
+
+
+
+
+
+
+ # +
+

constructs a svg representation of this polygon

+
+
+
    def to_svg(self, svg, round):
+
+
+
+
+
+
+ # +
+ +
+
+
        path_str = ""
+        if round is False:
+            fmt = '%f,%f'
+        else:
+            fmt = '%.' + str(round) + 'f'
+            fmt = fmt + ',' + fmt
+
+        for pts in self.contours:
+            cont_str = ""
+            kept = []
+            for pt in pts:
+                if 'deleted' in pt and pt.deleted is True:
+                    continue
+                kept.append(pt)
+
+            if len(kept) <= 3:
+                continue
+            for pt in kept:
+                if cont_str == "":
+                    cont_str = "M"
+                else:
+                    cont_str += "L"
+                cont_str += fmt % pt
+            cont_str += "Z "
+            path_str += cont_str
+
+        if path_str == "":
+            return None
+
+        path = svg.node('path', d=path_str)
+        return path
+
+
+
+
+
+
+ # +
+ +
+
+
    def is_empty(self):
+        return len(self.contours) == 0
+
+
+
+
+
+
+ # +
+ +
+
+
    def unify(self, point_store, precision=None):
+        from kartograph.simplify import unify_polygons
+        contours = self.contours
+        contours = unify_polygons(contours, point_store, precision)
+        self.apply_contours(contours)
+
+
+
+
+
+
+ # +
+ +
+
+
    def points(self):
+        return self.contours
+
+
+
+
+
+
+ # +
+

is called after the points of this geometry are +changed from outside this class

+
+
+
    def update(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        self.apply_contours(self.contours)
+
+
+
+
+
+
+ # +
+ +
+
+
    def to_kml(self, round=None):
+        from pykml.factory import KML_ElementMaker as KML
+        poly = KML.Polygon(
+            KML.tesselate("1")
+        )
+        outer = KML.outerBoundaryIs()
+        inner = KML.innerBoundaryIs()
+        has_inner = False
+        for i in range(len(self.poly)):
+            cnt = self.poly[i]
+            coords = ''
+            for p in cnt:
+                coords += ','.join(map(str, p)) + ' '
+            ring = KML.LinearRing(
+                KML.coordinates(coords)
+            )
+
+
+
+
+
+
+ # +
+

hole = self.poly.isHole(i) +if hole == False:

+
+
+
            outer.append(ring)
+
+
+
+
+
+
+ # +
+

else: + inner.append(ring) + has_inner = True

+
+
+
        poly.append(outer)
+        if has_inner:
+            poly.append(inner)
+
+        return poly
+
+
+
+
+
+
+ # +
+

splits the geometry into several line segments

+
+
+
    def to_line_segments(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        self.lines = []
+
+
+
+
+
+
+ # +
+ +
+
+
    def from_line_segments(self):
+        self.lines = []
+
+
+
+
+
+
+ # +
+ +
+
+
class Polygon(SolidGeometry):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, points):
+        self.__area = None
+        self.__centroid = None
+        self.points = points
+
+
+
+
+
+
+ # +
+ +
+
+
    def area(self):
+        if self.__area is not None:
+            return self.__area
+        a = 0
+        pts = self.points
+        for i in range(len(pts) - 1):
+            p0 = pts[i]
+            p1 = pts[i + 1]
+            a += p0.x * p1.y - p1.x * p0.y
+        self.__area = abs(a) * .5
+        return self.__area
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, proj):
+        self.invalidate()
+        self.points = proj.plot(self.points)
+
+
+
+
+
+
+ diff --git a/source/geometry/utils.html b/source/geometry/utils.html new file mode 100644 index 0000000..cde77ec --- /dev/null +++ b/source/geometry/utils.html @@ -0,0 +1,196 @@ + + + + + utils.py + + + +
+
+
+

utils.py

+
+
+
+
+
+ # +
+

geometry utils

+
+
+
+
+
+
+
+
+
+ # +
+

returns true if a given linear ring is in clockwise order

+
+
+
def is_clockwise(pts):
+
+
+
+
+
+
+ # +
+ +
+
+
    s = 0
+    for i in range(len(pts) - 1):
+        if 'x' in pts[i]:
+            x1 = pts[i].x
+            y1 = pts[i].y
+            x2 = pts[i + 1].x
+            y2 = pts[i + 1].y
+        else:
+            x1, y1 = pts[i]
+            x2, y2 = pts[i + 1]
+        s += (x2 - x1) * (y2 + y1)
+    return s >= 0
+
+
+
+
+
+
+ # +
+ +
+
+
def bbox_to_polygon(bbox):
+    from shapely.geometry import Polygon
+    s = bbox
+    poly = Polygon([(s.left, s.bottom), (s.left, s.top), (s.right, s.top), (s.right, s.bottom)])
+    return poly
+
+
+
+
+
+
+ # +
+ +
+
+
def geom_to_bbox(geom, min_area=0):
+    from kartograph.geometry import BBox
+    from shapely.geometry import MultiPolygon
+    if True or min_area == 0 or not isinstance(geom, MultiPolygon):
+
+
+
+
+
+
+ # +
+

if no minimum area ratio is set or the geometry +is not a multipart geometry, we simply use the +full bbox

+
+
+
        minx, miny, maxx, maxy = geom.bounds
+        return BBox(width=maxx - minx, height=maxy - miny, left=minx, top=miny)
+    else:
+
+
+
+
+
+
+ # +
+

for multipart geometry we use only the bbox of +the 'biggest' sub-geometries, depending on min_area

+
+
+
        bbox = BBox()
+        areas = []
+        bb = []
+        for polygon in geom.geoms:
+            areas.append(polygon.area)
+        max_a = max(areas)
+        for i in range(len(geom.geoms)):
+            a = areas[i]
+            if a < max_a * min_area:
+
+
+
+
+
+
+ # +
+

ignore this sub polygon since it is too small

+
+
+
                continue
+            bb.append(geom.geoms[i].bounds)
+    for b in bb:
+        bbox.update((b[0], b[2]))
+        bbox.update((b[1], b[2]))
+        bbox.update((b[0], b[3]))
+        bbox.update((b[1], b[3]))
+    return bbox
+
+
+
+
+
+
+ # +
+

joins polygonal features

+
+
+
def join_features(features, props):
+
+
+
+
+
+
+ # +
+ +
+
+
    from feature import MultiPolygonFeature
+
+    if len(features) == 0:
+        return features
+
+    joined = []
+    polygons = []
+
+    for feat in features:
+        if isinstance(feat, MultiPolygonFeature):
+            polygons.append(feat.geom)
+        else:
+            joined.append(feat)  # cannot join this
+
+    polygons = filter(lambda x: x is not None, polygons)
+    if len(polygons) > 0:
+        poly = polygons[0]
+        for poly2 in polygons[1:]:
+            poly = poly.union(poly2)
+        joined.append(MultiPolygonFeature(poly, props))
+    return joined
+
+
+
+
+
+
+ diff --git a/source/geometry/view.html b/source/geometry/view.html new file mode 100644 index 0000000..aa4f76b --- /dev/null +++ b/source/geometry/view.html @@ -0,0 +1,226 @@ + + + + + view.py + + + +
+
+
+

view.py

+
+
+
+
+
+ # +
+ +
+
+
from shapely.geometry import Polygon, MultiPolygon, LineString, MultiLineString, MultiPoint, Point
+from kartograph.errors import KartographError
+
+
+
+
+
+
+ # +
+

translates a point to a view

+
+
+
class View(object):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, bbox=None, width=None, height=None, padding=0):
+        self.bbox = bbox
+        self.width = width
+        self.padding = padding
+        self.height = height
+        if bbox:
+            self.scale = min((width - padding * 2) / bbox.width, (height - padding * 2) / bbox.height)
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, pt):
+        bbox = self.bbox
+        if not bbox:
+            return pt
+        s = self.scale
+        h = self.height
+        w = self.width
+        px = pt[0]
+        py = pt[1]
+        x = (px - bbox.left) * s + (w - bbox.width * s) * .5
+        y = (py - bbox.top) * s + (h - bbox.height * s) * .5
+        return ((x, y), Point(x, y))[isinstance(pt, Point)]
+
+
+
+
+
+
+ # +
+ +
+
+
    def project_inverse(self, pt):
+        bbox = self.bbox
+        if not bbox:
+            return pt
+        s = self.scale
+        h = self.height
+        w = self.width
+        x = pt[0]
+        y = pt[1]
+        px = (x - (w - bbox.width * s) * .5) / s + bbox.left
+        py = (y - (h - bbox.height * s) * .5) / s + bbox.top
+        return ((px, py), Point(px, py))[isinstance(pt, Point)]
+
+
+
+
+
+
+ # +
+

converts the given geometry to the view coordinates

+
+
+
    def project_geometry(self, geometry):
+
+
+
+
+
+
+ # +
+ +
+
+
        geometries = hasattr(geometry, 'geoms') and geometry.geoms or [geometry]
+        res = []
+
+
+
+
+
+
+ # +
+

at first shift polygons +geometries = [] +for geom in unshifted_geometries: + geometries += self._shift_polygon(geom)

+
+
+
        for geom in geometries:
+            if isinstance(geom, Polygon):
+                res += self.project_polygon(geom)
+            elif isinstance(geom, LineString):
+                rings = self.project_linear_ring(geom.coords)
+                res += map(LineString, rings)
+            elif isinstance(geom, Point):
+                if self._visible(geom.x, geom.y):
+                    res.append(self.project(geom))
+            else:
+                raise KartographError('unknown geometry type %s' % geometry)
+
+        if len(res) > 0:
+            if isinstance(res[0], Polygon):
+                if len(res) > 1:
+                    return MultiPolygon(res)
+                else:
+                    return res[0]
+            elif isinstance(res[0], LineString):
+                if len(res) > 1:
+                    return MultiLineString(res)
+                else:
+                    return LineString(res[0])
+            else:
+                if len(res) > 1:
+                    return MultiPoint(res)
+                else:
+                    return res[0]
+
+
+
+
+
+
+ # +
+ +
+
+
    def project_polygon(self, polygon):
+        ext = self.project_linear_ring(polygon.exterior)
+        if len(ext) == 1:
+            pts_int = []
+            for interior in polygon.interiors:
+                pts_int += self.project_linear_ring(interior)
+            return [Polygon(ext[0], pts_int)]
+        elif len(ext) == 0:
+            return []
+        else:
+            raise KartographError('unhandled case: exterior is split into multiple rings')
+
+
+
+
+
+
+ # +
+ +
+
+
    def project_linear_ring(self, ring):
+        points = []
+        for pt in ring.coords:
+            x, y = self.project(pt)
+            points.append((x, y))
+        return [points]
+
+
+
+
+
+
+ # +
+ +
+
+
    def __str__(self):
+        return 'View(w=%f, h=%f, pad=%f, scale=%f, bbox=%s)' % (self.width, self.height, self.padding, self.scale, self.bbox)
+
+
+
+
+
+
+ diff --git a/source/img/crop-bbox-01.png b/source/img/crop-bbox-01.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0023f1ae8f78726bf0c6331727970c5a86a1da GIT binary patch literal 80101 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 Q7Ybt1;tFDwA_hVK11|xxS^xk5 literal 0 HcmV?d00001 diff --git a/source/img/crop-polygon-1.png b/source/img/crop-polygon-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d3e7487bdc26a4fc058d0155e13455a838ccda1a GIT binary patch literal 15737 zcmX9_1yCDZy9SCApv7H^yB2qMcP$hs6nA%Pa0{-*i@RHKx8m+l+#T+I|IJJ$Gs#Zo z?4H*iIbanfX;fqaWGE;oR9P7bH7F=(ci_#22m^eBnD4p>d>}c<=sH6|!DjvUhW6pK z&I7*0cahX_QMb2naW`=?hY~fjH#H}dwKe%}u4Zmx=IJY{Cr;$;rug zD95W�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 literal 0 HcmV?d00001 diff --git a/source/img/crop-polygon-minarea.png b/source/img/crop-polygon-minarea.png new file mode 100644 index 0000000000000000000000000000000000000000..3c05a47ed77bcceb4bbdf007d99619502f5835b8 GIT binary patch literal 28682 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 S!+jvYM^aQ)q((?T@P7ah){6!J literal 0 HcmV?d00001 diff --git a/source/img/join.png b/source/img/join.png new file mode 100644 index 0000000000000000000000000000000000000000..b33139145bd6b4727c8b84161a5be31dc3d338b6 GIT binary patch literal 35257 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

C|@4I1H$L*|6$J4#_d0TxP-5yWXAm2Od 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 Y0N*@Ml^Lv$RR91007*qoM6N<$f-2E{2LJ#7 literal 0 HcmV?d00001 diff --git a/source/img/logo.png b/source/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3a64c2bf8d56ea97415d6ebd8c3c2e8f2311616f GIT binary patch literal 15102 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

=BSx7`>o*)RD@p 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 literal 0 HcmV?d00001 diff --git a/source/img/simplify.png b/source/img/simplify.png new file mode 100644 index 0000000000000000000000000000000000000000..ed830a2f030af47f581ac5a6ddbb96334addfeb4 GIT binary patch literal 69469 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 z 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 literal 0 HcmV?d00001 diff --git a/source/kartograph.html b/source/kartograph.html new file mode 100644 index 0000000..f4a0b4d --- /dev/null +++ b/source/kartograph.html @@ -0,0 +1,326 @@ + + + + + kartograph.py + + + +

+
+
+

kartograph.py

+
+
+
+
+
+ # +
+ +
+
+
from options import parse_options
+from shapely.geometry import Polygon, LineString, MultiPolygon
+from errors import *
+from copy import deepcopy
+from renderer import SvgRenderer, KmlRenderer
+from map import Map
+
+
+
+
+
+
+ # +
+

Kartograph

+
+
+
verbose = False
+
+
+
+
+
+
+ # +
+

These renderers are currently available. See renderer/svg.py and renderer/kml.py +for more details on those.

+
+
+
_known_renderer = {
+    'svg': SvgRenderer,
+    'kml': KmlRenderer
+}
+
+
+
+
+
+
+ # +
+ +
+
+
class Kartograph(object):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self):
+        self.layerCache = {}
+        pass
+
+
+
+
+
+
+ # +
+

Generates a the map and renders it using the specified output format.

+
+
+
    def generate(self, opts, outfile=None, format='svg', preview=None):
+
+
+
+
+
+
+ # +
+ +
+
+
        if preview is None:
+            preview = outfile is not None
+
+
+
+
+
+
+ # +
+

Create a deep copy of the options dictionary so our changes will not be +visible to the calling application.

+
+
+
        opts = deepcopy(opts)
+
+
+
+
+
+
+ # +
+

Parse the options dictionary. See options.py for more details.

+
+
+
        parse_options(opts)
+
+
+
+
+
+
+ # +
+

Create the map instance. It will do all the hard work for us, so you +definitely should check out map.py for all the fun stuff happending +there..

+
+
+
        _map = Map(opts, self.layerCache, format=format)
+
+
+
+
+
+
+ # +
+

Check if the format is handled by a renderer.

+
+
+
        format = format.lower()
+        if format in _known_renderer:
+
+
+
+
+
+
+ # +
+

Create a renderer instance and render the map.

+
+
+
            renderer = _known_renderer[format](_map)
+            renderer.render()
+
+
+
+
+
+
+ # +
+

If requested, we try to preview the created map now, which means that +we open the created SVG file in Firefox or open the KML in Google Earth. +Of course, preview modes are highly dependent on the operating system, but +we don't care about that now.

+
+
+
            if preview:
+                renderer.preview()
+
+
+
+
+
+
+ # +
+

Write the map to a file or return the renderer instance.

+
+
+
            if outfile is None:
+                return renderer
+            else:
+                renderer.write(outfile)
+        else:
+            raise KartographError('unknown format: %s' % format)
+
+
+
+
+
+
+ # +
+

Here are some handy methods for debugging Kartograph. It will plot a given shapely +geometry using matplotlib and descartes.

+
+
+
def _plot_geometry(geom, fill='#ffcccc', stroke='#333333', alpha=1, msg=None):
+    from matplotlib import pyplot
+    from matplotlib.figure import SubplotParams
+    from descartes import PolygonPatch
+
+    if isinstance(geom, (Polygon, MultiPolygon)):
+        b = geom.bounds
+        geoms = hasattr(geom, 'geoms') and geom.geoms or [geom]
+        w, h = (b[2] - b[0], b[3] - b[1])
+        ratio = w / h
+        pad = 0.15
+        fig = pyplot.figure(1, figsize=(5, 5 / ratio), dpi=110, subplotpars=SubplotParams(left=pad, bottom=pad, top=1 - pad, right=1 - pad))
+        ax = fig.add_subplot(111, aspect='equal')
+        for geom in geoms:
+            patch1 = PolygonPatch(geom, linewidth=0.5, fc=fill, ec=stroke, alpha=alpha, zorder=0)
+            ax.add_patch(patch1)
+    p = (b[2] - b[0]) * 0.03  # some padding
+    pyplot.axis([b[0] - p, b[2] + p, b[3] + p, b[1] - p])
+    pyplot.grid(True)
+    if msg:
+        fig.suptitle(msg, y=0.04, fontsize=9)
+    pyplot.show()
+
+
+
+
+
+
+ # +
+ +
+
+
def _plot_lines(lines):
+    from matplotlib import pyplot
+
+
+
+
+
+
+ # +
+ +
+
+
    def plot_line(ax, line):
+        filtered = []
+        for pt in line:
+            if not pt.deleted:
+                filtered.append(pt)
+        if len(filtered) < 2:
+            return
+        ob = LineString(line)
+        x, y = ob.xy
+        ax.plot(x, y, '-', color='#333333', linewidth=0.5, solid_capstyle='round', zorder=1)
+
+    fig = pyplot.figure(1, figsize=(4, 5.5), dpi=90, subplotpars=SubplotParams(left=0, bottom=0.065, top=1, right=1))
+    ax = fig.add_subplot(111, aspect='equal')
+    for line in lines:
+        plot_line(ax, line)
+    pyplot.grid(False)
+    ax.xaxis.set_visible(False)
+    ax.yaxis.set_visible(False)
+    ax.set_frame_on(False)
+    return (ax, fig)
+
+
+
+
+
+
+ # +
+ +
+
+
def _debug_show_features(features, message=None):
+    from descartes import PolygonPatch
+    from matplotlib import pyplot
+    from matplotlib.figure import SubplotParams
+
+    fig = pyplot.figure(1, figsize=(9, 5.5), dpi=110, subplotpars=SubplotParams(left=0, bottom=0.065, top=1, right=1))
+    ax = fig.add_subplot(111, aspect='equal')
+    b = (100000, 100000, -100000, -100000)
+    for feat in features:
+        if feat.geom is None:
+            continue
+        c = feat.geom.bounds
+        b = (min(c[0], b[0]), min(c[1], b[1]), max(c[2], b[2]), max(c[3], b[3]))
+        geoms = hasattr(feat.geom, 'geoms') and feat.geom.geoms or [feat.geom]
+        for geom in geoms:
+            patch1 = PolygonPatch(geom, linewidth=0.25, fc='#ddcccc', ec='#000000', alpha=0.75, zorder=0)
+            ax.add_patch(patch1)
+    p = (b[2] - b[0]) * 0.05  # some padding
+    pyplot.axis([b[0] - p, b[2] + p, b[3], b[1] - p])
+    ax.xaxis.set_visible(False)
+    ax.yaxis.set_visible(False)
+    ax.set_frame_on(True)
+    if message:
+        fig.suptitle(message, y=0.04, fontsize=9)
+    pyplot.show()
+
+
+
+
+
+
+ diff --git a/source/layersource/__init__.html b/source/layersource/__init__.html new file mode 100644 index 0000000..5d6b737 --- /dev/null +++ b/source/layersource/__init__.html @@ -0,0 +1,68 @@ + + + + + __init__.py + + + +
+
+
+

__init__.py

+
+
+
+
+
+ # +
+

as of version 2.0 kartograph supports multiple import formats

+
    +
  • Shapefile
  • +
  • KML ? (only polygons and polylines)
  • +
  • GeoJSON ?
  • +
+
+
+
__all__ = ['LayerSource', 'ShapefileLayer', 'GraticuleLayer']
+
+from shplayer import ShapefileLayer
+from layersource import LayerSource
+from special import GraticuleLayer, SeaLayer
+from kartograph.errors import *
+
+
+
+
+
+
+ # +
+ +
+
+
def handle_layer_source(layer, cache={}):
+    if 'src' in layer:
+        src = layer['src']
+        if src in cache:
+            return cache[src]
+        if src[-4:].lower() == ".shp":  # shapefile layer
+            src = ShapefileLayer(src)
+        if isinstance(src, LayerSource):
+            cache[layer['src']] = src
+            return src
+        else:
+            raise KartographLayerSourceError('don\'t know how to handle "' + src + '"')
+    elif 'special' in layer:
+        if layer['special'] == 'graticule':
+            return GraticuleLayer()
+        elif layer['special'] == 'sea':
+            return SeaLayer()
+
+
+
+
+
+
+ diff --git a/source/layersource/layersource.html b/source/layersource/layersource.html new file mode 100644 index 0000000..f4be231 --- /dev/null +++ b/source/layersource/layersource.html @@ -0,0 +1,55 @@ + + + + + layersource.py + + + +
+
+
+

layersource.py

+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

base class for layer source data providers (e.g. shapefiles)

+
+
+
class LayerSource:
+
+
+
+
+
+
+ # +
+ +
+
+
    def get_features(self, attr=None, filter=None, bbox=None):
+        raise NotImplementedError()
+
+
+
+
+
+
+ diff --git a/source/layersource/shapefile.html b/source/layersource/shapefile.html new file mode 100644 index 0000000..7db0d00 --- /dev/null +++ b/source/layersource/shapefile.html @@ -0,0 +1,2669 @@ + + + + + shapefile.py + + + +
+
+
+

shapefile.py

+
+
+
+
+
+ # +
+

shapefile.py +Provides read and write support for ESRI Shapefiles. +author: jlawheadgeospatialpython.com +date: 20110927 +version: 1.1.4 +Compatible with Python versions 2.4-3.x

+
+
+
from struct import pack, unpack, calcsize, error
+import os
+import sys
+import time
+import array
+
+
+
+
+
+
+ # +
+

Constants for shape types

+
+
+
NULL = 0
+POINT = 1
+POLYLINE = 3
+POLYGON = 5
+MULTIPOINT = 8
+POINTZ = 11
+POLYLINEZ = 13
+POLYGONZ = 15
+MULTIPOINTZ = 18
+POINTM = 21
+POLYLINEM = 23
+POLYGONM = 25
+MULTIPOINTM = 28
+MULTIPATCH = 31
+
+PYTHON3 = sys.version_info[0] == 3
+
+
+
+
+
+
+ # +
+ +
+
+
def b(v):
+    if PYTHON3:
+        if isinstance(v, str):
+
+
+
+
+
+
+ # +
+

For python 3 encode str to bytes.

+
+
+
            return v.encode('utf-8')
+        elif isinstance(v, bytes):
+
+
+
+
+
+
+ # +
+

Already bytes.

+
+
+
            return v
+        else:
+
+
+
+
+
+
+ # +
+

Error.

+
+
+
            raise Exception('Unknown input type')
+    else:
+
+
+
+
+
+
+ # +
+

For python 2 assume str passed in and return str.

+
+
+
        return v
+
+
+
+
+
+
+ # +
+ +
+
+
def u(v):
+    if PYTHON3:
+        if isinstance(v, bytes):
+
+
+
+
+
+
+ # +
+

For python 3 decode bytes to str.

+
+
+
            return v.decode('utf-8')
+        elif isinstance(v, str):
+
+
+
+
+
+
+ # +
+

Already str.

+
+
+
            return v
+        else:
+
+
+
+
+
+
+ # +
+

Error.

+
+
+
            raise Exception('Unknown input type')
+    else:
+
+
+
+
+
+
+ # +
+

For python 2 assume str passed in and return str.

+
+
+
        return v
+
+
+
+
+
+
+ # +
+ +
+
+
def is_string(v):
+    if PYTHON3:
+        return isinstance(v, str)
+    else:
+        return isinstance(v, basestring)
+
+
+
+
+
+
+ # +
+

Converts python tuples to lits of the appropritate type.

+
+
+
class _Array(array.array):
+
+
+
+
+
+
+ # +
+

Used to unpack different shapefile header parts.""" +def repr(self): + return str(self.tolist())

+

s _Shape: +def init(self, shapeType=None): +Stores the geometry of the different shape types

+
+
+
        specified in the Shapefile spec. Shape types are
+        usually point, polyline, or polygons. Every shape type
+        except the "Null" type contains points at some level for
+        example verticies in a polygon. If a shape type has
+        multiple shapes containing points within a single
+        geometry record then those shapes are called parts. Parts
+        are designated by their starting index in geometry record's
+        list of shapes."""
+        self.shapeType = shapeType
+        self.points = []
+#DIVIDER
+class _ShapeRecord:
+#DIVIDER
+    def __init__(self, shape=None, record=None):
+        self.shape = shape
+        self.record = record
+#DIVIDER
+class ShapefileException(Exception):
+#DIVIDER
+    pass
+#DIVIDER
+class Reader:
+#DIVIDER
+    def __init__(self, *args, **kwargs):
+        self.shp = None
+        self.shx = None
+        self.dbf = None
+        self.shapeName = "Not specified"
+        self._offsets = []
+        self.shpLength = None
+        self.numRecords = None
+        self.fields = []
+        self.__dbfHdrLength = 0
+#DIVIDER
+        if len(args) > 0:
+            if type(args[0]) is type("stringTest"):
+                self.load(args[0])
+                return
+        if "shp" in kwargs.keys():
+            if hasattr(kwargs["shp"], "read"):
+                self.shp = kwargs["shp"]
+                if hasattr(self.shp, "seek"):
+                    self.shp.seek(0)
+            if "shx" in kwargs.keys():
+                if hasattr(kwargs["shx"], "read"):
+                    self.shx = kwargs["shx"]
+                    if hasattr(self.shx, "seek"):
+                        self.shx.seek(0)
+        if "dbf" in kwargs.keys():
+            if hasattr(kwargs["dbf"], "read"):
+                self.dbf = kwargs["dbf"]
+                if hasattr(self.dbf, "seek"):
+                    self.dbf.seek(0)
+        if self.shp or self.dbf:        
+            self.load()
+        else:
+            raise ShapefileException("Shapefile Reader requires a shapefile or file-like object.")
+#DIVIDER
+    def load(self, shapefile=None):
+#DIVIDER
+        available. If not a ShapefileException is raised."""
+        if not f:
+            raise ShapefileException("Shapefile Reader requires a shapefile or file-like object.")
+        if self.shp and self.shpLength is None:
+            self.load()
+        if self.dbf and len(self.fields) == 0:
+            self.load()
+        return f
+
+
+
+
+
+
+ # +
+

A shape object of any type.

+
+
+
    def __restrictIndex(self, i):
+
+
+
+
+
+
+ # +
+ +
+
+
        if not self.shp:
+            raise ShapefileException("Shapefile Reader requires a shapefile or file-like object. (no shp file found")
+        shp = self.shp
+
+
+
+
+
+
+ # +
+

An exception to handle shapefile specific problems.

+
+
+
        shp.seek(24)
+        self.shpLength = unpack(">i", shp.read(4))[0] * 2
+
+
+
+
+
+
+ # +
+ +
+
+
        shp.seek(32)
+        self.shapeType= unpack("<i", shp.read(4))[0]
+
+
+
+
+
+
+ # +
+

Reads the three files of a shapefile as a unit or

+
+
+
        self.bbox = _Array('d', unpack("<4d", shp.read(32)))
+
+
+
+
+
+
+ # +
+

separately. If one of the three files (.shp, .shx, +.dbf) is missing no exception is thrown until you try +to call a method that depends on that particular file. +The .shx index file is used if available for efficiency +but is not required to read the geometry from the .shp +file. The "shapefile" argument in the constructor is the +name of the file you want to open.

+

You can instantiate a Reader without specifying a shapefile +and then specify one later with the load() method.

+

Only the shapefile headers are read upon loading. Content +within each file is only accessed when required and as +efficiently as possible. Shapefiles are usually not large +but they can be.

+
+
+
        self.elevation = _Array('d', unpack("<2d", shp.read(16)))
+
+
+
+
+
+
+ # +
+

See if a shapefile name was passed as an argument

+
+
+
        self.measure = _Array('d', unpack("<2d", shp.read(16)))
+
+
+
+
+
+
+ # +
+

Opens a shapefile from a filename or file-like

+
+
+
    def __shape(self):
+
+
+
+
+
+
+ # +
+

object. Normally this method would be called by the +constructor with the file object or file name as an +argument.""" +if shapefile: + (shapeName, ext) = os.path.splitext(shapefile) + self.shapeName = shapeName + try: + self.shp = open("%s.shp" % shapeName, "rb") + except IOError: + raise ShapefileException("Unable to open %s.shp" % shapeName) + try: + self.shx = open("%s.shx" % shapeName, "rb") + except IOError: + raise ShapefileException("Unable to open %s.shx" % shapeName) + try: + self.dbf = open("%s.dbf" % shapeName, "rb") + except IOError: + raise ShapefileException("Unable to open %s.dbf" % shapeName) +if self.shp: + self.shpHeader() +if self.dbf: + self.dbfHeader()

+

__getFileObj(self, f): +Checks to see if the requested shapefile file object is

+
+
+
        f = self.__getFileObj(self.shp)
+        record = _Shape()
+        nParts = nPoints = zmin = zmax = mmin = mmax = None
+        (recNum, recLength) = unpack(">2i", f.read(8))
+        shapeType = unpack("<i", f.read(4))[0]
+        record.shapeType = shapeType
+
+
+
+
+
+
+ # +
+

Provides list-like handling of a record index with a clearer

+
+
+
        if shapeType == 0:
+            record.points = []
+
+
+
+
+
+
+ # +
+

error message if the index is out of bounds.""" +if self.numRecords: + rmax = self.numRecords - 1 + if abs(i) > rmax: + raise IndexError("Shape or Record index out of range.") + if i < 0: i = range(self.numRecords)[i] +return i

+

__shpHeader(self): +Reads the header information from a .shp or .shx file.

+
+
+
        elif shapeType in (3,5,8,13,15,18,23,25,28,31):
+            record.bbox = _Array('d', unpack("<4d", f.read(32)))
+
+
+
+
+
+
+ # +
+

File length (16-bit word * 2 = bytes)

+
+
+
        if shapeType in (3,5,13,15,23,25,31):
+            nParts = unpack("<i", f.read(4))[0]
+
+
+
+
+
+
+ # +
+

Shape type

+
+
+
        if shapeType in (3,5,8,13,15,23,25,31):
+            nPoints = unpack("<i", f.read(4))[0]
+
+
+
+
+
+
+ # +
+

The shapefile's bounding box (lower left, upper right)

+
+
+
        if nParts:
+            record.parts = _Array('i', unpack("<%si" % nParts, f.read(nParts * 4)))
+
+
+
+
+
+
+ # +
+

Elevation

+
+
+
        if shapeType == 31:
+            record.partTypes = _Array('i', unpack("<%si" % nParts, f.read(nParts * 4)))
+
+
+
+
+
+
+ # +
+

Measure

+
+
+
        if nPoints:
+            record.points = [_Array('d', unpack("<2d", f.read(16))) for p in range(nPoints)]
+
+
+
+
+
+
+ # +
+

Returns the header info and geometry for a single shape.

+
+
+
        if shapeType in (13,15,18,31):
+            (zmin, zmax) = unpack("<2d", f.read(16))
+            record.z = _Array('d', unpack("<%sd" % nPoints, f.read(nPoints * 8)))
+
+
+
+
+
+
+ # +
+ +
+
+
        if shapeType in (13,18,23,25,28,31):
+            (mmin, mmax) = unpack("<2d", f.read(16))
+
+
+
+
+
+
+ # +
+

For Null shapes create an empty points list for consistency

+
+
+
            record.m = []
+            for m in _Array('d', unpack("%sd" % nPoints, f.read(nPoints * 8))):
+                if m > -10e38:
+                    record.m.append(m)
+                else:
+                    record.m.append(None)
+
+
+
+
+
+
+ # +
+

All shape types capable of having a bounding box

+
+
+
        if shapeType in (1,11,21):
+            record.points = [_Array('d', unpack("<2d", f.read(16)))]
+
+
+
+
+
+
+ # +
+

Shape types with parts

+
+
+
        if shapeType == 11:
+            record.z = unpack("<d", f.read(8))
+
+
+
+
+
+
+ # +
+

Shape types with points

+
+
+
        if shapeType in (11,21):
+            record.m = unpack("<d", f.read(8))
+        return record
+
+
+
+
+
+
+ # +
+

Read parts

+
+
+
    def __shapeIndex(self, i=None):
+
+
+
+
+
+
+ # +
+

Read part types for Multipatch - 31

+
+
+
        record file."""
+        shp = self.__getFileObj(self.shp)
+        i = self.__restrictIndex(i)
+        offset = self.__shapeIndex(i)
+        if not offset:
+#DIVIDER
+            shapes = self.shapes()
+            return shapes[i]
+        shp.seek(offset)
+        return self.__shape()
+#DIVIDER
+    def shapes(self):
+#DIVIDER
+        shp = self.__getFileObj(self.shp)
+        shp.seek(100)
+        shapes = []
+        while shp.tell() < self.shpLength:
+            shapes.append(self.__shape())
+        return shapes
+#DIVIDER
+    def __dbfHeaderLength(self):
+#DIVIDER
+        if not self.__dbfHdrLength:
+            if not self.dbf:
+                raise ShapefileException("Shapefile Reader requires a shapefile or file-like object. (no dbf file found)")
+            dbf = self.dbf
+            (self.numRecords, self.__dbfHdrLength) = \
+                    unpack("<xxxxLH22x", dbf.read(32))
+        return self.__dbfHdrLength
+#DIVIDER
+    def __dbfHeader(self):
+#DIVIDER
+        if not self.dbf:
+            raise ShapefileException("Shapefile Reader requires a shapefile or file-like object. (no dbf file found)")
+        dbf = self.dbf
+        headerLength = self.__dbfHeaderLength()
+        numFields = (headerLength - 33) // 32
+        for field in range(numFields):
+            fieldDesc = list(unpack("<11sc4xBB14x", dbf.read(32)))
+            name = 0
+            idx = 0
+            if b("\x00") in fieldDesc[name]:
+                idx = fieldDesc[name].index(b("\x00"))
+            else:
+                idx = len(fieldDesc[name]) - 1
+            fieldDesc[name] = fieldDesc[name][:idx]
+            fieldDesc[name] = u(fieldDesc[name])
+            fieldDesc[name] = fieldDesc[name].lstrip()
+            fieldDesc[1] = u(fieldDesc[1])
+            self.fields.append(fieldDesc)
+        terminator = dbf.read(1)
+        assert terminator == b("\r")
+        self.fields.insert(0, ('DeletionFlag', 'C', 1, 0))
+#DIVIDER
+    def __recordFmt(self):
+#DIVIDER
+        if not self.numRecords:
+            self.__dbfHeader()
+        fmt = ''.join(['%ds' % fieldinfo[2] for fieldinfo in self.fields])
+        fmtSize = calcsize(fmt)
+        return (fmt, fmtSize)
+#DIVIDER
+    def __record(self):
+#DIVIDER
+        f = self.__getFileObj(self.dbf)
+        recFmt = self.__recordFmt()
+        recordContents = unpack(recFmt[0], f.read(recFmt[1]))
+        if recordContents[0] != b(' '):
+#DIVIDER
+            return None
+        record = []
+        for (name, typ, size, deci), value in zip(self.fields,
+                                                                                                recordContents):
+            if name == 'DeletionFlag':
+                continue
+            elif not value.strip():
+                record.append(value)
+                continue
+            elif typ == "N":
+                value = value.replace(b('\0'), b('')).strip()
+                if value == b(''):
+                    value = 0
+                elif deci:
+                    value = float(value)
+                else:
+                    value = int(value)
+            elif typ == b('D'):
+                try:
+                    y, m, d = int(value[:4]), int(value[4:6]), int(value[6:8])
+                    value = [y, m, d]
+                except:
+                    value = value.strip()
+            elif typ == b('L'):
+                value = (value in b('YyTt') and b('T')) or \
+                                        (value in b('NnFf') and b('F')) or b('?')
+            else:
+                value = u(value)
+                value = value.strip()
+            record.append(value)
+        return record
+#DIVIDER
+    def record(self, i=0):
+#DIVIDER
+        f = self.__getFileObj(self.dbf)
+        if not self.numRecords:
+            self.__dbfHeader()
+        i = self.__restrictIndex(i)
+        recSize = self.__recordFmt()[1]
+        f.seek(0)
+        f.seek(self.__dbfHeaderLength() + (i * recSize))
+        return self.__record()
+#DIVIDER
+    def records(self):
+#DIVIDER
+        if not self.numRecords:
+            self.__dbfHeader()
+        records = []
+        f = self.__getFileObj(self.dbf)
+        f.seek(self.__dbfHeaderLength())
+        for i in range(self.numRecords):
+            r = self.__record()
+            if r:
+                records.append(r)
+        return records
+#DIVIDER
+    def shapeRecord(self, i=0):
+#DIVIDER
+        all records in a shapefile."""
+        shapeRecords = []
+        return [_ShapeRecord(shape=rec[0], record=rec[1]) \
+                                for rec in zip(self.shapes(), self.records())]
+
+
+
+
+
+
+ # +
+

Read points - produces a list of [x,y] values

+
+
+
class Writer:
+
+
+
+
+
+
+ # +
+

Read z extremes and values

+
+
+
    def __init__(self, shapeType=None):
+        self._shapes = []
+        self.fields = []
+        self.records = []
+        self.shapeType = shapeType
+        self.shp = None
+        self.shx = None
+        self.dbf = None
+
+
+
+
+
+
+ # +
+

Read m extremes and values

+
+
+
        self._offsets = []
+        self._lengths = []
+
+
+
+
+
+
+ # +
+

Measure values less than -10e38 are nodata values according to the spec

+
+
+
        self.deletionFlag = 0
+
+
+
+
+
+
+ # +
+

Read a single point

+
+
+
    def __getFileObj(self, f):
+
+
+
+
+
+
+ # +
+

Read a single Z value

+
+
+
        if not f:
+            raise ShapefileException("No file-like object available.")
+        elif hasattr(f, "write"):
+            return f
+        else:
+            pth = os.path.split(f)[0]
+            if pth and not os.path.exists(pth):
+                os.makedirs(pth)
+            return open(f, "wb")
+
+
+
+
+
+
+ # +
+

Read a single M value

+
+
+
    def __shpFileLength(self):
+
+
+
+
+
+
+ # +
+

Returns the offset in a .shp file for a shape based on information

+
+
+
        size = 100
+
+
+
+
+
+
+ # +
+

in the .shx index file.""" +shx = self.shx +if not shx: + return None +if not self._offsets: + # File length (16-bit word * 2 = bytes) - header length + shx.seek(24) + shxRecordLength = (unpack(">i", shx.read(4))[0] * 2) - 100 + numRecords = shxRecordLength // 8 + # Jump to the first record. + shx.seek(100) + for r in range(numRecords): + # Offsets are 16-bit words just like the file length + self._offsets.append(unpack(">i", shx.read(4))[0] * 2) + shx.seek(shx.tell() + 4) +if not i == None: + return self._offsets[i]

+

shape(self, i=0): +Returns a shape object for a shape in the the geometry

+
+
+
        for s in self._shapes:
+
+
+
+
+
+
+ # +
+

Shx index not available so use the full list.

+
+
+
            size += 12
+
+
+
+
+
+
+ # +
+

Returns all shapes in a shapefile.

+
+
+
            if hasattr(s,'parts'):
+                nParts = len(s.parts)
+            if hasattr(s,'points'):
+                nPoints = len(s.points)
+
+
+
+
+
+
+ # +
+ +
+
+
            if self.shapeType in (3,5,8,13,15,18,23,25,28,31):
+                size += 32
+
+
+
+
+
+
+ # +
+

Retrieves the header length of a dbf file header.

+
+
+
            if self.shapeType in (3,5,13,15,23,25,31):
+
+
+
+
+
+
+ # +
+ +
+
+
                size += 4
+
+
+
+
+
+
+ # +
+

Reads a dbf header. Xbase-related code borrows heavily from ActiveState Python Cookbook Recipe 362715 by Raymond Hettinger

+
+
+
                size += nParts * 4
+
+
+
+
+
+
+ # +
+ +
+
+
            if self.shapeType in (3,5,8,13,15,23,25,31):
+
+
+
+
+
+
+ # +
+

Calculates the size of a .shp geometry record.

+
+
+
                size += 4
+
+
+
+
+
+
+ # +
+ +
+
+
                size += 16 * nPoints
+
+
+
+
+
+
+ # +
+

Reads and returns a dbf record row as a list of values.

+
+
+
            if self.shapeType == 31:
+                size += nParts * 4
+
+
+
+
+
+
+ # +
+ +
+
+
            if self.shapeType in (13,15,18,31):
+
+
+
+
+
+
+ # +
+

deleted record

+
+
+
                size += 16
+
+
+
+
+
+
+ # +
+

Returns a specific dbf record based on the supplied index.

+
+
+
                size += 8 * nPoints
+
+
+
+
+
+
+ # +
+ +
+
+
            if self.shapeType in (23,25,31):
+
+
+
+
+
+
+ # +
+

Returns all records in a dbf file.

+
+
+
                size += 16
+
+
+
+
+
+
+ # +
+ +
+
+
                size += 8 * nPoints
+
+
+
+
+
+
+ # +
+

Returns a combination geometry and attribute record for the

+
+
+
            if self.shapeType in (1,11,21):
+                size += 16
+
+
+
+
+
+
+ # +
+

supplied record index.""" +i = self.__restrictIndex(i) +return _ShapeRecord(shape=self.shape(i), + record=self.record(i))

+

shapeRecords(self): +Returns a list of combination geometry/attribute records for

+
+
+
            if self.shapeType == 11:
+                size += 8
+
+
+
+
+
+
+ # +
+

Provides write support for ESRI Shapefiles.

+
+
+
            if self.shapeType in (11,21):
+                size += 8
+
+
+
+
+
+
+ # +
+ +
+
+
        size //= 2
+        return size
+
+
+
+
+
+
+ # +
+

Geometry record offsets and lengths for writing shx file.

+
+
+
    def __bbox(self, shapes, shapeTypes=[]):
+        x = []
+        y = []
+        for s in shapes:
+            shapeType = self.shapeType
+            if shapeTypes:
+                shapeType = shapeTypes[shapes.index(s)]
+            px, py = list(zip(*s.points))[:2]
+            x.extend(px)
+            y.extend(py)
+        return [min(x), min(y), max(x), max(y)]
+
+
+
+
+
+
+ # +
+

Use deletion flags in dbf? Default is false (0).

+
+
+
    def __zbox(self, shapes, shapeTypes=[]):
+        z = []
+        for s in shapes:
+            try:
+                for p in s.points:
+                    z.append(p[2])
+            except IndexError:
+                pass
+        if not z: z.append(0)
+        return [min(z), max(z)]
+
+
+
+
+
+
+ # +
+

Safety handler to verify file-like objects

+
+
+
    def __mbox(self, shapes, shapeTypes=[]):
+        m = [0]
+        for s in shapes:
+            try:
+                for p in s.points:
+                    m.append(p[3])
+            except IndexError:
+                pass
+        return [min(m), max(m)]
+
+
+
+
+
+
+ # +
+ +
+
+
    def bbox(self):
+
+
+
+
+
+
+ # +
+

Calculates the file length of the shp file.

+
+
+
        return self.__zbox(self._shapes)
+
+
+
+
+
+
+ # +
+

Start with header length

+
+
+
    def mbox(self):
+
+
+
+
+
+
+ # +
+

Calculate size of all shapes

+
+
+
        return self.__mbox(self._shapes)
+
+
+
+
+
+
+ # +
+

Add in record header and shape type fields

+
+
+
    def __shapefileHeader(self, fileObj, headerType='shp'):
+
+
+
+
+
+
+ # +
+

nParts and nPoints do not apply to all shapes +if self.shapeType not in (0,1): + nParts = len(s.parts) + nPoints = len(s.points)

+
+
+
        f = self.__getFileObj(self.dbf)
+        f.seek(0)
+        version = 3
+        year, month, day = time.localtime()[:3]
+        year -= 1900
+
+
+
+
+
+
+ # +
+

All shape types capable of having a bounding box

+
+
+
        for field in self.fields:
+            if field[0].startswith("Deletion"):
+                self.fields.remove(field)
+        numRecs = len(self.records)
+        numFields = len(self.fields)
+        headerLength = numFields * 32 + 33
+        recordLength = sum([int(field[2]) for field in self.fields]) + 1
+        header = pack('<BBBBLHH20x', version, year, month, day, numRecs,
+                headerLength, recordLength)
+        f.write(header)
+
+
+
+
+
+
+ # +
+

Shape types with parts

+
+
+
        for field in self.fields:
+            name, fieldType, size, decimal = field
+            name = b(name)
+            name = name.replace(b(' '), b('_'))
+            name = name.ljust(11).replace(b(' '), b('\x00'))
+            fieldType = b(fieldType)
+            size = int(size)
+            fld = pack('<11sc4xBB14x', name, fieldType, size, decimal)
+            f.write(fld)
+
+
+
+
+
+
+ # +
+

Parts count

+
+
+
        f.write(b('\r'))
+
+
+
+
+
+
+ # +
+

Parts index array

+
+
+
    def __shpRecords(self):
+
+
+
+
+
+
+ # +
+

Shape types with points

+
+
+
        f = self.__getFileObj(self.shp)
+        f.seek(100)
+        recNum = 1
+        for s in self._shapes:
+            self._offsets.append(f.tell())
+
+
+
+
+
+
+ # +
+

Points count

+
+
+
            f.write(pack(">2i", recNum, 0))
+            recNum += 1
+            start = f.tell()
+
+
+
+
+
+
+ # +
+

Points array

+
+
+
            f.write(pack("<i", s.shapeType))
+
+
+
+
+
+
+ # +
+

Calc size of part types for Multipatch (31)

+
+
+
            if s.shapeType in (3,5,8,13,15,18,23,25,28,31):
+                try:
+                    f.write(pack("<4d", *self.__bbox([s])))
+                except error:
+                    raise ShapefileException("Falied to write bounding box for record %s. Expected floats." % recNum)
+
+
+
+
+
+
+ # +
+

Calc z extremes and values

+
+
+
            if s.shapeType in (3,5,13,15,23,25,31):
+
+
+
+
+
+
+ # +
+

z extremes

+
+
+
                f.write(pack("<i", len(s.parts)))
+
+
+
+
+
+
+ # +
+

z array

+
+
+
            if s.shapeType in (3,5,8,13,15,23,25,31):
+
+
+
+
+
+
+ # +
+

Calc m extremes and values

+
+
+
                f.write(pack("<i", len(s.points)))
+
+
+
+
+
+
+ # +
+

m extremes

+
+
+
            if s.shapeType in (3,5,13,15,23,25,31):
+                for p in s.parts:
+                    f.write(pack("<i", p))
+
+
+
+
+
+
+ # +
+

m array

+
+
+
            if s.shapeType == 31:
+                for pt in s.partTypes:
+                    f.write(pack("<i", pt))
+
+
+
+
+
+
+ # +
+

Calc a single point

+
+
+
            if s.shapeType in (3,5,8,13,15,23,25,31):
+                try:
+                    [f.write(pack("<2d", *p[:2])) for p in s.points]
+                except error:
+                    raise ShapefileException("Failed to write points for record %s. Expected floats." % recNum)
+
+
+
+
+
+
+ # +
+

Calc a single Z value

+
+
+
            if s.shapeType in (13,15,18,31):
+                try:
+                    f.write(pack("<2d", *self.__zbox([s])))
+                except error:
+                    raise ShapefileException("Failed to write elevation extremes for record %s. Expected floats." % recNum)
+                try:
+                    [f.write(pack("<d", p[2])) for p in s.points]
+                except error:
+                    raise ShapefileException("Failed to write elevation values for record %s. Expected floats." % recNum)
+
+
+
+
+
+
+ # +
+

Calc a single M value

+
+
+
            if s.shapeType in (23,25,31):
+                try:
+                    f.write(pack("<2d", *self.__mbox([s])))
+                except error:
+                    raise ShapefileException("Failed to write measure extremes for record %s. Expected floats" % recNum)
+                try:
+                    [f.write(pack("<d", p[3])) for p in s.points]
+                except error:
+                    raise ShapefileException("Failed to write measure values for record %s. Expected floats" % recNum)
+
+
+
+
+
+
+ # +
+

Calculate size as 16-bit words

+
+
+
            if s.shapeType in (1,11,21):
+                try:
+                    f.write(pack("<2d", s.points[0][0], s.points[0][1]))
+                except error:
+                    raise ShapefileException("Failed to write point for record %s. Expected floats." % recNum)
+
+
+
+
+
+
+ # +
+ +
+
+
            if s.shapeType == 11:
+                try:
+                    f.write(pack("<1d", s.points[0][2]))
+                except error:
+                    raise ShapefileException("Failed to write elevation value for record %s. Expected floats." % recNum)
+
+
+
+
+
+
+ # +
+ +
+
+
            if s.shapeType in (11,21):
+                try:
+                    f.write(pack("<1d", s.points[0][3]))
+                except error:
+                    raise ShapefileException("Failed to write measure value for record %s. Expected floats." % recNum)
+
+
+
+
+
+
+ # +
+ +
+
+
            finish = f.tell()
+            length = (finish - start) // 2
+            self._lengths.append(length)
+
+
+
+
+
+
+ # +
+

Returns the current bounding box for the shapefile which is

+
+
+
            f.seek(start-4)
+            f.write(pack(">i", length))
+            f.seek(finish)
+
+
+
+
+
+
+ # +
+

the lower-left and upper-right corners. It does not contain the +elevation or measure extremes.""" +return self.__bbox(self._shapes)

+

zbox(self): +Returns the current z extremes for the shapefile.

+
+
+
    def __shxRecords(self):
+
+
+
+
+
+
+ # +
+

Returns the current m extremes for the shapefile.

+
+
+
        f = self.__getFileObj(self.shx)
+        f.seek(100)
+        for i in range(len(self._shapes)):
+            f.write(pack(">i", self._offsets[i] // 2))
+            f.write(pack(">i", self._lengths[i]))
+
+
+
+
+
+
+ # +
+ +
+
+
    def __dbfRecords(self):
+
+
+
+
+
+
+ # +
+

Writes the specified header type to the specified file-like object.

+
+
+
        f = self.__getFileObj(self.dbf)
+        for record in self.records:
+            if not self.fields[0][0].startswith("Deletion"):
+                f.write(b(' ')) # deletion flag
+            for (fieldName, fieldType, size, dec), value in zip(self.fields, record):
+                fieldType = fieldType.upper()
+                size = int(size)
+                if fieldType.upper() == "N":
+                    value = str(value).rjust(size)
+                elif fieldType == 'L':
+                    value = str(value)[0].upper()
+                else:
+                    value = str(value)[:size].ljust(size)
+                assert len(value) == size
+                value = b(value)
+                f.write(value)
+
+
+
+
+
+
+ # +
+

Several of the shapefile formats are so similar that a single generic +method to read or write them is warranted.""" +f = self.__getFileObj(fileObj) +f.seek(0)

+

File code, Unused bytes

+

f.write(pack(">6i", 9994,0,0,0,0,0))

+

File length (Bytes / 2 = 16-bit words)

+

if headerType == 'shp': + f.write(pack(">i", self.__shpFileLength())) +elif headerType == 'shx': + f.write(pack('>i', ((100 + (len(self._shapes) * 8)) // 2)))

+

Version, Shape type

+

f.write(pack("<2i", 1000, self.shapeType))

+

The shapefile's bounding box (lower left, upper right)

+

if self.shapeType != 0: + try: + f.write(pack("<4d", *self.bbox())) + except error: + raise ShapefileException("Failed to write shapefile bounding box. Floats required.") +else: + f.write(pack("<4d", 0,0,0,0))

+

Elevation

+

z = self.zbox()

+

Measure

+

m = self.mbox() +try: + f.write(pack("<4d", z[0], z[1], m[0], m[1])) +except error: + raise ShapefileException("Failed to write shapefile elevation and measure values. Floats required.")

+

__dbfHeader(self): +Writes the dbf header and field descriptors.

+
+
+
    def null(self):
+
+
+
+
+
+
+ # +
+

Remove deletion flag placeholder from fields

+
+
+
        self._shapes.append(_Shape(NULL))
+
+
+
+
+
+
+ # +
+

Field descriptors

+
+
+
    def point(self, x, y, z=0, m=0):
+
+
+
+
+
+
+ # +
+

Terminator

+
+
+
        pointShape = _Shape(self.shapeType)
+        pointShape.points.append([x, y, z, m])
+        self._shapes.append(pointShape)
+
+
+
+
+
+
+ # +
+

Write the shp records

+
+
+
    def line(self, parts=[], shapeType=POLYLINE):
+
+
+
+
+
+
+ # +
+ +
+
+
        self.poly(parts, shapeType, [])
+
+
+
+
+
+
+ # +
+

Record number, Content length place holder

+
+
+
    def poly(self, parts=[], shapeType=POLYGON, partTypes=[]):
+
+
+
+
+
+
+ # +
+

Shape Type

+
+
+
        polyShape = _Shape(shapeType)
+        polyShape.parts = []
+        polyShape.points = []
+        for part in parts:
+            polyShape.parts.append(len(polyShape.points))
+            for point in part:
+
+
+
+
+
+
+ # +
+

All shape types capable of having a bounding box

+
+
+
                if not isinstance(point, list):
+                    point = list(point)
+
+
+
+
+
+
+ # +
+

Shape types with parts

+
+
+
                while len(point) < 4:
+                    point.append(0)
+                polyShape.points.append(point)
+        if polyShape.shapeType == 31:
+            if not partTypes:
+                for part in parts:
+                    partTypes.append(polyShape.shapeType)
+            polyShape.partTypes = partTypes
+        self._shapes.append(polyShape)
+
+
+
+
+
+
+ # +
+

Number of parts

+
+
+
    def field(self, name, fieldType="C", size="50", decimal=0):
+
+
+
+
+
+
+ # +
+

Shape types with multiple points per record

+
+
+
        self.fields.append((name, fieldType, size, decimal))
+
+
+
+
+
+
+ # +
+

Number of points

+
+
+
    def record(self, *recordList, **recordDict):
+
+
+
+
+
+
+ # +
+

Write part indexes

+
+
+
        return self._shapes
+
+
+
+
+
+
+ # +
+

Part types for Multipatch (31)

+
+
+
    def saveShp(self, target):
+
+
+
+
+
+
+ # +
+

Write points for multiple-point records

+
+
+
        if not hasattr(target, "write"):
+            target = os.path.splitext(target)[0] + '.shp'
+        if not self.shapeType:
+            self.shapeType = self._shapes[0].shapeType
+        self.shp = self.__getFileObj(target)
+        self.__shapefileHeader(self.shp, headerType='shp')
+        self.__shpRecords()
+
+
+
+
+
+
+ # +
+

Write z extremes and values

+
+
+
    def saveShx(self, target):
+
+
+
+
+
+
+ # +
+

Write m extremes and values

+
+
+
        if not hasattr(target, "write"):
+            target = os.path.splitext(target)[0] + '.shx'
+        if not self.shapeType:
+            self.shapeType = self._shapes[0].shapeType
+        self.shx = self.__getFileObj(target)
+        self.__shapefileHeader(self.shx, headerType='shx')
+        self.__shxRecords()
+
+
+
+
+
+
+ # +
+

Write a single point

+
+
+
    def saveDbf(self, target):
+
+
+
+
+
+
+ # +
+

Write a single Z value

+
+
+
        if not hasattr(target, "write"):
+            target = os.path.splitext(target)[0] + '.dbf'
+        self.dbf = self.__getFileObj(target)
+        self.__dbfHeader()
+        self.__dbfRecords()
+
+
+
+
+
+
+ # +
+

Write a single M value

+
+
+
    def save(self, target=None, shp=None, shx=None, dbf=None):
+
+
+
+
+
+
+ # +
+

Finalize record length as 16-bit words

+
+
+
        pass
+
+
+
+
+
+
+ # +
+

start - 4 bytes is the content length field

+
+
+
    def delete(self, shape=None, part=None, point=None):
+
+
+
+
+
+
+ # +
+

Writes the shx records.

+
+
+
        you to update a specific point by shape, part, point of any
+        shape type."""
+#DIVIDER
+        if shape and part and point:
+            try: self._shapes[shape]
+            except IndexError: self._shapes.append([])
+            try: self._shapes[shape][part]
+            except IndexError: self._shapes[shape].append([])
+            try: self._shapes[shape][part][point]
+            except IndexError: self._shapes[shape][part].append([])
+            p = self._shapes[shape][part][point]
+            if x: p[0] = x
+            if y: p[1] = y
+            if z: p[2] = z
+            if m: p[3] = m
+            self._shapes[shape][part][point] = p
+#DIVIDER
+        elif shape and part and not point:
+            try: self._shapes[shape]
+            except IndexError: self._shapes.append([])
+            try: self._shapes[shape][part]
+            except IndexError: self._shapes[shape].append([])
+            points = self._shapes[shape][part]
+            for i in range(len(points)):
+                p = points[i]
+                if x: p[0] = x
+                if y: p[1] = y
+                if z: p[2] = z
+                if m: p[3] = m
+                self._shapes[shape][part][i] = p
+#DIVIDER
+        elif shape and not part and not point:
+            try: self._shapes[shape]
+            except IndexError: self._shapes.append([])
+#DIVIDER
+        if addr:
+            shape, part, point = addr
+            self._shapes[shape][part][point] = [x, y, z, m]
+        else:
+            Writer.point(self, x, y, z, m)
+        if self.autoBalance:
+            self.balance()
+#DIVIDER
+    def validate(self):
+#DIVIDER
+        on which type of record was created to make sure all three files
+        are in synch."""
+        if len(self.records) > len(self._shapes):
+            self.null()
+        elif len(self.records) < len(self._shapes):
+            self.record()
+
+
+
+
+
+
+ # +
+ +
+
+
    def __fieldNorm(self, fieldName):
+
+
+
+
+
+
+ # +
+

Writes the dbf records.

+
+
+
    Doctests are contained in the module 'pyshp_usage.py'. This library was developed
+    using Python 2.3. Python 2.4 and above have some excellent improvements in the built-in
+    testing libraries but for now unit testing is done using what's available in
+    2.3.
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

Creates a null shape.

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

Creates a point shape.

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

Creates a line shape. This method is just a convienience method

+
+
+
+
+
+
+
+
+
+ # +
+

which wraps 'poly()'.

+
+
+
+
+
+
+
+
+
+ # +
+

Creates a shape that has multiple collections of points (parts)

+
+
+
+
+
+
+
+
+
+ # +
+

including lines, polygons, and even multipoint shapes. If no shape type +is specified it defaults to 'polygon'. If no part types are specified +(which they normally won't be) then all parts default to the shape type.

+
+
+
+
+
+
+
+
+
+ # +
+

Ensure point is list

+
+
+
+
+
+
+
+
+
+ # +
+

Make sure point has z and m values

+
+
+
+
+
+
+
+
+
+ # +
+

Adds a dbf field descriptor to the shapefile.

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

Creates a dbf attribute record. You can submit either a sequence of

+
+
+
+
+
+
+
+
+
+ # +
+

field values or keyword arguments of field names and values. Before +adding records you must add fields for the record values using the +fields() method. If the record values exceed the number of fields the +extra ones won't be added. In the case of using keyword arguments to specify +field/value pairs only fields matching the already registered fields +will be added.""" +record = [] +fieldCount = len(self.fields)

+

Compensate for deletion flag

+

if self.fields[0][0].startswith("Deletion"): fieldCount -= 1 +if recordList: + [record.append(recordList[i]) for i in range(fieldCount)] +elif recordDict: + for field in self.fields: + if field[0] in recordDict: + val = recordDict[field[0]] + if val: + record.append(val) + else: + record.append("") +if record: + self.records.append(record)

+

shape(self, i): +return self._shapes[i]

+

shapes(self): +Return the current list of shapes.

+
+
+
+
+
+
+
+
+
+ # +
+

Save an shp file.

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

Save an shx file.

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

Save a dbf file.

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

Save the shapefile data to three files or

+
+
+
+
+
+
+
+
+
+ # +
+

three file-like objects. SHP and DBF files can also +be written exclusively using saveShp, saveShx, and saveDbf respectively."""

+

TODO: Create a unique filename for target if None.

+

if shp: + self.saveShp(shp) +if shx: + self.saveShx(shx) +if dbf: + self.saveDbf(dbf) +elif target: + self.saveShp(target) + self.shp.close() + self.saveShx(target) + self.shx.close() + self.saveDbf(target) + self.dbf.close()

+

itor(Writer): +init(self, shapefile=None, shapeType=POINT, autoBalance=1): +self.autoBalance = autoBalance +if not shapefile: + Writer.init(self, shapeType) +elif is_string(shapefile): + base = os.path.splitext(shapefile)[0] + if os.path.isfile("%s.shp" % base): + r = Reader(base) + Writer.init(self, r.shapeType) + self._shapes = r.shapes() + self.fields = r.fields + self.records = r.records()

+

select(self, expr): +Select one or more shapes (to be implemented) +TODO: Implement expressions to select shapes.

+
+
+
+
+
+
+
+
+
+ # +
+

Deletes the specified part of any shape by specifying a shape

+
+
+
+
+
+
+
+
+
+ # +
+

number, part number, or point number."""

+

shape, part, point

+

if shape and part and point: + del self._shapes[shape][part][point]

+

shape, part

+

elif shape and part and not point: + del self._shapes[shape][part]

+

shape

+

elif shape and not part and not point: + del self._shapes[shape]

+

point

+

elif not shape and not part and point: + for s in self._shapes: + if s.shapeType == 1: + del self._shapes[point] + else: + for part in s.parts: + del s[part][point]

+

part, point

+

elif not shape and part and point: + for s in self._shapes: + del s[part][point]

+

part

+

elif not shape and part and not point: + for s in self._shapes: + del s[part]

+

point(self, x=None, y=None, z=None, m=None, shape=None, part=None, point=None, addr=None): +Creates/updates a point shape. The arguments allows

+
+
+
+
+
+
+
+
+
+ # +
+

shape, part, point

+
+
+
+
+
+
+
+
+
+ # +
+

shape, part

+
+
+
+
+
+
+
+
+
+ # +
+

shape

+
+
+
+
+
+
+
+
+
+ # +
+

point +part

+
+
+
+
+
+
+
+
+
+ # +
+

An optional method to try and validate the shapefile

+
+
+
+
+
+
+
+
+
+ # +
+

as much as possible before writing it (not implemented)."""

+

TODO: Implement validation method

+

pass

+

balance(self): +Adds a corresponding empty attribute or null geometry record depending

+
+
+
+
+
+
+
+
+
+ # +
+

Normalizes a dbf field name to fit within the spec and the

+
+
+
+
+
+
+
+
+
+ # +
+

expectations of certain ESRI software.""" +if len(fieldName) > 11: fieldName = fieldName[:11] +fieldName = fieldName.upper() +fieldName.replace(' ', '_')

+

Testing +(): +rt doctest +est.NORMALIZE_WHITESPACE = 1 +est.testfile("README.txt", verbose=1)

+

e == "main__":

+
+
+
+
+
+
+
+
+
+ # +
+

test()

+
+
+
+
+
+
+
+ diff --git a/source/layersource/shplayer.html b/source/layersource/shplayer.html new file mode 100644 index 0000000..087c1e4 --- /dev/null +++ b/source/layersource/shplayer.html @@ -0,0 +1,410 @@ + + + + + shplayer.py + + + +
+
+
+

shplayer.py

+
+
+
+
+
+ # +
+ +
+
+
from layersource import LayerSource
+from kartograph.errors import *
+from kartograph.geometry import BBox, create_feature
+
+verbose = True
+
+
+
+
+
+
+ # +
+

this class handles shapefile layers

+
+
+
class ShapefileLayer(LayerSource):
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

initialize shapefile reader

+
+
+
    def __init__(self, src):
+
+
+
+
+
+
+ # +
+ +
+
+
        import shapefile
+        if isinstance(src, unicode):
+            src = src.encode('ascii', 'ignore')
+        self.shpSrc = src
+        self.sr = shapefile.Reader(src)
+        self.recs = []
+        self.shapes = {}
+        self.load_records()
+
+
+
+
+
+
+ # +
+

load shapefile records into memory. note that only the records are loaded and not the shapes.

+
+
+
    def load_records(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        self.recs = self.sr.records()
+        self.attributes = []
+        for a in self.sr.fields[1:]:
+            self.attributes.append(a[0])
+        i = 0
+        self.attrIndex = {}
+        for attr in self.attributes:
+            self.attrIndex[attr] = i
+            i += 1
+
+
+
+
+
+
+ # +
+

returns a shape of this shapefile. if requested for the first time, the shape is loaded from shapefile (slow)

+
+
+
    def get_shape(self, i):
+
+
+
+
+
+
+ # +
+ +
+
+
        if i in self.shapes:  # check cache
+            shp = self.shapes[i]
+        else:  # load shape from shapefile
+            shp = self.shapes[i] = self.sr.shapeRecord(i).shape
+        return shp
+
+
+
+
+
+
+ # +
+

returns a list of features matching to the attr -> value pair

+
+
+
    def get_features(self, attr=None, filter=None, bbox=None, verbose=False, ignore_holes=False, min_area=False, charset='utf-8'):
+
+
+
+
+
+
+ # +
+ +
+
+
        res = []
+        try_encodings = ('utf-8', 'latin-1', 'iso-8859-2')
+        tried_encodings = [charset]
+        if bbox is not None and not isinstance(bbox, BBox):
+            bbox = BBox(bbox[2] - bbox[0], bbox[3] - bbox[1], bbox[0], bbox[1])
+        ignored = 0
+        for i in range(0, len(self.recs)):
+            drec = {}
+            for j in range(len(self.attributes)):
+                drec[self.attributes[j]] = self.recs[i][j]
+            if filter is None or filter(drec):
+                props = {}
+                for j in range(len(self.attributes)):
+                    val = self.recs[i][j]
+                    if isinstance(val, str):
+                        try:
+                            val = val.decode(charset)
+                        except:
+                            print 'warning: could not decode "%s" to %s' % (val, charset)
+                            next_guess = False
+                            for enc in try_encodings:
+                                if enc not in tried_encodings:
+                                    next_guess = enc
+                                    tried_encodings.append(enc)
+                                    break
+                            if next_guess:
+                                print 'trying %s now..' % next_guess
+                                charset = next_guess
+                                j -= 1
+                                continue
+                            else:
+                                raise KartographError('having problems to decode the input data "%s"' % val)
+                    if isinstance(val, (str, unicode)):
+                        val = val.strip()
+                    props[self.attributes[j]] = val
+
+                shp = self.get_shape(i)
+
+                geom = shape2geometry(shp, ignore_holes=ignore_holes, min_area=min_area, bbox=bbox)
+                if geom is None:
+                    ignored += 1
+                    continue
+
+                feature = create_feature(geom, props)
+                res.append(feature)
+        if bbox is not None and ignored > 0 and verbose:
+            print "-ignoring %d shapes (not in bounds %s )" % (ignored, bbox)
+        return res
+
+
+
+
+
+
+ # +
+ +
+
+
def shape2geometry(shp, ignore_holes=False, min_area=False, bbox=False):
+    if bbox:
+        sbbox = BBox(left=shp.bbox[0], top=shp.bbox[1], width=shp.bbox[2] - shp.bbox[0], height=shp.bbox[3] - shp.bbox[1])
+        if not bbox.intersects(sbbox):
+
+
+
+
+
+
+ # +
+

ignore the shape if it's not within the bbox

+
+
+
            return None
+
+    if shp.shapeType in (5, 15):  # multi-polygon
+        geom = shape2polygon(shp, ignore_holes=ignore_holes, min_area=min_area)
+    elif shp.shapeType == 3:  # line
+        geom = points2line(shp)
+    else:
+        raise KartographError('unknown shape type (%d) in shapefile %s' % (shp.shapeType, self.shpSrc))
+    return geom
+
+
+
+
+
+
+ # +
+

converts a shapefile polygon to geometry.MultiPolygon

+
+
+
def shape2polygon(shp, ignore_holes=False, min_area=False):
+
+
+
+
+
+
+ # +
+

from kartograph.geometry import MultiPolygon

+
+
+
    from shapely.geometry import Polygon, MultiPolygon
+    from kartograph.geometry.utils import is_clockwise
+    parts = shp.parts[:]
+    parts.append(len(shp.points))
+    exteriors = []
+    holes = []
+    for j in range(len(parts) - 1):
+        pts = shp.points[parts[j]:parts[j + 1]]
+        if shp.shapeType == 15:
+
+
+
+
+
+
+ # +
+

remove z-coordinate from PolygonZ contours (not supported)

+
+
+
            for k in range(len(pts)):
+                pts[k] = pts[k][:2]
+        cw = is_clockwise(pts)
+        if cw:
+            exteriors.append(pts)
+        else:
+            holes.append(pts)
+    if ignore_holes:
+        holes = None
+    if len(exteriors) == 1:
+        poly = Polygon(exteriors[0], holes)
+    elif len(exteriors) > 1:
+
+
+
+
+
+
+ # +
+

use multipolygon, but we need to assign the holes to the right +exteriors

+
+
+
        from kartograph.geometry import BBox
+        used_holes = set()
+        polygons = []
+        for ext in exteriors:
+            bbox = BBox()
+            my_holes = []
+            for pt in ext:
+                bbox.update(pt)
+            for h in range(len(holes)):
+                if h not in used_holes:
+                    hole = holes[h]
+                    if bbox.check_point(hole[0]):
+
+
+
+
+
+
+ # +
+

this is a very weak test but it should be sufficient

+
+
+
                        used_holes.add(h)
+                        my_holes.append(hole)
+            polygons.append(Polygon(ext, my_holes))
+        if min_area:
+
+
+
+
+
+
+ # +
+

compute maximum area

+
+
+
            max_area = 0
+            for poly in polygons:
+                max_area = max(max_area, poly.area)
+
+
+
+
+
+
+ # +
+

filter out polygons that are below min_area * max_area

+
+
+
            polygons = [poly for poly in polygons if poly.area >= min_area * max_area]
+        poly = MultiPolygon(polygons)
+    else:
+        raise KartographError('shapefile import failed - no outer polygon found')
+    return poly
+
+
+
+
+
+
+ # +
+

converts a shapefile line to geometry.Line

+
+
+
def points2line(shp):
+
+
+
+
+
+
+ # +
+ +
+
+
    from kartograph.geometry import PolyLine
+    parts = shp.parts[:]
+    parts.append(len(shp.points))
+    lines = []
+    for j in range(len(parts) - 1):
+        pts = shp.points[parts[j]:parts[j + 1]]
+        lines.append(pts)
+    return PolyLine(lines)
+
+
+
+
+
+
+ diff --git a/source/map.html b/source/map.html new file mode 100644 index 0000000..20af1d1 --- /dev/null +++ b/source/map.html @@ -0,0 +1,1104 @@ + + + + + map.py + + + +
+
+
+

map.py

+
+
+
+
+
+ # +
+ +
+
+
from maplayer import MapLayer
+from geometry.utils import geom_to_bbox
+from geometry import BBox, View
+from shapely.geometry.base import BaseGeometry
+from shapely.geometry import Polygon
+from proj import projections
+from filter import filter_record
+from errors import KartographError
+
+
+
+
+
+
+ # +
+

Map

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
class Map(object):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(me, options, layerCache, format='svg', src_encoding=None):
+        me.options = options
+        me.format = format
+
+
+
+
+
+
+ # +
+

List and dictionary references to the map layers.

+
+
+
        me.layers = []
+        me.layersById = {}
+
+
+
+
+
+
+ # +
+

We will cache the bounding geometry since we need it twice, eventually.

+
+
+
        me._bounding_geometry_cache = False
+        me._unprojected_bounds = None
+
+
+
+
+
+
+ # +
+

The source encoding will be used as first guess when Kartograph tries to decode +the meta data of shapefiles etc. We use Unicode as default source encoding.

+
+
+
        if not src_encoding:
+            src_encoding = 'utf-8'
+        me._source_encoding = src_encoding
+
+
+
+
+
+
+ # +
+

Construct MapLayer instances for every layer and store references +to the layers in a list and a dictionary.

+
+
+
        for layer_cfg in options['layers']:
+            layer_id = layer_cfg['id']
+            layer = MapLayer(layer_id, layer_cfg, me, layerCache)
+            me.layers.append(layer)
+            me.layersById[layer_id] = layer
+
+
+
+
+
+
+ # +
+

Initialize the projection that will be used in this map. This sounds easier than +it is since we need to compute lot's of stuff here.

+
+
+
        me.proj = me._init_projection()
+
+
+
+
+
+
+ # +
+

Compute the bounding geometry for the map.

+
+
+
        me.bounds_poly = me._init_bounds()
+
+
+
+
+
+
+ # +
+

Set up the view which will transform from projected coordinates +(e.g. in meters) to screen coordinates in our map output.

+
+
+
        me.view = me._get_view()
+
+
+
+
+
+
+ # +
+

Get the polygon (in fact it's a rectangle in most cases) that will be used +to clip away unneeded geometry unless cfg['export']['crop-to-view'] is set to false.

+
+
+
        me.view_poly = me._init_view_poly()
+
+
+
+
+
+
+ # +
+

Load all features that could be visible in each layer. The feature geometries will +be projected and transformed to screen coordinates.

+
+
+
        for layer in me.layers:
+            layer.get_features()
+
+
+
+
+
+
+ # +
+

In each layer we will join polygons.

+
+
+
        me._join_features()
+
+
+
+
+
+
+ # +
+

Eventually we crop geometries to the map bounding rectangle.

+
+
+
        if options['export']['crop-to-view'] and format != 'kml':
+            me._crop_layers_to_view()
+
+
+
+
+
+
+ # +
+

Here's where we apply the simplification to geometries.

+
+
+
        me._simplify_layers()
+
+
+
+
+
+
+ # +
+

Also we can crop layers to another layer, useful if we need to limit geological +geometries such as tree coverage to a political boundary of a country.

+
+
+
        me._crop_layers()
+
+
+
+
+
+
+ # +
+

Or subtract one layer from another (or more), for instance to cut out lakes +from political boundaries.

+
+
+
        me._subtract_layers()
+
+
+
+
+
+
+ # +
+

Initializing the map projection

+
+
+
    def _init_projection(self):
+
+
+
+
+
+
+ # +
+

Some output formats don't need map projection at all, so +we just return the identity projection.

+
+
+
        if self.format in ('kml', 'json'):
+            return projections['ll']()  # use no projection for KML
+
+        opts = self.options
+
+
+
+
+
+
+ # +
+

If either lat0 or lon0 were set to "auto", we need to +compute a nice center of the projection and update the +projection configuration.

+
+
+
        autoLon = 'lon0' in opts['proj'] and opts['proj']['lon0'] == 'auto'
+        autoLat = 'lat0' in opts['proj'] and opts['proj']['lat0'] == 'auto'
+        if autoLon or autoLat:
+            map_center = self.__get_map_center()
+            if autoLon:
+                opts['proj']['lon0'] = map_center[0]
+            if autoLat:
+                opts['proj']['lat0'] = map_center[1]
+
+
+
+
+
+
+ # +
+

Load the projection class, if the id is known.

+
+
+
        if opts['proj']['id'] in projections:
+            projC = projections[opts['proj']['id']]
+        else:
+            raise KartographError('projection unknown %s' % opts['proj']['id'])
+
+
+
+
+
+
+ # +
+

Populate a dictionary of projection properties that +will be passed to the projection constructor as keyword +arguments.

+
+
+
        p_opts = {}
+        for prop in opts['proj']:
+            if prop != "id":
+                p_opts[prop] = opts['proj'][prop]
+        return projC(**p_opts)
+
+
+
+
+
+
+ # +
+

Determining the projection center

+
+
+
    def __get_map_center(self):
+
+
+
+
+
+
+ # +
+

To find out where the map will be centered to we need to +know the geographical boundaries.

+
+
+
        opts = self.options
+        mode = opts['bounds']['mode']
+        data = opts['bounds']['data']
+
+
+
+
+
+
+ # +
+

If the bound mode is set to bbox we simply +take the mean latitude and longitude as center.

+
+
+
        if mode == 'bbox':
+            lon0 = data[0] + 0.5 * (data[2] - data[0])
+            lat0 = data[1] + 0.5 * (data[3] - data[1])
+
+
+
+
+
+
+ # +
+

If the bound mode is set to point we average +over all latitude and longitude coordinates.

+
+
+
        elif mode[:5] == 'point':
+            lon0 = 0
+            lat0 = 0
+            m = 1 / len(data)
+            for (lon, lat) in data:
+                lon0 += m * lon
+                lat0 += m * lat
+
+
+
+
+
+
+ # +
+

The computationally worst case is the bound mode +polygon since we need to load the shapefile geometry +to compute its center of mass. However, we need +to load it anyway and cache the bounding geometry, +so this comes at low extra cost.

+
+
+
        elif mode[:4] == 'poly':
+            features = self._get_bounding_geometry()
+            if len(features) > 0:
+                if isinstance(features[0].geom, BaseGeometry):
+                    (lon0, lat0) = features[0].geom.representative_point().coords[0]
+            else:
+                lon0 = 0
+                lat0 = 0
+        else:
+            print "unrecognized bound mode", mode
+        return (lon0, lat0)
+
+
+
+
+
+
+ # +
+

Compute the projected bounding box

+
+
+
    def _init_bounds(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        if self.format in ('kml', 'json'):
+            return None  # no bounds needed for KML
+
+        from geometry.utils import bbox_to_polygon
+
+        opts = self.options
+        proj = self.proj
+        mode = opts['bounds']['mode'][:]
+        data = opts['bounds']['data']
+
+
+
+
+
+
+ # +
+

If the bound mode is set to bbox we simply project +a rectangle in lat/lon coordinates.

+
+
+
        if mode == "bbox":  # catch special case bbox
+            sea = proj.bounding_geometry(data, projected=True)
+            sbbox = geom_to_bbox(sea)
+            sbbox.inflate(sbbox.width * opts['bounds']['padding'])
+            return bbox_to_polygon(sbbox)
+
+        bbox = BBox()
+
+
+
+
+
+
+ # +
+

If the bound mode is set to points we project all +points and compute the bounding box.

+
+
+
        if mode[:5] == "point":
+            for lon, lat in data:
+                pt = proj.project(lon, lat)
+                bbox.update(pt)
+
+
+
+
+
+
+ # +
+

In bound mode polygons, which should correctly be +named gemetry, we compute the bounding boxes of every +geometry. We will also.

+
+
+
        if mode[:4] == "poly":
+            features = self._get_bounding_geometry()
+            ubbox = BBox()
+            if len(features) > 0:
+                for feature in features:
+                    ubbox.join(geom_to_bbox(feature.geometry))
+                    feature.project(proj)
+                    fbbox = geom_to_bbox(feature.geometry, data["min-area"])
+                    bbox.join(fbbox)
+
+
+
+
+
+
+ # +
+

Save the unprojected bounding box for later to +determine what features can be skipped.

+
+
+
                self._unprojected_bounds = ubbox
+            else:
+                raise KartographError('no features found for calculating the map bounds')
+
+
+
+
+
+
+ # +
+

If we need some extra geometry around the map bounds, we inflate +the bbox according to the set padding.

+
+
+
        bbox.inflate(bbox.width * opts['bounds']    ['padding'])
+
+
+
+
+
+
+ # +
+

At the end we convert the bounding box to a Polygon because +we need it for clipping tasks.

+
+
+
        return bbox_to_polygon(bbox)
+
+
+
+
+
+
+ # +
+

Get bounding geometry

+

For bounds mode "polygons" this helper function +returns a list of all geometry that the map should +be cropped to.

+
+
+
    def _get_bounding_geometry(self):
+
+
+
+
+
+
+ # +
+

Use the cached geometry, if available.

+
+
+
        if self._bounding_geometry_cache:
+            return self._bounding_geometry_cache
+
+        opts = self.options
+        features = []
+        data = opts['bounds']['data']
+        id = data['layer']
+
+
+
+
+
+
+ # +
+

Check that the layer exists.

+
+
+
        if id not in self.layersById:
+            raise KartographError('layer not found "%s"' % id)
+        layer = self.layersById[id]
+
+
+
+
+
+
+ # +
+

Construct the filter function of the layer, which specifies +what features should be excluded from the map completely.

+
+
+
        if layer.options['filter'] is False:
+            layerFilter = lambda a: True
+        else:
+            layerFilter = lambda rec: filter_record(layer.options['filter'], rec)
+
+
+
+
+
+
+ # +
+

Construct the filter function of the boundary, which specifies +what features should be excluded from the boundary calculation. +For instance, you often want to exclude Alaska and Hawaii from +the boundary computation of the map, although a part of Alaska +might be visible in the resulting map.

+
+
+
        if data['filter']:
+            boundsFilter = lambda rec: filter_record(data['filter'], rec)
+        else:
+            boundsFilter = lambda a: True
+
+
+
+
+
+
+ # +
+

Combine both filters to a single function.

+
+
+
        filter = lambda rec: layerFilter(rec) and boundsFilter(rec)
+
+
+
+
+
+
+ # +
+

Load the features from the layer source (e.g. a shapefile).

+
+
+
        features = layer.source.get_features(
+            filter=filter,
+            min_area=data["min-area"],
+            charset=layer.options['charset']
+        )
+
+
+
+
+
+
+ # +
+

Omit tiny islands, if needed.

+
+
+
        if layer.options['filter-islands']:
+            features = [f for f in features
+                if f.geometry.area > layer.options['filter-islands']]
+
+
+
+
+
+
+ # +
+

Store computed boundary in cache.

+
+
+
        self._bounding_geometry_cache = features
+        return features
+
+
+
+
+
+
+ # +
+

returns the output view

+
+
+
    def _get_view(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        if self.format in ('kml', 'json'):
+            return View()  # no view transformation needed for KML
+
+        self.src_bbox = bbox = geom_to_bbox(self.bounds_poly)
+        opts = self.options
+        exp = opts["export"]
+        w = exp["width"]
+        h = exp["height"]
+        ratio = exp["ratio"]
+
+        if ratio == "auto":
+            ratio = bbox.width / float(bbox.height)
+
+        if h == "auto":
+            h = w / ratio
+        elif w == "auto":
+            w = h * ratio
+        return View(bbox, w, h - 1)
+
+
+
+
+
+
+ # +
+

creates a polygon that represents the rectangular view bounds +used for cropping the geometries to not overlap the view

+
+
+
    def _init_view_poly(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        if self.format in ('kml', 'json'):
+            return None  # no view polygon needed for KML
+        w = self.view.width
+        h = self.view.height
+        return Polygon([(0, 0), (0, h), (w, h), (w, 0)])
+
+
+
+
+
+
+ # +
+

performs polygon simplification

+
+
+
    def _simplify_layers(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        from simplify import create_point_store, simplify_lines
+
+        point_store = create_point_store()  # create a new empty point store
+
+
+
+
+
+
+ # +
+

compute topology for all layers

+
+
+
        for layer in self.layers:
+            if layer.options['simplify'] is not False:
+                for feature in layer.features:
+                    feature.compute_topology(point_store, layer.options['unify-precision'])
+
+
+
+
+
+
+ # +
+

break features into lines

+
+
+
        for layer in self.layers:
+            if layer.options['simplify'] is not False:
+                for feature in layer.features:
+                    feature.break_into_lines()
+
+
+
+
+
+
+ # +
+

simplify lines

+
+
+
        total = 0
+        kept = 0
+        for layer in self.layers:
+            if layer.options['simplify'] is not False:
+                for feature in layer.features:
+                    lines = feature.break_into_lines()
+                    lines = simplify_lines(lines, layer.options['simplify']['method'], layer.options['simplify']['tolerance'])
+                    for line in lines:
+                        total += len(line)
+                        for pt in line:
+                            if not pt.deleted:
+                                kept += 1
+                    feature.restore_geometry(lines, layer.options['filter-islands'])
+        return (total, kept)
+
+
+
+
+
+
+ # +
+

cuts the layer features to the map view

+
+
+
    def _crop_layers_to_view(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        for layer in self.layers:
+
+
+
+
+
+
+ # +
+

out = []

+
+
+
            for feat in layer.features:
+                if not feat.geometry.is_valid:
+                    pass
+
+
+
+
+
+
+ # +
+

print feat.geometry +_plot_geometry(feat.geometry)

+
+
+
                feat.crop_to(self.view_poly)
+
+
+
+
+
+
+ # +
+

if not feat.is_empty(): + out.append(feat) +layer.features = out

+
+
+
+
+
+
+
+
+
+ # +
+

handles crop-to

+
+
+
    def _crop_layers(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        for layer in self.layers:
+            if layer.options['crop-to'] is not False:
+                cropped_features = []
+                for tocrop in layer.features:
+                    cbbox = geom_to_bbox(tocrop.geom)
+                    crop_at_layer = layer.options['crop-to']
+                    if crop_at_layer not in self.layers:
+                        raise KartographError('you want to substract '
+                            + 'from layer "%s" which cannot be found'
+                            % crop_at_layer)
+                    for crop_at in self.layersById[crop_at_layer].features:
+                        if crop_at.geom.bbox().intersects(cbbox):
+                            tocrop.crop_to(crop_at.geom)
+                            cropped_features.append(tocrop)
+                layer.features = cropped_features
+
+
+
+
+
+
+ # +
+

Subtract geometry

+
+
+
    def _subtract_layers(self):
+
+
+
+
+
+
+ # +
+

Substract geometry of a layer from the geometry +of one or more different layers. Added mainly +for excluding great lakes from country polygons.

+
+
+
        for layer in self.layers:
+            if layer.options['subtract-from']:
+                for feat in layer.features:
+                    if feat.geom is None:
+                        continue
+                    cbbox = geom_to_bbox(feat.geom)
+
+
+
+
+
+
+ # +
+

We remove it from multiple layers, if wanted.

+
+
+
                    for subid in layer.options['subtract-from']:
+                        if subid not in self.layersById:
+                            raise KartographError('you want to subtract'
+                                + ' from layer "%s" which cannot be found'
+                                % subid)
+                        for s in self.layersById[subid].features:
+                            if s.geom and geom_to_bbox(s.geom).intersects(cbbox):
+                                s.subtract_geom(feat.geom)
+
+
+
+
+
+
+ # +
+

Finally, we don't want the subtracted features +to be included in our map.

+
+
+
                layer.features = []
+
+
+
+
+
+
+ # +
+

Joins features within a layer.

+
+
+
    def _join_features(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        from geometry.utils import join_features
+
+        for layer in self.layers:
+            if layer.options['join'] is not False:
+                unjoined = 0
+                join = layer.options['join']
+                groupBy = join['group-by']
+                groups = join['groups']
+                if not groups:
+
+
+
+
+
+
+ # +
+

auto populate groups

+
+
+
                    groups = {}
+                    for feat in layer.features:
+                        fid = feat.props[groupBy]
+                        groups[fid] = [fid]
+
+                groupAs = join['group-as']
+                groupFeatures = {}
+                res = []
+                for feat in layer.features:
+                    found_in_group = False
+                    for g_id in groups:
+                        if g_id not in groupFeatures:
+                            groupFeatures[g_id] = []
+                        if feat.props[groupBy] in groups[g_id] or str(feat.props[groupBy]) in groups[g_id]:
+                            groupFeatures[g_id].append(feat)
+                            found_in_group = True
+                            break
+                    if not found_in_group:
+                        unjoined += 1
+                        res.append(feat)
+
+
+
+
+
+
+ # +
+

print unjoined,'features were not joined'

+
+
+
                for g_id in groups:
+                    props = {}
+                    for feat in groupFeatures[g_id]:
+                        fprops = feat.props
+                        for key in fprops:
+                            if key not in props:
+                                props[key] = fprops[key]
+                            else:
+                                if props[key] != fprops[key]:
+                                    props[key] = "---"
+
+                    if groupAs is not False:
+                        props[groupAs] = g_id
+                    if g_id in groupFeatures:
+                        res += join_features(groupFeatures[g_id], props)
+                layer.features = res
+
+
+
+
+
+
+ diff --git a/source/maplayer.html b/source/maplayer.html new file mode 100644 index 0000000..97448be --- /dev/null +++ b/source/maplayer.html @@ -0,0 +1,329 @@ + + + + + maplayer.py + + + +
+
+
+

maplayer.py

+
+
+
+
+
+ # +
+ +
+
+
from layersource import handle_layer_source
+from filter import filter_record
+
+
+_verbose = False
+
+
+
+
+
+
+ # +
+

MapLayer

+

Represents a layer in the map which contains a list of map features

+
+
+
class MapLayer(object):
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, id, options, _map, cache):
+
+
+
+
+
+
+ # +
+

Store layer properties as instance properties

+
+
+
        self.id = id
+        self.options = options
+        self.map = _map
+        self.cache = cache
+
+
+
+
+
+
+ # +
+

Make sure that the layer id is unique within the map.

+
+
+
        while self.id in self.map.layersById:
+            self.id += "_"
+
+
+
+
+
+
+ # +
+

Instantiate the layer source which will generate features from the source +geo data such as shapefiles or virtual sources such as graticule lines.

+
+
+
        self.source = handle_layer_source(self.options, self.cache)
+
+
+
+
+
+
+ # +
+

get_features()

+

Returns a list of projected and filtered features of a layer.

+
+
+
    def get_features(layer, filter=False, min_area=0):
+
+
+
+
+
+
+ # +
+ +
+
+
        opts = layer.map.options
+        is_projected = False
+
+
+
+
+
+
+ # +
+

Let's see if theres a better bounding box than this..

+
+
+
        bbox = [-180, -90, 180, 90]
+
+
+
+
+
+
+ # +
+

Use the clipping mode defined in the map configuration

+
+
+
        if opts['bounds']['mode'] == "bbox":
+            bbox = opts['bounds']['data']
+
+
+
+
+
+
+ # +
+

The 'crop' property overrides the clipping settings

+
+
+
        if 'crop' in opts['bounds'] and opts['bounds']['crop']:
+
+
+
+
+
+
+ # +
+

If crop is set to "auto", which is the default behaviour, Kartograph +will use the actual bounding geometry to compute the bounding box

+
+
+
            if opts['bounds']['crop'] == "auto":
+                if layer.map._unprojected_bounds:
+                    bbox = layer.map._unprojected_bounds
+                    bbox.inflate(inflate=opts['bounds']['padding'] * 2)
+                else:
+                    print 'could not compute bounding box for auto-cropping'
+            else:
+
+
+
+
+
+
+ # +
+

otherwise it will use the user defined bbox in the format +[minLon, minLat, maxLon, maxLat]

+
+
+
                bbox = opts['bounds']['crop']
+
+
+
+
+
+
+ # +
+

If the layer has the "src" property, it is a regular map layer source, which +means that there's an exernal file that we load the geometry and meta data from.

+
+
+
        if 'src' in layer.options:
+            if layer.options['filter'] is False:
+                filter = None
+            else:
+                filter = lambda rec: filter_record(layer.options['filter'], rec)
+
+
+
+
+
+
+ # +
+

Now we ask the layer source to generate the features that will be displayed +in the map.

+
+
+
            features = layer.source.get_features(
+                filter=filter,
+                bbox=bbox,
+                ignore_holes='ignore-holes' in layer.options and layer.options['ignore-holes'],
+                charset=layer.options['charset']
+            )
+            if _verbose:
+                print 'loaded %d features from shapefile %s' % (len(features), layer.options['src'])
+
+
+
+
+
+
+ # +
+

In contrast to regular layers, the geometry for special (or virtual) layers is generated +by Kartograph itself, based on some properties defined in the layer config.

+
+
+
        elif 'special' in layer.options:
+
+
+
+
+
+
+ # +
+

The graticule layer generates line features for longitudes and latitudes

+
+
+
            if layer.options['special'] == "graticule":
+                lats = layer.options['latitudes']
+                lons = layer.options['longitudes']
+                features = layer.source.get_features(lats, lons, layer.map.proj, bbox=bbox)
+
+
+
+
+
+
+ # +
+

The "sea" layer generates a MultiPolygon that represents the entire boundary +of the map. Especially useful for non-cylindrical map projections.

+
+
+
            elif layer.options['special'] == "sea":
+                features = layer.source.get_features(layer.map.proj)
+                is_projected = True
+
+        for feature in features:
+
+
+
+
+
+
+ # +
+

If the features are not projected yet, we project them now.

+
+
+
            if not is_projected:
+                feature.project(layer.map.proj)
+
+
+
+
+
+
+ # +
+

Transform features to view coordinates.

+
+
+
            feature.project_view(layer.map.view)
+
+
+
+
+
+
+ # +
+

Remove features that don't intersect our clipping polygon

+
+
+
        if layer.map.view_poly:
+            features = [feature for feature in features
+            if feature.geometry and feature.geometry.intersects(layer.map.view_poly)]
+        layer.features = features
+
+
+
+
+
+
+ diff --git a/source/options.html b/source/options.html new file mode 100644 index 0000000..3ebc799 --- /dev/null +++ b/source/options.html @@ -0,0 +1,499 @@ + + + + + options.py + + + +
+
+
+

options.py

+
+
+
+
+
+ # +
+

API 2.0 +helper methods for validating options dictionary

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
import os.path, proj, errors
+
+
+Error = errors.KartographOptionParseError
+
+
+
+
+
+
+ # +
+ +
+
+
def is_str(s):
+    return isinstance(s, (str, unicode))
+
+
+
+
+
+
+ # +
+

check out that the option dict is filled correctly

+
+
+
def parse_options(opts):
+
+
+
+
+
+
+ # +
+

projection

+
+
+
    parse_proj(opts)
+    parse_layers(opts)
+    parse_bounds(opts)
+    parse_export(opts)
+
+
+
+
+
+
+ # +
+

checks projections

+
+
+
def parse_proj(opts):
+
+
+
+
+
+
+ # +
+ +
+
+
    if 'proj' not in opts:
+        opts['proj'] = {}
+    prj = opts['proj']
+    if 'id' not in prj:
+        if 'bounds' not in opts:
+            prj['id'] = 'robinson'
+        else:
+            prj['id'] = 'laea'
+    if prj['id'] not in proj.projections:
+        raise Error('unknown projection')
+    prjClass = proj.projections[prj['id']]
+    for attr in prjClass.attributes():
+        if attr not in prj:
+            prj[attr] = "auto"
+        else:
+            if prj[attr] != "auto":
+                prj[attr] = float(prj[attr])
+
+
+
+
+
+
+ # +
+ +
+
+
def parse_layers(opts):
+    if 'layers' not in opts:
+        opts['layers'] = []
+    l_id = 0
+    g_id = 0
+    s_id = 0
+    for layer in opts['layers']:
+        if 'styles' not in layer:
+            layer['styles'] = {}
+        if 'src' not in layer and 'special' not in layer:
+            raise Error('you need to define the source for your layers')
+        if 'src' in layer:
+            if not os.path.exists(layer['src']):
+                raise Error('layer source not found: ' + layer['src'])
+            if 'id' not in layer:
+                layer['id'] = 'layer_' + str(l_id)
+                l_id += 1
+            if 'charset' not in layer:
+                layer['charset'] = 'utf-8'
+        elif 'special' in layer:
+            if layer['special'] == 'graticule':
+                if 'id' not in layer:
+                    layer['id'] = 'graticule'
+                    if g_id > 0:
+                        layer['id'] += '_' + str(g_id)
+                    g_id += 1
+                if 'fill' not in layer['styles']:
+                    layer['styles']['fill'] = 'None'
+                parse_layer_graticule(layer)
+            elif layer['special'] == 'sea':
+                if 'id' not in layer:
+                    layer['id'] = 'sea'
+                    if s_id > 0:
+                        layer['id'] += '_' + str(s_id)
+                    s_id += 1
+
+        parse_layer_attributes(layer)
+        parse_layer_filter(layer)
+        parse_layer_join(layer)
+        parse_layer_simplify(layer)
+        parse_layer_subtract(layer)
+        parse_layer_cropping(layer)
+
+
+
+
+
+
+ # +
+ +
+
+
def parse_layer_attributes(layer):
+    if 'attributes' not in layer:
+        layer['attributes'] = []
+        return
+    attrs = []
+    for attr in layer['attributes']:
+        if is_str(attr):
+            if isinstance(layer['attributes'], list):  # ["ISO_A3", "FIPS"]
+                attrs.append({'src': attr, 'tgt': attr})
+            elif isinstance(layer['attributes'], dict):  # { "ISO_A3": "iso" }
+                attrs.append({'src': attr, 'tgt': layer['attributes'][attr]})
+        elif isinstance(attr, dict) and 'src' in attr and 'tgt' in attr:
+            attrs.append(attr)
+    layer['attributes'] = attrs
+
+
+
+
+
+
+ # +
+ +
+
+
def parse_layer_filter(layer):
+    if 'filter' not in layer:
+        layer['filter'] = False
+        return
+    return  # todo: check valid filter syntax (recursivly, place code in filter.py)
+    filter = layer['filter']
+    if 'type' not in filter:
+        filter['type'] = 'include'
+    if 'attribute' not in filter:
+        raise Error('layer filter must define an attribute to filter on')
+    if 'equals' in filter:
+        if isinstance(filter['equals'], (str, unicode, int, float)):
+            filter['equals'] = [filter['equals']]
+    elif 'greater-than' in filter:
+        try:
+            filter['greater-than'] = float(filter['greater-than'])
+        except ValueError:
+            raise Error('could not convert filter value "greater-than" to float')
+    elif 'less-than' in filter:
+        try:
+            filter['less-than'] = float(filter['less-than'])
+        except ValueError:
+            raise Error('could not convert filter value "less-than" to float')
+    else:
+        raise Error('you must define either "equals", "greater-than" or "less-than" in the filter')
+
+
+
+
+
+
+ # +
+ +
+
+
def parse_layer_join(layer):
+    if 'join' not in layer:
+        layer['join'] = False
+        return
+    if layer['join'] is False:
+        return
+
+    join = layer['join']
+    if 'group-by' not in join:
+        raise Error('missing attribute "group-by": you need to specify an attribute by which the features should be joined.')
+    if 'groups' not in join:
+        join['groups'] = None
+    if 'group-as' not in join:
+        join['group-as'] = False
+
+
+
+
+
+
+ # +
+ +
+
+
def parse_layer_simplify(layer):
+    if 'unify-precision' not in layer:
+        layer['unify-precision'] = None
+    if 'simplify' not in layer:
+        layer['simplify'] = False
+        return
+    if layer['simplify'] is False:
+        return
+    if isinstance(layer['simplify'], (int, float, str, unicode)):
+
+
+
+
+
+
+ # +
+

default to visvalingam-whyatt

+
+
+
        layer['simplify'] = {"method": "visvalingam-whyatt", "tolerance": float(layer['simplify'])}
+    try:
+        layer['simplify']['tolerance'] = float(layer['simplify']['tolerance'])
+    except ValueError:
+        raise Error('could not convert simplification amount to float')
+    if 'filter-islands' not in layer:
+        layer['filter-islands'] = False
+
+
+
+
+
+
+ # +
+ +
+
+
def parse_layer_subtract(layer):
+    if 'subtract-from' not in layer:
+        layer['subtract-from'] = False
+        return
+    if isinstance(layer['subtract-from'], (str, unicode)):
+        layer['subtract-from'] = [layer['subtract-from']]
+
+
+
+
+
+
+ # +
+ +
+
+
def parse_layer_cropping(layer):
+    if 'crop-to' not in layer:
+        layer['crop-to'] = False
+        return
+
+
+
+
+
+
+ # +
+ +
+
+
def parse_layer_graticule(layer):
+    if 'latitudes' not in layer:
+        layer['latitudes'] = []
+    elif isinstance(layer['latitudes'], (int, float)):
+        step = layer['latitudes']
+        layer['latitudes'] = [0]
+        for lat in _xfrange(step, 90, step):
+            layer['latitudes'] += [lat, -lat]
+
+    if 'longitudes' not in layer:
+        layer['longitudes'] = []
+    elif isinstance(layer['longitudes'], (int, float)):
+        step = layer['longitudes']
+        layer['longitudes'] = [0]
+        for lon in _xfrange(step, 181, step):
+            if lon == 180:
+                p = [lon]
+            else:
+                p = [lon, -lon]
+            layer['longitudes'] += p
+
+
+
+
+
+
+ # +
+ +
+
+
def _xfrange(start, stop, step):
+    while (step > 0 and start < stop) or (step < 0 and start > step):
+        yield start
+        start += step
+
+
+
+
+
+
+ # +
+ +
+
+
def parse_bounds(opts):
+    if 'bounds' not in opts:
+        opts['bounds'] = {}
+
+
+
+
+
+
+ # +
+

return

+
+
+
    bounds = opts['bounds']
+    if 'mode' not in bounds:
+        bounds['mode'] = 'bbox'
+
+    if 'data' not in bounds:
+        bounds['data'] = [-180, -90, 180, 90]
+        bounds['mode'] = 'bbox'
+
+    mode = bounds['mode']
+    data = bounds['data']
+
+    if 'crop' not in bounds:
+        bounds['crop'] = 'auto'
+
+    if "padding" not in bounds:
+        bounds["padding"] = 0
+
+    if mode == "bbox":
+        try:
+            if len(data) == 4:
+                for i in range(0, 4):
+                    data[i] = float(data[i])
+            else:
+                raise Error('bounds mode bbox requires array with exactly 4 values [lon0,lat0,lon1,lat]')
+        except Error:
+            raise
+        except:
+            raise Error('bounds mode bbox requires array with exactly 4 values [lon0,lat0,lon1,lat]')
+    elif mode == "points":
+        try:
+            for i in range(0, len(data)):
+                pt = data[i]
+                if len(pt) == 2:
+                    pt = map(float, pt)
+                else:
+                    raise Error('bounds mode points requires array with (lon,lat) tuples')
+        except Error:
+            raise
+        except:
+            raise Error('bounds mode points requires array with (lon,lat) tuples')
+    elif mode in ("polygons", "polygon"):
+        bounds['mode'] = mode = "polygons"
+        if "layer" not in data or not is_str(data["layer"]):
+            raise Error('you must specify a layer for bounds mode ' + mode)
+        if "filter" not in data:
+            data["filter"] = False
+        if "attribute" not in data or not is_str(data["attribute"]):
+            data["attribute"] = None
+        if "values" not in data:
+            if data["attribute"] is None:
+                data["values"] = None
+            else:
+                raise Error('you must specify a list of values to match in bounds mode ' + mode)
+        if is_str(data["values"]):
+            data["values"] = [data["values"]]
+        if "min-area" in data:
+            try:
+                data["min-area"] = float(data["min-area"])
+            except:
+                raise Error('min_area must be an integer or float')
+        else:
+            data['min-area'] = 0
+
+
+
+
+
+
+ # +
+ +
+
+
def parse_export(opts):
+    if "export" not in opts:
+        opts["export"] = {}
+    exp = opts["export"]
+    if "width" not in exp and "height" not in exp:
+        exp["width"] = 1000
+        exp["height"] = "auto"
+    elif "height" not in exp:
+        exp["height"] = "auto"
+    elif "width" not in exp:
+        exp["width"] = "auto"
+
+    if "ratio" not in exp:
+        exp["ratio"] = "auto"
+    if "round" not in exp:
+        exp["round"] = False
+    else:
+        exp["round"] = int(exp["round"])
+    if "crop-to-view" not in exp:
+        exp['crop-to-view'] = True
+
+
+
+
+
+
+ diff --git a/source/proj/__init__.html b/source/proj/__init__.html new file mode 100644 index 0000000..46c09b2 --- /dev/null +++ b/source/proj/__init__.html @@ -0,0 +1,219 @@ + + + + + __init__.py + + + +
+
+
+

__init__.py

+
+
+
+
+
+ # +
+
kartograph - a svg mapping library
+Copyright (C) 2011  Gregor Aisch
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
projections = dict()
+
+from base import Proj
+from cylindrical import *
+
+projections['lonlat'] = Equirectangular
+projections['cea'] = CEA
+projections['gallpeters'] = GallPeters
+projections['hobodyer'] = HoboDyer
+projections['behrmann'] = Behrmann
+projections['balthasart'] = Balthasart
+projections['mercator'] = Mercator
+projections['ll'] = LonLat
+
+from pseudocylindrical import *
+
+projections['naturalearth'] = NaturalEarth
+projections['robinson'] = Robinson
+projections['eckert4'] = EckertIV
+projections['sinusoidal'] = Sinusoidal
+projections['mollweide'] = Mollweide
+projections['wagner4'] = WagnerIV
+projections['wagner5'] = WagnerV
+projections['loximuthal'] = Loximuthal
+projections['canters1'] = CantersModifiedSinusoidalI
+projections['goodehomolosine'] = GoodeHomolosine
+projections['hatano'] = Hatano
+projections['aitoff'] = Aitoff
+projections['winkel3'] = Winkel3
+projections['nicolosi'] = Nicolosi
+
+from azimuthal import *
+
+projections['ortho'] = Orthographic
+projections['laea'] = LAEA
+projections['stereo'] = Stereographic
+projections['satellite'] = Satellite
+projections['eda'] = EquidistantAzimuthal
+projections['aitoff'] = Aitoff
+
+from conic import *
+
+projections['lcc'] = LCC
+
+
+
+
+
+
+ # +
+ +
+
+
class Proj4(Proj):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, projstr):
+        import pyproj
+        self.proj = pyproj.Proj(projstr)
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        lon, lat = self.ll(lon, lat)
+        x, y = self.proj(lon, lat)
+        return (x, y * -1)
+
+
+
+
+
+
+ # +
+ +
+
+
class LCC__(Proj4):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lat0=0, lon0=0, lat1=28, lat2=30):
+        Proj4.__init__(self, '+proj=lcc +lat_0=%f +lon_0=%f +lat_1=%f +lat_2=%f' % (lat0, lon0, lat1, lat2))
+
+
+
+
+
+
+ # +
+ +
+
+
    def _visible(self, lon, lat):
+        return True
+
+
+
+
+
+
+ # +
+ +
+
+
    def _truncate(self, x, y):
+        return (x, y)
+
+
+for pjname in projections:
+    projections[pjname].name = pjname
+
+
+if __name__ == '__main__':
+    import sys
+
+
+
+
+
+
+ # +
+

some class testing +p = LAEA(52.0,10.0) +x,y = p.project(50,5) +assert (round(x,2),round(y,2)) == (3962799.45, -2999718.85), 'LAEA proj error'

+
+
+
    from kartograph.geometry import BBox
+
+    print Proj.fromXML(Robinson(lat0=3, lon0=4).toXML(), projections)
+
+    Robinson(lat0=3, lon0=4)
+
+    for pj in projections:
+        Proj = projections[pj]
+        bbox = BBox()
+        try:
+            proj = Proj(lon0=60)
+            print proj.project(0, 0)
+            print proj.world_bounds(bbox)
+            print proj.toXML()
+        except:
+            print 'Error', pj
+            print sys.exc_info()[0]
+            raise
+
+
+
+
+
+
+ diff --git a/source/proj/base.html b/source/proj/base.html new file mode 100644 index 0000000..85b7b16 --- /dev/null +++ b/source/proj/base.html @@ -0,0 +1,432 @@ + + + + + base.py + + + +
+
+
+

base.py

+
+
+
+
+
+ # +
+
kartograph - a svg mapping library
+Copyright (C) 2011  Gregor Aisch
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
import math
+from kartograph.errors import KartographError
+from shapely.geometry import Polygon, LineString, Point, MultiPolygon, MultiLineString, MultiPoint
+
+
+
+
+
+
+ # +
+

base class for projections

+
+
+
class Proj(object):
+
+
+
+
+
+
+ # +
+ +
+
+
    HALFPI = math.pi * .5
+    QUARTERPI = math.pi * .25
+
+    minLat = -90
+    maxLat = 90
+    minLon = -180
+    maxLon = 180
+
+
+
+
+
+
+ # +
+ +
+
+
    def _shift_polygon(self, polygon):
+        return [polygon]  # no shifting
+
+
+
+
+
+
+ # +
+ +
+
+
    def plot(self, geometry):
+        geometries = hasattr(geometry, 'geoms') and geometry.geoms or [geometry]
+        res = []
+
+
+
+
+
+
+ # +
+

at first shift polygons +shifted = [] +for geom in geometries: + if isinstance(geom, Polygon): + shifted += self._shift_polygon(geom) + else: + shifted += [geom]

+
+
+
        for geom in geometries:
+            if isinstance(geom, Polygon):
+                res += self.plot_polygon(geom)
+            elif isinstance(geom, LineString):
+                rings = self.plot_linear_ring(geom.coords)
+                res += map(LineString, rings)
+            elif isinstance(geom, Point):
+                if self._visible(geom.x, geom.y):
+                    x, y = self.project(geom.x, geom.y)
+                    res.append(Point(x, y))
+            else:
+                pass
+
+
+
+
+
+
+ # +
+

raise KartographError('proj.plot(): unknown geometry type %s' % geom)

+
+
+
        if len(res) > 0:
+            if isinstance(res[0], Polygon):
+                if len(res) > 1:
+                    return MultiPolygon(res)
+                else:
+                    return res[0]
+            elif isinstance(res[0], LineString):
+                if len(res) > 1:
+                    return MultiLineString(res)
+                else:
+                    return LineString(res[0])
+            else:
+                if len(res) > 1:
+                    return MultiPoint(res)
+                else:
+                    return Point(res[0][0], res[0][1])
+
+
+
+
+
+
+ # +
+ +
+
+
    def plot_polygon(self, polygon):
+        ext = self.plot_linear_ring(polygon.exterior, truncate=True)
+        if len(ext) == 1:
+            pts_int = []
+            for interior in polygon.interiors:
+                pts_int += self.plot_linear_ring(interior, truncate=True)
+            return [Polygon(ext[0], pts_int)]
+        elif len(ext) == 0:
+            return []
+        else:
+            raise KartographError('unhandled case: exterior is split into multiple rings')
+
+
+
+
+
+
+ # +
+ +
+
+
    def plot_linear_ring(self, ring, truncate=False):
+        ignore = True
+        points = []
+        for (lon, lat) in ring.coords:
+            vis = self._visible(lon, lat)
+            if vis:
+                ignore = False
+            x, y = self.project(lon, lat)
+            if not vis and truncate:
+                points.append(self._truncate(x, y))
+            else:
+                points.append((x, y))
+        if ignore:
+            return []
+        return [points]
+
+
+
+
+
+
+ # +
+ +
+
+
    def ll(self, lon, lat):
+        return (lon, lat)
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        assert False, 'Proj is an abstract class'
+
+
+
+
+
+
+ # +
+ +
+
+
    def project_inverse(self, x, y):
+        assert False, 'inverse projection is not supporte by %s' % self.name
+
+
+
+
+
+
+ # +
+ +
+
+
    def _visible(self, lon, lat):
+        assert False, 'Proj is an abstract class'
+
+
+
+
+
+
+ # +
+ +
+
+
    def _truncate(self, x, y):
+        assert False, 'truncation is not implemented'
+
+
+
+
+
+
+ # +
+ +
+
+
    def world_bounds(self, bbox, llbbox=(-180, -90, 180, 90)):
+        sea = self.sea_shape(llbbox)
+        for x, y in sea[0]:
+            bbox.update((x, y))
+        return bbox
+
+
+
+
+
+
+ # +
+

returns a WGS84 polygon that represents the limits of this projection +points that lie outside this polygon will not be plotted +this polygon will also be used to render the sea layer in world maps

+

defaults to full WGS84 range

+
+
+
    def bounding_geometry(self, llbbox=(-180, -90, 180, 90), projected=False):
+
+
+
+
+
+
+ # +
+ +
+
+
        from shapely.geometry import Polygon
+        sea = []
+
+        minLon = llbbox[0]
+        maxLon = llbbox[2]
+        minLat = max(self.minLat, llbbox[1])
+        maxLat = min(self.maxLat, llbbox[3])
+
+
+
+
+
+
+ # +
+ +
+
+
        def xfrange(start, stop, step):
+            if stop > start:
+                while start < stop:
+                    yield start
+                    start += step
+            else:
+                while stop < start:
+                    yield start
+                    start -= step
+
+        lat_step = abs((maxLat - minLat) / 180.0)
+        lon_step = abs((maxLon - minLon) / 360.0)
+
+        for lat in xfrange(minLat, maxLat, lat_step):
+            sea.append((minLon, lat))
+        for lon in xfrange(minLon, maxLon, lon_step):
+            sea.append((lon, maxLat))
+        for lat in xfrange(maxLat, minLat, lat_step):
+            sea.append((maxLon, lat))
+        for lon in xfrange(maxLon, minLon, lon_step):
+            sea.append((lon, minLat))
+
+        if projected:
+            sea = [self.project(lon, lat) for (lon, lat) in sea]
+
+        return Polygon(sea)
+
+
+
+
+
+
+ # +
+ +
+
+
    def __str__(self):
+        return 'Proj(' + self.name + ')'
+
+
+
+
+
+
+ # +
+ +
+
+
    def attrs(self):
+        return dict(id=self.name)
+
+
+
+
+
+
+ # +
+

returns array of attribute names of this projection

+
+
+
    @staticmethod
+    def attributes():
+
+
+
+
+
+
+ # +
+ +
+
+
        return []
+
+
+
+
+
+
+ # +
+ +
+
+
    @staticmethod
+    def fromXML(xml, projections):
+        id = xml['id']
+        if id in projections:
+            ProjClass = projections[id]
+            args = {}
+            for (prop, val) in xml:
+                if prop[0] != "id":
+                    args[prop[0]] = float(val)
+            return ProjClass(**args)
+        raise Exception("could not restore projection from xml")
+
+
+
+
+
+
+ diff --git a/source/proj/conic.html b/source/proj/conic.html new file mode 100644 index 0000000..e2de70e --- /dev/null +++ b/source/proj/conic.html @@ -0,0 +1,320 @@ + + + + + conic.py + + + +
+
+
+

conic.py

+
+
+
+
+
+ # +
+
kartograph - a svg mapping library
+Copyright (C) 2011  Gregor Aisch
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
from base import Proj
+import math
+from math import radians as rad
+
+
+
+
+
+
+ # +
+ +
+
+
class Conic(Proj):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lat0=0, lon0=0, lat1=0, lat2=0):
+        self.lat0 = lat0
+        self.phi0 = rad(lat0)
+        self.lon0 = lon0
+        self.lam0 = rad(lon0)
+        self.lat1 = lat1
+        self.phi1 = rad(lat1)
+        self.lat2 = lat2
+        self.phi2 = rad(lat2)
+
+        if lon0 != 0.0:
+            self.bounds = self.bounding_geometry()
+
+
+
+
+
+
+ # +
+ +
+
+
    def _visible(self, lon, lat):
+        return True
+
+
+
+
+
+
+ # +
+ +
+
+
    def _truncate(self, x, y):
+        return (x, y)
+
+
+
+
+
+
+ # +
+ +
+
+
    def attrs(self):
+        p = super(Conic, self).attrs()
+        p['lon0'] = self.lon0
+        p['lat0'] = self.lat0
+        p['lat1'] = self.lat1
+        p['lat2'] = self.lat2
+        return p
+
+
+
+
+
+
+ # +
+

shifts a polygon according to the origin longitude

+
+
+
    def _shift_polygon(self, polygon):
+
+
+
+
+
+
+ # +
+ +
+
+
        if self.lon0 == 0.0:
+            return [polygon]  # no need to shift anything
+
+        from shapely.geometry import Polygon
+
+
+
+
+
+
+ # +
+

we need to split and join some polygons

+
+
+
        poly_coords = []
+        holes = []
+        for (lon, lat) in polygon.exterior.coords:
+            poly_coords.append((lon - self.lon0, lat))
+        for hole in polygon.interiors:
+            hole_coords = []
+            for (lon, lat) in hole.coords:
+                hole_coords.append((lon - self.lon0, lat))
+            holes.append(hole_coords)
+        poly = Polygon(poly_coords, holes)
+
+        polygons = []
+
+
+
+
+
+
+ # +
+

print "shifted polygons", (time.time() - start) +start = time.time()

+
+
+
        try:
+            p_in = poly.intersection(self.bounds)
+            polygons += hasattr(p_in, 'geoms') and p_in.geoms or [p_in]
+        except:
+            pass
+
+
+
+
+
+
+ # +
+

print "computed polygons inside bounds", (time.time() - start) +start = time.time()

+
+
+
        try:
+            p_out = poly.symmetric_difference(self.bounds)
+            out_geoms = hasattr(p_out, 'geoms') and p_out.geoms or [p_out]
+        except:
+            out_geoms = []
+            pass
+
+
+
+
+
+
+ # +
+

print "computed polygons outside bounds", (time.time() - start) +start = time.time()

+
+
+
        for polygon in out_geoms:
+            ext_pts = []
+            int_pts = []
+            s = 0  # at first we compute the avg longitude
+            c = 0
+            for (lon, lat) in polygon.exterior.coords:
+                s += lon
+                c += 1
+            left = s / float(c) < -180  # and use it to decide where to shift the polygon
+            for (lon, lat) in polygon.exterior.coords:
+                ext_pts.append((lon + (-360, 360)[left], lat))
+            for interior in polygon.interiors:
+                pts = []
+                for (lon, lat) in interior.coords:
+                    pts.append((lon + (-360, 360)[left], lat))
+                int_pts.append(pts)
+            polygons.append(Polygon(ext_pts, int_pts))
+
+
+
+
+
+
+ # +
+

print "shifted outside polygons to inside", (time.time() - start)

+
+
+
        return polygons
+
+
+
+
+
+
+ # +
+

Lambert Conformal Conic Projection (spherical)

+
+
+
    @staticmethod
+    def attributes():
+        return ['lon0', 'lat0', 'lat1', 'lat2']
+
+
+class LCC(Conic):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lat0=0, lon0=0, lat1=30, lat2=50):
+        from math import sin, cos, tan, pow, log
+        self.minLat = -60
+        self.maxLat = 85
+        Conic.__init__(self, lat0=lat0, lon0=lon0, lat1=lat1, lat2=lat2)
+        self.n = n = sin(self.phi1)
+        cosphi = cos(self.phi1)
+        secant = abs(self.phi1 - self.phi2) >= 1e-10
+        if secant:
+            n = log(cosphi / cos(self.phi2)) / log(tan(self.QUARTERPI + .5 * self.phi2) / tan(self.QUARTERPI + .5 * self.phi1))
+        self.c = c = cosphi * pow(tan(self.QUARTERPI + .5 * self.phi1), n) / n
+        if abs(abs(self.phi0) - self.HALFPI) < 1e-10:
+            self.rho0 = 0.
+        else:
+            self.rho0 = c * pow(tan(self.QUARTERPI + .5 * self.phi0), -n)
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        lon, lat = self.ll(lon, lat)
+        phi = rad(lat)
+        lam = rad(lon)
+        n = self.n
+        if abs(abs(phi) - self.HALFPI) < 1e-10:
+            rho = 0.0
+        else:
+            rho = self.c * math.pow(math.tan(self.QUARTERPI + 0.5 * phi), -n)
+        lam_ = (lam - self.lam0) * n
+        x = 1000 * rho * math.sin(lam_)
+        y = 1000 * (self.rho0 - rho * math.cos(lam_))
+
+        return (x, y * -1)
+
+
+
+
+
+
+ diff --git a/source/proj/cylindrical.html b/source/proj/cylindrical.html new file mode 100644 index 0000000..7e77b6c --- /dev/null +++ b/source/proj/cylindrical.html @@ -0,0 +1,426 @@ + + + + + cylindrical.py + + + +
+
+
+

cylindrical.py

+
+
+
+
+
+ # +
+
kartograph - a svg mapping library
+Copyright (C) 2011  Gregor Aisch
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
from base import Proj
+import math
+from math import radians as rad
+
+
+
+
+
+
+ # +
+ +
+
+
class Cylindrical(Proj):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lon0=0.0, flip=0):
+        self.flip = flip
+        self.lon0 = lon0
+        self.bounds = self.bounding_geometry()
+
+
+
+
+
+
+ # +
+

shifts a polygon according to the origin longitude

+
+
+
    def _shift_polygon(self, polygon):
+
+
+
+
+
+
+ # +
+ +
+
+
        if self.lon0 == 0.0:
+            return [polygon]  # no need to shift anything
+
+        from shapely.geometry import Polygon
+
+
+
+
+
+
+ # +
+

we need to split and join some polygons

+
+
+
        poly_coords = []
+        holes = []
+        for (lon, lat) in polygon.exterior.coords:
+            poly_coords.append((lon - self.lon0, lat))
+        for hole in polygon.interiors:
+            hole_coords = []
+            for (lon, lat) in hole.coords:
+                hole_coords.append((lon - self.lon0, lat))
+            holes.append(hole_coords)
+        poly = Polygon(poly_coords, holes)
+
+        polygons = []
+
+
+
+
+
+
+ # +
+

print "shifted polygons", (time.time() - start) +start = time.time()

+
+
+
        try:
+            p_in = poly.intersection(self.bounds)
+            polygons += hasattr(p_in, 'geoms') and p_in.geoms or [p_in]
+        except:
+            pass
+
+
+
+
+
+
+ # +
+

print "computed polygons inside bounds", (time.time() - start) +start = time.time()

+
+
+
        try:
+            p_out = poly.symmetric_difference(self.bounds)
+            out_geoms = hasattr(p_out, 'geoms') and p_out.geoms or [p_out]
+        except:
+            out_geoms = []
+            pass
+
+
+
+
+
+
+ # +
+

print "computed polygons outside bounds", (time.time() - start) +start = time.time()

+
+
+
        for polygon in out_geoms:
+            ext_pts = []
+            int_pts = []
+            s = 0  # at first we compute the avg longitude
+            c = 0
+            for (lon, lat) in polygon.exterior.coords:
+                s += lon
+                c += 1
+            left = s / float(c) < -180  # and use it to decide where to shift the polygon
+            for (lon, lat) in polygon.exterior.coords:
+                ext_pts.append((lon + (-360, 360)[left], lat))
+            for interior in polygon.interiors:
+                pts = []
+                for (lon, lat) in interior.coords:
+                    pts.append((lon + (-360, 360)[left], lat))
+                int_pts.append(pts)
+            polygons.append(Polygon(ext_pts, int_pts))
+
+
+
+
+
+
+ # +
+

print "shifted outside polygons to inside", (time.time() - start)

+
+
+
        return polygons
+
+
+
+
+
+
+ # +
+ +
+
+
    def _visible(self, lon, lat):
+        return True
+
+
+
+
+
+
+ # +
+ +
+
+
    def _truncate(self, x, y):
+        return (x, y)
+
+
+
+
+
+
+ # +
+ +
+
+
    def attrs(self):
+        a = super(Cylindrical, self).attrs()
+        a['lon0'] = self.lon0
+        a['flip'] = self.flip
+        return a
+
+
+
+
+
+
+ # +
+ +
+
+
    def __str__(self):
+        return 'Proj(' + self.name + ', lon0=%s)' % self.lon0
+
+
+
+
+
+
+ # +
+

Equirectangular Projection, aka lonlat, aka plate carree

+
+
+
    @staticmethod
+    def attributes():
+        return ['lon0', 'flip']
+
+    def ll(self, lon, lat):
+        if self.flip == 1:
+            return (-lon, -lat)
+        return (lon, lat)
+
+
+class Equirectangular(Cylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lon0=0.0, lat0=0.0, flip=0):
+        self.lat0 = lat0
+        self.phi0 = rad(lat0 * -1)
+        Cylindrical.__init__(self, lon0=lon0, flip=flip)
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        lon, lat = self.ll(lon, lat)
+        return (lon * math.cos(self.phi0) * 1000, lat * -1 * 1000)
+
+
+
+
+
+
+ # +
+

Cylindrical Equal Area Projection

+
+
+
class CEA(Cylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lat0=0.0, lon0=0.0, lat1=0.0, flip=0):
+        self.lat0 = lat0
+        self.lat1 = lat1
+        self.phi0 = rad(lat0 * -1)
+        self.phi1 = rad(lat1 * -1)
+        self.lam0 = rad(lon0)
+        Cylindrical.__init__(self, lon0=lon0, flip=flip)
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        lon, lat = self.ll(lon, lat)
+        lam = rad(lon)
+        phi = rad(lat * -1)
+        x = (lam) * math.cos(self.phi1) * 1000
+        y = math.sin(phi) / math.cos(self.phi1) * 1000
+        return (x, y)
+
+
+
+
+
+
+ # +
+ +
+
+
    def attrs(self):
+        p = super(CEA, self).attrs()
+        p['lat1'] = self.lat1
+        return p
+
+
+
+
+
+
+ # +
+ +
+
+
    @staticmethod
+    def attributes():
+        return ['lon0', 'lat1', 'flip']
+
+    def __str__(self):
+        return 'Proj(' + self.name + ', lon0=%s, lat1=%s)' % (self.lon0, self.lat1)
+
+
+class GallPeters(CEA):
+    def __init__(self, lat0=0.0, lon0=0.0, flip=0):
+        CEA.__init__(self, lon0=lon0, lat0=0, lat1=45, flip=flip)
+
+
+class HoboDyer(CEA):
+    def __init__(self, lat0=0.0, lon0=0.0, flip=0):
+        CEA.__init__(self, lon0=lon0, lat0=lat0, lat1=37.5, flip=flip)
+
+
+class Behrmann(CEA):
+    def __init__(self, lat0=0.0, lon0=0.0, flip=0):
+        CEA.__init__(self, lat1=30, lat0=lat0, lon0=lon0, flip=flip)
+
+
+class Balthasart(CEA):
+    def __init__(self, lat0=0.0, lon0=0.0, flip=0):
+        CEA.__init__(self, lat1=50, lat0=lat0, lon0=lon0, flip=flip)
+
+
+class Mercator(Cylindrical):
+    def __init__(self, lon0=0.0, lat0=0.0, flip=0):
+        Cylindrical.__init__(self, lon0=lon0, flip=flip)
+        self.minLat = -85
+        self.maxLat = 85
+
+    def project(self, lon, lat):
+        lon, lat = self.ll(lon, lat)
+        lam = rad(lon)
+        phi = rad(lat * -1)
+        x = lam * 1000
+        y = math.log((1 + math.sin(phi)) / math.cos(phi)) * 1000
+        return (x, y)
+
+
+class LonLat(Cylindrical):
+    def project(self, lon, lat):
+        return (lon, lat)
+
+
+
+
+
+
+ diff --git a/source/proj/pseudocylindrical.html b/source/proj/pseudocylindrical.html new file mode 100644 index 0000000..aa6cbda --- /dev/null +++ b/source/proj/pseudocylindrical.html @@ -0,0 +1,1014 @@ + + + + + pseudocylindrical.py + + + +
+
+
+

pseudocylindrical.py

+
+
+
+
+
+ # +
+
kartograph - a svg mapping library
+Copyright (C) 2011  Gregor Aisch
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
from cylindrical import Cylindrical
+import math
+from math import radians as rad
+
+
+
+
+
+
+ # +
+ +
+
+
class PseudoCylindrical(Cylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lon0=0.0, flip=0):
+        Cylindrical.__init__(self, lon0=lon0, flip=flip)
+
+
+
+
+
+
+ # +
+

src: http://www.shadedrelief.com/NE_proj/

+
+
+
class NaturalEarth(PseudoCylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lat0=0.0, lon0=0.0, flip=0):
+        PseudoCylindrical.__init__(self, lon0=lon0, flip=flip)
+        from math import pi
+        s = self
+        s.A0 = 0.8707
+        s.A1 = -0.131979
+        s.A2 = -0.013791
+        s.A3 = 0.003971
+        s.A4 = -0.001529
+        s.B0 = 1.007226
+        s.B1 = 0.015085
+        s.B2 = -0.044475
+        s.B3 = 0.028874
+        s.B4 = -0.005916
+        s.C0 = s.B0
+        s.C1 = 3 * s.B1
+        s.C2 = 7 * s.B2
+        s.C3 = 9 * s.B3
+        s.C4 = 11 * s.B4
+        s.EPS = 1e-11
+        s.MAX_Y = 0.8707 * 0.52 * pi
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        lon, lat = self.ll(lon, lat)
+        lplam = rad(lon)
+        lpphi = rad(lat * -1)
+        phi2 = lpphi * lpphi
+        phi4 = phi2 * phi2
+        x = lplam * (self.A0 + phi2 * (self.A1 + phi2 * (self.A2 + phi4 * phi2 * (self.A3 + phi2 * self.A4)))) * 180 + 500
+        y = lpphi * (self.B0 + phi2 * (self.B1 + phi4 * (self.B2 + self.B3 * phi2 + self.B4 * phi4))) * 180 + 270
+        return (x, y)
+
+
+
+
+
+
+ # +
+ +
+
+
class Robinson(PseudoCylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lat0=0.0, lon0=0.0, flip=0):
+        PseudoCylindrical.__init__(self, lon0=lon0, flip=flip)
+        self.X = [1, -5.67239e-12, -7.15511e-05, 3.11028e-06,  0.9986, -0.000482241, -2.4897e-05, -1.33094e-06, 0.9954, -0.000831031, -4.4861e-05, -9.86588e-07, 0.99, -0.00135363, -5.96598e-05, 3.67749e-06, 0.9822, -0.00167442, -4.4975e-06, -5.72394e-06, 0.973, -0.00214869, -9.03565e-05, 1.88767e-08, 0.96, -0.00305084, -9.00732e-05, 1.64869e-06, 0.9427, -0.00382792, -6.53428e-05, -2.61493e-06, 0.9216, -0.00467747, -0.000104566, 4.8122e-06, 0.8962, -0.00536222, -3.23834e-05, -5.43445e-06, 0.8679, -0.00609364, -0.0001139, 3.32521e-06, 0.835, -0.00698325, -6.40219e-05, 9.34582e-07, 0.7986, -0.00755337, -5.00038e-05, 9.35532e-07, 0.7597, -0.00798325, -3.59716e-05, -2.27604e-06, 0.7186, -0.00851366, -7.0112e-05, -8.63072e-06, 0.6732, -0.00986209, -0.000199572, 1.91978e-05, 0.6213, -0.010418, 8.83948e-05, 6.24031e-06, 0.5722, -0.00906601, 0.000181999, 6.24033e-06, 0.5322,  0.,  0.,  0.]
+        self.Y = [0, 0.0124, 3.72529e-10, 1.15484e-09, 0.062, 0.0124001, 1.76951e-08, -5.92321e-09, 0.124, 0.0123998, -7.09668e-08, 2.25753e-08, 0.186, 0.0124008, 2.66917e-07, -8.44523e-08, 0.248, 0.0123971, -9.99682e-07, 3.15569e-07, 0.31, 0.0124108, 3.73349e-06, -1.1779e-06, 0.372, 0.0123598, -1.3935e-05, 4.39588e-06, 0.434, 0.0125501, 5.20034e-05, -1.00051e-05, 0.4968, 0.0123198, -9.80735e-05, 9.22397e-06, 0.5571, 0.0120308, 4.02857e-05, -5.2901e-06, 0.6176, 0.0120369, -3.90662e-05, 7.36117e-07, 0.6769, 0.0117015, -2.80246e-05, -8.54283e-07, 0.7346, 0.0113572, -4.08389e-05, -5.18524e-07, 0.7903, 0.0109099, -4.86169e-05, -1.0718e-06, 0.8435, 0.0103433, -6.46934e-05, 5.36384e-09, 0.8936, 0.00969679, -6.46129e-05, -8.54894e-06, 0.9394, 0.00840949, -0.000192847, -4.21023e-06, 0.9761, 0.00616525, -0.000256001, -4.21021e-06, 1.,  0.,  0.,  0]
+        self.NODES = 18
+        self.FXC = 0.8487
+        self.FYC = 1.3523
+        self.C1 = 11.45915590261646417544
+        self.RC1 = 0.08726646259971647884
+        self.ONEEPS = 1.000001
+        self.EPS = 1e-8
+
+
+
+
+
+
+ # +
+ +
+
+
    def _poly(self, arr, off, z):
+        return arr[off] + z * (arr[off + 1] + z * (arr[off + 2] + z * (arr[off + 3])))
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        lon, lat = self.ll(lon, lat)
+        lplam = rad(lon)
+        lpphi = rad(lat * -1)
+
+        phi = abs(lpphi)
+        i = int(phi * self.C1)
+        if i >= self.NODES:
+            i = self.NODES - 1
+        phi = math.degrees(phi - self.RC1 * i)
+        i *= 4
+        x = 1000 * self._poly(self.X, i, phi) * self.FXC * lplam
+        y = 1000 * self._poly(self.Y, i, phi) * self.FYC
+        if lpphi < 0.0:
+            y = -y
+
+        return (x, y)
+
+
+
+
+
+
+ # +
+ +
+
+
class EckertIV(PseudoCylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lon0=0.0, lat0=0, flip=0):
+        PseudoCylindrical.__init__(self, lon0=lon0, flip=flip)
+
+        self.C_x = .42223820031577120149
+        self.C_y = 1.32650042817700232218
+        self.RC_y = .75386330736002178205
+        self.C_p = 3.57079632679489661922
+        self.RC_p = .28004957675577868795
+        self.EPS = 1e-7
+        self.NITER = 6
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        lon, lat = self.ll(lon, lat)
+        lplam = rad(lon)
+        lpphi = rad(lat * -1)
+
+        p = self.C_p * math.sin(lpphi)
+        V = lpphi * lpphi
+        lpphi *= 0.895168 + V * (0.0218849 + V * 0.00826809)
+
+        i = self.NITER
+        while i > 0:
+            c = math.cos(lpphi)
+            s = math.sin(lpphi)
+            V = (lpphi + s * (c + 2.) - p) / (1. + c * (c + 2.) - s * s)
+            lpphi -= V
+            if abs(V) < self.EPS:
+                break
+            i -= 1
+
+        if i == 0:
+            x = self.C_x * lplam
+            y = (self.C_y, - self.C_y)[lpphi < 0]
+        else:
+            x = self.C_x * lplam * (1. + math.cos(lpphi))
+            y = self.C_y * math.sin(lpphi)
+        return (x, y)
+
+
+
+
+
+
+ # +
+ +
+
+
class Sinusoidal(PseudoCylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lon0=0.0, lat0=0.0, flip=0):
+        PseudoCylindrical.__init__(self, lon0=lon0, flip=flip)
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        lon, lat = self.ll(lon, lat)
+        lam = rad(lon)
+        phi = rad(lat * -1)
+        x = 1032 * lam * math.cos(phi)
+        y = 1032 * phi
+        return (x, y)
+
+
+
+
+
+
+ # +
+ +
+
+
class Mollweide(PseudoCylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, p=1.5707963267948966, lon0=0.0, lat0=0.0, cx=None, cy=None, cp=None, flip=0):
+        PseudoCylindrical.__init__(self, lon0=lon0, flip=flip)
+        self.MAX_ITER = 10
+        self.TOLERANCE = 1e-7
+
+        if p != None:
+            p2 = p + p
+            sp = math.sin(p)
+            r = math.sqrt(math.pi * 2.0 * sp / (p2 + math.sin(p2)))
+            self.cx = 2. * r / math.pi
+            self.cy = r / sp
+            self.cp = p2 + math.sin(p2)
+        elif cx != None and cy != None and cp != None:
+            self.cx = cx
+            self.cy = cy
+            self.cp = cp
+        else:
+            assert False, 'either p or cx,cy,cp must be defined'
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        lon, lat = self.ll(lon, lat)
+        lam = rad(lon)
+        phi = rad(lat)
+
+        k = self.cp * math.sin(phi)
+        i = self.MAX_ITER
+
+        while i != 0:
+            v = (phi + math.sin(phi) - k) / (1. + math.cos(phi))
+            phi -= v
+            if abs(v) < self.TOLERANCE:
+                break
+            i -= 1
+
+        if i == 0:
+            phi = (self.HALFPI, -self.HALFPI)[phi < 0]
+        else:
+            phi *= 0.5
+
+        x = 1000 * self.cx * lam * math.cos(phi)
+        y = 1000 * self.cy * math.sin(phi)
+        return (x, y * -1)
+
+
+
+
+
+
+ # +
+ +
+
+
class GoodeHomolosine(PseudoCylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lon0=0, flip=0):
+        self.lat1 = 41.737
+        PseudoCylindrical.__init__(self, lon0=lon0, flip=flip)
+        self.p1 = Mollweide()
+        self.p0 = Sinusoidal()
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        lon, lat = self.ll(lon, lat)
+
+
+
+
+
+
+ # +
+

lon = me.clon(lon)

+
+
+
        if abs(lat) > self.lat1:
+            return self.p1.project(lon, lat)
+        else:
+            return self.p0.project(lon, lat)
+
+
+
+
+
+
+ # +
+ +
+
+
class WagnerIV(Mollweide):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lon0=0, lat0=0, flip=0):
+
+
+
+
+
+
+ # +
+

p=math.pi/3

+
+
+
        Mollweide.__init__(self, p=1.0471975511965976, flip=flip)
+
+
+
+
+
+
+ # +
+ +
+
+
class WagnerV(Mollweide):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lat0=0, lon0=0, flip=0):
+        Mollweide.__init__(self, cx=0.90977, cy=1.65014, cp=3.00896, flip=flip)
+
+
+
+
+
+
+ # +
+ +
+
+
class Loximuthal(PseudoCylindrical):
+
+    minLat = -89
+    maxLat = 89
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lon0=0.0, lat0=0.0, flip=0):
+        PseudoCylindrical.__init__(self, lon0=lon0, flip=flip)
+        if flip == 1:
+            lat0 = -lat0
+        self.lat0 = lat0
+        self.phi0 = rad(lat0)
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        lon, lat = self.ll(lon, lat)
+        lam = rad(lon)
+        phi = rad(lat)
+        if phi == self.phi0:
+            x = lam * math.cos(self.phi0)
+        else:
+            try:
+                x = lam * (phi - self.phi0) / (math.log(math.tan(self.QUARTERPI + phi * 0.5)) - math.log(math.tan(self.QUARTERPI + self.phi0 * 0.5)))
+            except:
+                return None
+        x *= 1000
+        y = 1000 * (phi - self.phi0)
+        return (x, y * -1)
+
+
+
+
+
+
+ # +
+ +
+
+
    def attrs(self):
+        p = super(Loximuthal, self).attrs()
+        p['lat0'] = self.lat0
+        return p
+
+
+
+
+
+
+ # +
+

Canters, F. (2002) Small-scale Map projection Design. p. 218-219. +Modified Sinusoidal, equal-area.

+

implementation borrowed from +http://cartography.oregonstate.edu/temp/AdaptiveProjection/src/projections/Canters1.js

+
+
+
    @staticmethod
+    def attributes():
+        return ['lon0', 'lat0', 'flip']
+
+
+class CantersModifiedSinusoidalI(PseudoCylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lon0=0.0, flip=0):
+        PseudoCylindrical.__init__(self, lon0=lon0, flip=flip)
+        self.C1 = 1.1966
+        self.C3 = -0.1290
+        self.C3x3 = 3 * self.C3
+        self.C5 = -0.0076
+        self.C5x5 = 5 * self.C5
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(self, lon, lat):
+        me = self
+        lon, lat = me.ll(lon, lat)
+
+        lon = rad(lon)
+        lat = rad(lat)
+
+        y2 = lat * lat
+        y4 = y2 * y2
+        x = 1000 * lon * math.cos(lat) / (me.C1 + me.C3x3 * y2 + me.C5x5 * y4)
+        y = 1000 * lat * (me.C1 + me.C3 * y2 + me.C5 * y4)
+        return (x, y * -1)
+
+
+
+
+
+
+ # +
+ +
+
+
class Hatano(PseudoCylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(me, lon0=0, flip=0):
+        PseudoCylindrical.__init__(me, lon0=lon0, flip=flip)
+        me.NITER = 20
+        me.EPS = 1e-7
+        me.ONETOL = 1.000001
+        me.CN = 2.67595
+        me.CS = 2.43763
+        me.RCN = 0.37369906014686373063
+        me.RCS = 0.41023453108141924738
+        me.FYCN = 1.75859
+        me.FYCS = 1.93052
+        me.RYCN = 0.56863737426006061674
+        me.RYCS = 0.51799515156538134803
+        me.FXC = 0.85
+        me.RXC = 1.17647058823529411764
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(me, lon, lat):
+        [lon, lat] = me.ll(lon, lat)
+        lam = rad(lon)
+        phi = rad(lat)
+        c = math.sin(phi) * (me.CN, me.CS)[phi < 0.0]
+        for i in range(me.NITER, 0, -1):
+            th1 = (phi + math.sin(phi) - c) / (1.0 + math.cos(phi))
+            phi -= th1
+            if abs(th1) < me.EPS:
+                break
+        phi *= 0.5
+        x = 1000 * me.FXC * lam * math.cos(phi)
+        y = 1000 * math.sin(phi) * (me.FYCN, me.FYCS)[phi < 0.0]
+        return (x, y * -1)
+
+
+
+
+
+
+ # +
+

Aitoff projection

+

implementation taken from +Snyder, Map projections - A working manual

+
+
+
class Aitoff(PseudoCylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lon0=0, flip=0):
+        PseudoCylindrical.__init__(self, lon0=lon0, flip=flip)
+        self.winkel = False
+        self.COSPHI1 = 0.636619772367581343
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(me, lon, lat):
+        [lon, lat] = me.ll(lon, lat)
+        lam = rad(lon)
+        phi = rad(lat)
+        c = 0.5 * lam
+        d = math.acos(math.cos(phi) * math.cos(c))
+        if d != 0:
+            y = 1.0 / math.sin(d)
+            x = 2.0 * d * math.cos(phi) * math.sin(c) * y
+            y *= d * math.sin(phi)
+        else:
+            x = y = 0
+        if me.winkel:
+            x = (x + lam * me.COSPHI1) * 0.5
+            y = (y + phi) * 0.5
+        return (x * 1000, y * -1000)
+
+
+
+
+
+
+ # +
+ +
+
+
class Winkel3(Aitoff):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, lon0=0, flip=0):
+        Aitoff.__init__(self, lon0=lon0, flip=flip)
+        self.winkel = True
+
+
+
+
+
+
+ # +
+ +
+
+
class Nicolosi(PseudoCylindrical):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(me, lon0=0, flip=0):
+        me.EPS = 1e-10
+        PseudoCylindrical.__init__(me, lon0=lon0, flip=flip)
+        me.r = me.HALFPI * 100
+        sea = []
+        r = me.r
+        for phi in range(0, 361):
+            sea.append((math.cos(rad(phi)) * r, math.sin(rad(phi)) * r))
+        me.sea = sea
+
+
+
+
+
+
+ # +
+ +
+
+
    def _clon(me, lon):
+        lon -= me.lon0
+        if lon < -180:
+            lon += 360
+        elif lon > 180:
+            lon -= 360
+        return lon
+
+
+
+
+
+
+ # +
+ +
+
+
    def _visible(me, lon, lat):
+
+
+
+
+
+
+ # +
+

lon = me._clon(lon)

+
+
+
        return lon > -90 and lon < 90
+
+
+
+
+
+
+ # +
+ +
+
+
    def _truncate(me, x, y):
+        theta = math.atan2(y, x)
+        x1 = me.r * math.cos(theta)
+        y1 = me.r * math.sin(theta)
+        return (x1, y1)
+
+
+
+
+
+
+ # +
+ +
+
+
    def world_bounds(self, bbox, llbbox=(-180, -90, 180, 90)):
+        if llbbox == (-180, -90, 180, 90):
+            d = self.r * 2
+            bbox.update((-d, -d))
+            bbox.update((d, d))
+        else:
+            bbox = super(PseudoCylindrical, self).world_bounds(bbox, llbbox)
+        return bbox
+
+
+
+
+
+
+ # +
+ +
+
+
    def sea_shape(self, llbbox=(-180, -90, 180, 90)):
+        out = []
+        if llbbox == (-180, -90, 180, 90) or llbbox == [-180, -90, 180, 90]:
+            for phi in range(0, 360):
+                x = math.cos(math.radians(phi)) * self.r
+                y = math.sin(math.radians(phi)) * self.r
+                out.append((x, y))
+            out = [out]
+        else:
+            out = super(PseudoCylindrical, self).sea_shape(llbbox)
+        return out
+
+
+
+
+
+
+ # +
+ +
+
+
    def project(me, lon, lat):
+        [lon, lat] = me.ll(lon, lat)
+        lam = rad(lon)
+        phi = rad(lat)
+
+        if abs(lam) < me.EPS:
+            x = 0
+            y = phi
+        elif abs(phi) < me.EPS:
+            x = lam
+            y = 0
+        elif abs(abs(lam) - me.HALFPI) < me.EPS:
+            x = lam * math.cos(phi)
+            y = me.HALFPI * math.sin(phi)
+        elif abs(abs(phi) - me.HALFPI) < me.EPS:
+            x = 0
+            y = phi
+        else:
+            tb = me.HALFPI / lam - lam / me.HALFPI
+            c = phi / me.HALFPI
+            sp = math.sin(phi)
+            d = (1 - c * c) / (sp - c)
+            r2 = tb / d
+            r2 *= r2
+            m = (tb * sp / d - 0.5 * tb) / (1.0 + r2)
+            n = (sp / r2 + 0.5 * d) / (1.0 + 1.0 / r2)
+            x = math.cos(phi)
+            x = math.sqrt(m * m + x * x / (1.0 + r2))
+            x = me.HALFPI * (m + (x, -x)[lam < 0])
+            f = n * n - (sp * sp / r2 + d * sp - 1.0) / (1.0 + 1.0 / r2)
+            if f < 0:
+                y = phi
+            else:
+                y = math.sqrt(f)
+                y = me.HALFPI * (n + (-y, y)[phi < 0])
+        return (x * 100, y * -100)
+
+
+
+
+
+
+ # +
+ +
+
+
    def plot(self, polygon, truncate=True):
+        polygons = self._shift_polygon(polygon)
+        plotted = []
+        for polygon in polygons:
+            points = []
+            ignore = True
+            for (lon, lat) in polygon:
+                vis = self._visible(lon, lat)
+                if vis:
+                    ignore = False
+                x, y = self.project(lon, lat)
+                if not vis and truncate:
+                    points.append(self._truncate(x, y))
+                else:
+                    points.append((x, y))
+            if ignore:
+                continue
+            plotted.append(points)
+        return plotted
+
+
+
+
+
+
+ diff --git a/source/pycco.css b/source/pycco.css new file mode 100644 index 0000000..57e6c47 --- /dev/null +++ b/source/pycco.css @@ -0,0 +1,186 @@ +/*--------------------- Layout and Typography ----------------------------*/ +body { + font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; + font-size: 16px; + line-height: 24px; + color: #252519; + margin: 0; padding: 0; +} +a { + color: #261a3b; +} + a:visited { + color: #261a3b; + } +p { + margin: 0 0 15px 0; +} +h1, h2, h3, h4, h5, h6 { + margin: 40px 0 15px 0; +} +h2, h3, h4, h5, h6 { + margin-top: 0; + } +#container, div.section { + position: relative; +} +#background { + position: fixed; + top: 0; left: 580px; right: 0; bottom: 0; + background: #f5f5ff; + border-left: 1px solid #e5e5ee; + z-index: -1; +} +#jump_to, #jump_page { + background: white; + -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777; + -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; + font: 10px Arial; + text-transform: uppercase; + cursor: pointer; + text-align: right; +} +#jump_to, #jump_wrapper { + position: fixed; + right: 0; top: 0; + padding: 5px 10px; +} + #jump_wrapper { + padding: 0; + display: none; + } + #jump_to:hover #jump_wrapper { + display: block; + } + #jump_page { + padding: 5px 0 3px; + margin: 0 0 25px 25px; + } + #jump_page .source { + display: block; + padding: 5px 10px; + text-decoration: none; + border-top: 1px solid #eee; + } + #jump_page .source:hover { + background: #f5f5ff; + } + #jump_page .source:first-child { + } +div.docs { + float: left; + max-width: 500px; + min-width: 500px; + min-height: 5px; + padding: 10px 25px 1px 50px; + vertical-align: top; + text-align: left; +} + .docs pre { + margin: 15px 0 15px; + padding-left: 15px; + } + .docs p tt, .docs p code { + background: #f8f8ff; + border: 1px solid #dedede; + font-size: 12px; + padding: 0 0.2em; + } + .octowrap { + position: relative; + } + .octothorpe { + font: 12px Arial; + text-decoration: none; + color: #454545; + position: absolute; + top: 3px; left: -20px; + padding: 1px 2px; + opacity: 0; + -webkit-transition: opacity 0.2s linear; + } + div.docs:hover .octothorpe { + opacity: 1; + } +div.code { + margin-left: 580px; + padding: 14px 15px 16px 50px; + vertical-align: top; +} + .code pre, .docs p code { + font-size: 12px; + } + pre, tt, code { + line-height: 18px; + font-family: Monaco, Consolas, "Lucida Console", monospace; + margin: 0; padding: 0; + } +div.clearall { + clear: both; +} + + +/*---------------------- Syntax Highlighting -----------------------------*/ +td.linenos { background-color: #f0f0f0; padding-right: 10px; } +span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; } +body .hll { background-color: #ffffcc } +body .c { color: #408080; font-style: italic } /* Comment */ +body .err { border: 1px solid #FF0000 } /* Error */ +body .k { color: #954121 } /* Keyword */ +body .o { color: #666666 } /* Operator */ +body .cm { color: #408080; font-style: italic } /* Comment.Multiline */ +body .cp { color: #BC7A00 } /* Comment.Preproc */ +body .c1 { color: #408080; font-style: italic } /* Comment.Single */ +body .cs { color: #408080; font-style: italic } /* Comment.Special */ +body .gd { color: #A00000 } /* Generic.Deleted */ +body .ge { font-style: italic } /* Generic.Emph */ +body .gr { color: #FF0000 } /* Generic.Error */ +body .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +body .gi { color: #00A000 } /* Generic.Inserted */ +body .go { color: #808080 } /* Generic.Output */ +body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +body .gs { font-weight: bold } /* Generic.Strong */ +body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +body .gt { color: #0040D0 } /* Generic.Traceback */ +body .kc { color: #954121 } /* Keyword.Constant */ +body .kd { color: #954121; font-weight: bold } /* Keyword.Declaration */ +body .kn { color: #954121; font-weight: bold } /* Keyword.Namespace */ +body .kp { color: #954121 } /* Keyword.Pseudo */ +body .kr { color: #954121; font-weight: bold } /* Keyword.Reserved */ +body .kt { color: #B00040 } /* Keyword.Type */ +body .m { color: #666666 } /* Literal.Number */ +body .s { color: #219161 } /* Literal.String */ +body .na { color: #7D9029 } /* Name.Attribute */ +body .nb { color: #954121 } /* Name.Builtin */ +body .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +body .no { color: #880000 } /* Name.Constant */ +body .nd { color: #AA22FF } /* Name.Decorator */ +body .ni { color: #999999; font-weight: bold } /* Name.Entity */ +body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ +body .nf { color: #0000FF } /* Name.Function */ +body .nl { color: #A0A000 } /* Name.Label */ +body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +body .nt { color: #954121; font-weight: bold } /* Name.Tag */ +body .nv { color: #19469D } /* Name.Variable */ +body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +body .w { color: #bbbbbb } /* Text.Whitespace */ +body .mf { color: #666666 } /* Literal.Number.Float */ +body .mh { color: #666666 } /* Literal.Number.Hex */ +body .mi { color: #666666 } /* Literal.Number.Integer */ +body .mo { color: #666666 } /* Literal.Number.Oct */ +body .sb { color: #219161 } /* Literal.String.Backtick */ +body .sc { color: #219161 } /* Literal.String.Char */ +body .sd { color: #219161; font-style: italic } /* Literal.String.Doc */ +body .s2 { color: #219161 } /* Literal.String.Double */ +body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ +body .sh { color: #219161 } /* Literal.String.Heredoc */ +body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ +body .sx { color: #954121 } /* Literal.String.Other */ +body .sr { color: #BB6688 } /* Literal.String.Regex */ +body .s1 { color: #219161 } /* Literal.String.Single */ +body .ss { color: #19469D } /* Literal.String.Symbol */ +body .bp { color: #954121 } /* Name.Builtin.Pseudo */ +body .vc { color: #19469D } /* Name.Variable.Class */ +body .vg { color: #19469D } /* Name.Variable.Global */ +body .vi { color: #19469D } /* Name.Variable.Instance */ +body .il { color: #666666 } /* Literal.Number.Integer.Long */ diff --git a/source/renderer/__init__.html b/source/renderer/__init__.html new file mode 100644 index 0000000..f46964c --- /dev/null +++ b/source/renderer/__init__.html @@ -0,0 +1,100 @@ + + + + + __init__.py + + + +
+
+
+

__init__.py

+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
class MapRenderer(object):
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, map):
+        self.map = map
+
+
+
+
+
+
+ # +
+ +
+
+
    def render(self):
+        pass
+
+
+
+
+
+
+ # +
+ +
+
+
    def write(self, filename):
+        raise 'Not implemented yet'
+
+
+
+
+
+
+ # +
+ +
+
+
    def preview(self):
+        raise 'Not implemented yet'
+
+
+from svg import SvgRenderer
+from kml import KmlRenderer
+
+__all__ = ['MapRenderer', 'SvgRenderer', 'KmlRenderer']
+
+
+
+
+
+
+ diff --git a/source/renderer/kml.html b/source/renderer/kml.html new file mode 100644 index 0000000..676fc42 --- /dev/null +++ b/source/renderer/kml.html @@ -0,0 +1,272 @@ + + + + + kml.py + + + +
+
+
+

kml.py

+
+
+
+
+
+ # +
+ +
+
+
from kartograph.renderer import MapRenderer
+from kartograph.errors import KartographError
+from pykml.factory import KML_ElementMaker as KML
+
+
+
+
+
+
+ # +
+ +
+
+
class KmlRenderer(MapRenderer):
+
+
+
+
+
+
+ # +
+ +
+
+
    def render(self):
+        self._init_kml_canvas()
+        self._store_layers_kml()
+
+
+
+
+
+
+ # +
+ +
+
+
    def write(self, filename):
+        outfile = open(filename, 'w')
+        from lxml import etree
+        outfile.write(etree.tostring(self.kml, pretty_print=True))
+
+
+
+
+
+
+ # +
+ +
+
+
    def preview(self):
+        self.write('tmp.kml')
+        from subprocess import call
+        call(["open", "tmp.kml"])
+
+
+
+
+
+
+ # +
+ +
+
+
    def _init_kml_canvas(self):
+        self.kml = KML.kml(
+            KML.Document(
+                KML.name('kartograph map')
+            )
+        )
+
+
+
+
+
+
+ # +
+

store features in kml (projected to WGS84 latlon)

+
+
+
    def _store_layers_kml(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        from pykml.factory import KML_ElementMaker as KML
+
+        for layer in self.map.layers:
+            if len(layer.features) == 0:
+                continue  # ignore empty layers
+            g = KML.Folder(
+                KML.name(id)
+            )
+            for feat in layer.features:
+                g.append(self._render_feature(feat, layer.options['attributes']))
+            self.kml.Document.append(g)
+
+
+
+
+
+
+ # +
+ +
+
+
    def _render_feature(self, feature, attributes=[]):
+        path = self._render_geometry(feature.geometry)
+
+        pm = KML.Placemark(
+            KML.name(unicode(feature.props[attributes[0]['src']])),
+            path
+        )
+
+        xt = KML.ExtendedData()
+
+        for cfg in attributes:
+            if 'src' in cfg:
+                if cfg['src'] not in feature.props:
+                    continue
+
+
+
+
+
+
+ # +
+

raise KartographError(('attribute not found "%s"'%cfg['src']))

+
+
+
                val = feature.props[cfg['src']]
+                import unicodedata
+                if isinstance(val, str):
+                    val = unicode(val, errors='ignore')
+                    val = unicodedata.normalize('NFKD', val).encode('ascii', 'ignore')
+                xt.append(KML.Data(
+                    KML.value(unicode(val)),
+                    name=cfg['tgt']
+                ))
+            elif 'where' in cfg:
+                src = cfg['where']
+                tgt = cfg['set']
+                if len(cfg['equals']) != len(cfg['to']):
+                    raise KartographError('attributes: "equals" and "to" arrays must be of same length')
+                for i in range(len(cfg['equals'])):
+                    if feature.props[src] == cfg['equals'][i]:
+                        xt.append(KML.Data(
+                            KML.value(cfg['to'][i]),
+                            name=tgt
+                        ))
+        pm.append(xt)
+
+        return pm
+
+
+
+
+
+
+ # +
+ +
+
+
    def _render_geometry(self, geometry):
+        from shapely.geometry import Polygon, MultiPolygon
+        if isinstance(geometry, (Polygon, MultiPolygon)):
+            return self._render_polygon(geometry)
+        else:
+            raise KartographError('kml-renderer is not fully implemented yet')
+
+
+
+
+
+
+ # +
+

renders a Polygon or MultiPolygon as KML node

+
+
+
    def _render_polygon(self, geometry):
+
+
+
+
+
+
+ # +
+ +
+
+
        geoms = hasattr(geometry, 'geoms') and geometry.geoms or [geometry]
+
+        kml_polys = []
+
+        for geom in geoms:
+            poly = KML.Polygon(
+                KML.tesselate("1")
+            )
+            outer = KML.outerBoundaryIs()
+            coords = ''
+            for pt in geom.exterior.coords:
+                coords += ','.join(map(str, pt)) + ' '
+            outer.append(KML.LinearRing(
+                KML.coordinates(coords)
+            ))
+            poly.append(outer)
+            inner = KML.innerBoundaryIs()
+            for hole in geom.interiors:
+                coords = ''
+                for pt in hole.coords:
+                    coords += ','.join(map(str, pt)) + ' '
+                inner.append(KML.LinearRing(
+                    KML.coordinates(coords)
+                ))
+            if len(inner) > 0:
+                poly.append(inner)
+            kml_polys.append(poly)
+
+        if len(kml_polys) == 1:
+            return kml_polys[0]
+        multigeometry = KML.MultiGeometry()
+        for p in kml_polys:
+            multigeometry.append(p)
+        return multigeometry
+
+
+
+
+
+
+ diff --git a/source/renderer/svg.html b/source/renderer/svg.html new file mode 100644 index 0000000..f2dfe78 --- /dev/null +++ b/source/renderer/svg.html @@ -0,0 +1,525 @@ + + + + + svg.py + + + +
+
+
+

svg.py

+
+
+
+
+
+ # +
+ +
+
+
from kartograph.renderer import MapRenderer
+from kartograph.errors import KartographError
+
+
+
+
+
+
+ # +
+

This script contains everything that is needed by Kartograph to finally +render the processed maps into SVG files.

+
+
+
+
+
+
+
+
+
+ # +
+

The SVG renderer is based on xml.dom.minidom.

+
+
+
from xml.dom import minidom
+from xml.dom.minidom import parse
+import re
+
+
+
+
+
+
+ # +
+ +
+
+
class SvgRenderer(MapRenderer):
+
+
+
+
+
+
+ # +
+

The render() method prepares a new empty SVG document and +stores all the layer features into SVG groups.

+
+
+
    def render(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        self._init_svg_doc()
+        self._store_layers_to_svg()
+
+
+
+
+
+
+ # +
+ +
+
+
    def _init_svg_doc(self):
+
+
+
+
+
+
+ # +
+

Load width and height of the map view +We add two pixels to the height to ensure that +the map fits.

+
+
+
        w = self.map.view.width
+        h = self.map.view.height + 2
+
+
+
+
+
+
+ # +
+

SvgDocument is a handy wrapper around xml.dom.minidom. It is defined below.

+
+
+
        svg = SvgDocument(
+            width='%dpx' % w,
+            height='%dpx' % h,
+            viewBox='0 0 %d %d' % (w, h),
+            enable_background='new 0 0 %d %d' % (w, h),
+            style='stroke-linejoin: round; stroke:#000; fill:#f6f3f0;')
+
+        defs = svg.node('defs', svg.root)
+        style = svg.node('style', defs, type='text/css')
+        css = 'path { fill-rule: evenodd; }\n#context path { fill: #eee; stroke: #bbb; } '
+        svg.cdata(css, style)
+        metadata = svg.node('metadata', svg.root)
+        views = svg.node('views', metadata)
+        view = svg.node('view', views,
+            padding=str(self.map.options['bounds']['padding']), w=w, h=h)
+
+        svg.node('proj', view, **self.map.proj.attrs())
+        svg.node('bbox', view,
+            x=round(self.map.src_bbox.left, 2),
+            y=round(self.map.src_bbox.top, 2),
+            w=round(self.map.src_bbox.width, 2),
+            h=round(self.map.src_bbox.height, 2))
+
+        ll = [-180, -90, 180, 90]
+        if self.map.options['bounds']['mode'] == "bbox":
+            ll = self.map.options['bounds']['data']
+        svg.node('llbbox', view,
+            lon0=ll[0], lon1=ll[2],
+            lat0=ll[1], lat1=ll[3])
+        self.svg = svg
+
+
+
+
+
+
+ # +
+

store features in svg

+
+
+
    def _store_layers_to_svg(self):
+
+
+
+
+
+
+ # +
+ +
+
+
        svg = self.svg
+        for layer in self.map.layers:
+            if len(layer.features) == 0:
+                print "ignoring empty layer", layer.id
+                continue  # ignore empty layers
+            g = svg.node('g', svg.root, id=layer.id)
+            for feat in layer.features:
+                node = self._render_feature(feat, layer.options['attributes'])
+                if node is not None:
+                    g.appendChild(node)
+                else:
+                    print "feature.to_svg is None", feat
+            if 'styles' in layer.options:
+                for prop in layer.options['styles']:
+                    g.setAttribute(prop, str(layer.options['styles'][prop]))
+
+
+
+
+
+
+ # +
+ +
+
+
    def _render_feature(self, feature, attributes=[]):
+        node = self._render_geometry(feature.geometry)
+        if node is None:
+            return None
+
+        for cfg in attributes:
+            if 'src' in cfg:
+                tgt = re.sub('(\W|_)+', '-', cfg['tgt'].lower())
+                if cfg['src'] not in feature.props:
+                    continue
+
+
+
+
+
+
+ # +
+

raise KartographError(('attribute not found "%s"'%cfg['src']))

+
+
+
                val = feature.props[cfg['src']]
+                if isinstance(val, (int, float)):
+                    val = str(val)
+                node.setAttribute('data-' + tgt, val)
+                if tgt == "id":
+                    node.setAttribute('id', val)
+
+            elif 'where' in cfg:
+
+
+
+
+
+
+ # +
+

can be used to replace attributes...

+
+
+
                src = cfg['where']
+                tgt = cfg['set']
+                if len(cfg['equals']) != len(cfg['to']):
+                    raise KartographError('attributes: "equals" and "to" arrays must be of same length')
+                for i in range(len(cfg['equals'])):
+                    if feature.props[src] == cfg['equals'][i]:
+                        node.setAttribute('data-' + tgt, cfg['to'][i])
+
+        if '__color__' in feature.props:
+            node.setAttribute('fill', self.props['__color__'])
+        return node
+
+
+
+
+
+
+ # +
+ +
+
+
    def _render_geometry(self, geometry):
+        from shapely.geometry import Polygon, MultiPolygon
+        if isinstance(geometry, (Polygon, MultiPolygon)):
+            return self._render_polygon(geometry)
+
+
+
+
+
+
+ # +
+

constructs a svg representation of a polygon

+
+
+
    def _render_polygon(self, geometry):
+
+
+
+
+
+
+ # +
+ +
+
+
        _round = self.map.options['export']['round']
+        path_str = ""
+        if _round is False:
+            fmt = '%f,%f'
+        else:
+            fmt = '%.' + str(_round) + 'f'
+            fmt = fmt + ',' + fmt
+
+        geoms = hasattr(geometry, 'geoms') and geometry.geoms or [geometry]
+        for polygon in geoms:
+            if polygon is None:
+                continue
+            for ring in [polygon.exterior] + list(polygon.interiors):
+                cont_str = ""
+                kept = []
+                for pt in ring.coords:
+                    kept.append(pt)
+                if len(kept) <= 3:
+                    continue
+                for pt in kept:
+                    if cont_str == "":
+                        cont_str = "M"
+                    else:
+                        cont_str += "L"
+                    cont_str += fmt % pt
+                cont_str += "Z "
+                path_str += cont_str
+        if path_str == "":
+            return None
+        path = self.svg.node('path', d=path_str)
+        return path
+
+
+
+
+
+
+ # +
+ +
+
+
    def write(self, filename):
+        self.svg.write(filename)
+
+
+
+
+
+
+ # +
+ +
+
+
    def preview(self):
+        self.svg.preview()
+
+
+
+
+
+
+ # +
+

SvgDocument

+

SVGDocument is a handy wrapper around xml.dom.minidom which allows us +to quickly build XML structures. It is largely inspired by the SVG class +of the svgfig project, which was +used by one of the earlier versions of Kartograph.

+
+
+
+
+
+
+
+
+
+ # +
+ +
+
+
class SvgDocument(object):
+
+
+
+
+
+
+ # +
+

Of course, we need to create and XML document with all this +boring SVG header stuff added to it.

+
+
+
    def __init__(self, **kwargs):
+        imp = minidom.getDOMImplementation('')
+        dt = imp.createDocumentType('svg',
+            '-//W3C//DTD SVG 1.1//EN',
+            'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd')
+        self.doc = imp.createDocument('http://www.w3.org/2000/svg', 'svg', dt)
+        self.root = svg = self.doc.getElementsByTagName('svg')[0]
+        svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')
+        svg.setAttribute('version', '1.1')
+        svg.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink')
+        _add_attrs(self.root, kwargs)
+
+
+
+
+
+
+ # +
+

This is the magic of SvgDocument. Instead of having to do appendChild() +and addAttribute() for every node we create, we just call svgdoc.node() +which is smart enough to append itself to the parent if we specify one, +and also sets all attributes we pass as keyword arguments.

+
+
+
    def node(self, name, parent=None, **kwargs):
+        el = self.doc.createElement(name)
+        _add_attrs(el, kwargs)
+        if parent is not None:
+            parent.appendChild(el)
+        return el
+
+
+
+
+
+
+ # +
+

Sometimes we also need a <[CDATA]> block, for instance if we embed +CSS code in the SVG document.

+
+
+
    def cdata(self, data, parent=None):
+        cd = minidom.CDATASection()
+        cd.data = data
+        if parent is not None:
+            parent.appendChild(cd)
+        return cd
+
+
+
+
+
+
+ # +
+

Here we finally write the SVG file, and we're brave enough +to try to write it in Unicode.

+
+
+
    def write(self, outfile):
+        if isinstance(outfile, str):
+            outfile = open(outfile, 'w')
+        raw = self.doc.toxml()
+        try:
+            raw = raw.encode('utf-8')
+        except:
+            print 'warning: could not encode to unicode'
+
+        outfile.write(raw)
+        outfile.close()
+
+
+
+
+
+
+ # +
+

Don't blame me if you don't have a command-line shortcut to +simply the best free browser of the world.

+
+
+
    def preview(self):
+        self.write('tmp.svg')
+        from subprocess import call
+        call(["firefox", "tmp.svg"])
+
+
+
+
+
+
+ # +
+ +
+
+
    def tostring(self):
+        return self.doc.toxml()
+
+
+
+
+
+
+ # +
+

This is an artifact of an older version of Kartograph, but +maybe we'll need it later. It will load an SVG document from +a file.

+
+
+
    @staticmethod
+    def load(filename):
+        svg = SvgDocument()
+        dom = parse(filename)
+        svg.doc = dom
+        svg.root = dom.getElementsByTagName('svg')[0]
+        return svg
+
+
+def _add_attrs(node, attrs):
+    for key in attrs:
+        node.setAttribute(key, str(attrs[key]))
+
+
+
+
+
+
+ diff --git a/source/simplify/__init__.html b/source/simplify/__init__.html new file mode 100644 index 0000000..15a2001 --- /dev/null +++ b/source/simplify/__init__.html @@ -0,0 +1,85 @@ + + + + + __init__.py + + + +
+
+
+

__init__.py

+
+
+
+
+
+ # +
+ +
+
+
__all__ = ['create_point_store', 'unify_polygon', 'unify_polygons', 'simplify_lines']
+
+from unify import *
+from distance import simplify_distance
+from douglas_peucker import simplify_douglas_peucker
+from visvalingam import simplify_visvalingam_whyatt
+
+
+simplification_methods = dict()
+simplification_methods['distance'] = simplify_distance
+simplification_methods['douglas-peucker'] = simplify_douglas_peucker
+simplification_methods['visvalingam-whyatt'] = simplify_visvalingam_whyatt
+
+
+
+
+
+
+ # +
+

simplifies a set of lines

+
+
+
def simplify_lines(lines, method, params):
+
+
+
+
+
+
+ # +
+ +
+
+
    simplify = simplification_methods[method]
+    out = []
+    for line in lines:
+
+
+
+
+
+
+ # +
+

remove duplicate points from line

+
+
+
        unique = [line[0]]
+        for i in range(1, len(line)):
+            if line[i] != line[i - 1]:
+                unique.append(line[i])
+        simplify(unique, params)
+        out.append(unique)
+    return out
+
+
+
+
+
+
+ diff --git a/source/simplify/distance.html b/source/simplify/distance.html new file mode 100644 index 0000000..f1de2e3 --- /dev/null +++ b/source/simplify/distance.html @@ -0,0 +1,108 @@ + + + + + distance.py + + + +
+
+
+

distance.py

+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

simplifies a line segment using a very simple algorithm that checks the distance +to the last non-deleted point. the algorithm operates on line segments.

+

in order to preserve topology of the original polygons the algorithm +- never removes the first or the last point of a line segment +- flags all points as simplified after processing (so it won't be processed twice)

+
+
+
def simplify_distance(points, dist):
+
+
+
+
+
+
+ # +
+ +
+
+
    dist_sq = dist * dist
+    n = len(points)
+
+    kept = []
+    deleted = 0
+    if n < 4:
+        return points
+
+    for i in range(0, n):
+        pt = points[i]
+        if i == 0 or i == n - 1:
+
+
+
+
+
+
+ # +
+

never remove first or last point of line

+
+
+
            pt.simplified = True
+            lpt = pt
+            kept.append(pt)
+        else:
+            d = (pt.x - lpt.x) * (pt.x - lpt.x) + (pt.y - lpt.y) * (pt.y - lpt.y)  # compute distance to last point
+            if pt.simplified or d > dist_sq:  # if point already handled or distance exceeds threshold..
+                kept.append(pt)  # ..keep the point
+                lpt = pt
+            else:  # otherwise remove it
+                deleted += 1
+                pt.deleted = True
+            pt.simplified = True
+
+    if len(kept) < 4:
+        for pt in points:
+            pt.deleted = False
+        return points
+
+    return kept
+
+
+
+
+
+
+ # +
+

print 'kept %d deleted %d' % (kept, deleted)

+
+
+
+
+
+
+
+ diff --git a/source/simplify/douglas_peucker.html b/source/simplify/douglas_peucker.html new file mode 100644 index 0000000..464ba85 --- /dev/null +++ b/source/simplify/douglas_peucker.html @@ -0,0 +1,221 @@ + + + + + douglas_peucker.py + + + +
+
+
+

douglas_peucker.py

+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

simplifies a line segment using the Douglas-Peucker algorithm.

+

taken from +http://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm#Pseudocode

+

in order to preserve topology of the original polygons the algorithm +- never removes the first or the last point of a line segment +- flags all points as simplified after processing (so it won't be processed twice)

+
+
+
def simplify_douglas_peucker(points, epsilon):
+
+
+
+
+
+
+ # +
+ +
+
+
    n = len(points)
+    kept = []
+    if n < 4:
+        return points  # skip short lines
+
+    if not points[0].simplified:
+        _douglas_peucker(points, 0, n - 1, epsilon)
+
+    return kept
+
+
+
+
+
+
+ # +
+

print 'kept %d deleted %d' % (kept, deleted)

+
+
+
+
+
+
+
+
+
+ # +
+

inner part of Douglas-Peucker algorithm, called recursively

+
+
+
def _douglas_peucker(points, start, end, epsilon):
+
+
+
+
+
+
+ # +
+ +
+
+
    dmax = 0
+    index = 0
+
+
+
+
+
+
+ # +
+

Find the point with the maximum distance

+
+
+
    for i in range(start + 1, end):
+        x1, y1 = points[start]
+        x2, y2 = points[end]
+        if x1 == x2 and y1 == y2:
+            return
+        x3, y3 = points[i]
+        d = _min_distance(x1, y1, x2, y2, x3, y3)
+        if d > dmax:
+            index = i
+            dmax = d
+
+
+
+
+
+
+ # +
+

If max distance is greater than epsilon, recursively simplify

+
+
+
    if dmax >= epsilon and start < index < end:
+
+
+
+
+
+
+ # +
+

recursivly call

+
+
+
        _douglas_peucker(points, start, index, epsilon)
+        _douglas_peucker(points, index, end, epsilon)
+    else:
+
+
+
+
+
+
+ # +
+

remove any point but the first and last

+
+
+
        for i in range(start, end + 1):
+            points[i].deleted = i == start or i == end
+            points[i].simplified = True
+
+
+
+
+
+
+ # +
+

the perpendicular distance from a point (x3,y3) to the line from (x1,y1) to (x2,y2) +taken from http://local.wasp.uwa.edu.au/~pbourke/geometry/pointline/

+
+
+
def _min_distance(x1, y1, x2, y2, x3, y3):
+
+
+
+
+
+
+ # +
+ +
+
+
    d = _dist(x1, y1, x2, y2)
+    u = (x3 - x1) * (x2 - x1) + (y3 - y1) * (y2 - y1) / (d * d)
+    x = x1 + u * (x2 - x1)
+    y = y1 + u * (y2 - y1)
+    return _dist(x, y, x3, y3)
+
+
+
+
+
+
+ # +
+

eucledian distance between two points

+
+
+
def _dist(x1, y1, x2, y2):
+
+
+
+
+
+
+ # +
+ +
+
+
    import math
+    dx = x2 - x1
+    dy = y2 - y1
+    return math.sqrt(dx * dx + dy * dy)
+
+
+
+
+
+
+ diff --git a/source/simplify/mpoint.html b/source/simplify/mpoint.html new file mode 100644 index 0000000..f6d9f30 --- /dev/null +++ b/source/simplify/mpoint.html @@ -0,0 +1,133 @@ + + + + + mpoint.py + + + +
+
+
+

mpoint.py

+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

Point class used for polygon simplification

+
+
+
class MPoint:
+
+
+
+
+
+
+ # +
+ +
+
+
    def __init__(self, x, y):
+        self.x = x
+        self.y = y
+        self.simplified = False
+        self.deleted = False
+        self.keep = False
+        self.features = set()
+
+
+
+
+
+
+ # +
+ +
+
+
    def isDeletable(self):
+        if self.keep or self.simplified or self.three:
+            return False
+        return True
+
+
+
+
+
+
+ # +
+ +
+
+
    def __repr__(self):
+        return 'Pt(%.2f,%.2f)' % (self.x, self.y)
+
+
+
+
+
+
+ # +
+ +
+
+
    def __len__(self):
+        return 2
+
+
+
+
+
+
+ # +
+ +
+
+
    def __getitem__(self, key):
+        if key == 0:
+            return self.x
+        if key == 1:
+            return self.y
+        raise IndexError()
+
+
+
+
+
+
+ # +
+ +
+
+
    def __contains__(self, key):
+        if key == "deleted":
+            return True
+        return False
+
+
+
+
+
+
+ diff --git a/source/simplify/unify.html b/source/simplify/unify.html new file mode 100644 index 0000000..758861b --- /dev/null +++ b/source/simplify/unify.html @@ -0,0 +1,152 @@ + + + + + unify.py + + + +
+
+
+

unify.py

+
+
+
+
+
+ # +
+

the whole point of the unification step is to convert all points into unique MPoint instances

+
+
+
from mpoint import MPoint
+
+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

creates a new point_store

+
+
+
def create_point_store():
+
+
+
+
+
+
+ # +
+ +
+
+
    point_store = {'kept': 0, 'removed': 0}
+    return point_store
+
+
+
+
+
+
+ # +
+ +
+
+
def unify_rings(rings, point_store, precision=None, feature=None):
+    out = []
+    for ring in rings:
+        out.append(unify_ring(ring, point_store, precision=precision, feature=feature))
+    return out
+
+
+
+
+
+
+ # +
+

Replaces duplicate points with MPoint instances

+
+
+
def unify_ring(ring, point_store, precision=None, feature=None):
+
+
+
+
+
+
+ # +
+ +
+
+
    out_ring = []
+    lptid = ''
+    for pt in ring:
+        if 'deleted' not in pt:
+            pt = MPoint(pt[0], pt[1])  # eventually convert to MPoint
+
+
+
+
+
+
+ # +
+

generate hash for point

+
+
+
        if precision is not None:
+            fmt = '%' + precision + 'f-%' + precision + 'f'
+        else:
+            fmt = '%f-%f'
+        pid = fmt % (pt.x, pt.y)
+        if pid == lptid:
+            continue  # skip double points
+        lptid = pid
+        if pid in point_store:
+
+
+
+
+
+
+ # +
+

load existing point from point store

+
+
+
            point = point_store[pid]
+            point_store['removed'] += 1
+        else:
+            point = pt
+            point_store['kept'] += 1
+            point_store[pid] = pt
+
+        point.features.add(feature)
+        out_ring.append(point)
+    return out_ring
+
+
+
+
+
+
+ diff --git a/source/simplify/visvalingam.html b/source/simplify/visvalingam.html new file mode 100644 index 0000000..a4b10b6 --- /dev/null +++ b/source/simplify/visvalingam.html @@ -0,0 +1,218 @@ + + + + + visvalingam.py + + + +
+
+
+

visvalingam.py

+
+
+
+
+
+ # +
+ +
+
+
+
+
+
+
+
+
+ # +
+

Visvalingam-Whyatt simplification

+
+
+
def simplify_visvalingam_whyatt(points, tolerance):
+
+
+
+
+
+
+ # +
+

mplementation borrowed from @migurski: +ttps://github.com/migurski/Bloch/blob/master/Bloch/init.py#L133

+
+
+
    if len(points) < 3:
+        return
+    if points[1].simplified:
+        return
+
+    min_area = tolerance ** 2
+
+    pts = range(len(points))  # pts stores an index of all non-deleted points
+
+    while len(pts) > 4:
+        preserved, popped = set(), []
+        areas = []
+
+        for i in range(1, len(pts) - 1):
+            x1, y1 = points[pts[i - 1]]
+            x2, y2 = points[pts[i]]
+            x3, y3 = points[pts[i + 1]]
+
+
+
+
+
+
+ # +
+

compute and store triangle area

+
+
+
            areas.append((_tri_area(x1, y1, x2, y2, x3, y3), i))
+
+        areas = sorted(areas)
+
+        if not areas or areas[0][0] > min_area:
+
+
+
+
+
+
+ # +
+

there's nothing to be done

+
+
+
            for pt in points:
+                pt.simplified = True
+            break
+
+
+
+
+
+
+ # +
+

Reduce any segments that makes a triangle whose area is below +the minimum threshold, starting with the smallest and working up. +Mark segments to be preserved until the next iteration.

+
+
+
        for (area, i) in areas:
+
+            if area > min_area:
+
+
+
+
+
+
+ # +
+

there won't be any more points to remove.

+
+
+
                break
+
+            if i - 1 in preserved or i + 1 in preserved:
+
+
+
+
+
+
+ # +
+

the current segment is too close to a previously-preserved one. +print "-pre", preserved

+
+
+
                continue
+
+            points[pts[i]].deleted = True
+            popped.append(i)
+
+
+
+
+
+
+ # +
+

make sure that the adjacent points

+
+
+
            preserved.add(i - 1)
+            preserved.add(i + 1)
+
+        if len(popped) == 0:
+
+
+
+
+
+
+ # +
+

no points removed, so break out of loop

+
+
+
            break
+
+        popped = sorted(popped, reverse=True)
+        for i in popped:
+
+
+
+
+
+
+ # +
+

remove point from index list

+
+
+
            pts = pts[:i] + pts[i + 1:]
+
+    for pt in points:
+        pt.simplified = True
+
+
+
+
+
+
+ # +
+

computes the area of a triangle given by three points +implementation taken from: +http://www.btinternet.com/~se16/hgb/triangle.htm

+
+
+
def _tri_area(x1, y1, x2, y2, x3, y3):
+
+
+
+
+
+
+ # +
+ +
+
+
    return abs((x2*y1-x1*y2)+(x3*y2-x2*y3)+(x1*y3-x3*y1))/2.0
+
+
+
+
+
+
+